1 /****************************************************************************** 2 * 3 * Module Name: dttable.c - handling for specific ACPI tables 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 #define __DTTABLE_C__ 45 46 /* Compile all complex data tables */ 47 48 #include "aslcompiler.h" 49 #include "dtcompiler.h" 50 51 #define _COMPONENT DT_COMPILER 52 ACPI_MODULE_NAME ("dttable") 53 54 55 /* TBD: merge these into dmtbinfo.c? */ 56 57 static ACPI_DMTABLE_INFO TableInfoAsfAddress[] = 58 { 59 {ACPI_DMT_BUFFER, 0, "Addresses", 0}, 60 {ACPI_DMT_EXIT, 0, NULL, 0} 61 }; 62 63 static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] = 64 { 65 {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0}, 66 {ACPI_DMT_EXIT, 0, NULL, 0} 67 }; 68 69 70 /* TBD: move to acmacros.h */ 71 72 #define ACPI_SUB_PTR(t, a, b) \ 73 ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b))) 74 75 76 /* Local prototypes */ 77 78 static ACPI_STATUS 79 DtCompileTwoSubtables ( 80 void **List, 81 ACPI_DMTABLE_INFO *TableInfo1, 82 ACPI_DMTABLE_INFO *TableInfo2); 83 84 85 /****************************************************************************** 86 * 87 * FUNCTION: DtCompileTwoSubtables 88 * 89 * PARAMETERS: List - Current field list pointer 90 * TableInfo1 - Info table 1 91 * TableInfo1 - Info table 2 92 * 93 * RETURN: Status 94 * 95 * DESCRIPTION: Compile tables with a header and one or more same subtables. 96 * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT 97 * 98 *****************************************************************************/ 99 100 static ACPI_STATUS 101 DtCompileTwoSubtables ( 102 void **List, 103 ACPI_DMTABLE_INFO *TableInfo1, 104 ACPI_DMTABLE_INFO *TableInfo2) 105 { 106 ACPI_STATUS Status; 107 DT_SUBTABLE *Subtable; 108 DT_SUBTABLE *ParentTable; 109 DT_FIELD **PFieldList = (DT_FIELD **) List; 110 111 112 Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE); 113 if (ACPI_FAILURE (Status)) 114 { 115 return (Status); 116 } 117 118 ParentTable = DtPeekSubtable (); 119 DtInsertSubtable (ParentTable, Subtable); 120 121 while (*PFieldList) 122 { 123 Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE); 124 if (ACPI_FAILURE (Status)) 125 { 126 return (Status); 127 } 128 129 DtInsertSubtable (ParentTable, Subtable); 130 } 131 132 return (AE_OK); 133 } 134 135 136 /****************************************************************************** 137 * 138 * FUNCTION: DtCompileFacs 139 * 140 * PARAMETERS: PFieldList - Current field list pointer 141 * 142 * RETURN: Status 143 * 144 * DESCRIPTION: Compile FACS. 145 * 146 *****************************************************************************/ 147 148 ACPI_STATUS 149 DtCompileFacs ( 150 DT_FIELD **PFieldList) 151 { 152 DT_SUBTABLE *Subtable; 153 UINT8 *ReservedBuffer; 154 ACPI_STATUS Status; 155 UINT32 ReservedSize; 156 157 158 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs, 159 &Gbl_RootTable, TRUE); 160 if (ACPI_FAILURE (Status)) 161 { 162 return (Status); 163 } 164 165 /* Large FACS reserved area at the end of the table */ 166 167 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1); 168 ReservedBuffer = UtLocalCalloc (ReservedSize); 169 170 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 171 172 ACPI_FREE (ReservedBuffer); 173 DtInsertSubtable (Gbl_RootTable, Subtable); 174 return (AE_OK); 175 } 176 177 178 /****************************************************************************** 179 * 180 * FUNCTION: DtCompileRsdp 181 * 182 * PARAMETERS: PFieldList - Current field list pointer 183 * 184 * RETURN: Status 185 * 186 * DESCRIPTION: Compile RSDP. 187 * 188 *****************************************************************************/ 189 190 ACPI_STATUS 191 DtCompileRsdp ( 192 DT_FIELD **PFieldList) 193 { 194 DT_SUBTABLE *Subtable; 195 ACPI_TABLE_RSDP *Rsdp; 196 ACPI_RSDP_EXTENSION *RsdpExtension; 197 ACPI_STATUS Status; 198 199 200 /* Compile the "common" RSDP (ACPI 1.0) */ 201 202 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1, 203 &Gbl_RootTable, TRUE); 204 if (ACPI_FAILURE (Status)) 205 { 206 return (Status); 207 } 208 209 Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer); 210 DtSetTableChecksum (&Rsdp->Checksum); 211 212 if (Rsdp->Revision > 0) 213 { 214 /* Compile the "extended" part of the RSDP as a subtable */ 215 216 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2, 217 &Subtable, TRUE); 218 if (ACPI_FAILURE (Status)) 219 { 220 return (Status); 221 } 222 223 DtInsertSubtable (Gbl_RootTable, Subtable); 224 225 /* Set length and extended checksum for entire RSDP */ 226 227 RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer); 228 RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length; 229 DtSetTableChecksum (&RsdpExtension->ExtendedChecksum); 230 } 231 232 return (AE_OK); 233 } 234 235 236 /****************************************************************************** 237 * 238 * FUNCTION: DtCompileAsf 239 * 240 * PARAMETERS: List - Current field list pointer 241 * 242 * RETURN: Status 243 * 244 * DESCRIPTION: Compile ASF!. 245 * 246 *****************************************************************************/ 247 248 ACPI_STATUS 249 DtCompileAsf ( 250 void **List) 251 { 252 ACPI_ASF_INFO *AsfTable; 253 DT_SUBTABLE *Subtable; 254 DT_SUBTABLE *ParentTable; 255 ACPI_DMTABLE_INFO *InfoTable; 256 ACPI_DMTABLE_INFO *DataInfoTable = NULL; 257 UINT32 DataCount = 0; 258 ACPI_STATUS Status; 259 UINT32 i; 260 DT_FIELD **PFieldList = (DT_FIELD **) List; 261 DT_FIELD *SubtableStart; 262 263 264 while (*PFieldList) 265 { 266 SubtableStart = *PFieldList; 267 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr, 268 &Subtable, TRUE); 269 if (ACPI_FAILURE (Status)) 270 { 271 return (Status); 272 } 273 274 ParentTable = DtPeekSubtable (); 275 DtInsertSubtable (ParentTable, Subtable); 276 DtPushSubtable (Subtable); 277 278 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer); 279 280 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 281 { 282 case ACPI_ASF_TYPE_INFO: 283 284 InfoTable = AcpiDmTableInfoAsf0; 285 break; 286 287 case ACPI_ASF_TYPE_ALERT: 288 289 InfoTable = AcpiDmTableInfoAsf1; 290 break; 291 292 case ACPI_ASF_TYPE_CONTROL: 293 294 InfoTable = AcpiDmTableInfoAsf2; 295 break; 296 297 case ACPI_ASF_TYPE_BOOT: 298 299 InfoTable = AcpiDmTableInfoAsf3; 300 break; 301 302 case ACPI_ASF_TYPE_ADDRESS: 303 304 InfoTable = AcpiDmTableInfoAsf4; 305 break; 306 307 default: 308 309 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 310 return (AE_ERROR); 311 } 312 313 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 314 if (ACPI_FAILURE (Status)) 315 { 316 return (Status); 317 } 318 319 ParentTable = DtPeekSubtable (); 320 DtInsertSubtable (ParentTable, Subtable); 321 322 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 323 { 324 case ACPI_ASF_TYPE_INFO: 325 326 DataInfoTable = NULL; 327 break; 328 329 case ACPI_ASF_TYPE_ALERT: 330 331 DataInfoTable = AcpiDmTableInfoAsf1a; 332 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, 333 ACPI_SUB_PTR (UINT8, Subtable->Buffer, 334 sizeof (ACPI_ASF_HEADER)))->Alerts; 335 break; 336 337 case ACPI_ASF_TYPE_CONTROL: 338 339 DataInfoTable = AcpiDmTableInfoAsf2a; 340 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, 341 ACPI_SUB_PTR (UINT8, Subtable->Buffer, 342 sizeof (ACPI_ASF_HEADER)))->Controls; 343 break; 344 345 case ACPI_ASF_TYPE_BOOT: 346 347 DataInfoTable = NULL; 348 break; 349 350 case ACPI_ASF_TYPE_ADDRESS: 351 352 DataInfoTable = TableInfoAsfAddress; 353 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, 354 ACPI_SUB_PTR (UINT8, Subtable->Buffer, 355 sizeof (ACPI_ASF_HEADER)))->Devices; 356 break; 357 358 default: 359 360 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 361 return (AE_ERROR); 362 } 363 364 if (DataInfoTable) 365 { 366 switch (AsfTable->Header.Type & 0x7F) 367 { 368 case ACPI_ASF_TYPE_ADDRESS: 369 370 while (DataCount > 0) 371 { 372 Status = DtCompileTable (PFieldList, DataInfoTable, 373 &Subtable, TRUE); 374 if (ACPI_FAILURE (Status)) 375 { 376 return (Status); 377 } 378 379 DtInsertSubtable (ParentTable, Subtable); 380 DataCount = DataCount - Subtable->Length; 381 } 382 break; 383 384 default: 385 386 for (i = 0; i < DataCount; i++) 387 { 388 Status = DtCompileTable (PFieldList, DataInfoTable, 389 &Subtable, TRUE); 390 if (ACPI_FAILURE (Status)) 391 { 392 return (Status); 393 } 394 395 DtInsertSubtable (ParentTable, Subtable); 396 } 397 break; 398 } 399 } 400 401 DtPopSubtable (); 402 } 403 404 return (AE_OK); 405 } 406 407 408 /****************************************************************************** 409 * 410 * FUNCTION: DtCompileCpep 411 * 412 * PARAMETERS: List - Current field list pointer 413 * 414 * RETURN: Status 415 * 416 * DESCRIPTION: Compile CPEP. 417 * 418 *****************************************************************************/ 419 420 ACPI_STATUS 421 DtCompileCpep ( 422 void **List) 423 { 424 ACPI_STATUS Status; 425 426 427 Status = DtCompileTwoSubtables (List, 428 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0); 429 return (Status); 430 } 431 432 433 /****************************************************************************** 434 * 435 * FUNCTION: DtCompileCsrt 436 * 437 * PARAMETERS: List - Current field list pointer 438 * 439 * RETURN: Status 440 * 441 * DESCRIPTION: Compile CSRT. 442 * 443 *****************************************************************************/ 444 445 ACPI_STATUS 446 DtCompileCsrt ( 447 void **List) 448 { 449 ACPI_STATUS Status = AE_OK; 450 DT_SUBTABLE *Subtable; 451 DT_SUBTABLE *ParentTable; 452 DT_FIELD **PFieldList = (DT_FIELD **) List; 453 UINT32 DescriptorCount; 454 UINT32 GroupLength; 455 456 457 /* Sub-tables (Resource Groups) */ 458 459 while (*PFieldList) 460 { 461 /* Resource group subtable */ 462 463 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0, 464 &Subtable, TRUE); 465 if (ACPI_FAILURE (Status)) 466 { 467 return (Status); 468 } 469 470 /* Compute the number of resource descriptors */ 471 472 GroupLength = 473 (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 474 Subtable->Buffer))->Length - 475 (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 476 Subtable->Buffer))->SharedInfoLength - 477 sizeof (ACPI_CSRT_GROUP); 478 479 DescriptorCount = (GroupLength / 480 sizeof (ACPI_CSRT_DESCRIPTOR)); 481 482 ParentTable = DtPeekSubtable (); 483 DtInsertSubtable (ParentTable, Subtable); 484 DtPushSubtable (Subtable); 485 486 /* Shared info subtable (One per resource group) */ 487 488 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1, 489 &Subtable, TRUE); 490 if (ACPI_FAILURE (Status)) 491 { 492 return (Status); 493 } 494 495 ParentTable = DtPeekSubtable (); 496 DtInsertSubtable (ParentTable, Subtable); 497 498 /* Sub-Subtables (Resource Descriptors) */ 499 500 while (*PFieldList && DescriptorCount) 501 { 502 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2, 503 &Subtable, TRUE); 504 if (ACPI_FAILURE (Status)) 505 { 506 return (Status); 507 } 508 509 ParentTable = DtPeekSubtable (); 510 DtInsertSubtable (ParentTable, Subtable); 511 DescriptorCount--; 512 } 513 514 DtPopSubtable (); 515 } 516 517 return (Status); 518 } 519 520 521 /****************************************************************************** 522 * 523 * FUNCTION: DtCompileDbg2 524 * 525 * PARAMETERS: List - Current field list pointer 526 * 527 * RETURN: Status 528 * 529 * DESCRIPTION: Compile DBG2. 530 * 531 *****************************************************************************/ 532 533 ACPI_STATUS 534 DtCompileDbg2 ( 535 void **List) 536 { 537 ACPI_STATUS Status; 538 DT_SUBTABLE *Subtable; 539 DT_SUBTABLE *ParentTable; 540 DT_FIELD **PFieldList = (DT_FIELD **) List; 541 UINT32 SubtableCount; 542 ACPI_DBG2_HEADER *Dbg2Header; 543 ACPI_DBG2_DEVICE *DeviceInfo; 544 UINT16 CurrentOffset; 545 UINT32 i; 546 547 548 /* Main table */ 549 550 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE); 551 if (ACPI_FAILURE (Status)) 552 { 553 return (Status); 554 } 555 556 ParentTable = DtPeekSubtable (); 557 DtInsertSubtable (ParentTable, Subtable); 558 559 /* Main table fields */ 560 561 Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer); 562 Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( 563 ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); 564 565 SubtableCount = Dbg2Header->InfoCount; 566 DtPushSubtable (Subtable); 567 568 /* Process all Device Information subtables (Count = InfoCount) */ 569 570 while (*PFieldList && SubtableCount) 571 { 572 /* Subtable: Debug Device Information */ 573 574 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device, 575 &Subtable, TRUE); 576 if (ACPI_FAILURE (Status)) 577 { 578 return (Status); 579 } 580 581 DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer); 582 CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE); 583 584 ParentTable = DtPeekSubtable (); 585 DtInsertSubtable (ParentTable, Subtable); 586 DtPushSubtable (Subtable); 587 588 ParentTable = DtPeekSubtable (); 589 590 /* BaseAddressRegister GAS array (Required, size is RegisterCount) */ 591 592 DeviceInfo->BaseAddressOffset = CurrentOffset; 593 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 594 { 595 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr, 596 &Subtable, TRUE); 597 if (ACPI_FAILURE (Status)) 598 { 599 return (Status); 600 } 601 602 CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS); 603 DtInsertSubtable (ParentTable, Subtable); 604 } 605 606 /* AddressSize array (Required, size = RegisterCount) */ 607 608 DeviceInfo->AddressSizeOffset = CurrentOffset; 609 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 610 { 611 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size, 612 &Subtable, TRUE); 613 if (ACPI_FAILURE (Status)) 614 { 615 return (Status); 616 } 617 618 CurrentOffset += (UINT16) sizeof (UINT32); 619 DtInsertSubtable (ParentTable, Subtable); 620 } 621 622 /* NamespaceString device identifier (Required, size = NamePathLength) */ 623 624 DeviceInfo->NamepathOffset = CurrentOffset; 625 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name, 626 &Subtable, TRUE); 627 if (ACPI_FAILURE (Status)) 628 { 629 return (Status); 630 } 631 632 /* Update the device info header */ 633 634 DeviceInfo->NamepathLength = (UINT16) Subtable->Length; 635 CurrentOffset += (UINT16) DeviceInfo->NamepathLength; 636 DtInsertSubtable (ParentTable, Subtable); 637 638 /* OemData - Variable-length data (Optional, size = OemDataLength) */ 639 640 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData, 641 &Subtable, TRUE); 642 if (ACPI_FAILURE (Status)) 643 { 644 return (Status); 645 } 646 647 /* Update the device info header (zeros if no OEM data present) */ 648 649 DeviceInfo->OemDataOffset = 0; 650 DeviceInfo->OemDataLength = 0; 651 652 /* Optional subtable (OemData) */ 653 654 if (Subtable && Subtable->Length) 655 { 656 DeviceInfo->OemDataOffset = CurrentOffset; 657 DeviceInfo->OemDataLength = (UINT16) Subtable->Length; 658 659 DtInsertSubtable (ParentTable, Subtable); 660 } 661 662 SubtableCount--; 663 DtPopSubtable (); /* Get next Device Information subtable */ 664 } 665 666 DtPopSubtable (); 667 return (AE_OK); 668 } 669 670 671 /****************************************************************************** 672 * 673 * FUNCTION: DtCompileDmar 674 * 675 * PARAMETERS: List - Current field list pointer 676 * 677 * RETURN: Status 678 * 679 * DESCRIPTION: Compile DMAR. 680 * 681 *****************************************************************************/ 682 683 ACPI_STATUS 684 DtCompileDmar ( 685 void **List) 686 { 687 ACPI_STATUS Status; 688 DT_SUBTABLE *Subtable; 689 DT_SUBTABLE *ParentTable; 690 DT_FIELD **PFieldList = (DT_FIELD **) List; 691 DT_FIELD *SubtableStart; 692 ACPI_DMTABLE_INFO *InfoTable; 693 ACPI_DMAR_HEADER *DmarHeader; 694 ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope; 695 UINT32 DeviceScopeLength; 696 UINT32 PciPathLength; 697 698 699 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE); 700 if (ACPI_FAILURE (Status)) 701 { 702 return (Status); 703 } 704 705 ParentTable = DtPeekSubtable (); 706 DtInsertSubtable (ParentTable, Subtable); 707 DtPushSubtable (Subtable); 708 709 while (*PFieldList) 710 { 711 /* DMAR Header */ 712 713 SubtableStart = *PFieldList; 714 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr, 715 &Subtable, TRUE); 716 if (ACPI_FAILURE (Status)) 717 { 718 return (Status); 719 } 720 721 ParentTable = DtPeekSubtable (); 722 DtInsertSubtable (ParentTable, Subtable); 723 DtPushSubtable (Subtable); 724 725 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); 726 727 switch (DmarHeader->Type) 728 { 729 case ACPI_DMAR_TYPE_HARDWARE_UNIT: 730 731 InfoTable = AcpiDmTableInfoDmar0; 732 break; 733 734 case ACPI_DMAR_TYPE_RESERVED_MEMORY: 735 736 InfoTable = AcpiDmTableInfoDmar1; 737 break; 738 739 case ACPI_DMAR_TYPE_ATSR: 740 741 InfoTable = AcpiDmTableInfoDmar2; 742 break; 743 744 case ACPI_DMAR_HARDWARE_AFFINITY: 745 746 InfoTable = AcpiDmTableInfoDmar3; 747 break; 748 749 default: 750 751 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); 752 return (AE_ERROR); 753 } 754 755 /* DMAR Subtable */ 756 757 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 758 if (ACPI_FAILURE (Status)) 759 { 760 return (Status); 761 } 762 763 ParentTable = DtPeekSubtable (); 764 DtInsertSubtable (ParentTable, Subtable); 765 DtPushSubtable (Subtable); 766 767 /* Optional Device Scope subtables */ 768 769 DeviceScopeLength = DmarHeader->Length - Subtable->Length - 770 ParentTable->Length; 771 while (DeviceScopeLength) 772 { 773 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, 774 &Subtable, FALSE); 775 if (Status == AE_NOT_FOUND) 776 { 777 break; 778 } 779 780 ParentTable = DtPeekSubtable (); 781 DtInsertSubtable (ParentTable, Subtable); 782 DtPushSubtable (Subtable); 783 784 DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer); 785 786 /* Optional PCI Paths */ 787 788 PciPathLength = DmarDeviceScope->Length - Subtable->Length; 789 while (PciPathLength) 790 { 791 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath, 792 &Subtable, FALSE); 793 if (Status == AE_NOT_FOUND) 794 { 795 DtPopSubtable (); 796 break; 797 } 798 799 ParentTable = DtPeekSubtable (); 800 DtInsertSubtable (ParentTable, Subtable); 801 PciPathLength -= Subtable->Length; 802 } 803 804 DtPopSubtable (); 805 DeviceScopeLength -= DmarDeviceScope->Length; 806 } 807 808 DtPopSubtable (); 809 DtPopSubtable (); 810 } 811 812 return (AE_OK); 813 } 814 815 816 /****************************************************************************** 817 * 818 * FUNCTION: DtCompileEinj 819 * 820 * PARAMETERS: List - Current field list pointer 821 * 822 * RETURN: Status 823 * 824 * DESCRIPTION: Compile EINJ. 825 * 826 *****************************************************************************/ 827 828 ACPI_STATUS 829 DtCompileEinj ( 830 void **List) 831 { 832 ACPI_STATUS Status; 833 834 835 Status = DtCompileTwoSubtables (List, 836 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0); 837 return (Status); 838 } 839 840 841 /****************************************************************************** 842 * 843 * FUNCTION: DtCompileErst 844 * 845 * PARAMETERS: List - Current field list pointer 846 * 847 * RETURN: Status 848 * 849 * DESCRIPTION: Compile ERST. 850 * 851 *****************************************************************************/ 852 853 ACPI_STATUS 854 DtCompileErst ( 855 void **List) 856 { 857 ACPI_STATUS Status; 858 859 860 Status = DtCompileTwoSubtables (List, 861 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0); 862 return (Status); 863 } 864 865 866 /****************************************************************************** 867 * 868 * FUNCTION: DtCompileFadt 869 * 870 * PARAMETERS: List - Current field list pointer 871 * 872 * RETURN: Status 873 * 874 * DESCRIPTION: Compile FADT. 875 * 876 *****************************************************************************/ 877 878 ACPI_STATUS 879 DtCompileFadt ( 880 void **List) 881 { 882 ACPI_STATUS Status; 883 DT_SUBTABLE *Subtable; 884 DT_SUBTABLE *ParentTable; 885 DT_FIELD **PFieldList = (DT_FIELD **) List; 886 ACPI_TABLE_HEADER *Table; 887 UINT8 Revision; 888 889 890 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, 891 &Subtable, TRUE); 892 if (ACPI_FAILURE (Status)) 893 { 894 return (Status); 895 } 896 897 ParentTable = DtPeekSubtable (); 898 DtInsertSubtable (ParentTable, Subtable); 899 900 Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 901 Revision = Table->Revision; 902 903 if (Revision == 2) 904 { 905 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2, 906 &Subtable, TRUE); 907 if (ACPI_FAILURE (Status)) 908 { 909 return (Status); 910 } 911 912 DtInsertSubtable (ParentTable, Subtable); 913 } 914 else if (Revision >= 2) 915 { 916 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, 917 &Subtable, TRUE); 918 if (ACPI_FAILURE (Status)) 919 { 920 return (Status); 921 } 922 923 DtInsertSubtable (ParentTable, Subtable); 924 925 if (Revision >= 5) 926 { 927 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, 928 &Subtable, TRUE); 929 if (ACPI_FAILURE (Status)) 930 { 931 return (Status); 932 } 933 934 DtInsertSubtable (ParentTable, Subtable); 935 } 936 } 937 938 return (AE_OK); 939 } 940 941 942 /****************************************************************************** 943 * 944 * FUNCTION: DtCompileFpdt 945 * 946 * PARAMETERS: List - Current field list pointer 947 * 948 * RETURN: Status 949 * 950 * DESCRIPTION: Compile FPDT. 951 * 952 *****************************************************************************/ 953 954 ACPI_STATUS 955 DtCompileFpdt ( 956 void **List) 957 { 958 ACPI_STATUS Status; 959 ACPI_FPDT_HEADER *FpdtHeader; 960 DT_SUBTABLE *Subtable; 961 DT_SUBTABLE *ParentTable; 962 ACPI_DMTABLE_INFO *InfoTable; 963 DT_FIELD **PFieldList = (DT_FIELD **) List; 964 DT_FIELD *SubtableStart; 965 966 967 while (*PFieldList) 968 { 969 SubtableStart = *PFieldList; 970 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr, 971 &Subtable, TRUE); 972 if (ACPI_FAILURE (Status)) 973 { 974 return (Status); 975 } 976 977 ParentTable = DtPeekSubtable (); 978 DtInsertSubtable (ParentTable, Subtable); 979 DtPushSubtable (Subtable); 980 981 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 982 983 switch (FpdtHeader->Type) 984 { 985 case ACPI_FPDT_TYPE_BOOT: 986 987 InfoTable = AcpiDmTableInfoFpdt0; 988 break; 989 990 case ACPI_FPDT_TYPE_S3PERF: 991 992 InfoTable = AcpiDmTableInfoFpdt1; 993 break; 994 995 default: 996 997 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT"); 998 return (AE_ERROR); 999 break; 1000 } 1001 1002 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1003 if (ACPI_FAILURE (Status)) 1004 { 1005 return (Status); 1006 } 1007 1008 ParentTable = DtPeekSubtable (); 1009 DtInsertSubtable (ParentTable, Subtable); 1010 DtPopSubtable (); 1011 } 1012 1013 return (AE_OK); 1014 } 1015 1016 1017 /****************************************************************************** 1018 * 1019 * FUNCTION: DtCompileHest 1020 * 1021 * PARAMETERS: List - Current field list pointer 1022 * 1023 * RETURN: Status 1024 * 1025 * DESCRIPTION: Compile HEST. 1026 * 1027 *****************************************************************************/ 1028 1029 ACPI_STATUS 1030 DtCompileHest ( 1031 void **List) 1032 { 1033 ACPI_STATUS Status; 1034 DT_SUBTABLE *Subtable; 1035 DT_SUBTABLE *ParentTable; 1036 DT_FIELD **PFieldList = (DT_FIELD **) List; 1037 DT_FIELD *SubtableStart; 1038 ACPI_DMTABLE_INFO *InfoTable; 1039 UINT16 Type; 1040 UINT32 BankCount; 1041 1042 1043 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest, 1044 &Subtable, TRUE); 1045 if (ACPI_FAILURE (Status)) 1046 { 1047 return (Status); 1048 } 1049 1050 ParentTable = DtPeekSubtable (); 1051 DtInsertSubtable (ParentTable, Subtable); 1052 1053 while (*PFieldList) 1054 { 1055 /* Get subtable type */ 1056 1057 SubtableStart = *PFieldList; 1058 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 1059 1060 switch (Type) 1061 { 1062 case ACPI_HEST_TYPE_IA32_CHECK: 1063 1064 InfoTable = AcpiDmTableInfoHest0; 1065 break; 1066 1067 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1068 1069 InfoTable = AcpiDmTableInfoHest1; 1070 break; 1071 1072 case ACPI_HEST_TYPE_IA32_NMI: 1073 1074 InfoTable = AcpiDmTableInfoHest2; 1075 break; 1076 1077 case ACPI_HEST_TYPE_AER_ROOT_PORT: 1078 1079 InfoTable = AcpiDmTableInfoHest6; 1080 break; 1081 1082 case ACPI_HEST_TYPE_AER_ENDPOINT: 1083 1084 InfoTable = AcpiDmTableInfoHest7; 1085 break; 1086 1087 case ACPI_HEST_TYPE_AER_BRIDGE: 1088 1089 InfoTable = AcpiDmTableInfoHest8; 1090 break; 1091 1092 case ACPI_HEST_TYPE_GENERIC_ERROR: 1093 1094 InfoTable = AcpiDmTableInfoHest9; 1095 break; 1096 1097 default: 1098 1099 /* Cannot continue on unknown type */ 1100 1101 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); 1102 return (AE_ERROR); 1103 } 1104 1105 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1106 if (ACPI_FAILURE (Status)) 1107 { 1108 return (Status); 1109 } 1110 1111 DtInsertSubtable (ParentTable, Subtable); 1112 1113 /* 1114 * Additional subtable data - IA32 Error Bank(s) 1115 */ 1116 BankCount = 0; 1117 switch (Type) 1118 { 1119 case ACPI_HEST_TYPE_IA32_CHECK: 1120 1121 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1122 Subtable->Buffer))->NumHardwareBanks; 1123 break; 1124 1125 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1126 1127 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1128 Subtable->Buffer))->NumHardwareBanks; 1129 break; 1130 1131 default: 1132 1133 break; 1134 } 1135 1136 while (BankCount) 1137 { 1138 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank, 1139 &Subtable, TRUE); 1140 if (ACPI_FAILURE (Status)) 1141 { 1142 return (Status); 1143 } 1144 1145 DtInsertSubtable (ParentTable, Subtable); 1146 BankCount--; 1147 } 1148 } 1149 1150 return (AE_OK); 1151 } 1152 1153 1154 /****************************************************************************** 1155 * 1156 * FUNCTION: DtCompileIvrs 1157 * 1158 * PARAMETERS: List - Current field list pointer 1159 * 1160 * RETURN: Status 1161 * 1162 * DESCRIPTION: Compile IVRS. 1163 * 1164 *****************************************************************************/ 1165 1166 ACPI_STATUS 1167 DtCompileIvrs ( 1168 void **List) 1169 { 1170 ACPI_STATUS Status; 1171 DT_SUBTABLE *Subtable; 1172 DT_SUBTABLE *ParentTable; 1173 DT_FIELD **PFieldList = (DT_FIELD **) List; 1174 DT_FIELD *SubtableStart; 1175 ACPI_DMTABLE_INFO *InfoTable; 1176 ACPI_IVRS_HEADER *IvrsHeader; 1177 UINT8 EntryType; 1178 1179 1180 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs, 1181 &Subtable, TRUE); 1182 if (ACPI_FAILURE (Status)) 1183 { 1184 return (Status); 1185 } 1186 1187 ParentTable = DtPeekSubtable (); 1188 DtInsertSubtable (ParentTable, Subtable); 1189 1190 while (*PFieldList) 1191 { 1192 SubtableStart = *PFieldList; 1193 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr, 1194 &Subtable, TRUE); 1195 if (ACPI_FAILURE (Status)) 1196 { 1197 return (Status); 1198 } 1199 1200 ParentTable = DtPeekSubtable (); 1201 DtInsertSubtable (ParentTable, Subtable); 1202 DtPushSubtable (Subtable); 1203 1204 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer); 1205 1206 switch (IvrsHeader->Type) 1207 { 1208 case ACPI_IVRS_TYPE_HARDWARE: 1209 1210 InfoTable = AcpiDmTableInfoIvrs0; 1211 break; 1212 1213 case ACPI_IVRS_TYPE_MEMORY1: 1214 case ACPI_IVRS_TYPE_MEMORY2: 1215 case ACPI_IVRS_TYPE_MEMORY3: 1216 1217 InfoTable = AcpiDmTableInfoIvrs1; 1218 break; 1219 1220 default: 1221 1222 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS"); 1223 return (AE_ERROR); 1224 } 1225 1226 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1227 if (ACPI_FAILURE (Status)) 1228 { 1229 return (Status); 1230 } 1231 1232 ParentTable = DtPeekSubtable (); 1233 DtInsertSubtable (ParentTable, Subtable); 1234 1235 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE) 1236 { 1237 while (*PFieldList && 1238 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type")) 1239 { 1240 SubtableStart = *PFieldList; 1241 DtCompileInteger (&EntryType, *PFieldList, 1, 0); 1242 1243 switch (EntryType) 1244 { 1245 /* 4-byte device entries */ 1246 1247 case ACPI_IVRS_TYPE_PAD4: 1248 case ACPI_IVRS_TYPE_ALL: 1249 case ACPI_IVRS_TYPE_SELECT: 1250 case ACPI_IVRS_TYPE_START: 1251 case ACPI_IVRS_TYPE_END: 1252 1253 InfoTable = AcpiDmTableInfoIvrs4; 1254 break; 1255 1256 /* 8-byte entries, type A */ 1257 1258 case ACPI_IVRS_TYPE_ALIAS_SELECT: 1259 case ACPI_IVRS_TYPE_ALIAS_START: 1260 1261 InfoTable = AcpiDmTableInfoIvrs8a; 1262 break; 1263 1264 /* 8-byte entries, type B */ 1265 1266 case ACPI_IVRS_TYPE_PAD8: 1267 case ACPI_IVRS_TYPE_EXT_SELECT: 1268 case ACPI_IVRS_TYPE_EXT_START: 1269 1270 InfoTable = AcpiDmTableInfoIvrs8b; 1271 break; 1272 1273 /* 8-byte entries, type C */ 1274 1275 case ACPI_IVRS_TYPE_SPECIAL: 1276 1277 InfoTable = AcpiDmTableInfoIvrs8c; 1278 break; 1279 1280 default: 1281 1282 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, 1283 "IVRS Device Entry"); 1284 return (AE_ERROR); 1285 } 1286 1287 Status = DtCompileTable (PFieldList, InfoTable, 1288 &Subtable, TRUE); 1289 if (ACPI_FAILURE (Status)) 1290 { 1291 return (Status); 1292 } 1293 1294 DtInsertSubtable (ParentTable, Subtable); 1295 } 1296 } 1297 1298 DtPopSubtable (); 1299 } 1300 1301 return (AE_OK); 1302 } 1303 1304 1305 /****************************************************************************** 1306 * 1307 * FUNCTION: DtCompileMadt 1308 * 1309 * PARAMETERS: List - Current field list pointer 1310 * 1311 * RETURN: Status 1312 * 1313 * DESCRIPTION: Compile MADT. 1314 * 1315 *****************************************************************************/ 1316 1317 ACPI_STATUS 1318 DtCompileMadt ( 1319 void **List) 1320 { 1321 ACPI_STATUS Status; 1322 DT_SUBTABLE *Subtable; 1323 DT_SUBTABLE *ParentTable; 1324 DT_FIELD **PFieldList = (DT_FIELD **) List; 1325 DT_FIELD *SubtableStart; 1326 ACPI_SUBTABLE_HEADER *MadtHeader; 1327 ACPI_DMTABLE_INFO *InfoTable; 1328 1329 1330 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 1331 &Subtable, TRUE); 1332 if (ACPI_FAILURE (Status)) 1333 { 1334 return (Status); 1335 } 1336 1337 ParentTable = DtPeekSubtable (); 1338 DtInsertSubtable (ParentTable, Subtable); 1339 1340 while (*PFieldList) 1341 { 1342 SubtableStart = *PFieldList; 1343 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 1344 &Subtable, TRUE); 1345 if (ACPI_FAILURE (Status)) 1346 { 1347 return (Status); 1348 } 1349 1350 ParentTable = DtPeekSubtable (); 1351 DtInsertSubtable (ParentTable, Subtable); 1352 DtPushSubtable (Subtable); 1353 1354 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1355 1356 switch (MadtHeader->Type) 1357 { 1358 case ACPI_MADT_TYPE_LOCAL_APIC: 1359 1360 InfoTable = AcpiDmTableInfoMadt0; 1361 break; 1362 1363 case ACPI_MADT_TYPE_IO_APIC: 1364 1365 InfoTable = AcpiDmTableInfoMadt1; 1366 break; 1367 1368 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1369 1370 InfoTable = AcpiDmTableInfoMadt2; 1371 break; 1372 1373 case ACPI_MADT_TYPE_NMI_SOURCE: 1374 1375 InfoTable = AcpiDmTableInfoMadt3; 1376 break; 1377 1378 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1379 1380 InfoTable = AcpiDmTableInfoMadt4; 1381 break; 1382 1383 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1384 1385 InfoTable = AcpiDmTableInfoMadt5; 1386 break; 1387 1388 case ACPI_MADT_TYPE_IO_SAPIC: 1389 1390 InfoTable = AcpiDmTableInfoMadt6; 1391 break; 1392 1393 case ACPI_MADT_TYPE_LOCAL_SAPIC: 1394 1395 InfoTable = AcpiDmTableInfoMadt7; 1396 break; 1397 1398 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1399 1400 InfoTable = AcpiDmTableInfoMadt8; 1401 break; 1402 1403 case ACPI_MADT_TYPE_LOCAL_X2APIC: 1404 1405 InfoTable = AcpiDmTableInfoMadt9; 1406 break; 1407 1408 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1409 1410 InfoTable = AcpiDmTableInfoMadt10; 1411 break; 1412 1413 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 1414 1415 InfoTable = AcpiDmTableInfoMadt11; 1416 break; 1417 1418 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 1419 1420 InfoTable = AcpiDmTableInfoMadt12; 1421 break; 1422 1423 default: 1424 1425 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 1426 return (AE_ERROR); 1427 } 1428 1429 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1430 if (ACPI_FAILURE (Status)) 1431 { 1432 return (Status); 1433 } 1434 1435 ParentTable = DtPeekSubtable (); 1436 DtInsertSubtable (ParentTable, Subtable); 1437 DtPopSubtable (); 1438 } 1439 1440 return (AE_OK); 1441 } 1442 1443 1444 /****************************************************************************** 1445 * 1446 * FUNCTION: DtCompileMcfg 1447 * 1448 * PARAMETERS: List - Current field list pointer 1449 * 1450 * RETURN: Status 1451 * 1452 * DESCRIPTION: Compile MCFG. 1453 * 1454 *****************************************************************************/ 1455 1456 ACPI_STATUS 1457 DtCompileMcfg ( 1458 void **List) 1459 { 1460 ACPI_STATUS Status; 1461 1462 1463 Status = DtCompileTwoSubtables (List, 1464 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 1465 return (Status); 1466 } 1467 1468 1469 /****************************************************************************** 1470 * 1471 * FUNCTION: DtCompileMpst 1472 * 1473 * PARAMETERS: List - Current field list pointer 1474 * 1475 * RETURN: Status 1476 * 1477 * DESCRIPTION: Compile MPST. 1478 * 1479 *****************************************************************************/ 1480 1481 ACPI_STATUS 1482 DtCompileMpst ( 1483 void **List) 1484 { 1485 ACPI_STATUS Status; 1486 DT_SUBTABLE *Subtable; 1487 DT_SUBTABLE *ParentTable; 1488 DT_FIELD **PFieldList = (DT_FIELD **) List; 1489 ACPI_MPST_CHANNEL *MpstChannelInfo; 1490 ACPI_MPST_POWER_NODE *MpstPowerNode; 1491 ACPI_MPST_DATA_HDR *MpstDataHeader; 1492 UINT16 SubtableCount; 1493 UINT32 PowerStateCount; 1494 UINT32 ComponentCount; 1495 1496 1497 /* Main table */ 1498 1499 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE); 1500 if (ACPI_FAILURE (Status)) 1501 { 1502 return (Status); 1503 } 1504 1505 ParentTable = DtPeekSubtable (); 1506 DtInsertSubtable (ParentTable, Subtable); 1507 DtPushSubtable (Subtable); 1508 1509 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); 1510 SubtableCount = MpstChannelInfo->PowerNodeCount; 1511 1512 while (*PFieldList && SubtableCount) 1513 { 1514 /* Subtable: Memory Power Node(s) */ 1515 1516 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0, 1517 &Subtable, TRUE); 1518 if (ACPI_FAILURE (Status)) 1519 { 1520 return (Status); 1521 } 1522 1523 ParentTable = DtPeekSubtable (); 1524 DtInsertSubtable (ParentTable, Subtable); 1525 DtPushSubtable (Subtable); 1526 1527 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); 1528 PowerStateCount = MpstPowerNode->NumPowerStates; 1529 ComponentCount = MpstPowerNode->NumPhysicalComponents; 1530 1531 ParentTable = DtPeekSubtable (); 1532 1533 /* Sub-subtables - Memory Power State Structure(s) */ 1534 1535 while (*PFieldList && PowerStateCount) 1536 { 1537 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A, 1538 &Subtable, TRUE); 1539 if (ACPI_FAILURE (Status)) 1540 { 1541 return (Status); 1542 } 1543 1544 DtInsertSubtable (ParentTable, Subtable); 1545 PowerStateCount--; 1546 } 1547 1548 /* Sub-subtables - Physical Component ID Structure(s) */ 1549 1550 while (*PFieldList && ComponentCount) 1551 { 1552 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B, 1553 &Subtable, TRUE); 1554 if (ACPI_FAILURE (Status)) 1555 { 1556 return (Status); 1557 } 1558 1559 DtInsertSubtable (ParentTable, Subtable); 1560 ComponentCount--; 1561 } 1562 1563 SubtableCount--; 1564 DtPopSubtable (); 1565 } 1566 1567 /* Subtable: Count of Memory Power State Characteristic structures */ 1568 1569 DtPopSubtable (); 1570 1571 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE); 1572 if (ACPI_FAILURE (Status)) 1573 { 1574 return (Status); 1575 } 1576 1577 ParentTable = DtPeekSubtable (); 1578 DtInsertSubtable (ParentTable, Subtable); 1579 DtPushSubtable (Subtable); 1580 1581 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); 1582 SubtableCount = MpstDataHeader->CharacteristicsCount; 1583 1584 ParentTable = DtPeekSubtable (); 1585 1586 /* Subtable: Memory Power State Characteristics structure(s) */ 1587 1588 while (*PFieldList && SubtableCount) 1589 { 1590 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2, 1591 &Subtable, TRUE); 1592 if (ACPI_FAILURE (Status)) 1593 { 1594 return (Status); 1595 } 1596 1597 DtInsertSubtable (ParentTable, Subtable); 1598 SubtableCount--; 1599 } 1600 1601 DtPopSubtable (); 1602 return (AE_OK); 1603 } 1604 1605 1606 /****************************************************************************** 1607 * 1608 * FUNCTION: DtCompileMsct 1609 * 1610 * PARAMETERS: List - Current field list pointer 1611 * 1612 * RETURN: Status 1613 * 1614 * DESCRIPTION: Compile MSCT. 1615 * 1616 *****************************************************************************/ 1617 1618 ACPI_STATUS 1619 DtCompileMsct ( 1620 void **List) 1621 { 1622 ACPI_STATUS Status; 1623 1624 1625 Status = DtCompileTwoSubtables (List, 1626 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 1627 return (Status); 1628 } 1629 1630 1631 /****************************************************************************** 1632 * 1633 * FUNCTION: DtCompileMtmr 1634 * 1635 * PARAMETERS: List - Current field list pointer 1636 * 1637 * RETURN: Status 1638 * 1639 * DESCRIPTION: Compile MTMR. 1640 * 1641 *****************************************************************************/ 1642 1643 ACPI_STATUS 1644 DtCompileMtmr ( 1645 void **List) 1646 { 1647 ACPI_STATUS Status; 1648 1649 1650 Status = DtCompileTwoSubtables (List, 1651 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0); 1652 return (Status); 1653 } 1654 1655 1656 /****************************************************************************** 1657 * 1658 * FUNCTION: DtCompilePcct 1659 * 1660 * PARAMETERS: List - Current field list pointer 1661 * 1662 * RETURN: Status 1663 * 1664 * DESCRIPTION: Compile PCCT. 1665 * 1666 *****************************************************************************/ 1667 1668 ACPI_STATUS 1669 DtCompilePcct ( 1670 void **List) 1671 { 1672 ACPI_STATUS Status; 1673 DT_SUBTABLE *Subtable; 1674 DT_SUBTABLE *ParentTable; 1675 DT_FIELD **PFieldList = (DT_FIELD **) List; 1676 DT_FIELD *SubtableStart; 1677 ACPI_SUBTABLE_HEADER *PcctHeader; 1678 ACPI_DMTABLE_INFO *InfoTable; 1679 1680 1681 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct, 1682 &Subtable, TRUE); 1683 if (ACPI_FAILURE (Status)) 1684 { 1685 return (Status); 1686 } 1687 1688 ParentTable = DtPeekSubtable (); 1689 DtInsertSubtable (ParentTable, Subtable); 1690 1691 while (*PFieldList) 1692 { 1693 SubtableStart = *PFieldList; 1694 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr, 1695 &Subtable, TRUE); 1696 if (ACPI_FAILURE (Status)) 1697 { 1698 return (Status); 1699 } 1700 1701 ParentTable = DtPeekSubtable (); 1702 DtInsertSubtable (ParentTable, Subtable); 1703 DtPushSubtable (Subtable); 1704 1705 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1706 1707 switch (PcctHeader->Type) 1708 { 1709 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 1710 1711 InfoTable = AcpiDmTableInfoPcct0; 1712 break; 1713 1714 default: 1715 1716 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT"); 1717 return (AE_ERROR); 1718 } 1719 1720 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1721 if (ACPI_FAILURE (Status)) 1722 { 1723 return (Status); 1724 } 1725 1726 ParentTable = DtPeekSubtable (); 1727 DtInsertSubtable (ParentTable, Subtable); 1728 DtPopSubtable (); 1729 } 1730 1731 return (AE_OK); 1732 } 1733 1734 1735 /****************************************************************************** 1736 * 1737 * FUNCTION: DtCompilePmtt 1738 * 1739 * PARAMETERS: List - Current field list pointer 1740 * 1741 * RETURN: Status 1742 * 1743 * DESCRIPTION: Compile PMTT. 1744 * 1745 *****************************************************************************/ 1746 1747 ACPI_STATUS 1748 DtCompilePmtt ( 1749 void **List) 1750 { 1751 ACPI_STATUS Status; 1752 DT_SUBTABLE *Subtable; 1753 DT_SUBTABLE *ParentTable; 1754 DT_FIELD **PFieldList = (DT_FIELD **) List; 1755 DT_FIELD *SubtableStart; 1756 ACPI_PMTT_HEADER *PmttHeader; 1757 ACPI_PMTT_CONTROLLER *PmttController; 1758 UINT16 DomainCount; 1759 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET; 1760 1761 1762 /* Main table */ 1763 1764 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE); 1765 if (ACPI_FAILURE (Status)) 1766 { 1767 return (Status); 1768 } 1769 1770 ParentTable = DtPeekSubtable (); 1771 DtInsertSubtable (ParentTable, Subtable); 1772 DtPushSubtable (Subtable); 1773 1774 while (*PFieldList) 1775 { 1776 SubtableStart = *PFieldList; 1777 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr, 1778 &Subtable, TRUE); 1779 if (ACPI_FAILURE (Status)) 1780 { 1781 return (Status); 1782 } 1783 1784 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer); 1785 while (PrevType >= PmttHeader->Type) 1786 { 1787 DtPopSubtable (); 1788 1789 if (PrevType == ACPI_PMTT_TYPE_SOCKET) 1790 { 1791 break; 1792 } 1793 PrevType--; 1794 } 1795 PrevType = PmttHeader->Type; 1796 1797 ParentTable = DtPeekSubtable (); 1798 DtInsertSubtable (ParentTable, Subtable); 1799 DtPushSubtable (Subtable); 1800 1801 switch (PmttHeader->Type) 1802 { 1803 case ACPI_PMTT_TYPE_SOCKET: 1804 1805 /* Subtable: Socket Structure */ 1806 1807 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0, 1808 &Subtable, TRUE); 1809 if (ACPI_FAILURE (Status)) 1810 { 1811 return (Status); 1812 } 1813 1814 ParentTable = DtPeekSubtable (); 1815 DtInsertSubtable (ParentTable, Subtable); 1816 break; 1817 1818 case ACPI_PMTT_TYPE_CONTROLLER: 1819 1820 /* Subtable: Memory Controller Structure */ 1821 1822 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1, 1823 &Subtable, TRUE); 1824 if (ACPI_FAILURE (Status)) 1825 { 1826 return (Status); 1827 } 1828 1829 ParentTable = DtPeekSubtable (); 1830 DtInsertSubtable (ParentTable, Subtable); 1831 1832 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER, 1833 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER))); 1834 DomainCount = PmttController->DomainCount; 1835 1836 while (DomainCount) 1837 { 1838 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a, 1839 &Subtable, TRUE); 1840 if (ACPI_FAILURE (Status)) 1841 { 1842 return (Status); 1843 } 1844 1845 DtInsertSubtable (ParentTable, Subtable); 1846 DomainCount--; 1847 } 1848 break; 1849 1850 case ACPI_PMTT_TYPE_DIMM: 1851 1852 /* Subtable: Physical Component Structure */ 1853 1854 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2, 1855 &Subtable, TRUE); 1856 if (ACPI_FAILURE (Status)) 1857 { 1858 return (Status); 1859 } 1860 1861 ParentTable = DtPeekSubtable (); 1862 DtInsertSubtable (ParentTable, Subtable); 1863 break; 1864 1865 default: 1866 1867 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT"); 1868 return (AE_ERROR); 1869 } 1870 } 1871 1872 return (Status); 1873 } 1874 1875 1876 /****************************************************************************** 1877 * 1878 * FUNCTION: DtCompileRsdt 1879 * 1880 * PARAMETERS: List - Current field list pointer 1881 * 1882 * RETURN: Status 1883 * 1884 * DESCRIPTION: Compile RSDT. 1885 * 1886 *****************************************************************************/ 1887 1888 ACPI_STATUS 1889 DtCompileRsdt ( 1890 void **List) 1891 { 1892 DT_SUBTABLE *Subtable; 1893 DT_SUBTABLE *ParentTable; 1894 DT_FIELD *FieldList = *(DT_FIELD **) List; 1895 UINT32 Address; 1896 1897 1898 ParentTable = DtPeekSubtable (); 1899 1900 while (FieldList) 1901 { 1902 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 1903 1904 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 1905 DtInsertSubtable (ParentTable, Subtable); 1906 FieldList = FieldList->Next; 1907 } 1908 1909 return (AE_OK); 1910 } 1911 1912 1913 /****************************************************************************** 1914 * 1915 * FUNCTION: DtCompileS3pt 1916 * 1917 * PARAMETERS: PFieldList - Current field list pointer 1918 * 1919 * RETURN: Status 1920 * 1921 * DESCRIPTION: Compile S3PT (Pointed to by FPDT) 1922 * 1923 *****************************************************************************/ 1924 1925 ACPI_STATUS 1926 DtCompileS3pt ( 1927 DT_FIELD **PFieldList) 1928 { 1929 ACPI_STATUS Status; 1930 ACPI_S3PT_HEADER *S3ptHeader; 1931 DT_SUBTABLE *Subtable; 1932 DT_SUBTABLE *ParentTable; 1933 ACPI_DMTABLE_INFO *InfoTable; 1934 DT_FIELD *SubtableStart; 1935 1936 1937 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, 1938 &Gbl_RootTable, TRUE); 1939 if (ACPI_FAILURE (Status)) 1940 { 1941 return (Status); 1942 } 1943 1944 DtPushSubtable (Gbl_RootTable); 1945 1946 while (*PFieldList) 1947 { 1948 SubtableStart = *PFieldList; 1949 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr, 1950 &Subtable, TRUE); 1951 if (ACPI_FAILURE (Status)) 1952 { 1953 return (Status); 1954 } 1955 1956 ParentTable = DtPeekSubtable (); 1957 DtInsertSubtable (ParentTable, Subtable); 1958 DtPushSubtable (Subtable); 1959 1960 S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer); 1961 1962 switch (S3ptHeader->Type) 1963 { 1964 case ACPI_S3PT_TYPE_RESUME: 1965 1966 InfoTable = AcpiDmTableInfoS3pt0; 1967 break; 1968 1969 case ACPI_S3PT_TYPE_SUSPEND: 1970 1971 InfoTable = AcpiDmTableInfoS3pt1; 1972 break; 1973 1974 default: 1975 1976 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); 1977 return (AE_ERROR); 1978 } 1979 1980 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1981 if (ACPI_FAILURE (Status)) 1982 { 1983 return (Status); 1984 } 1985 1986 ParentTable = DtPeekSubtable (); 1987 DtInsertSubtable (ParentTable, Subtable); 1988 DtPopSubtable (); 1989 } 1990 1991 return (AE_OK); 1992 } 1993 1994 1995 /****************************************************************************** 1996 * 1997 * FUNCTION: DtCompileSlic 1998 * 1999 * PARAMETERS: List - Current field list pointer 2000 * 2001 * RETURN: Status 2002 * 2003 * DESCRIPTION: Compile SLIC. 2004 * 2005 *****************************************************************************/ 2006 2007 ACPI_STATUS 2008 DtCompileSlic ( 2009 void **List) 2010 { 2011 ACPI_STATUS Status; 2012 DT_SUBTABLE *Subtable; 2013 DT_SUBTABLE *ParentTable; 2014 DT_FIELD **PFieldList = (DT_FIELD **) List; 2015 DT_FIELD *SubtableStart; 2016 ACPI_SLIC_HEADER *SlicHeader; 2017 ACPI_DMTABLE_INFO *InfoTable; 2018 2019 2020 while (*PFieldList) 2021 { 2022 SubtableStart = *PFieldList; 2023 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr, 2024 &Subtable, TRUE); 2025 if (ACPI_FAILURE (Status)) 2026 { 2027 return (Status); 2028 } 2029 2030 ParentTable = DtPeekSubtable (); 2031 DtInsertSubtable (ParentTable, Subtable); 2032 DtPushSubtable (Subtable); 2033 2034 SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer); 2035 2036 switch (SlicHeader->Type) 2037 { 2038 case ACPI_SLIC_TYPE_PUBLIC_KEY: 2039 2040 InfoTable = AcpiDmTableInfoSlic0; 2041 break; 2042 2043 case ACPI_SLIC_TYPE_WINDOWS_MARKER: 2044 2045 InfoTable = AcpiDmTableInfoSlic1; 2046 break; 2047 2048 default: 2049 2050 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC"); 2051 return (AE_ERROR); 2052 } 2053 2054 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 2055 if (ACPI_FAILURE (Status)) 2056 { 2057 return (Status); 2058 } 2059 2060 ParentTable = DtPeekSubtable (); 2061 DtInsertSubtable (ParentTable, Subtable); 2062 DtPopSubtable (); 2063 } 2064 2065 return (AE_OK); 2066 } 2067 2068 2069 /****************************************************************************** 2070 * 2071 * FUNCTION: DtCompileSlit 2072 * 2073 * PARAMETERS: List - Current field list pointer 2074 * 2075 * RETURN: Status 2076 * 2077 * DESCRIPTION: Compile SLIT. 2078 * 2079 *****************************************************************************/ 2080 2081 ACPI_STATUS 2082 DtCompileSlit ( 2083 void **List) 2084 { 2085 ACPI_STATUS Status; 2086 DT_SUBTABLE *Subtable; 2087 DT_SUBTABLE *ParentTable; 2088 DT_FIELD **PFieldList = (DT_FIELD **) List; 2089 DT_FIELD *FieldList; 2090 UINT32 Localities; 2091 UINT8 *LocalityBuffer; 2092 2093 2094 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 2095 &Subtable, TRUE); 2096 if (ACPI_FAILURE (Status)) 2097 { 2098 return (Status); 2099 } 2100 2101 ParentTable = DtPeekSubtable (); 2102 DtInsertSubtable (ParentTable, Subtable); 2103 2104 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 2105 LocalityBuffer = UtLocalCalloc (Localities); 2106 2107 /* Compile each locality buffer */ 2108 2109 FieldList = *PFieldList; 2110 while (FieldList) 2111 { 2112 DtCompileBuffer (LocalityBuffer, 2113 FieldList->Value, FieldList, Localities); 2114 2115 DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 2116 DtInsertSubtable (ParentTable, Subtable); 2117 FieldList = FieldList->Next; 2118 } 2119 2120 ACPI_FREE (LocalityBuffer); 2121 return (AE_OK); 2122 } 2123 2124 2125 /****************************************************************************** 2126 * 2127 * FUNCTION: DtCompileSrat 2128 * 2129 * PARAMETERS: List - Current field list pointer 2130 * 2131 * RETURN: Status 2132 * 2133 * DESCRIPTION: Compile SRAT. 2134 * 2135 *****************************************************************************/ 2136 2137 ACPI_STATUS 2138 DtCompileSrat ( 2139 void **List) 2140 { 2141 ACPI_STATUS Status; 2142 DT_SUBTABLE *Subtable; 2143 DT_SUBTABLE *ParentTable; 2144 DT_FIELD **PFieldList = (DT_FIELD **) List; 2145 DT_FIELD *SubtableStart; 2146 ACPI_SUBTABLE_HEADER *SratHeader; 2147 ACPI_DMTABLE_INFO *InfoTable; 2148 2149 2150 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 2151 &Subtable, TRUE); 2152 if (ACPI_FAILURE (Status)) 2153 { 2154 return (Status); 2155 } 2156 2157 ParentTable = DtPeekSubtable (); 2158 DtInsertSubtable (ParentTable, Subtable); 2159 2160 while (*PFieldList) 2161 { 2162 SubtableStart = *PFieldList; 2163 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 2164 &Subtable, TRUE); 2165 if (ACPI_FAILURE (Status)) 2166 { 2167 return (Status); 2168 } 2169 2170 ParentTable = DtPeekSubtable (); 2171 DtInsertSubtable (ParentTable, Subtable); 2172 DtPushSubtable (Subtable); 2173 2174 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 2175 2176 switch (SratHeader->Type) 2177 { 2178 case ACPI_SRAT_TYPE_CPU_AFFINITY: 2179 2180 InfoTable = AcpiDmTableInfoSrat0; 2181 break; 2182 2183 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2184 2185 InfoTable = AcpiDmTableInfoSrat1; 2186 break; 2187 2188 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2189 2190 InfoTable = AcpiDmTableInfoSrat2; 2191 break; 2192 2193 default: 2194 2195 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 2196 return (AE_ERROR); 2197 } 2198 2199 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 2200 if (ACPI_FAILURE (Status)) 2201 { 2202 return (Status); 2203 } 2204 2205 ParentTable = DtPeekSubtable (); 2206 DtInsertSubtable (ParentTable, Subtable); 2207 DtPopSubtable (); 2208 } 2209 2210 return (AE_OK); 2211 } 2212 2213 2214 /****************************************************************************** 2215 * 2216 * FUNCTION: DtGetGenericTableInfo 2217 * 2218 * PARAMETERS: Name - Generic type name 2219 * 2220 * RETURN: Info entry 2221 * 2222 * DESCRIPTION: Obtain table info for a generic name entry 2223 * 2224 *****************************************************************************/ 2225 2226 ACPI_DMTABLE_INFO * 2227 DtGetGenericTableInfo ( 2228 char *Name) 2229 { 2230 ACPI_DMTABLE_INFO *Info; 2231 UINT32 i; 2232 2233 2234 if (!Name) 2235 { 2236 return (NULL); 2237 } 2238 2239 /* Search info table for name match */ 2240 2241 for (i = 0; ; i++) 2242 { 2243 Info = AcpiDmTableInfoGeneric[i]; 2244 if (Info->Opcode == ACPI_DMT_EXIT) 2245 { 2246 Info = NULL; 2247 break; 2248 } 2249 2250 /* Use caseless compare for generic keywords */ 2251 2252 if (!AcpiUtStricmp (Name, Info->Name)) 2253 { 2254 break; 2255 } 2256 } 2257 2258 return (Info); 2259 } 2260 2261 2262 /****************************************************************************** 2263 * 2264 * FUNCTION: DtCompileUefi 2265 * 2266 * PARAMETERS: List - Current field list pointer 2267 * 2268 * RETURN: Status 2269 * 2270 * DESCRIPTION: Compile UEFI. 2271 * 2272 *****************************************************************************/ 2273 2274 ACPI_STATUS 2275 DtCompileUefi ( 2276 void **List) 2277 { 2278 ACPI_STATUS Status; 2279 DT_SUBTABLE *Subtable; 2280 DT_SUBTABLE *ParentTable; 2281 DT_FIELD **PFieldList = (DT_FIELD **) List; 2282 UINT16 *DataOffset; 2283 2284 2285 /* Compile the predefined portion of the UEFI table */ 2286 2287 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi, 2288 &Subtable, TRUE); 2289 if (ACPI_FAILURE (Status)) 2290 { 2291 return (Status); 2292 } 2293 2294 DataOffset = (UINT16 *) (Subtable->Buffer + 16); 2295 *DataOffset = sizeof (ACPI_TABLE_UEFI); 2296 2297 ParentTable = DtPeekSubtable (); 2298 DtInsertSubtable (ParentTable, Subtable); 2299 2300 /* 2301 * Compile the "generic" portion of the UEFI table. This 2302 * part of the table is not predefined and any of the generic 2303 * operators may be used. 2304 */ 2305 2306 DtCompileGeneric ((void **) PFieldList); 2307 2308 return (AE_OK); 2309 } 2310 2311 2312 /****************************************************************************** 2313 * 2314 * FUNCTION: DtCompileVrtc 2315 * 2316 * PARAMETERS: List - Current field list pointer 2317 * 2318 * RETURN: Status 2319 * 2320 * DESCRIPTION: Compile VRTC. 2321 * 2322 *****************************************************************************/ 2323 2324 ACPI_STATUS 2325 DtCompileVrtc ( 2326 void **List) 2327 { 2328 ACPI_STATUS Status; 2329 2330 2331 Status = DtCompileTwoSubtables (List, 2332 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0); 2333 return (Status); 2334 } 2335 2336 2337 /****************************************************************************** 2338 * 2339 * FUNCTION: DtCompileWdat 2340 * 2341 * PARAMETERS: List - Current field list pointer 2342 * 2343 * RETURN: Status 2344 * 2345 * DESCRIPTION: Compile WDAT. 2346 * 2347 *****************************************************************************/ 2348 2349 ACPI_STATUS 2350 DtCompileWdat ( 2351 void **List) 2352 { 2353 ACPI_STATUS Status; 2354 2355 2356 Status = DtCompileTwoSubtables (List, 2357 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 2358 return (Status); 2359 } 2360 2361 2362 /****************************************************************************** 2363 * 2364 * FUNCTION: DtCompileXsdt 2365 * 2366 * PARAMETERS: List - Current field list pointer 2367 * 2368 * RETURN: Status 2369 * 2370 * DESCRIPTION: Compile XSDT. 2371 * 2372 *****************************************************************************/ 2373 2374 ACPI_STATUS 2375 DtCompileXsdt ( 2376 void **List) 2377 { 2378 DT_SUBTABLE *Subtable; 2379 DT_SUBTABLE *ParentTable; 2380 DT_FIELD *FieldList = *(DT_FIELD **) List; 2381 UINT64 Address; 2382 2383 ParentTable = DtPeekSubtable (); 2384 2385 while (FieldList) 2386 { 2387 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 2388 2389 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 2390 DtInsertSubtable (ParentTable, Subtable); 2391 FieldList = FieldList->Next; 2392 } 2393 2394 return (AE_OK); 2395 } 2396 2397 2398 /****************************************************************************** 2399 * 2400 * FUNCTION: DtCompileGeneric 2401 * 2402 * PARAMETERS: List - Current field list pointer 2403 * 2404 * RETURN: Status 2405 * 2406 * DESCRIPTION: Compile generic unknown table. 2407 * 2408 *****************************************************************************/ 2409 2410 ACPI_STATUS 2411 DtCompileGeneric ( 2412 void **List) 2413 { 2414 ACPI_STATUS Status; 2415 DT_SUBTABLE *Subtable; 2416 DT_SUBTABLE *ParentTable; 2417 DT_FIELD **PFieldList = (DT_FIELD **) List; 2418 ACPI_DMTABLE_INFO *Info; 2419 2420 2421 ParentTable = DtPeekSubtable (); 2422 2423 /* 2424 * Compile the "generic" portion of the table. This 2425 * part of the table is not predefined and any of the generic 2426 * operators may be used. 2427 */ 2428 2429 /* Find any and all labels in the entire generic portion */ 2430 2431 DtDetectAllLabels (*PFieldList); 2432 2433 /* Now we can actually compile the parse tree */ 2434 2435 while (*PFieldList) 2436 { 2437 Info = DtGetGenericTableInfo ((*PFieldList)->Name); 2438 if (!Info) 2439 { 2440 sprintf (MsgBuffer, "Generic data type \"%s\" not found", 2441 (*PFieldList)->Name); 2442 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 2443 (*PFieldList), MsgBuffer); 2444 2445 *PFieldList = (*PFieldList)->Next; 2446 continue; 2447 } 2448 2449 Status = DtCompileTable (PFieldList, Info, 2450 &Subtable, TRUE); 2451 if (ACPI_SUCCESS (Status)) 2452 { 2453 DtInsertSubtable (ParentTable, Subtable); 2454 } 2455 else 2456 { 2457 *PFieldList = (*PFieldList)->Next; 2458 2459 if (Status == AE_NOT_FOUND) 2460 { 2461 sprintf (MsgBuffer, "Generic data type \"%s\" not found", 2462 (*PFieldList)->Name); 2463 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 2464 (*PFieldList), MsgBuffer); 2465 } 2466 } 2467 } 2468 2469 return (AE_OK); 2470 }