summaryrefslogtreecommitdiff
path: root/payloads/libpayload
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload')
-rw-r--r--payloads/libpayload/arch/x86/coreboot.c8
-rw-r--r--payloads/libpayload/include/coreboot_tables.h12
-rw-r--r--payloads/libpayload/include/sysinfo.h6
-rw-r--r--payloads/libpayload/libc/coreboot.c133
4 files changed, 71 insertions, 88 deletions
diff --git a/payloads/libpayload/arch/x86/coreboot.c b/payloads/libpayload/arch/x86/coreboot.c
index 38ede875c7..cad13963ec 100644
--- a/payloads/libpayload/arch/x86/coreboot.c
+++ b/payloads/libpayload/arch/x86/coreboot.c
@@ -47,20 +47,12 @@ static void cb_parse_x86_rom_var_mtrr(void *ptr, struct sysinfo_t *info)
info->x86_rom_var_mtrr_index = rom_mtrr->index;
}
-static void cb_parse_mrc_cache(void *ptr, struct sysinfo_t *info)
-{
- info->mrc_cache = get_cbmem_addr(ptr);
-}
-
int cb_parse_arch_specific(struct cb_record *rec, struct sysinfo_t *info)
{
switch(rec->tag) {
case CB_TAG_X86_ROM_MTRR:
cb_parse_x86_rom_var_mtrr(rec, info);
break;
- case CB_TAG_MRC_CACHE:
- cb_parse_mrc_cache(rec, info);
- break;
default:
return 0;
}
diff --git a/payloads/libpayload/include/coreboot_tables.h b/payloads/libpayload/include/coreboot_tables.h
index 914cfa5683..3fd3fc85e1 100644
--- a/payloads/libpayload/include/coreboot_tables.h
+++ b/payloads/libpayload/include/coreboot_tables.h
@@ -321,6 +321,16 @@ struct cb_boot_media_params {
uint64_t boot_media_size;
};
+
+struct cb_cbmem_entry {
+ uint32_t tag;
+ uint32_t size;
+
+ uint64_t address;
+ uint32_t entry_size;
+ uint32_t id;
+};
+
struct cb_tsc_info {
uint32_t tag;
uint32_t size;
@@ -443,6 +453,4 @@ static inline const char *cb_mb_part_string(const struct cb_mainboard *cbm)
(void *)(((u8 *) (_rec)) + sizeof(*(_rec)) \
+ (sizeof((_rec)->map[0]) * (_idx)))
-/* Helper functions */
-uintptr_t get_cbmem_addr(const void *cbmem_tab_entry);
#endif
diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h
index b34476d25e..376f298c77 100644
--- a/payloads/libpayload/include/sysinfo.h
+++ b/payloads/libpayload/include/sysinfo.h
@@ -150,6 +150,12 @@ struct sysinfo_t {
#endif
/* USB Type-C Port Configuration Info */
uintptr_t type_c_info;
+
+ /* CBFS RW/RO Metadata Cache */
+ uintptr_t cbfs_ro_mcache_offset;
+ uint32_t cbfs_ro_mcache_size;
+ uintptr_t cbfs_rw_mcache_offset;
+ uint32_t cbfs_rw_mcache_size;
};
extern struct sysinfo_t lib_sysinfo;
diff --git a/payloads/libpayload/libc/coreboot.c b/payloads/libpayload/libc/coreboot.c
index bd1041166e..79a382b990 100644
--- a/payloads/libpayload/libc/coreboot.c
+++ b/payloads/libpayload/libc/coreboot.c
@@ -29,6 +29,7 @@
#include <libpayload-config.h>
#include <libpayload.h>
+#include <commonlib/bsd/cbmem_id.h>
#include <coreboot_tables.h>
#include <stdint.h>
@@ -41,12 +42,6 @@
/* === Parsing code === */
/* This is the generic parsing code. */
-uintptr_t get_cbmem_addr(const void *const cbmem_tab_entry)
-{
- const struct cb_cbmem_tab *const cbmem = cbmem_tab_entry;
- return cbmem->cbmem_tab;
-}
-
static void cb_parse_memory(void *ptr, struct sysinfo_t *info)
{
struct cb_memory *mem = ptr;
@@ -83,11 +78,6 @@ static void cb_parse_serial(void *ptr, struct sysinfo_t *info)
info->cb_serial = virt_to_phys(ptr);
}
-static void cb_parse_vboot_workbuf(unsigned char *ptr, struct sysinfo_t *info)
-{
- info->vboot_workbuf = get_cbmem_addr(ptr);
-}
-
static void cb_parse_vbnv(unsigned char *ptr, struct sysinfo_t *info)
{
struct lb_range *vbnv = (struct lb_range *)ptr;
@@ -128,26 +118,6 @@ static void cb_parse_mac_addresses(unsigned char *ptr,
info->macs[i] = macs->mac_addrs[i];
}
-static void cb_parse_tstamp(unsigned char *ptr, struct sysinfo_t *info)
-{
- info->tstamp_table = get_cbmem_addr(ptr);
-}
-
-static void cb_parse_cbmem_cons(unsigned char *ptr, struct sysinfo_t *info)
-{
- info->cbmem_cons = get_cbmem_addr(ptr);
-}
-
-static void cb_parse_acpi_gnvs(unsigned char *ptr, struct sysinfo_t *info)
-{
- info->acpi_gnvs = get_cbmem_addr(ptr);
-}
-
-static void cb_parse_acpi_cnvs(unsigned char *ptr, struct sysinfo_t *info)
-{
- info->acpi_cnvs = get_cbmem_addr(ptr);
-}
-
static void cb_parse_board_config(unsigned char *ptr, struct sysinfo_t *info)
{
struct cb_board_config *const config = (struct cb_board_config *)ptr;
@@ -188,11 +158,6 @@ static void cb_parse_string(const void *const ptr, uintptr_t *const info)
*info = virt_to_phys(str->string);
}
-static void cb_parse_wifi_calibration(void *ptr, struct sysinfo_t *info)
-{
- info->wifi_calibration = get_cbmem_addr(ptr);
-}
-
static void cb_parse_ramoops(void *ptr, struct sysinfo_t *info)
{
struct lb_range *ramoops = (struct lb_range *)ptr;
@@ -236,21 +201,6 @@ static void cb_parse_boot_media_params(unsigned char *ptr,
info->boot_media_size = bmp->boot_media_size;
}
-static void cb_parse_vpd(void *ptr, struct sysinfo_t *info)
-{
- info->chromeos_vpd = get_cbmem_addr(ptr);
-}
-
-static void cb_parse_fmap_cache(void *ptr, struct sysinfo_t *info)
-{
- info->fmap_cache = get_cbmem_addr(ptr);
-}
-
-static void cb_parse_type_c_info(void *ptr, struct sysinfo_t *info)
-{
- info->type_c_info = get_cbmem_addr(ptr);
-}
-
#if CONFIG(LP_TIMER_RDTSC)
static void cb_parse_tsc_info(void *ptr, struct sysinfo_t *info)
{
@@ -264,6 +214,57 @@ static void cb_parse_tsc_info(void *ptr, struct sysinfo_t *info)
}
#endif
+static void cb_parse_cbmem_entry(void *ptr, struct sysinfo_t *info)
+{
+ const struct cb_cbmem_entry *cbmem_entry = ptr;
+
+ if (cbmem_entry->size != sizeof(*cbmem_entry))
+ return;
+
+ switch (cbmem_entry->id) {
+ case CBMEM_ID_ACPI_CNVS:
+ info->acpi_cnvs = cbmem_entry->address;
+ break;
+ case CBMEM_ID_ACPI_GNVS:
+ info->acpi_gnvs = cbmem_entry->address;
+ break;
+ case CBMEM_ID_CBFS_RO_MCACHE:
+ info->cbfs_ro_mcache_offset = cbmem_entry->address;
+ info->cbfs_ro_mcache_size = cbmem_entry->size;
+ break;
+ case CBMEM_ID_CBFS_RW_MCACHE:
+ info->cbfs_rw_mcache_offset = cbmem_entry->address;
+ info->cbfs_rw_mcache_size = cbmem_entry->size;
+ break;
+ case CBMEM_ID_CONSOLE:
+ info->cbmem_cons = cbmem_entry->address;
+ break;
+ case CBMEM_ID_MRCDATA:
+ info->mrc_cache = cbmem_entry->address;
+ break;
+ case CBMEM_ID_VBOOT_WORKBUF:
+ info->vboot_workbuf = cbmem_entry->address;
+ break;
+ case CBMEM_ID_TIMESTAMP:
+ info->tstamp_table = cbmem_entry->address;
+ break;
+ case CBMEM_ID_VPD:
+ info->chromeos_vpd = cbmem_entry->address;
+ break;
+ case CBMEM_ID_FMAP:
+ info->fmap_cache = cbmem_entry->address;
+ break;
+ case CBMEM_ID_WIFI_CALIBRATION:
+ info->wifi_calibration = cbmem_entry->address;
+ break;
+ case CBMEM_ID_TYPE_C_INFO:
+ info->type_c_info = cbmem_entry->address;
+ break;
+ default:
+ break;
+ }
+}
+
int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
{
struct cb_header *header;
@@ -372,33 +373,15 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
case CB_TAG_VBNV:
cb_parse_vbnv(ptr, info);
break;
- case CB_TAG_VBOOT_WORKBUF:
- cb_parse_vboot_workbuf(ptr, info);
- break;
case CB_TAG_MAC_ADDRS:
cb_parse_mac_addresses(ptr, info);
break;
case CB_TAG_SERIALNO:
cb_parse_string(ptr, &info->serialno);
break;
- case CB_TAG_TIMESTAMPS:
- cb_parse_tstamp(ptr, info);
- break;
- case CB_TAG_CBMEM_CONSOLE:
- cb_parse_cbmem_cons(ptr, info);
- break;
- case CB_TAG_ACPI_GNVS:
- cb_parse_acpi_gnvs(ptr, info);
- break;
- case CB_TAG_ACPI_CNVS:
- cb_parse_acpi_cnvs(ptr, info);
- break;
case CB_TAG_BOARD_CONFIG:
cb_parse_board_config(ptr, info);
break;
- case CB_TAG_WIFI_CALIBRATION:
- cb_parse_wifi_calibration(ptr, info);
- break;
case CB_TAG_RAM_OOPS:
cb_parse_ramoops(ptr, info);
break;
@@ -414,20 +397,14 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
case CB_TAG_BOOT_MEDIA_PARAMS:
cb_parse_boot_media_params(ptr, info);
break;
+ case CB_TAG_CBMEM_ENTRY:
+ cb_parse_cbmem_entry(ptr, info);
+ break;
#if CONFIG(LP_TIMER_RDTSC)
case CB_TAG_TSC_INFO:
cb_parse_tsc_info(ptr, info);
break;
#endif
- case CB_TAG_VPD:
- cb_parse_vpd(ptr, info);
- break;
- case CB_TAG_FMAP:
- cb_parse_fmap_cache(ptr, info);
- break;
- case CB_TAG_TYPE_C_INFO:
- cb_parse_type_c_info(ptr, info);
- break;
default:
cb_parse_arch_specific(rec, info);
break;