diff --git a/payloads/libpayload/include/coreboot_tables.h b/payloads/libpayload/include/coreboot_tables.h index a3a0a05a32..1a189e5e4e 100644 --- a/payloads/libpayload/include/coreboot_tables.h +++ b/payloads/libpayload/include/coreboot_tables.h @@ -246,6 +246,15 @@ struct cb_ram_code { uint32_t ram_code; }; +#define CB_TAG_SPI_FLASH 0x0029 +struct cb_spi_flash { + uint32_t tag; + uint32_t size; + uint32_t flash_size; + uint32_t sector_size; + uint32_t erase_cmd; +}; + #define CB_TAG_CMOS_OPTION_TABLE 0x00c8 struct cb_cmos_option_table { u32 tag; diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h index aa594c98dd..ec8a31c6b6 100644 --- a/payloads/libpayload/include/sysinfo.h +++ b/payloads/libpayload/include/sysinfo.h @@ -118,6 +118,11 @@ struct sysinfo_t { void *wifi_calibration; uint64_t ramoops_buffer; uint32_t ramoops_buffer_size; + struct spi_flash { + uint32_t size; + uint32_t sector_size; + uint32_t erase_cmd; + } spi_flash; }; extern struct sysinfo_t lib_sysinfo; diff --git a/payloads/libpayload/libc/coreboot.c b/payloads/libpayload/libc/coreboot.c index 1f1cf320a2..5999e86856 100644 --- a/payloads/libpayload/libc/coreboot.c +++ b/payloads/libpayload/libc/coreboot.c @@ -203,6 +203,15 @@ static void cb_parse_ramoops(void *ptr, struct sysinfo_t *info) info->ramoops_buffer_size = ramoops->range_size; } +static void cb_parse_spi_flash(void *ptr, struct sysinfo_t *info) +{ + struct cb_spi_flash *flash = (struct cb_spi_flash *)ptr; + + info->spi_flash.size = flash->flash_size; + info->spi_flash.sector_size = flash->sector_size; + info->spi_flash.erase_cmd = flash->erase_cmd; +} + int cb_parse_header(void *addr, int len, struct sysinfo_t *info) { struct cb_header *header; @@ -346,6 +355,9 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info) case CB_TAG_RAM_OOPS: cb_parse_ramoops(ptr, info); break; + case CB_TAG_SPI_FLASH: + cb_parse_spi_flash(ptr, info); + break; default: cb_parse_arch_specific(rec, info); break;