summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Czapiga <jacz@semihalf.com>2021-11-10 14:04:43 +0000
committerFelix Held <felix-coreboot@felixheld.de>2021-12-03 16:51:41 +0000
commit2f236c232d9ceaeeddf8efa2868a3afbd898e1b3 (patch)
tree6baa879a93e428cfa4e2ca36f66ba3b5c1e8fb7a
parentc627b0edeb2f82cb710f51f92f7ae1d5bea0605c (diff)
libpayload: Add CBMEM_IMD_ENTRY support to coreboot tables parser
coreboot stores much information in the CBMEM IMD. Until now it was ignored. This patch makes use of these coreboot tables entries. It also removes get_cbmem_addr() function as it is no longer needed. Moreover, the coreboot tables entry CB_TAG_MRC_CACHE does not exist anymore, as it is not created by the code. It was replaced by CBMEM_ID_MRCDATA entry, so MRCDATA should now be accessible through sysinfo structure field. Change-Id: I5bd02a98ba2631f34014bc0f8e7ebd5a5ddd2321 Signed-off-by: Jakub Czapiga <jacz@semihalf.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/59491 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
-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;