| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <acpi/acpi.h> |
| #include <assert.h> |
| #include <boot/coreboot_tables.h> |
| #include <boot/tables.h> |
| #include <bootmem.h> |
| #include <cbmem.h> |
| #include <console/console.h> |
| #include <smbios.h> |
| #include <string.h> |
| #include <symbols.h> |
| |
| static void write_acpi_table(void) |
| { |
| const size_t max_acpi_size = CONFIG_MAX_ACPI_TABLE_SIZE_KB * KiB; |
| const uintptr_t acpi_start = (uintptr_t)cbmem_add(CBMEM_ID_ACPI, max_acpi_size); |
| assert(IS_ALIGNED(acpi_start, 16)); |
| const uintptr_t acpi_end = write_acpi_tables(acpi_start); |
| assert(acpi_end < acpi_start + max_acpi_size); |
| printk(BIOS_DEBUG, "ACPI tables: %ld bytes.\n", acpi_end - acpi_start); |
| } |
| |
| static void write_smbios_table(void) |
| { |
| unsigned long smbios_begin, smbios_end; |
| |
| #define MAX_SMBIOS_SIZE (32 * KiB) |
| |
| smbios_begin = (unsigned long)cbmem_add(CBMEM_ID_SMBIOS, MAX_SMBIOS_SIZE); |
| if (!smbios_begin) { |
| printk(BIOS_ERR, "Out of memory for SMBIOS tables\n"); |
| return; |
| } |
| |
| /* |
| * Clear the entire region to ensure the unused space doesn't |
| * contain garbage from a previous boot, like stale table |
| * signatures that could be found by the OS. |
| */ |
| memset((void *)smbios_begin, 0, MAX_SMBIOS_SIZE); |
| |
| smbios_end = smbios_write_tables(smbios_begin); |
| |
| if (smbios_end > (smbios_begin + MAX_SMBIOS_SIZE)) |
| printk(BIOS_ERR, "Increase SMBIOS size\n"); |
| |
| printk(BIOS_DEBUG, "SMBIOS tables: %ld bytes.\n", smbios_end - smbios_begin); |
| } |
| |
| void arch_write_tables(uintptr_t coreboot_table) |
| { |
| if (CONFIG(HAVE_ACPI_TABLES)) |
| write_acpi_table(); |
| |
| if (CONFIG(GENERATE_SMBIOS_TABLES)) |
| write_smbios_table(); |
| } |
| |
| void bootmem_arch_add_ranges(void) |
| { |
| bootmem_add_range((uintptr_t)_ttb, REGION_SIZE(ttb), BM_MEM_RAMSTAGE); |
| |
| if (CONFIG(ARM64_USE_ARM_TRUSTED_FIRMWARE) && |
| REGION_SIZE(bl31) > 0) |
| bootmem_add_range((uintptr_t)_bl31, REGION_SIZE(bl31), |
| BM_MEM_BL31); |
| |
| if (!CONFIG(COMMON_CBFS_SPI_WRAPPER)) |
| return; |
| bootmem_add_range((uintptr_t)_postram_cbfs_cache, |
| REGION_SIZE(postram_cbfs_cache), BM_MEM_RAMSTAGE); |
| } |
| |
| void lb_arch_add_records(struct lb_header *header) |
| { |
| } |