Skip to content
Snippets Groups Projects
Commit d2cb7a22 authored by Simon Glass's avatar Simon Glass Committed by Bin Meng
Browse files

x86: Allow putting some tables in the bloblist


At present all tables are placed starting at address f0000 in memory, and
can be up to 64KB in size. If the tables are very large, this may not
provide enough space.

Also if the tables point to other tables (such as console log or a ramoops
area) then we must allocate other memory anyway.

The bloblist is a nice place to put these tables since it is contiguous,
which makes it easy to reserve this memory for linux using the 820 tables.

Add an option to put some of the tables in the bloblist. For SMBIOS and
ACPI, create suitable pointers from the f0000 region to the new location
of the tables.

Signed-off-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng's avatarBin Meng <bmeng.cn@gmail.com>
[bmeng: squashed in http://patchwork.ozlabs.org/project/uboot/patch/


 20201105062407.1.I8091ad931cbbb5e3b6f6ababdf3f8d5db0d17bb9@changeid/]
Signed-off-by: Bin Meng's avatarBin Meng <bmeng.cn@gmail.com>
parent f36e4c7d
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
*/ */
#include <common.h> #include <common.h>
#include <bloblist.h>
#include <log.h> #include <log.h>
#include <malloc.h> #include <malloc.h>
#include <smbios.h> #include <smbios.h>
...@@ -13,6 +14,8 @@ ...@@ -13,6 +14,8 @@
#include <asm/tables.h> #include <asm/tables.h>
#include <asm/coreboot_tables.h> #include <asm/coreboot_tables.h>
DECLARE_GLOBAL_DATA_PTR;
/** /**
* Function prototype to write a specific configuration table * Function prototype to write a specific configuration table
* *
...@@ -26,10 +29,16 @@ typedef ulong (*table_write)(ulong addr); ...@@ -26,10 +29,16 @@ typedef ulong (*table_write)(ulong addr);
* *
* @name: Name of table (for debugging) * @name: Name of table (for debugging)
* @write: Function to call to write this table * @write: Function to call to write this table
* @tag: Bloblist tag if using CONFIG_BLOBLIST_TABLES
* @size: Maximum table size
* @align: Table alignment in bytes
*/ */
struct table_info { struct table_info {
const char *name; const char *name;
table_write write; table_write write;
enum bloblist_tag_t tag;
int size;
int align;
}; };
static struct table_info table_list[] = { static struct table_info table_list[] = {
...@@ -43,10 +52,10 @@ static struct table_info table_list[] = { ...@@ -43,10 +52,10 @@ static struct table_info table_list[] = {
{ "mp", write_mp_table, }, { "mp", write_mp_table, },
#endif #endif
#ifdef CONFIG_GENERATE_ACPI_TABLE #ifdef CONFIG_GENERATE_ACPI_TABLE
{ "acpi", write_acpi_tables, }, { "acpi", write_acpi_tables, BLOBLISTT_ACPI_TABLES, 0x10000, 0x1000},
#endif #endif
#ifdef CONFIG_GENERATE_SMBIOS_TABLE #ifdef CONFIG_GENERATE_SMBIOS_TABLE
{ "smbios", write_smbios_table, }, { "smbios", write_smbios_table, BLOBLISTT_SMBIOS_TABLES, 0x1000, 0x100},
#endif #endif
}; };
...@@ -66,16 +75,25 @@ void table_fill_string(char *dest, const char *src, size_t n, char pad) ...@@ -66,16 +75,25 @@ void table_fill_string(char *dest, const char *src, size_t n, char pad)
int write_tables(void) int write_tables(void)
{ {
u32 rom_table_start = ROM_TABLE_ADDR; u32 rom_table_start;
u32 rom_table_end; u32 rom_table_end;
u32 high_table, table_size; u32 high_table, table_size;
struct memory_area cfg_tables[ARRAY_SIZE(table_list) + 1]; struct memory_area cfg_tables[ARRAY_SIZE(table_list) + 1];
int i; int i;
rom_table_start = ROM_TABLE_ADDR;
debug("Writing tables to %x:\n", rom_table_start); debug("Writing tables to %x:\n", rom_table_start);
for (i = 0; i < ARRAY_SIZE(table_list); i++) { for (i = 0; i < ARRAY_SIZE(table_list); i++) {
const struct table_info *table = &table_list[i]; const struct table_info *table = &table_list[i];
int size = table->size ? : CONFIG_ROM_TABLE_SIZE;
if (IS_ENABLED(CONFIG_BLOBLIST_TABLES) && table->tag) {
rom_table_start = (ulong)bloblist_add(table->tag, size,
table->align);
if (!rom_table_start)
return log_msg_ret("bloblist", -ENOBUFS);
}
rom_table_end = table->write(rom_table_start); rom_table_end = table->write(rom_table_start);
rom_table_end = ALIGN(rom_table_end, ROM_TABLE_ALIGN); rom_table_end = ALIGN(rom_table_end, ROM_TABLE_ALIGN);
...@@ -96,6 +114,11 @@ int write_tables(void) ...@@ -96,6 +114,11 @@ int write_tables(void)
debug("- wrote '%s' to %x, end %x\n", table->name, debug("- wrote '%s' to %x, end %x\n", table->name,
rom_table_start, rom_table_end); rom_table_start, rom_table_end);
if (rom_table_end - rom_table_start > size) {
log_err("Out of space for configuration tables: need %x, have %x\n",
rom_table_end - rom_table_start, size);
return log_msg_ret("bloblist", -ENOSPC);
}
rom_table_start = rom_table_end; rom_table_start = rom_table_end;
} }
...@@ -105,6 +128,26 @@ int write_tables(void) ...@@ -105,6 +128,26 @@ int write_tables(void)
write_coreboot_table(CB_TABLE_ADDR, cfg_tables); write_coreboot_table(CB_TABLE_ADDR, cfg_tables);
} }
if (IS_ENABLED(CONFIG_BLOBLIST_TABLES)) {
void *ptr = (void *)CONFIG_ROM_TABLE_ADDR;
/* Write an RSDP pointing to the tables */
if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
struct acpi_ctx *ctx = gd_acpi_ctx();
acpi_write_rsdp(ptr, ctx->rsdt, ctx->xsdt);
ptr += ALIGN(sizeof(struct acpi_rsdp), 16);
}
if (IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE)) {
void *smbios;
smbios = bloblist_find(BLOBLISTT_SMBIOS_TABLES, 0);
if (!smbios)
return log_msg_ret("smbios", -ENOENT);
memcpy(ptr, smbios, sizeof(struct smbios_entry));
}
}
debug("- done writing tables\n"); debug("- done writing tables\n");
return 0; return 0;
......
...@@ -688,6 +688,16 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table); ...@@ -688,6 +688,16 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table);
*/ */
void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start); void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start);
/**
* acpi_write_rsdp() - Write out an RSDP indicating where the ACPI tables are
*
* @rsdp: Address to write RSDP
* @rsdt: Address of RSDT
* @xsdt: Address of XSDT
*/
void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
struct acpi_xsdt *xsdt);
#endif /* !__ACPI__*/ #endif /* !__ACPI__*/
#include <asm/acpi_table.h> #include <asm/acpi_table.h>
......
...@@ -36,6 +36,8 @@ enum bloblist_tag_t { ...@@ -36,6 +36,8 @@ enum bloblist_tag_t {
BLOBLISTT_INTEL_VBT, /* Intel Video-BIOS table */ BLOBLISTT_INTEL_VBT, /* Intel Video-BIOS table */
BLOBLISTT_TPM2_TCG_LOG, /* TPM v2 log space */ BLOBLISTT_TPM2_TCG_LOG, /* TPM v2 log space */
BLOBLISTT_TCPA_LOG, /* TPM log space */ BLOBLISTT_TCPA_LOG, /* TPM log space */
BLOBLISTT_ACPI_TABLES, /* ACPI tables for x86 */
BLOBLISTT_SMBIOS_TABLES, /* SMBIOS tables for x86 */
BLOBLISTT_COUNT BLOBLISTT_COUNT
}; };
......
...@@ -637,6 +637,15 @@ config FDT_FIXUP_PARTITIONS ...@@ -637,6 +637,15 @@ config FDT_FIXUP_PARTITIONS
menu "System tables" menu "System tables"
depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER) depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER)
config BLOBLIST_TABLES
bool "Put tables in a bloblist"
depends on X86
help
Normally tables are placed at address 0xf0000 and can be up to 64KB
long. With this option, tables are instead placed in the bloblist
with a pointer from 0xf0000. The size can then be larger and the
tables can be placed high in memory.
config GENERATE_SMBIOS_TABLE config GENERATE_SMBIOS_TABLE
bool "Generate an SMBIOS (System Management BIOS) table" bool "Generate an SMBIOS (System Management BIOS) table"
default y default y
......
...@@ -183,8 +183,8 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table) ...@@ -183,8 +183,8 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
return 0; return 0;
} }
static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt, void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
struct acpi_xsdt *xsdt) struct acpi_xsdt *xsdt)
{ {
memset(rsdp, 0, sizeof(struct acpi_rsdp)); memset(rsdp, 0, sizeof(struct acpi_rsdp));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment