1 /****************************************************************************** 2 * 3 * Module Name: tbutils - ACPI Table utilities 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2013, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <acpi/acpi.h> 45 #include "accommon.h" 46 #include "actables.h" 47 48 #define _COMPONENT ACPI_TABLES 49 ACPI_MODULE_NAME("tbutils") 50 51 /* Local prototypes */ 52 static acpi_physical_address 53 acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); 54 55 /******************************************************************************* 56 * 57 * FUNCTION: acpi_tb_check_xsdt 58 * 59 * PARAMETERS: address - Pointer to the XSDT 60 * 61 * RETURN: status 62 * AE_OK - XSDT is okay 63 * AE_NO_MEMORY - can't map XSDT 64 * AE_INVALID_TABLE_LENGTH - invalid table length 65 * AE_NULL_ENTRY - XSDT has NULL entry 66 * 67 * DESCRIPTION: validate XSDT 68 ******************************************************************************/ 69 70 static acpi_status 71 acpi_tb_check_xsdt(acpi_physical_address address) 72 { 73 struct acpi_table_header *table; 74 u32 length; 75 u64 xsdt_entry_address; 76 u8 *table_entry; 77 u32 table_count; 78 int i; 79 80 table = acpi_os_map_memory(address, sizeof(struct acpi_table_header)); 81 if (!table) 82 return AE_NO_MEMORY; 83 84 length = table->length; 85 acpi_os_unmap_memory(table, sizeof(struct acpi_table_header)); 86 if (length < sizeof(struct acpi_table_header)) 87 return AE_INVALID_TABLE_LENGTH; 88 89 table = acpi_os_map_memory(address, length); 90 if (!table) 91 return AE_NO_MEMORY; 92 93 /* Calculate the number of tables described in XSDT */ 94 table_count = 95 (u32) ((table->length - 96 sizeof(struct acpi_table_header)) / sizeof(u64)); 97 table_entry = 98 ACPI_CAST_PTR(u8, table) + sizeof(struct acpi_table_header); 99 for (i = 0; i < table_count; i++) { 100 ACPI_MOVE_64_TO_64(&xsdt_entry_address, table_entry); 101 if (!xsdt_entry_address) { 102 /* XSDT has NULL entry */ 103 break; 104 } 105 table_entry += sizeof(u64); 106 } 107 acpi_os_unmap_memory(table, length); 108 109 if (i < table_count) 110 return AE_NULL_ENTRY; 111 else 112 return AE_OK; 113 } 114 115 #if (!ACPI_REDUCED_HARDWARE) 116 /******************************************************************************* 117 * 118 * FUNCTION: acpi_tb_initialize_facs 119 * 120 * PARAMETERS: None 121 * 122 * RETURN: Status 123 * 124 * DESCRIPTION: Create a permanent mapping for the FADT and save it in a global 125 * for accessing the Global Lock and Firmware Waking Vector 126 * 127 ******************************************************************************/ 128 129 acpi_status acpi_tb_initialize_facs(void) 130 { 131 acpi_status status; 132 133 /* If Hardware Reduced flag is set, there is no FACS */ 134 135 if (acpi_gbl_reduced_hardware) { 136 acpi_gbl_FACS = NULL; 137 return (AE_OK); 138 } 139 140 status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS, 141 ACPI_CAST_INDIRECT_PTR(struct 142 acpi_table_header, 143 &acpi_gbl_FACS)); 144 return (status); 145 } 146 #endif /* !ACPI_REDUCED_HARDWARE */ 147 148 /******************************************************************************* 149 * 150 * FUNCTION: acpi_tb_tables_loaded 151 * 152 * PARAMETERS: None 153 * 154 * RETURN: TRUE if required ACPI tables are loaded 155 * 156 * DESCRIPTION: Determine if the minimum required ACPI tables are present 157 * (FADT, FACS, DSDT) 158 * 159 ******************************************************************************/ 160 161 u8 acpi_tb_tables_loaded(void) 162 { 163 164 if (acpi_gbl_root_table_list.current_table_count >= 3) { 165 return (TRUE); 166 } 167 168 return (FALSE); 169 } 170 171 /******************************************************************************* 172 * 173 * FUNCTION: acpi_tb_check_dsdt_header 174 * 175 * PARAMETERS: None 176 * 177 * RETURN: None 178 * 179 * DESCRIPTION: Quick compare to check validity of the DSDT. This will detect 180 * if the DSDT has been replaced from outside the OS and/or if 181 * the DSDT header has been corrupted. 182 * 183 ******************************************************************************/ 184 185 void acpi_tb_check_dsdt_header(void) 186 { 187 188 /* Compare original length and checksum to current values */ 189 190 if (acpi_gbl_original_dsdt_header.length != acpi_gbl_DSDT->length || 191 acpi_gbl_original_dsdt_header.checksum != acpi_gbl_DSDT->checksum) { 192 ACPI_BIOS_ERROR((AE_INFO, 193 "The DSDT has been corrupted or replaced - " 194 "old, new headers below")); 195 acpi_tb_print_table_header(0, &acpi_gbl_original_dsdt_header); 196 acpi_tb_print_table_header(0, acpi_gbl_DSDT); 197 198 ACPI_ERROR((AE_INFO, 199 "Please send DMI info to linux-acpi@vger.kernel.org\n" 200 "If system does not work as expected, please boot with acpi=copy_dsdt")); 201 202 /* Disable further error messages */ 203 204 acpi_gbl_original_dsdt_header.length = acpi_gbl_DSDT->length; 205 acpi_gbl_original_dsdt_header.checksum = 206 acpi_gbl_DSDT->checksum; 207 } 208 } 209 210 /******************************************************************************* 211 * 212 * FUNCTION: acpi_tb_copy_dsdt 213 * 214 * PARAMETERS: table_desc - Installed table to copy 215 * 216 * RETURN: None 217 * 218 * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory. 219 * Some very bad BIOSs are known to either corrupt the DSDT or 220 * install a new, bad DSDT. This copy works around the problem. 221 * 222 ******************************************************************************/ 223 224 struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index) 225 { 226 struct acpi_table_header *new_table; 227 struct acpi_table_desc *table_desc; 228 229 table_desc = &acpi_gbl_root_table_list.tables[table_index]; 230 231 new_table = ACPI_ALLOCATE(table_desc->length); 232 if (!new_table) { 233 ACPI_ERROR((AE_INFO, "Could not copy DSDT of length 0x%X", 234 table_desc->length)); 235 return (NULL); 236 } 237 238 ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length); 239 acpi_tb_delete_table(table_desc); 240 table_desc->pointer = new_table; 241 table_desc->flags = ACPI_TABLE_ORIGIN_ALLOCATED; 242 243 ACPI_INFO((AE_INFO, 244 "Forced DSDT copy: length 0x%05X copied locally, original unmapped", 245 new_table->length)); 246 247 return (new_table); 248 } 249 250 /******************************************************************************* 251 * 252 * FUNCTION: acpi_tb_install_table 253 * 254 * PARAMETERS: address - Physical address of DSDT or FACS 255 * signature - Table signature, NULL if no need to 256 * match 257 * table_index - Index into root table array 258 * 259 * RETURN: None 260 * 261 * DESCRIPTION: Install an ACPI table into the global data structure. The 262 * table override mechanism is called to allow the host 263 * OS to replace any table before it is installed in the root 264 * table array. 265 * 266 ******************************************************************************/ 267 268 void 269 acpi_tb_install_table(acpi_physical_address address, 270 char *signature, u32 table_index) 271 { 272 struct acpi_table_header *table; 273 struct acpi_table_header *final_table; 274 struct acpi_table_desc *table_desc; 275 276 if (!address) { 277 ACPI_ERROR((AE_INFO, 278 "Null physical address for ACPI table [%s]", 279 signature)); 280 return; 281 } 282 283 /* Map just the table header */ 284 285 table = acpi_os_map_memory(address, sizeof(struct acpi_table_header)); 286 if (!table) { 287 ACPI_ERROR((AE_INFO, 288 "Could not map memory for table [%s] at %p", 289 signature, ACPI_CAST_PTR(void, address))); 290 return; 291 } 292 293 /* If a particular signature is expected (DSDT/FACS), it must match */ 294 295 if (signature && !ACPI_COMPARE_NAME(table->signature, signature)) { 296 ACPI_BIOS_ERROR((AE_INFO, 297 "Invalid signature 0x%X for ACPI table, expected [%s]", 298 *ACPI_CAST_PTR(u32, table->signature), 299 signature)); 300 goto unmap_and_exit; 301 } 302 303 /* 304 * Initialize the table entry. Set the pointer to NULL, since the 305 * table is not fully mapped at this time. 306 */ 307 table_desc = &acpi_gbl_root_table_list.tables[table_index]; 308 309 table_desc->address = address; 310 table_desc->pointer = NULL; 311 table_desc->length = table->length; 312 table_desc->flags = ACPI_TABLE_ORIGIN_MAPPED; 313 ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature); 314 315 /* 316 * ACPI Table Override: 317 * 318 * Before we install the table, let the host OS override it with a new 319 * one if desired. Any table within the RSDT/XSDT can be replaced, 320 * including the DSDT which is pointed to by the FADT. 321 * 322 * NOTE: If the table is overridden, then final_table will contain a 323 * mapped pointer to the full new table. If the table is not overridden, 324 * or if there has been a physical override, then the table will be 325 * fully mapped later (in verify table). In any case, we must 326 * unmap the header that was mapped above. 327 */ 328 final_table = acpi_tb_table_override(table, table_desc); 329 if (!final_table) { 330 final_table = table; /* There was no override */ 331 } 332 333 acpi_tb_print_table_header(table_desc->address, final_table); 334 335 /* Set the global integer width (based upon revision of the DSDT) */ 336 337 if (table_index == ACPI_TABLE_INDEX_DSDT) { 338 acpi_ut_set_integer_width(final_table->revision); 339 } 340 341 /* 342 * If we have a physical override during this early loading of the ACPI 343 * tables, unmap the table for now. It will be mapped again later when 344 * it is actually used. This supports very early loading of ACPI tables, 345 * before virtual memory is fully initialized and running within the 346 * host OS. Note: A logical override has the ACPI_TABLE_ORIGIN_OVERRIDE 347 * flag set and will not be deleted below. 348 */ 349 if (final_table != table) { 350 acpi_tb_delete_table(table_desc); 351 } 352 353 unmap_and_exit: 354 355 /* Always unmap the table header that we mapped above */ 356 357 acpi_os_unmap_memory(table, sizeof(struct acpi_table_header)); 358 } 359 360 /******************************************************************************* 361 * 362 * FUNCTION: acpi_tb_get_root_table_entry 363 * 364 * PARAMETERS: table_entry - Pointer to the RSDT/XSDT table entry 365 * table_entry_size - sizeof 32 or 64 (RSDT or XSDT) 366 * 367 * RETURN: Physical address extracted from the root table 368 * 369 * DESCRIPTION: Get one root table entry. Handles 32-bit and 64-bit cases on 370 * both 32-bit and 64-bit platforms 371 * 372 * NOTE: acpi_physical_address is 32-bit on 32-bit platforms, 64-bit on 373 * 64-bit platforms. 374 * 375 ******************************************************************************/ 376 377 static acpi_physical_address 378 acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size) 379 { 380 u64 address64; 381 382 /* 383 * Get the table physical address (32-bit for RSDT, 64-bit for XSDT): 384 * Note: Addresses are 32-bit aligned (not 64) in both RSDT and XSDT 385 */ 386 if (table_entry_size == sizeof(u32)) { 387 /* 388 * 32-bit platform, RSDT: Return 32-bit table entry 389 * 64-bit platform, RSDT: Expand 32-bit to 64-bit and return 390 */ 391 return ((acpi_physical_address) 392 (*ACPI_CAST_PTR(u32, table_entry))); 393 } else { 394 /* 395 * 32-bit platform, XSDT: Truncate 64-bit to 32-bit and return 396 * 64-bit platform, XSDT: Move (unaligned) 64-bit to local, 397 * return 64-bit 398 */ 399 ACPI_MOVE_64_TO_64(&address64, table_entry); 400 401 #if ACPI_MACHINE_WIDTH == 32 402 if (address64 > ACPI_UINT32_MAX) { 403 404 /* Will truncate 64-bit address to 32 bits, issue warning */ 405 406 ACPI_BIOS_WARNING((AE_INFO, 407 "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X)," 408 " truncating", 409 ACPI_FORMAT_UINT64(address64))); 410 } 411 #endif 412 return ((acpi_physical_address) (address64)); 413 } 414 } 415 416 /******************************************************************************* 417 * 418 * FUNCTION: acpi_tb_parse_root_table 419 * 420 * PARAMETERS: rsdp - Pointer to the RSDP 421 * 422 * RETURN: Status 423 * 424 * DESCRIPTION: This function is called to parse the Root System Description 425 * Table (RSDT or XSDT) 426 * 427 * NOTE: Tables are mapped (not copied) for efficiency. The FACS must 428 * be mapped and cannot be copied because it contains the actual 429 * memory location of the ACPI Global Lock. 430 * 431 ******************************************************************************/ 432 433 acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address) 434 { 435 struct acpi_table_rsdp *rsdp; 436 u32 table_entry_size; 437 u32 i; 438 u32 table_count; 439 struct acpi_table_header *table; 440 acpi_physical_address address; 441 acpi_physical_address uninitialized_var(rsdt_address); 442 u32 length; 443 u8 *table_entry; 444 acpi_status status; 445 446 ACPI_FUNCTION_TRACE(tb_parse_root_table); 447 448 /* 449 * Map the entire RSDP and extract the address of the RSDT or XSDT 450 */ 451 rsdp = acpi_os_map_memory(rsdp_address, sizeof(struct acpi_table_rsdp)); 452 if (!rsdp) { 453 return_ACPI_STATUS(AE_NO_MEMORY); 454 } 455 456 acpi_tb_print_table_header(rsdp_address, 457 ACPI_CAST_PTR(struct acpi_table_header, 458 rsdp)); 459 460 /* Differentiate between RSDT and XSDT root tables */ 461 462 if (rsdp->revision > 1 && rsdp->xsdt_physical_address 463 && !acpi_rsdt_forced) { 464 /* 465 * Root table is an XSDT (64-bit physical addresses). We must use the 466 * XSDT if the revision is > 1 and the XSDT pointer is present, as per 467 * the ACPI specification. 468 */ 469 address = (acpi_physical_address) rsdp->xsdt_physical_address; 470 table_entry_size = sizeof(u64); 471 rsdt_address = (acpi_physical_address) 472 rsdp->rsdt_physical_address; 473 } else { 474 /* Root table is an RSDT (32-bit physical addresses) */ 475 476 address = (acpi_physical_address) rsdp->rsdt_physical_address; 477 table_entry_size = sizeof(u32); 478 } 479 480 /* 481 * It is not possible to map more than one entry in some environments, 482 * so unmap the RSDP here before mapping other tables 483 */ 484 acpi_os_unmap_memory(rsdp, sizeof(struct acpi_table_rsdp)); 485 486 if (table_entry_size == sizeof(u64)) { 487 if (acpi_tb_check_xsdt(address) == AE_NULL_ENTRY) { 488 /* XSDT has NULL entry, RSDT is used */ 489 address = rsdt_address; 490 table_entry_size = sizeof(u32); 491 ACPI_WARNING((AE_INFO, "BIOS XSDT has NULL entry, " 492 "using RSDT")); 493 } 494 } 495 /* Map the RSDT/XSDT table header to get the full table length */ 496 497 table = acpi_os_map_memory(address, sizeof(struct acpi_table_header)); 498 if (!table) { 499 return_ACPI_STATUS(AE_NO_MEMORY); 500 } 501 502 acpi_tb_print_table_header(address, table); 503 504 /* Get the length of the full table, verify length and map entire table */ 505 506 length = table->length; 507 acpi_os_unmap_memory(table, sizeof(struct acpi_table_header)); 508 509 if (length < sizeof(struct acpi_table_header)) { 510 ACPI_BIOS_ERROR((AE_INFO, 511 "Invalid table length 0x%X in RSDT/XSDT", 512 length)); 513 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); 514 } 515 516 table = acpi_os_map_memory(address, length); 517 if (!table) { 518 return_ACPI_STATUS(AE_NO_MEMORY); 519 } 520 521 /* Validate the root table checksum */ 522 523 status = acpi_tb_verify_checksum(table, length); 524 if (ACPI_FAILURE(status)) { 525 acpi_os_unmap_memory(table, length); 526 return_ACPI_STATUS(status); 527 } 528 529 /* Calculate the number of tables described in the root table */ 530 531 table_count = (u32)((table->length - sizeof(struct acpi_table_header)) / 532 table_entry_size); 533 /* 534 * First two entries in the table array are reserved for the DSDT 535 * and FACS, which are not actually present in the RSDT/XSDT - they 536 * come from the FADT 537 */ 538 table_entry = 539 ACPI_CAST_PTR(u8, table) + sizeof(struct acpi_table_header); 540 acpi_gbl_root_table_list.current_table_count = 2; 541 542 /* 543 * Initialize the root table array from the RSDT/XSDT 544 */ 545 for (i = 0; i < table_count; i++) { 546 if (acpi_gbl_root_table_list.current_table_count >= 547 acpi_gbl_root_table_list.max_table_count) { 548 549 /* There is no more room in the root table array, attempt resize */ 550 551 status = acpi_tb_resize_root_table_list(); 552 if (ACPI_FAILURE(status)) { 553 ACPI_WARNING((AE_INFO, 554 "Truncating %u table entries!", 555 (unsigned) (table_count - 556 (acpi_gbl_root_table_list. 557 current_table_count - 558 2)))); 559 break; 560 } 561 } 562 563 /* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */ 564 565 acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list. 566 current_table_count].address = 567 acpi_tb_get_root_table_entry(table_entry, table_entry_size); 568 569 table_entry += table_entry_size; 570 acpi_gbl_root_table_list.current_table_count++; 571 } 572 573 /* 574 * It is not possible to map more than one entry in some environments, 575 * so unmap the root table here before mapping other tables 576 */ 577 acpi_os_unmap_memory(table, length); 578 579 /* 580 * Complete the initialization of the root table array by examining 581 * the header of each table 582 */ 583 for (i = 2; i < acpi_gbl_root_table_list.current_table_count; i++) { 584 acpi_tb_install_table(acpi_gbl_root_table_list.tables[i]. 585 address, NULL, i); 586 587 /* Special case for FADT - get the DSDT and FACS */ 588 589 if (ACPI_COMPARE_NAME 590 (&acpi_gbl_root_table_list.tables[i].signature, 591 ACPI_SIG_FADT)) { 592 acpi_tb_parse_fadt(i); 593 } 594 } 595 596 return_ACPI_STATUS(AE_OK); 597 } 598