1 /* 2 * acpi_tables.c - ACPI Boot-Time Table Parsing 3 * 4 * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> 5 * 6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 * 20 */ 21 22 /* Uncomment next line to get verbose printout */ 23 /* #define DEBUG */ 24 #define pr_fmt(fmt) "ACPI: " fmt 25 26 #include <linux/init.h> 27 #include <linux/kernel.h> 28 #include <linux/smp.h> 29 #include <linux/string.h> 30 #include <linux/types.h> 31 #include <linux/irq.h> 32 #include <linux/errno.h> 33 #include <linux/acpi.h> 34 #include <linux/memblock.h> 35 #include <linux/earlycpio.h> 36 #include <linux/initrd.h> 37 #include "internal.h" 38 39 #ifdef CONFIG_ACPI_CUSTOM_DSDT 40 #include CONFIG_ACPI_CUSTOM_DSDT_FILE 41 #endif 42 43 #define ACPI_MAX_TABLES 128 44 45 static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" }; 46 static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" }; 47 48 static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata; 49 50 static int acpi_apic_instance __initdata; 51 52 enum acpi_subtable_type { 53 ACPI_SUBTABLE_COMMON, 54 ACPI_SUBTABLE_HMAT, 55 }; 56 57 struct acpi_subtable_entry { 58 union acpi_subtable_headers *hdr; 59 enum acpi_subtable_type type; 60 }; 61 62 /* 63 * Disable table checksum verification for the early stage due to the size 64 * limitation of the current x86 early mapping implementation. 65 */ 66 static bool acpi_verify_table_checksum __initdata = false; 67 68 void acpi_table_print_madt_entry(struct acpi_subtable_header *header) 69 { 70 if (!header) 71 return; 72 73 switch (header->type) { 74 75 case ACPI_MADT_TYPE_LOCAL_APIC: 76 { 77 struct acpi_madt_local_apic *p = 78 (struct acpi_madt_local_apic *)header; 79 pr_debug("LAPIC (acpi_id[0x%02x] lapic_id[0x%02x] %s)\n", 80 p->processor_id, p->id, 81 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled"); 82 } 83 break; 84 85 case ACPI_MADT_TYPE_LOCAL_X2APIC: 86 { 87 struct acpi_madt_local_x2apic *p = 88 (struct acpi_madt_local_x2apic *)header; 89 pr_debug("X2APIC (apic_id[0x%02x] uid[0x%02x] %s)\n", 90 p->local_apic_id, p->uid, 91 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled"); 92 } 93 break; 94 95 case ACPI_MADT_TYPE_IO_APIC: 96 { 97 struct acpi_madt_io_apic *p = 98 (struct acpi_madt_io_apic *)header; 99 pr_debug("IOAPIC (id[0x%02x] address[0x%08x] gsi_base[%d])\n", 100 p->id, p->address, p->global_irq_base); 101 } 102 break; 103 104 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 105 { 106 struct acpi_madt_interrupt_override *p = 107 (struct acpi_madt_interrupt_override *)header; 108 pr_info("INT_SRC_OVR (bus %d bus_irq %d global_irq %d %s %s)\n", 109 p->bus, p->source_irq, p->global_irq, 110 mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK], 111 mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2]); 112 if (p->inti_flags & 113 ~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK)) 114 pr_info("INT_SRC_OVR unexpected reserved flags: 0x%x\n", 115 p->inti_flags & 116 ~(ACPI_MADT_POLARITY_MASK | ACPI_MADT_TRIGGER_MASK)); 117 } 118 break; 119 120 case ACPI_MADT_TYPE_NMI_SOURCE: 121 { 122 struct acpi_madt_nmi_source *p = 123 (struct acpi_madt_nmi_source *)header; 124 pr_info("NMI_SRC (%s %s global_irq %d)\n", 125 mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK], 126 mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2], 127 p->global_irq); 128 } 129 break; 130 131 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 132 { 133 struct acpi_madt_local_apic_nmi *p = 134 (struct acpi_madt_local_apic_nmi *)header; 135 pr_info("LAPIC_NMI (acpi_id[0x%02x] %s %s lint[0x%x])\n", 136 p->processor_id, 137 mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK ], 138 mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2], 139 p->lint); 140 } 141 break; 142 143 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 144 { 145 u16 polarity, trigger; 146 struct acpi_madt_local_x2apic_nmi *p = 147 (struct acpi_madt_local_x2apic_nmi *)header; 148 149 polarity = p->inti_flags & ACPI_MADT_POLARITY_MASK; 150 trigger = (p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2; 151 152 pr_info("X2APIC_NMI (uid[0x%02x] %s %s lint[0x%x])\n", 153 p->uid, 154 mps_inti_flags_polarity[polarity], 155 mps_inti_flags_trigger[trigger], 156 p->lint); 157 } 158 break; 159 160 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 161 { 162 struct acpi_madt_local_apic_override *p = 163 (struct acpi_madt_local_apic_override *)header; 164 pr_info("LAPIC_ADDR_OVR (address[%p])\n", 165 (void *)(unsigned long)p->address); 166 } 167 break; 168 169 case ACPI_MADT_TYPE_IO_SAPIC: 170 { 171 struct acpi_madt_io_sapic *p = 172 (struct acpi_madt_io_sapic *)header; 173 pr_debug("IOSAPIC (id[0x%x] address[%p] gsi_base[%d])\n", 174 p->id, (void *)(unsigned long)p->address, 175 p->global_irq_base); 176 } 177 break; 178 179 case ACPI_MADT_TYPE_LOCAL_SAPIC: 180 { 181 struct acpi_madt_local_sapic *p = 182 (struct acpi_madt_local_sapic *)header; 183 pr_debug("LSAPIC (acpi_id[0x%02x] lsapic_id[0x%02x] lsapic_eid[0x%02x] %s)\n", 184 p->processor_id, p->id, p->eid, 185 (p->lapic_flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled"); 186 } 187 break; 188 189 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 190 { 191 struct acpi_madt_interrupt_source *p = 192 (struct acpi_madt_interrupt_source *)header; 193 pr_info("PLAT_INT_SRC (%s %s type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n", 194 mps_inti_flags_polarity[p->inti_flags & ACPI_MADT_POLARITY_MASK], 195 mps_inti_flags_trigger[(p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2], 196 p->type, p->id, p->eid, p->io_sapic_vector, 197 p->global_irq); 198 } 199 break; 200 201 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 202 { 203 struct acpi_madt_generic_interrupt *p = 204 (struct acpi_madt_generic_interrupt *)header; 205 pr_debug("GICC (acpi_id[0x%04x] address[%llx] MPIDR[0x%llx] %s)\n", 206 p->uid, p->base_address, 207 p->arm_mpidr, 208 (p->flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled"); 209 210 } 211 break; 212 213 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 214 { 215 struct acpi_madt_generic_distributor *p = 216 (struct acpi_madt_generic_distributor *)header; 217 pr_debug("GIC Distributor (gic_id[0x%04x] address[%llx] gsi_base[%d])\n", 218 p->gic_id, p->base_address, 219 p->global_irq_base); 220 } 221 break; 222 223 default: 224 pr_warn("Found unsupported MADT entry (type = 0x%x)\n", 225 header->type); 226 break; 227 } 228 } 229 230 static unsigned long __init 231 acpi_get_entry_type(struct acpi_subtable_entry *entry) 232 { 233 switch (entry->type) { 234 case ACPI_SUBTABLE_COMMON: 235 return entry->hdr->common.type; 236 case ACPI_SUBTABLE_HMAT: 237 return entry->hdr->hmat.type; 238 } 239 return 0; 240 } 241 242 static unsigned long __init 243 acpi_get_entry_length(struct acpi_subtable_entry *entry) 244 { 245 switch (entry->type) { 246 case ACPI_SUBTABLE_COMMON: 247 return entry->hdr->common.length; 248 case ACPI_SUBTABLE_HMAT: 249 return entry->hdr->hmat.length; 250 } 251 return 0; 252 } 253 254 static unsigned long __init 255 acpi_get_subtable_header_length(struct acpi_subtable_entry *entry) 256 { 257 switch (entry->type) { 258 case ACPI_SUBTABLE_COMMON: 259 return sizeof(entry->hdr->common); 260 case ACPI_SUBTABLE_HMAT: 261 return sizeof(entry->hdr->hmat); 262 } 263 return 0; 264 } 265 266 static enum acpi_subtable_type __init 267 acpi_get_subtable_type(char *id) 268 { 269 if (strncmp(id, ACPI_SIG_HMAT, 4) == 0) 270 return ACPI_SUBTABLE_HMAT; 271 return ACPI_SUBTABLE_COMMON; 272 } 273 274 /** 275 * acpi_parse_entries_array - for each proc_num find a suitable subtable 276 * 277 * @id: table id (for debugging purposes) 278 * @table_size: size of the root table 279 * @table_header: where does the table start? 280 * @proc: array of acpi_subtable_proc struct containing entry id 281 * and associated handler with it 282 * @proc_num: how big proc is? 283 * @max_entries: how many entries can we process? 284 * 285 * For each proc_num find a subtable with proc->id and run proc->handler 286 * on it. Assumption is that there's only single handler for particular 287 * entry id. 288 * 289 * The table_size is not the size of the complete ACPI table (the length 290 * field in the header struct), but only the size of the root table; i.e., 291 * the offset from the very first byte of the complete ACPI table, to the 292 * first byte of the very first subtable. 293 * 294 * On success returns sum of all matching entries for all proc handlers. 295 * Otherwise, -ENODEV or -EINVAL is returned. 296 */ 297 static int __init acpi_parse_entries_array(char *id, unsigned long table_size, 298 struct acpi_table_header *table_header, 299 struct acpi_subtable_proc *proc, int proc_num, 300 unsigned int max_entries) 301 { 302 struct acpi_subtable_entry entry; 303 unsigned long table_end, subtable_len, entry_len; 304 int count = 0; 305 int errs = 0; 306 int i; 307 308 if (acpi_disabled) 309 return -ENODEV; 310 311 if (!id) 312 return -EINVAL; 313 314 if (!table_size) 315 return -EINVAL; 316 317 if (!table_header) { 318 pr_warn("%4.4s not present\n", id); 319 return -ENODEV; 320 } 321 322 table_end = (unsigned long)table_header + table_header->length; 323 324 /* Parse all entries looking for a match. */ 325 326 entry.type = acpi_get_subtable_type(id); 327 entry.hdr = (union acpi_subtable_headers *) 328 ((unsigned long)table_header + table_size); 329 subtable_len = acpi_get_subtable_header_length(&entry); 330 331 while (((unsigned long)entry.hdr) + subtable_len < table_end) { 332 if (max_entries && count >= max_entries) 333 break; 334 335 for (i = 0; i < proc_num; i++) { 336 if (acpi_get_entry_type(&entry) != proc[i].id) 337 continue; 338 if (!proc[i].handler || 339 (!errs && proc[i].handler(entry.hdr, table_end))) { 340 errs++; 341 continue; 342 } 343 344 proc[i].count++; 345 break; 346 } 347 if (i != proc_num) 348 count++; 349 350 /* 351 * If entry->length is 0, break from this loop to avoid 352 * infinite loop. 353 */ 354 entry_len = acpi_get_entry_length(&entry); 355 if (entry_len == 0) { 356 pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, proc->id); 357 return -EINVAL; 358 } 359 360 entry.hdr = (union acpi_subtable_headers *) 361 ((unsigned long)entry.hdr + entry_len); 362 } 363 364 if (max_entries && count > max_entries) { 365 pr_warn("[%4.4s:0x%02x] found the maximum %i entries\n", 366 id, proc->id, count); 367 } 368 369 return errs ? -EINVAL : count; 370 } 371 372 int __init acpi_table_parse_entries_array(char *id, 373 unsigned long table_size, 374 struct acpi_subtable_proc *proc, int proc_num, 375 unsigned int max_entries) 376 { 377 struct acpi_table_header *table_header = NULL; 378 int count; 379 u32 instance = 0; 380 381 if (acpi_disabled) 382 return -ENODEV; 383 384 if (!id) 385 return -EINVAL; 386 387 if (!strncmp(id, ACPI_SIG_MADT, 4)) 388 instance = acpi_apic_instance; 389 390 acpi_get_table(id, instance, &table_header); 391 if (!table_header) { 392 pr_warn("%4.4s not present\n", id); 393 return -ENODEV; 394 } 395 396 count = acpi_parse_entries_array(id, table_size, table_header, 397 proc, proc_num, max_entries); 398 399 acpi_put_table(table_header); 400 return count; 401 } 402 403 int __init acpi_table_parse_entries(char *id, 404 unsigned long table_size, 405 int entry_id, 406 acpi_tbl_entry_handler handler, 407 unsigned int max_entries) 408 { 409 struct acpi_subtable_proc proc = { 410 .id = entry_id, 411 .handler = handler, 412 }; 413 414 return acpi_table_parse_entries_array(id, table_size, &proc, 1, 415 max_entries); 416 } 417 418 int __init acpi_table_parse_madt(enum acpi_madt_type id, 419 acpi_tbl_entry_handler handler, unsigned int max_entries) 420 { 421 return acpi_table_parse_entries(ACPI_SIG_MADT, 422 sizeof(struct acpi_table_madt), id, 423 handler, max_entries); 424 } 425 426 /** 427 * acpi_table_parse - find table with @id, run @handler on it 428 * @id: table id to find 429 * @handler: handler to run 430 * 431 * Scan the ACPI System Descriptor Table (STD) for a table matching @id, 432 * run @handler on it. 433 * 434 * Return 0 if table found, -errno if not. 435 */ 436 int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler) 437 { 438 struct acpi_table_header *table = NULL; 439 440 if (acpi_disabled) 441 return -ENODEV; 442 443 if (!id || !handler) 444 return -EINVAL; 445 446 if (strncmp(id, ACPI_SIG_MADT, 4) == 0) 447 acpi_get_table(id, acpi_apic_instance, &table); 448 else 449 acpi_get_table(id, 0, &table); 450 451 if (table) { 452 handler(table); 453 acpi_put_table(table); 454 return 0; 455 } else 456 return -ENODEV; 457 } 458 459 /* 460 * The BIOS is supposed to supply a single APIC/MADT, 461 * but some report two. Provide a knob to use either. 462 * (don't you wish instance 0 and 1 were not the same?) 463 */ 464 static void __init check_multiple_madt(void) 465 { 466 struct acpi_table_header *table = NULL; 467 468 acpi_get_table(ACPI_SIG_MADT, 2, &table); 469 if (table) { 470 pr_warn("BIOS bug: multiple APIC/MADT found, using %d\n", 471 acpi_apic_instance); 472 pr_warn("If \"acpi_apic_instance=%d\" works better, " 473 "notify linux-acpi@vger.kernel.org\n", 474 acpi_apic_instance ? 0 : 2); 475 acpi_put_table(table); 476 477 } else 478 acpi_apic_instance = 0; 479 480 return; 481 } 482 483 static void acpi_table_taint(struct acpi_table_header *table) 484 { 485 pr_warn("Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n", 486 table->signature, table->oem_table_id); 487 add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE); 488 } 489 490 #ifdef CONFIG_ACPI_TABLE_UPGRADE 491 static u64 acpi_tables_addr; 492 static int all_tables_size; 493 494 /* Copied from acpica/tbutils.c:acpi_tb_checksum() */ 495 static u8 __init acpi_table_checksum(u8 *buffer, u32 length) 496 { 497 u8 sum = 0; 498 u8 *end = buffer + length; 499 500 while (buffer < end) 501 sum = (u8) (sum + *(buffer++)); 502 return sum; 503 } 504 505 /* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */ 506 static const char * const table_sigs[] = { 507 ACPI_SIG_BERT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, ACPI_SIG_EINJ, 508 ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, ACPI_SIG_MSCT, 509 ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, ACPI_SIG_ASF, 510 ACPI_SIG_BOOT, ACPI_SIG_DBGP, ACPI_SIG_DMAR, ACPI_SIG_HPET, 511 ACPI_SIG_IBFT, ACPI_SIG_IVRS, ACPI_SIG_MCFG, ACPI_SIG_MCHI, 512 ACPI_SIG_SLIC, ACPI_SIG_SPCR, ACPI_SIG_SPMI, ACPI_SIG_TCPA, 513 ACPI_SIG_UEFI, ACPI_SIG_WAET, ACPI_SIG_WDAT, ACPI_SIG_WDDT, 514 ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT, 515 ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, ACPI_SIG_IORT, 516 ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT, NULL }; 517 518 #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header) 519 520 #define NR_ACPI_INITRD_TABLES 64 521 static struct cpio_data __initdata acpi_initrd_files[NR_ACPI_INITRD_TABLES]; 522 static DECLARE_BITMAP(acpi_initrd_installed, NR_ACPI_INITRD_TABLES); 523 524 #define MAP_CHUNK_SIZE (NR_FIX_BTMAPS << PAGE_SHIFT) 525 526 void __init acpi_table_upgrade(void) 527 { 528 void *data; 529 size_t size; 530 int sig, no, table_nr = 0, total_offset = 0; 531 long offset = 0; 532 struct acpi_table_header *table; 533 char cpio_path[32] = "kernel/firmware/acpi/"; 534 struct cpio_data file; 535 536 if (IS_ENABLED(CONFIG_ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD)) { 537 data = __initramfs_start; 538 size = __initramfs_size; 539 } else { 540 data = (void *)initrd_start; 541 size = initrd_end - initrd_start; 542 } 543 544 if (data == NULL || size == 0) 545 return; 546 547 for (no = 0; no < NR_ACPI_INITRD_TABLES; no++) { 548 file = find_cpio_data(cpio_path, data, size, &offset); 549 if (!file.data) 550 break; 551 552 data += offset; 553 size -= offset; 554 555 if (file.size < sizeof(struct acpi_table_header)) { 556 pr_err("ACPI OVERRIDE: Table smaller than ACPI header [%s%s]\n", 557 cpio_path, file.name); 558 continue; 559 } 560 561 table = file.data; 562 563 for (sig = 0; table_sigs[sig]; sig++) 564 if (!memcmp(table->signature, table_sigs[sig], 4)) 565 break; 566 567 if (!table_sigs[sig]) { 568 pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n", 569 cpio_path, file.name); 570 continue; 571 } 572 if (file.size != table->length) { 573 pr_err("ACPI OVERRIDE: File length does not match table length [%s%s]\n", 574 cpio_path, file.name); 575 continue; 576 } 577 if (acpi_table_checksum(file.data, table->length)) { 578 pr_err("ACPI OVERRIDE: Bad table checksum [%s%s]\n", 579 cpio_path, file.name); 580 continue; 581 } 582 583 pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n", 584 table->signature, cpio_path, file.name, table->length); 585 586 all_tables_size += table->length; 587 acpi_initrd_files[table_nr].data = file.data; 588 acpi_initrd_files[table_nr].size = file.size; 589 table_nr++; 590 } 591 if (table_nr == 0) 592 return; 593 594 acpi_tables_addr = 595 memblock_find_in_range(0, ACPI_TABLE_UPGRADE_MAX_PHYS, 596 all_tables_size, PAGE_SIZE); 597 if (!acpi_tables_addr) { 598 WARN_ON(1); 599 return; 600 } 601 /* 602 * Only calling e820_add_reserve does not work and the 603 * tables are invalid (memory got used) later. 604 * memblock_reserve works as expected and the tables won't get modified. 605 * But it's not enough on X86 because ioremap will 606 * complain later (used by acpi_os_map_memory) that the pages 607 * that should get mapped are not marked "reserved". 608 * Both memblock_reserve and e820__range_add (via arch_reserve_mem_area) 609 * works fine. 610 */ 611 memblock_reserve(acpi_tables_addr, all_tables_size); 612 arch_reserve_mem_area(acpi_tables_addr, all_tables_size); 613 614 /* 615 * early_ioremap only can remap 256k one time. If we map all 616 * tables one time, we will hit the limit. Need to map chunks 617 * one by one during copying the same as that in relocate_initrd(). 618 */ 619 for (no = 0; no < table_nr; no++) { 620 unsigned char *src_p = acpi_initrd_files[no].data; 621 phys_addr_t size = acpi_initrd_files[no].size; 622 phys_addr_t dest_addr = acpi_tables_addr + total_offset; 623 phys_addr_t slop, clen; 624 char *dest_p; 625 626 total_offset += size; 627 628 while (size) { 629 slop = dest_addr & ~PAGE_MASK; 630 clen = size; 631 if (clen > MAP_CHUNK_SIZE - slop) 632 clen = MAP_CHUNK_SIZE - slop; 633 dest_p = early_memremap(dest_addr & PAGE_MASK, 634 clen + slop); 635 memcpy(dest_p + slop, src_p, clen); 636 early_memunmap(dest_p, clen + slop); 637 src_p += clen; 638 dest_addr += clen; 639 size -= clen; 640 } 641 } 642 } 643 644 static acpi_status 645 acpi_table_initrd_override(struct acpi_table_header *existing_table, 646 acpi_physical_address *address, u32 *length) 647 { 648 int table_offset = 0; 649 int table_index = 0; 650 struct acpi_table_header *table; 651 u32 table_length; 652 653 *length = 0; 654 *address = 0; 655 if (!acpi_tables_addr) 656 return AE_OK; 657 658 while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) { 659 table = acpi_os_map_memory(acpi_tables_addr + table_offset, 660 ACPI_HEADER_SIZE); 661 if (table_offset + table->length > all_tables_size) { 662 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 663 WARN_ON(1); 664 return AE_OK; 665 } 666 667 table_length = table->length; 668 669 /* Only override tables matched */ 670 if (memcmp(existing_table->signature, table->signature, 4) || 671 memcmp(table->oem_id, existing_table->oem_id, 672 ACPI_OEM_ID_SIZE) || 673 memcmp(table->oem_table_id, existing_table->oem_table_id, 674 ACPI_OEM_TABLE_ID_SIZE)) { 675 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 676 goto next_table; 677 } 678 /* 679 * Mark the table to avoid being used in 680 * acpi_table_initrd_scan() and check the revision. 681 */ 682 if (test_and_set_bit(table_index, acpi_initrd_installed) || 683 existing_table->oem_revision >= table->oem_revision) { 684 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 685 goto next_table; 686 } 687 688 *length = table_length; 689 *address = acpi_tables_addr + table_offset; 690 pr_info("Table Upgrade: override [%4.4s-%6.6s-%8.8s]\n", 691 table->signature, table->oem_id, 692 table->oem_table_id); 693 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 694 break; 695 696 next_table: 697 table_offset += table_length; 698 table_index++; 699 } 700 return AE_OK; 701 } 702 703 static void __init acpi_table_initrd_scan(void) 704 { 705 int table_offset = 0; 706 int table_index = 0; 707 u32 table_length; 708 struct acpi_table_header *table; 709 710 if (!acpi_tables_addr) 711 return; 712 713 while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) { 714 table = acpi_os_map_memory(acpi_tables_addr + table_offset, 715 ACPI_HEADER_SIZE); 716 if (table_offset + table->length > all_tables_size) { 717 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 718 WARN_ON(1); 719 return; 720 } 721 722 table_length = table->length; 723 724 /* Skip RSDT/XSDT which should only be used for override */ 725 if (ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_RSDT) || 726 ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_XSDT)) { 727 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 728 goto next_table; 729 } 730 /* 731 * Mark the table to avoid being used in 732 * acpi_table_initrd_override(). Though this is not possible 733 * because override is disabled in acpi_install_table(). 734 */ 735 if (test_and_set_bit(table_index, acpi_initrd_installed)) { 736 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 737 goto next_table; 738 } 739 740 pr_info("Table Upgrade: install [%4.4s-%6.6s-%8.8s]\n", 741 table->signature, table->oem_id, 742 table->oem_table_id); 743 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE); 744 acpi_install_table(acpi_tables_addr + table_offset, TRUE); 745 next_table: 746 table_offset += table_length; 747 table_index++; 748 } 749 } 750 #else 751 static acpi_status 752 acpi_table_initrd_override(struct acpi_table_header *existing_table, 753 acpi_physical_address *address, 754 u32 *table_length) 755 { 756 *table_length = 0; 757 *address = 0; 758 return AE_OK; 759 } 760 761 static void __init acpi_table_initrd_scan(void) 762 { 763 } 764 #endif /* CONFIG_ACPI_TABLE_UPGRADE */ 765 766 acpi_status 767 acpi_os_physical_table_override(struct acpi_table_header *existing_table, 768 acpi_physical_address *address, 769 u32 *table_length) 770 { 771 return acpi_table_initrd_override(existing_table, address, 772 table_length); 773 } 774 775 #ifdef CONFIG_ACPI_CUSTOM_DSDT 776 static void *amlcode __attribute__ ((weakref("AmlCode"))); 777 static void *dsdt_amlcode __attribute__ ((weakref("dsdt_aml_code"))); 778 #endif 779 780 acpi_status acpi_os_table_override(struct acpi_table_header *existing_table, 781 struct acpi_table_header **new_table) 782 { 783 if (!existing_table || !new_table) 784 return AE_BAD_PARAMETER; 785 786 *new_table = NULL; 787 788 #ifdef CONFIG_ACPI_CUSTOM_DSDT 789 if (!strncmp(existing_table->signature, "DSDT", 4)) { 790 *new_table = (struct acpi_table_header *)&amlcode; 791 if (!(*new_table)) 792 *new_table = (struct acpi_table_header *)&dsdt_amlcode; 793 } 794 #endif 795 if (*new_table != NULL) 796 acpi_table_taint(existing_table); 797 return AE_OK; 798 } 799 800 /* 801 * acpi_table_init() 802 * 803 * find RSDP, find and checksum SDT/XSDT. 804 * checksum all tables, print SDT/XSDT 805 * 806 * result: sdt_entry[] is initialized 807 */ 808 809 int __init acpi_table_init(void) 810 { 811 acpi_status status; 812 813 if (acpi_verify_table_checksum) { 814 pr_info("Early table checksum verification enabled\n"); 815 acpi_gbl_enable_table_validation = TRUE; 816 } else { 817 pr_info("Early table checksum verification disabled\n"); 818 acpi_gbl_enable_table_validation = FALSE; 819 } 820 821 status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); 822 if (ACPI_FAILURE(status)) 823 return -EINVAL; 824 acpi_table_initrd_scan(); 825 826 check_multiple_madt(); 827 return 0; 828 } 829 830 static int __init acpi_parse_apic_instance(char *str) 831 { 832 if (!str) 833 return -EINVAL; 834 835 if (kstrtoint(str, 0, &acpi_apic_instance)) 836 return -EINVAL; 837 838 pr_notice("Shall use APIC/MADT table %d\n", acpi_apic_instance); 839 840 return 0; 841 } 842 early_param("acpi_apic_instance", acpi_parse_apic_instance); 843 844 static int __init acpi_force_table_verification_setup(char *s) 845 { 846 acpi_verify_table_checksum = true; 847 848 return 0; 849 } 850 early_param("acpi_force_table_verification", acpi_force_table_verification_setup); 851 852 static int __init acpi_force_32bit_fadt_addr(char *s) 853 { 854 pr_info("Forcing 32 Bit FADT addresses\n"); 855 acpi_gbl_use32_bit_fadt_addresses = TRUE; 856 857 return 0; 858 } 859 early_param("acpi_force_32bit_fadt_addr", acpi_force_32bit_fadt_addr); 860