^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #define BOOT_CTYPE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include "misc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include "error.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "../string.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/numa.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/efi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/efi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Longest parameter of 'acpi=' is 'copy_dsdt', plus an extra '\0'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * for termination.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define MAX_ACPI_ARG_LENGTH 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Immovable memory regions representation. Max amount of memory regions is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * MAX_NUMNODES*2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct mem_vector immovable_mem[MAX_NUMNODES*2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Search EFI system tables for RSDP. If both ACPI_20_TABLE_GUID and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * ACPI_TABLE_GUID are found, take the former, which has more features.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static acpi_physical_address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) __efi_get_rsdp_addr(unsigned long config_tables, unsigned int nr_tables,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) bool efi_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) acpi_physical_address rsdp_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifdef CONFIG_EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* Get EFI tables from systab. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) for (i = 0; i < nr_tables; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) acpi_physical_address table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) efi_guid_t guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (efi_64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) efi_config_table_64_t *tbl = (efi_config_table_64_t *)config_tables + i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) guid = tbl->guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) table = tbl->table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (!IS_ENABLED(CONFIG_X86_64) && table >> 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) debug_putstr("Error getting RSDP address: EFI config table located above 4GB.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) efi_config_table_32_t *tbl = (efi_config_table_32_t *)config_tables + i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) guid = tbl->guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) table = tbl->table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if (!(efi_guidcmp(guid, ACPI_TABLE_GUID)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) rsdp_addr = table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) else if (!(efi_guidcmp(guid, ACPI_20_TABLE_GUID)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) return table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) return rsdp_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* EFI/kexec support is 64-bit only. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static struct efi_setup_data *get_kexec_setup_data_addr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct setup_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u64 pa_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) pa_data = boot_params->hdr.setup_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) while (pa_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) data = (struct setup_data *)pa_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (data->type == SETUP_EFI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) return (struct efi_setup_data *)(pa_data + sizeof(struct setup_data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) pa_data = data->next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static acpi_physical_address kexec_get_rsdp_addr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) efi_system_table_64_t *systab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct efi_setup_data *esd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct efi_info *ei;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) char *sig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) esd = (struct efi_setup_data *)get_kexec_setup_data_addr();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (!esd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (!esd->tables) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) debug_putstr("Wrong kexec SETUP_EFI data.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ei = &boot_params->efi_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) sig = (char *)&ei->efi_loader_signature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (strncmp(sig, EFI64_LOADER_SIGNATURE, 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) debug_putstr("Wrong kexec EFI loader signature.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* Get systab from boot params. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) systab = (efi_system_table_64_t *) (ei->efi_systab | ((__u64)ei->efi_systab_hi << 32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (!systab)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) error("EFI system table not found in kexec boot_params.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return __efi_get_rsdp_addr((unsigned long)esd->tables, systab->nr_tables, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static acpi_physical_address kexec_get_rsdp_addr(void) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif /* CONFIG_X86_64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static acpi_physical_address efi_get_rsdp_addr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #ifdef CONFIG_EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) unsigned long systab, config_tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) unsigned int nr_tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct efi_info *ei;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) bool efi_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) char *sig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ei = &boot_params->efi_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) sig = (char *)&ei->efi_loader_signature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (!strncmp(sig, EFI64_LOADER_SIGNATURE, 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) efi_64 = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) } else if (!strncmp(sig, EFI32_LOADER_SIGNATURE, 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) efi_64 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) debug_putstr("Wrong EFI loader signature.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* Get systab from boot params. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) systab = ei->efi_systab | ((__u64)ei->efi_systab_hi << 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (ei->efi_systab_hi || ei->efi_memmap_hi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) debug_putstr("Error getting RSDP address: EFI system table located above 4GB.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) systab = ei->efi_systab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (!systab)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) error("EFI system table not found.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* Handle EFI bitness properly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (efi_64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) efi_system_table_64_t *stbl = (efi_system_table_64_t *)systab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) config_tables = stbl->tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) nr_tables = stbl->nr_tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) efi_system_table_32_t *stbl = (efi_system_table_32_t *)systab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) config_tables = stbl->tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) nr_tables = stbl->nr_tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (!config_tables)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) error("EFI config tables not found.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return __efi_get_rsdp_addr(config_tables, nr_tables, efi_64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static u8 compute_checksum(u8 *buffer, u32 length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u8 *end = buffer + length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u8 sum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) while (buffer < end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) sum += *(buffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) return sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* Search a block of memory for the RSDP signature. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) static u8 *scan_mem_for_rsdp(u8 *start, u32 length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) struct acpi_table_rsdp *rsdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) u8 *address, *end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) end = start + length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* Search from given start address for the requested length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) for (address = start; address < end; address += ACPI_RSDP_SCAN_STEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * Both RSDP signature and checksum must be correct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * Note: Sometimes there exists more than one RSDP in memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * the valid RSDP has a valid checksum, all others have an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * invalid checksum.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) rsdp = (struct acpi_table_rsdp *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* BAD Signature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (!ACPI_VALIDATE_RSDP_SIG(rsdp->signature))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /* Check the standard checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (compute_checksum((u8 *)rsdp, ACPI_RSDP_CHECKSUM_LENGTH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* Check extended checksum if table version >= 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if ((rsdp->revision >= 2) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) (compute_checksum((u8 *)rsdp, ACPI_RSDP_XCHECKSUM_LENGTH)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /* Signature and checksum valid, we have found a real RSDP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* Search RSDP address in EBDA. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static acpi_physical_address bios_get_rsdp_addr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) unsigned long address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) u8 *rsdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* Get the location of the Extended BIOS Data Area (EBDA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) address = *(u16 *)ACPI_EBDA_PTR_LOCATION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) address <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * Search EBDA paragraphs (EBDA is required to be a minimum of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * 1K length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (address > 0x400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) rsdp = scan_mem_for_rsdp((u8 *)address, ACPI_EBDA_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return (acpi_physical_address)(unsigned long)rsdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* Search upper memory: 16-byte boundaries in E0000h-FFFFFh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) rsdp = scan_mem_for_rsdp((u8 *) ACPI_HI_RSDP_WINDOW_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) ACPI_HI_RSDP_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return (acpi_physical_address)(unsigned long)rsdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* Return RSDP address on success, otherwise 0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) acpi_physical_address get_rsdp_addr(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) acpi_physical_address pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) pa = boot_params->acpi_rsdp_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * Try to get EFI data from setup_data. This can happen when we're a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * kexec'ed kernel and kexec(1) has passed all the required EFI info to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (!pa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) pa = kexec_get_rsdp_addr();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (!pa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) pa = efi_get_rsdp_addr();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (!pa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) pa = bios_get_rsdp_addr();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #if defined(CONFIG_RANDOMIZE_BASE) && defined(CONFIG_MEMORY_HOTREMOVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * Max length of 64-bit hex address string is 19, prefix "0x" + 16 hex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * digits, and '\0' for termination.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define MAX_ADDR_LEN 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) static unsigned long get_cmdline_acpi_rsdp(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) unsigned long addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #ifdef CONFIG_KEXEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) char val[MAX_ADDR_LEN] = { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) ret = cmdline_find_option("acpi_rsdp", val, MAX_ADDR_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (boot_kstrtoul(val, 16, &addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* Compute SRAT address from RSDP. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) static unsigned long get_acpi_srat_table(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) unsigned long root_table, acpi_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct acpi_table_header *header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) struct acpi_table_rsdp *rsdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) u32 num_entries, size, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) char arg[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) u8 *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * Check whether we were given an RSDP on the command line. We don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * stash this in boot params because the kernel itself may have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * different ideas about whether to trust a command-line parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) rsdp = (struct acpi_table_rsdp *)get_cmdline_acpi_rsdp();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (!rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) rsdp = (struct acpi_table_rsdp *)(long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) boot_params->acpi_rsdp_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (!rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* Get ACPI root table from RSDP.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if (!(cmdline_find_option("acpi", arg, sizeof(arg)) == 4 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) !strncmp(arg, "rsdt", 4)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) rsdp->xsdt_physical_address &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) rsdp->revision > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) root_table = rsdp->xsdt_physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) size = ACPI_XSDT_ENTRY_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) root_table = rsdp->rsdt_physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) size = ACPI_RSDT_ENTRY_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) if (!root_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) header = (struct acpi_table_header *)root_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) len = header->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (len < sizeof(struct acpi_table_header) + size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) num_entries = (len - sizeof(struct acpi_table_header)) / size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) entry = (u8 *)(root_table + sizeof(struct acpi_table_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) while (num_entries--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (size == ACPI_RSDT_ENTRY_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) acpi_table = *(u32 *)entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) acpi_table = *(u64 *)entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (acpi_table) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) header = (struct acpi_table_header *)acpi_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (ACPI_COMPARE_NAMESEG(header->signature, ACPI_SIG_SRAT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return acpi_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) entry += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * count_immovable_mem_regions - Parse SRAT and cache the immovable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * memory regions into the immovable_mem array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * Return the number of immovable memory regions on success, 0 on failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * - Too many immovable memory regions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) * - ACPI off or no SRAT found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * - No immovable memory region found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) int count_immovable_mem_regions(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) unsigned long table_addr, table_end, table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct acpi_subtable_header *sub_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct acpi_table_header *table_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) char arg[MAX_ACPI_ARG_LENGTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) int num = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (cmdline_find_option("acpi", arg, sizeof(arg)) == 3 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) !strncmp(arg, "off", 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) table_addr = get_acpi_srat_table();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (!table_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) table_header = (struct acpi_table_header *)table_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) table_end = table_addr + table_header->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) table = table_addr + sizeof(struct acpi_table_srat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) while (table + sizeof(struct acpi_subtable_header) < table_end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) sub_table = (struct acpi_subtable_header *)table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) if (!sub_table->length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) debug_putstr("Invalid zero length SRAT subtable.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (sub_table->type == ACPI_SRAT_TYPE_MEMORY_AFFINITY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) struct acpi_srat_mem_affinity *ma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) ma = (struct acpi_srat_mem_affinity *)sub_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (!(ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) && ma->length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) immovable_mem[num].start = ma->base_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) immovable_mem[num].size = ma->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (num >= MAX_NUMNODES*2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) debug_putstr("Too many immovable memory regions, aborting.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) table += sub_table->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #endif /* CONFIG_RANDOMIZE_BASE && CONFIG_MEMORY_HOTREMOVE */