Furquan Shaikh has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/35639 )
Change subject: fmap: Add get_fmap_flash_offset() ......................................................................
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.
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 --- M src/include/fmap.h M src/lib/coreboot_table.c M src/lib/fmap.c 3 files changed, 10 insertions(+), 4 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/39/35639/1
diff --git a/src/include/fmap.h b/src/include/fmap.h index ab7e5ab..f989e5d 100644 --- a/src/include/fmap.h +++ b/src/include/fmap.h @@ -48,4 +48,8 @@ /* 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 diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index 9c5942f..d3576e6 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -256,7 +256,6 @@ 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 @@ 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) diff --git a/src/lib/fmap.c b/src/lib/fmap.c index f007418..027d6ac 100644 --- a/src/lib/fmap.c +++ b/src/lib/fmap.c @@ -31,6 +31,11 @@ static int fmap_print_once CAR_GLOBAL; static struct mem_region_device fmap_cache CAR_GLOBAL;
+uint64_t get_fmap_flash_offset(void) +{ + return FMAP_OFFSET; +} + int find_fmap_directory(struct region_device *fmrd) { const struct region_device *boot;