X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=arch%2Fx86%2Flib%2Ftables.c;h=1213a9cd2b8c3c8b1f765a7314c4329d40a8778d;hb=8a8c0352556cb63c941d9bf1ff58d45c4d27d61d;hp=8031201a49c2ce2db0b7a8a65cd1a7365d4f21f2;hpb=3f2f1a00394eb7ce7176f9d0930e40e55ba2c79c;p=u-boot diff --git a/arch/x86/lib/tables.c b/arch/x86/lib/tables.c index 8031201a49..1213a9cd2b 100644 --- a/arch/x86/lib/tables.c +++ b/arch/x86/lib/tables.c @@ -5,8 +5,39 @@ */ #include +#include #include +#include +#include #include +#include +#include + +/** + * Function prototype to write a specific configuration table + * + * @addr: start address to write the table + * @return: end address of the table + */ +typedef u32 (*table_write)(u32 addr); + +static table_write table_write_funcs[] = { +#ifdef CONFIG_GENERATE_PIRQ_TABLE + write_pirq_routing_table, +#endif +#ifdef CONFIG_GENERATE_SFI_TABLE + write_sfi_table, +#endif +#ifdef CONFIG_GENERATE_MP_TABLE + write_mp_table, +#endif +#ifdef CONFIG_GENERATE_ACPI_TABLE + write_acpi_tables, +#endif +#ifdef CONFIG_GENERATE_SMBIOS_TABLE + write_smbios_table, +#endif +}; u8 table_compute_checksum(void *v, int len) { @@ -20,16 +51,54 @@ u8 table_compute_checksum(void *v, int len) return checksum; } +void table_fill_string(char *dest, const char *src, size_t n, char pad) +{ + int start, len; + int i; + + strncpy(dest, src, n); + + /* Fill the remaining bytes with pad */ + len = strlen(src); + start = len < n ? len : n; + for (i = start; i < n; i++) + dest[i] = pad; +} + void write_tables(void) { - u32 __maybe_unused rom_table_end = ROM_TABLE_ADDR; + u32 rom_table_start = ROM_TABLE_ADDR; + u32 rom_table_end; +#ifdef CONFIG_SEABIOS + u32 high_table, table_size; + struct memory_area cfg_tables[ARRAY_SIZE(table_write_funcs) + 1]; +#endif + int i; -#ifdef CONFIG_GENERATE_PIRQ_TABLE - rom_table_end = write_pirq_routing_table(rom_table_end); - rom_table_end = ALIGN(rom_table_end, 1024); + for (i = 0; i < ARRAY_SIZE(table_write_funcs); i++) { + rom_table_end = table_write_funcs[i](rom_table_start); + rom_table_end = ALIGN(rom_table_end, ROM_TABLE_ALIGN); + +#ifdef CONFIG_SEABIOS + table_size = rom_table_end - rom_table_start; + high_table = (u32)memalign(ROM_TABLE_ALIGN, table_size); + if (high_table) { + memset((void *)high_table, 0, table_size); + table_write_funcs[i](high_table); + + cfg_tables[i].start = high_table; + cfg_tables[i].size = table_size; + } else { + printf("%d: no memory for configuration tables\n", i); + } #endif -#ifdef CONFIG_GENERATE_SFI_TABLE - rom_table_end = write_sfi_table(rom_table_end); - rom_table_end = ALIGN(rom_table_end, 1024); + + rom_table_start = rom_table_end; + } + +#ifdef CONFIG_SEABIOS + /* make sure the last item is zero */ + cfg_tables[i].size = 0; + write_coreboot_table(CB_TABLE_ADDR, cfg_tables); #endif }