diff --git a/src/drivers/smmstore/smi.c b/src/drivers/smmstore/smi.c index 6ea447ffe6e..e1721067335 100644 --- a/src/drivers/smmstore/smi.c +++ b/src/drivers/smmstore/smi.c @@ -79,6 +79,10 @@ static uint32_t smmstorev2_exec(uint8_t command, void *param) { uint32_t ret = SMMSTORE_RET_FAILURE; +#if CONFIG(DRIVERS_EFI_UPDATE_CAPSULES) + smmstore_should_use_full_flash(&command); +#endif + switch (command) { case SMMSTORE_CMD_INIT: { printk(BIOS_DEBUG, "Init SMM store\n"); diff --git a/src/drivers/smmstore/store.c b/src/drivers/smmstore/store.c index 270384c3c6d..1e64a909cd8 100644 --- a/src/drivers/smmstore/store.c +++ b/src/drivers/smmstore/store.c @@ -47,8 +47,36 @@ _Static_assert(SMM_BLOCK_SIZE <= FMAP_SECTION_SMMSTORE_SIZE, * crash/reboot could clear out all variables. */ +#if CONFIG(DRIVERS_EFI_UPDATE_CAPSULES) +#define SMMSTORE_CMD_USE_FULL_FLASH 0x80 + +static int use_full_flash; + +void smmstore_should_use_full_flash(uint8_t *cmd) +{ + if ((*cmd & SMMSTORE_CMD_USE_FULL_FLASH) == SMMSTORE_CMD_USE_FULL_FLASH) { + use_full_flash = 1; + *cmd &= ~SMMSTORE_CMD_USE_FULL_FLASH; + } else { + use_full_flash = 0; + } + +} +#endif + static enum cb_err lookup_store_region(struct region *region) { +#if CONFIG(DRIVERS_EFI_UPDATE_CAPSULES) + if (use_full_flash) { + const struct region_device *rdev = boot_device_rw(); + if (rdev == NULL) + return CB_ERR; + + *region = *region_device_region(rdev); + return CB_SUCCESS; + } +#endif + if (fmap_locate_area(SMMSTORE_REGION, region)) { printk(BIOS_WARNING, "smm store: Unable to find SMM store FMAP region '%s'\n", diff --git a/src/include/smmstore.h b/src/include/smmstore.h index d3940abc3f2..27cf7dc4826 100644 --- a/src/include/smmstore.h +++ b/src/include/smmstore.h @@ -117,6 +117,9 @@ int smmstore_get_info(struct smmstore_params_info *info); #endif struct region_device; int smmstore_lookup_region(struct region_device *rstore); +#if CONFIG(DRIVERS_EFI_UPDATE_CAPSULES) +void smmstore_should_use_full_flash(uint8_t *cmd); +#endif /* Advertise SMMSTORE v2 support */ struct lb_header;