cbfs: Stop checking master header
The CBFS master header is a legacy structure that just conveys the same information we already have from the FMAP these days. We're still including it to support older CBFS implementations in some payloads, but there's no need for coreboot itself to follow this indirection anymore. This patch simplifies the default CBFS locator to just return the CBFS offset and size from the FMAP directly. Change-Id: I6b00dd7f276364d62fa1f637efbaee0e80607c49 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/36688 Reviewed-by: Wim Vervoorn <wvervoorn@eltan.com> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
cefe89ee79
commit
32e13c0b00
|
@ -74,7 +74,7 @@ struct cbfs_props {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default CBFS locator .locate() callback that locates "COREBOOT" region. */
|
/* Default CBFS locator .locate() callback that locates "COREBOOT" region. */
|
||||||
int cbfs_master_header_props(struct cbfs_props *props);
|
int cbfs_default_props(struct cbfs_props *props);
|
||||||
|
|
||||||
/* Return < 0 on error otherwise props are filled out accordingly. */
|
/* Return < 0 on error otherwise props are filled out accordingly. */
|
||||||
int cbfs_boot_region_properties(struct cbfs_props *props);
|
int cbfs_boot_region_properties(struct cbfs_props *props);
|
||||||
|
|
|
@ -296,44 +296,16 @@ out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This only supports the "COREBOOT" fmap region. */
|
/* The default locator to find the CBFS in the "COREBOOT" FMAP region. */
|
||||||
int cbfs_master_header_props(struct cbfs_props *props)
|
int cbfs_default_props(struct cbfs_props *props)
|
||||||
{
|
{
|
||||||
struct cbfs_header header;
|
struct region region;
|
||||||
const struct region_device *bdev;
|
|
||||||
int32_t rel_offset;
|
|
||||||
size_t offset;
|
|
||||||
|
|
||||||
bdev = boot_device_ro();
|
if (fmap_locate_area("COREBOOT", ®ion))
|
||||||
|
|
||||||
if (bdev == NULL)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
struct region fmap_region;
|
props->offset = region_offset(®ion);
|
||||||
if (fmap_locate_area("COREBOOT", &fmap_region))
|
props->size = region_sz(®ion);
|
||||||
return -1;
|
|
||||||
size_t fmap_top = region_end(&fmap_region);
|
|
||||||
|
|
||||||
/* Find location of header using signed 32-bit offset from
|
|
||||||
* end of CBFS region. */
|
|
||||||
offset = fmap_top - sizeof(int32_t);
|
|
||||||
if (rdev_readat(bdev, &rel_offset, offset, sizeof(int32_t)) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
offset = fmap_top + (int32_t)le32_to_cpu(rel_offset);
|
|
||||||
if (rdev_readat(bdev, &header, offset, sizeof(header)) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
header.magic = ntohl(header.magic);
|
|
||||||
header.romsize = ntohl(header.romsize);
|
|
||||||
header.offset = ntohl(header.offset);
|
|
||||||
|
|
||||||
if (header.magic != CBFS_HEADER_MAGIC)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
props->offset = header.offset;
|
|
||||||
props->size = header.romsize;
|
|
||||||
props->size -= props->offset;
|
|
||||||
|
|
||||||
printk(BIOS_SPEW, "CBFS @ %zx size %zx\n", props->offset, props->size);
|
printk(BIOS_SPEW, "CBFS @ %zx size %zx\n", props->offset, props->size);
|
||||||
|
|
||||||
|
@ -343,9 +315,9 @@ int cbfs_master_header_props(struct cbfs_props *props)
|
||||||
/* This struct is marked as weak to allow a particular platform to
|
/* This struct is marked as weak to allow a particular platform to
|
||||||
* override the master header logic. This implementation should work for most
|
* override the master header logic. This implementation should work for most
|
||||||
* devices. */
|
* devices. */
|
||||||
const struct cbfs_locator __weak cbfs_master_header_locator = {
|
const struct cbfs_locator __weak cbfs_default_locator = {
|
||||||
.name = "Master Header Locator",
|
.name = "COREBOOT Locator",
|
||||||
.locate = cbfs_master_header_props,
|
.locate = cbfs_default_props,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct cbfs_locator vboot_locator;
|
extern const struct cbfs_locator vboot_locator;
|
||||||
|
@ -359,7 +331,7 @@ static const struct cbfs_locator *locators[] = {
|
||||||
*/
|
*/
|
||||||
&vboot_locator,
|
&vboot_locator,
|
||||||
#endif
|
#endif
|
||||||
&cbfs_master_header_locator,
|
&cbfs_default_locator,
|
||||||
};
|
};
|
||||||
|
|
||||||
int cbfs_boot_region_properties(struct cbfs_props *props)
|
int cbfs_boot_region_properties(struct cbfs_props *props)
|
||||||
|
|
|
@ -128,10 +128,10 @@ static int iafw_boot_region_properties(struct cbfs_props *props)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Named cbfs_master_header_locator so that it overrides the default, but
|
* Named cbfs_default_locator so that it overrides the default, but incompatible
|
||||||
* incompatible locator in cbfs.c
|
* locator in cbfs.c
|
||||||
*/
|
*/
|
||||||
const struct cbfs_locator cbfs_master_header_locator = {
|
const struct cbfs_locator cbfs_default_locator = {
|
||||||
.name = "IAFW Locator",
|
.name = "IAFW Locator",
|
||||||
.locate = iafw_boot_region_properties,
|
.locate = iafw_boot_region_properties,
|
||||||
};
|
};
|
||||||
|
|
|
@ -355,8 +355,8 @@ static void vendor_secure_prepare(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct cbfs_locator cbfs_master_header_locator = {
|
const struct cbfs_locator cbfs_default_locator = {
|
||||||
.name = "Vendorcode Header Locator",
|
.name = "Vendorcode Header Locator",
|
||||||
.prepare = vendor_secure_prepare,
|
.prepare = vendor_secure_prepare,
|
||||||
.locate = cbfs_master_header_props
|
.locate = cbfs_default_props
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue