fmap: Add get_fmap_flash_offset()

CB:35377 changed the behavior of find_fmap_directory() to return
pointer to CBMEM_ID_FMAP if fmap is cached in
cbmem. lb_boot_media_params() calls find_fmap_directory to add offset
of fmap in flash to coreboot table. However, because of the change in
behavior of find_fmap_directory(), it ended up adding 0 as the offset.

This change adds a new function get_fmap_flash_offset() which returns
the offset of fmap in flash. Ideally, all payloads should move to
using the FMAP from CBMEM. However, in order to maintain compatibility
with payloads which are not updated, ensure that fmap_offset is
updated correctly.

Since find_fmap_directory() is no longer used outside fmap.c, this
change also removes it from fmap.h and limits scope to fmap.c.

In a follow up patch, we need to push a change to libpayload to expose
the fmap cache pointer to lib_sysinfo.

BUG=b:141723751

Change-Id: I7ff6e8199143d1a992a83d7de1e3b44813b733f4
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/35639
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Shelley Chen <shchen@google.com>
This commit is contained in:
Furquan Shaikh 2019-09-26 23:51:46 -07:00 committed by Shelley Chen
parent 55ef0d25d3
commit b33a2b05af
3 changed files with 11 additions and 8 deletions

View File

@ -19,9 +19,6 @@
#include <commonlib/region.h>
#include <commonlib/fmap_serialized.h>
/* Locate the fmap directory. Return 0 on success, < 0 on error. */
int find_fmap_directory(struct region_device *fmrd);
/* Locate the named area in the fmap and fill in a region device representing
* that area. The region is a sub-region of the readonly boot media. Return
* 0 on success, < 0 on error. */
@ -48,4 +45,8 @@ ssize_t fmap_read_area(const char *name, void *buffer, size_t size);
/* Write provided buffer into fmap area.
* Return size written on success, < 0 on error. */
ssize_t fmap_overwrite_area(const char *name, const void *buffer, size_t size);
/* Get offset of FMAP in flash. */
uint64_t get_fmap_flash_offset(void);
#endif

View File

@ -256,7 +256,6 @@ static void lb_boot_media_params(struct lb_header *header)
struct lb_boot_media_params *bmp;
struct cbfs_props props;
const struct region_device *boot_dev;
struct region_device fmrd;
boot_device_init();
@ -275,9 +274,7 @@ static void lb_boot_media_params(struct lb_header *header)
bmp->cbfs_size = props.size;
bmp->boot_media_size = region_device_sz(boot_dev);
bmp->fmap_offset = ~(uint64_t)0;
if (find_fmap_directory(&fmrd) == 0)
bmp->fmap_offset = region_device_offset(&fmrd);
bmp->fmap_offset = get_fmap_flash_offset();
}
static void lb_ram_code(struct lb_header *header)

View File

@ -31,7 +31,12 @@
static int fmap_print_once CAR_GLOBAL;
static struct mem_region_device fmap_cache CAR_GLOBAL;
int find_fmap_directory(struct region_device *fmrd)
uint64_t get_fmap_flash_offset(void)
{
return FMAP_OFFSET;
}
static int find_fmap_directory(struct region_device *fmrd)
{
const struct region_device *boot;
struct fmap *fmap;