2015-04-24 10:10:04 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
2016-08-18 23:23:23 +00:00
|
|
|
#include <smbios.h>
|
2015-04-29 02:25:10 +00:00
|
|
|
#include <asm/sfi.h>
|
2015-06-23 04:18:52 +00:00
|
|
|
#include <asm/mpspec.h>
|
2015-04-24 10:10:04 +00:00
|
|
|
#include <asm/tables.h>
|
x86: Generate a valid ACPI table
Implement write_acpi_table() to create a minimal working ACPI table.
This includes writing FACS, XSDT, RSDP, FADT, MCFG, MADT, DSDT & SSDT
ACPI table entries.
Use a Kconfig option GENERATE_ACPI_TABLE to tell U-Boot whether we need
actually write the APCI table just like we did for PIRQ routing, MP table
and SFI tables. With ACPI table existence, linux kernel gets control of
power management, thermal management, configuration management and
monitoring in hardware.
Signed-off-by: Saket Sinha <saket.sinha89@gmail.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tidied up whitespace and aligned some tabs:
Signed-off-by: Simon Glass <sjg@chromium.org>
2015-08-22 06:50:55 +00:00
|
|
|
#include <asm/acpi_table.h>
|
2016-02-29 07:54:50 +00:00
|
|
|
#include <asm/coreboot_tables.h>
|
2015-04-24 10:10:04 +00:00
|
|
|
|
2016-02-28 06:58:01 +00:00
|
|
|
/**
|
|
|
|
* Function prototype to write a specific configuration table
|
|
|
|
*
|
|
|
|
* @addr: start address to write the table
|
|
|
|
* @return: end address of the table
|
|
|
|
*/
|
2017-01-16 14:03:35 +00:00
|
|
|
typedef ulong (*table_write)(ulong addr);
|
2016-02-28 06:58:01 +00:00
|
|
|
|
|
|
|
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
|
2017-01-16 14:03:35 +00:00
|
|
|
write_smbios_table,
|
2016-02-28 06:58:01 +00:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2015-06-23 04:18:51 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2015-04-24 10:10:04 +00:00
|
|
|
void write_tables(void)
|
|
|
|
{
|
2016-02-28 06:58:01 +00:00
|
|
|
u32 rom_table_start = ROM_TABLE_ADDR;
|
|
|
|
u32 rom_table_end;
|
2016-02-29 07:54:50 +00:00
|
|
|
#ifdef CONFIG_SEABIOS
|
2016-02-28 06:58:02 +00:00
|
|
|
u32 high_table, table_size;
|
2016-02-29 07:54:50 +00:00
|
|
|
struct memory_area cfg_tables[ARRAY_SIZE(table_write_funcs) + 1];
|
|
|
|
#endif
|
2016-02-28 06:58:01 +00:00
|
|
|
int i;
|
2015-04-24 10:10:04 +00:00
|
|
|
|
2016-02-28 06:58:01 +00:00
|
|
|
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);
|
2016-02-28 06:58:02 +00:00
|
|
|
|
2016-02-29 07:54:50 +00:00
|
|
|
#ifdef CONFIG_SEABIOS
|
2016-02-28 06:58:02 +00:00
|
|
|
table_size = rom_table_end - rom_table_start;
|
2016-05-11 14:45:02 +00:00
|
|
|
high_table = (u32)high_table_malloc(table_size);
|
2016-02-28 06:58:02 +00:00
|
|
|
if (high_table) {
|
|
|
|
table_write_funcs[i](high_table);
|
2016-02-29 07:54:50 +00:00
|
|
|
|
|
|
|
cfg_tables[i].start = high_table;
|
|
|
|
cfg_tables[i].size = table_size;
|
2016-02-28 06:58:02 +00:00
|
|
|
} else {
|
|
|
|
printf("%d: no memory for configuration tables\n", i);
|
|
|
|
}
|
2016-02-29 07:54:50 +00:00
|
|
|
#endif
|
2016-02-28 06:58:02 +00:00
|
|
|
|
2016-02-28 06:58:01 +00:00
|
|
|
rom_table_start = rom_table_end;
|
|
|
|
}
|
2016-02-29 07:54:50 +00:00
|
|
|
|
|
|
|
#ifdef CONFIG_SEABIOS
|
|
|
|
/* make sure the last item is zero */
|
|
|
|
cfg_tables[i].size = 0;
|
|
|
|
write_coreboot_table(CB_TABLE_ADDR, cfg_tables);
|
|
|
|
#endif
|
2015-04-24 10:10:04 +00:00
|
|
|
}
|