1 /****************************************************************************** 2 * 3 * Module Name: dttable2.c - handling for specific ACPI tables 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2021, 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 MERCHANTABILITY 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 /* Compile all complex data tables, signatures starting with L-Z */ 45 46 #include "aslcompiler.h" 47 48 #define _COMPONENT DT_COMPILER 49 ACPI_MODULE_NAME ("dttable2") 50 51 52 /****************************************************************************** 53 * 54 * FUNCTION: DtCompileLpit 55 * 56 * PARAMETERS: List - Current field list pointer 57 * 58 * RETURN: Status 59 * 60 * DESCRIPTION: Compile LPIT. 61 * 62 *****************************************************************************/ 63 64 ACPI_STATUS 65 DtCompileLpit ( 66 void **List) 67 { 68 ACPI_STATUS Status; 69 DT_SUBTABLE *Subtable; 70 DT_SUBTABLE *ParentTable; 71 DT_FIELD **PFieldList = (DT_FIELD **) List; 72 DT_FIELD *SubtableStart; 73 ACPI_DMTABLE_INFO *InfoTable; 74 ACPI_LPIT_HEADER *LpitHeader; 75 76 77 /* Note: Main table consists only of the standard ACPI table header */ 78 79 while (*PFieldList) 80 { 81 SubtableStart = *PFieldList; 82 83 /* LPIT Subtable header */ 84 85 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr, 86 &Subtable); 87 if (ACPI_FAILURE (Status)) 88 { 89 return (Status); 90 } 91 92 ParentTable = DtPeekSubtable (); 93 DtInsertSubtable (ParentTable, Subtable); 94 DtPushSubtable (Subtable); 95 96 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer); 97 98 switch (LpitHeader->Type) 99 { 100 case ACPI_LPIT_TYPE_NATIVE_CSTATE: 101 102 InfoTable = AcpiDmTableInfoLpit0; 103 break; 104 105 default: 106 107 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT"); 108 return (AE_ERROR); 109 } 110 111 /* LPIT Subtable */ 112 113 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 114 if (ACPI_FAILURE (Status)) 115 { 116 return (Status); 117 } 118 119 ParentTable = DtPeekSubtable (); 120 DtInsertSubtable (ParentTable, Subtable); 121 DtPopSubtable (); 122 } 123 124 return (AE_OK); 125 } 126 127 128 /****************************************************************************** 129 * 130 * FUNCTION: DtCompileMadt 131 * 132 * PARAMETERS: List - Current field list pointer 133 * 134 * RETURN: Status 135 * 136 * DESCRIPTION: Compile MADT. 137 * 138 *****************************************************************************/ 139 140 ACPI_STATUS 141 DtCompileMadt ( 142 void **List) 143 { 144 ACPI_STATUS Status; 145 DT_SUBTABLE *Subtable; 146 DT_SUBTABLE *ParentTable; 147 DT_FIELD **PFieldList = (DT_FIELD **) List; 148 DT_FIELD *SubtableStart; 149 ACPI_SUBTABLE_HEADER *MadtHeader; 150 ACPI_DMTABLE_INFO *InfoTable; 151 152 153 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 154 &Subtable); 155 if (ACPI_FAILURE (Status)) 156 { 157 return (Status); 158 } 159 160 ParentTable = DtPeekSubtable (); 161 DtInsertSubtable (ParentTable, Subtable); 162 163 while (*PFieldList) 164 { 165 SubtableStart = *PFieldList; 166 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 167 &Subtable); 168 if (ACPI_FAILURE (Status)) 169 { 170 return (Status); 171 } 172 173 ParentTable = DtPeekSubtable (); 174 DtInsertSubtable (ParentTable, Subtable); 175 DtPushSubtable (Subtable); 176 177 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 178 179 switch (MadtHeader->Type) 180 { 181 case ACPI_MADT_TYPE_LOCAL_APIC: 182 183 InfoTable = AcpiDmTableInfoMadt0; 184 break; 185 186 case ACPI_MADT_TYPE_IO_APIC: 187 188 InfoTable = AcpiDmTableInfoMadt1; 189 break; 190 191 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 192 193 InfoTable = AcpiDmTableInfoMadt2; 194 break; 195 196 case ACPI_MADT_TYPE_NMI_SOURCE: 197 198 InfoTable = AcpiDmTableInfoMadt3; 199 break; 200 201 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 202 203 InfoTable = AcpiDmTableInfoMadt4; 204 break; 205 206 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 207 208 InfoTable = AcpiDmTableInfoMadt5; 209 break; 210 211 case ACPI_MADT_TYPE_IO_SAPIC: 212 213 InfoTable = AcpiDmTableInfoMadt6; 214 break; 215 216 case ACPI_MADT_TYPE_LOCAL_SAPIC: 217 218 InfoTable = AcpiDmTableInfoMadt7; 219 break; 220 221 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 222 223 InfoTable = AcpiDmTableInfoMadt8; 224 break; 225 226 case ACPI_MADT_TYPE_LOCAL_X2APIC: 227 228 InfoTable = AcpiDmTableInfoMadt9; 229 break; 230 231 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 232 233 InfoTable = AcpiDmTableInfoMadt10; 234 break; 235 236 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 237 238 InfoTable = AcpiDmTableInfoMadt11; 239 break; 240 241 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 242 243 InfoTable = AcpiDmTableInfoMadt12; 244 break; 245 246 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 247 248 InfoTable = AcpiDmTableInfoMadt13; 249 break; 250 251 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 252 253 InfoTable = AcpiDmTableInfoMadt14; 254 break; 255 256 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 257 258 InfoTable = AcpiDmTableInfoMadt15; 259 break; 260 261 case ACPI_MADT_TYPE_MULTIPROC_WAKEUP: 262 263 InfoTable = AcpiDmTableInfoMadt16; 264 break; 265 266 default: 267 268 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 269 return (AE_ERROR); 270 } 271 272 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 273 if (ACPI_FAILURE (Status)) 274 { 275 return (Status); 276 } 277 278 ParentTable = DtPeekSubtable (); 279 DtInsertSubtable (ParentTable, Subtable); 280 DtPopSubtable (); 281 } 282 283 return (AE_OK); 284 } 285 286 287 /****************************************************************************** 288 * 289 * FUNCTION: DtCompileMcfg 290 * 291 * PARAMETERS: List - Current field list pointer 292 * 293 * RETURN: Status 294 * 295 * DESCRIPTION: Compile MCFG. 296 * 297 *****************************************************************************/ 298 299 ACPI_STATUS 300 DtCompileMcfg ( 301 void **List) 302 { 303 ACPI_STATUS Status; 304 305 306 Status = DtCompileTwoSubtables (List, 307 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 308 return (Status); 309 } 310 311 312 /****************************************************************************** 313 * 314 * FUNCTION: DtCompileMpst 315 * 316 * PARAMETERS: List - Current field list pointer 317 * 318 * RETURN: Status 319 * 320 * DESCRIPTION: Compile MPST. 321 * 322 *****************************************************************************/ 323 324 ACPI_STATUS 325 DtCompileMpst ( 326 void **List) 327 { 328 ACPI_STATUS Status; 329 DT_SUBTABLE *Subtable; 330 DT_SUBTABLE *ParentTable; 331 DT_FIELD **PFieldList = (DT_FIELD **) List; 332 ACPI_MPST_CHANNEL *MpstChannelInfo; 333 ACPI_MPST_POWER_NODE *MpstPowerNode; 334 ACPI_MPST_DATA_HDR *MpstDataHeader; 335 UINT16 SubtableCount; 336 UINT32 PowerStateCount; 337 UINT32 ComponentCount; 338 339 340 /* Main table */ 341 342 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable); 343 if (ACPI_FAILURE (Status)) 344 { 345 return (Status); 346 } 347 348 ParentTable = DtPeekSubtable (); 349 DtInsertSubtable (ParentTable, Subtable); 350 DtPushSubtable (Subtable); 351 352 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); 353 SubtableCount = MpstChannelInfo->PowerNodeCount; 354 355 while (*PFieldList && SubtableCount) 356 { 357 /* Subtable: Memory Power Node(s) */ 358 359 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0, 360 &Subtable); 361 if (ACPI_FAILURE (Status)) 362 { 363 return (Status); 364 } 365 366 ParentTable = DtPeekSubtable (); 367 DtInsertSubtable (ParentTable, Subtable); 368 DtPushSubtable (Subtable); 369 370 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); 371 PowerStateCount = MpstPowerNode->NumPowerStates; 372 ComponentCount = MpstPowerNode->NumPhysicalComponents; 373 374 ParentTable = DtPeekSubtable (); 375 376 /* Sub-subtables - Memory Power State Structure(s) */ 377 378 while (*PFieldList && PowerStateCount) 379 { 380 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A, 381 &Subtable); 382 if (ACPI_FAILURE (Status)) 383 { 384 return (Status); 385 } 386 387 DtInsertSubtable (ParentTable, Subtable); 388 PowerStateCount--; 389 } 390 391 /* Sub-subtables - Physical Component ID Structure(s) */ 392 393 while (*PFieldList && ComponentCount) 394 { 395 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B, 396 &Subtable); 397 if (ACPI_FAILURE (Status)) 398 { 399 return (Status); 400 } 401 402 DtInsertSubtable (ParentTable, Subtable); 403 ComponentCount--; 404 } 405 406 SubtableCount--; 407 DtPopSubtable (); 408 } 409 410 /* Subtable: Count of Memory Power State Characteristic structures */ 411 412 DtPopSubtable (); 413 414 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable); 415 if (ACPI_FAILURE (Status)) 416 { 417 return (Status); 418 } 419 420 ParentTable = DtPeekSubtable (); 421 DtInsertSubtable (ParentTable, Subtable); 422 DtPushSubtable (Subtable); 423 424 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); 425 SubtableCount = MpstDataHeader->CharacteristicsCount; 426 427 ParentTable = DtPeekSubtable (); 428 429 /* Subtable: Memory Power State Characteristics structure(s) */ 430 431 while (*PFieldList && SubtableCount) 432 { 433 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2, 434 &Subtable); 435 if (ACPI_FAILURE (Status)) 436 { 437 return (Status); 438 } 439 440 DtInsertSubtable (ParentTable, Subtable); 441 SubtableCount--; 442 } 443 444 DtPopSubtable (); 445 return (AE_OK); 446 } 447 448 449 /****************************************************************************** 450 * 451 * FUNCTION: DtCompileMsct 452 * 453 * PARAMETERS: List - Current field list pointer 454 * 455 * RETURN: Status 456 * 457 * DESCRIPTION: Compile MSCT. 458 * 459 *****************************************************************************/ 460 461 ACPI_STATUS 462 DtCompileMsct ( 463 void **List) 464 { 465 ACPI_STATUS Status; 466 467 468 Status = DtCompileTwoSubtables (List, 469 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 470 return (Status); 471 } 472 473 474 /****************************************************************************** 475 * 476 * FUNCTION: DtCompileNfit 477 * 478 * PARAMETERS: List - Current field list pointer 479 * 480 * RETURN: Status 481 * 482 * DESCRIPTION: Compile NFIT. 483 * 484 *****************************************************************************/ 485 486 ACPI_STATUS 487 DtCompileNfit ( 488 void **List) 489 { 490 ACPI_STATUS Status; 491 DT_SUBTABLE *Subtable; 492 DT_SUBTABLE *ParentTable; 493 DT_FIELD **PFieldList = (DT_FIELD **) List; 494 DT_FIELD *SubtableStart; 495 ACPI_NFIT_HEADER *NfitHeader; 496 ACPI_DMTABLE_INFO *InfoTable; 497 UINT32 Count; 498 ACPI_NFIT_INTERLEAVE *Interleave = NULL; 499 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 500 501 502 /* Main table */ 503 504 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit, 505 &Subtable); 506 if (ACPI_FAILURE (Status)) 507 { 508 return (Status); 509 } 510 511 ParentTable = DtPeekSubtable (); 512 DtInsertSubtable (ParentTable, Subtable); 513 DtPushSubtable (Subtable); 514 515 /* Subtables */ 516 517 while (*PFieldList) 518 { 519 SubtableStart = *PFieldList; 520 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr, 521 &Subtable); 522 if (ACPI_FAILURE (Status)) 523 { 524 return (Status); 525 } 526 527 ParentTable = DtPeekSubtable (); 528 DtInsertSubtable (ParentTable, Subtable); 529 DtPushSubtable (Subtable); 530 531 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer); 532 533 switch (NfitHeader->Type) 534 { 535 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 536 537 InfoTable = AcpiDmTableInfoNfit0; 538 break; 539 540 case ACPI_NFIT_TYPE_MEMORY_MAP: 541 542 InfoTable = AcpiDmTableInfoNfit1; 543 break; 544 545 case ACPI_NFIT_TYPE_INTERLEAVE: 546 547 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer); 548 InfoTable = AcpiDmTableInfoNfit2; 549 break; 550 551 case ACPI_NFIT_TYPE_SMBIOS: 552 553 InfoTable = AcpiDmTableInfoNfit3; 554 break; 555 556 case ACPI_NFIT_TYPE_CONTROL_REGION: 557 558 InfoTable = AcpiDmTableInfoNfit4; 559 break; 560 561 case ACPI_NFIT_TYPE_DATA_REGION: 562 563 InfoTable = AcpiDmTableInfoNfit5; 564 break; 565 566 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 567 568 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer); 569 InfoTable = AcpiDmTableInfoNfit6; 570 break; 571 572 case ACPI_NFIT_TYPE_CAPABILITIES: 573 574 InfoTable = AcpiDmTableInfoNfit7; 575 break; 576 577 default: 578 579 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT"); 580 return (AE_ERROR); 581 } 582 583 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 584 if (ACPI_FAILURE (Status)) 585 { 586 return (Status); 587 } 588 589 ParentTable = DtPeekSubtable (); 590 DtInsertSubtable (ParentTable, Subtable); 591 DtPopSubtable (); 592 593 switch (NfitHeader->Type) 594 { 595 case ACPI_NFIT_TYPE_INTERLEAVE: 596 597 Count = 0; 598 DtPushSubtable (Subtable); 599 while (*PFieldList) 600 { 601 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a, 602 &Subtable); 603 if (ACPI_FAILURE (Status)) 604 { 605 return (Status); 606 } 607 608 if (!Subtable) 609 { 610 DtPopSubtable (); 611 break; 612 } 613 614 ParentTable = DtPeekSubtable (); 615 DtInsertSubtable (ParentTable, Subtable); 616 Count++; 617 } 618 619 Interleave->LineCount = Count; 620 break; 621 622 case ACPI_NFIT_TYPE_SMBIOS: 623 624 if (*PFieldList) 625 { 626 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a, 627 &Subtable); 628 if (ACPI_FAILURE (Status)) 629 { 630 return (Status); 631 } 632 633 if (Subtable) 634 { 635 DtInsertSubtable (ParentTable, Subtable); 636 } 637 } 638 break; 639 640 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 641 642 Count = 0; 643 DtPushSubtable (Subtable); 644 while (*PFieldList) 645 { 646 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a, 647 &Subtable); 648 if (ACPI_FAILURE (Status)) 649 { 650 return (Status); 651 } 652 653 if (!Subtable) 654 { 655 DtPopSubtable (); 656 break; 657 } 658 659 ParentTable = DtPeekSubtable (); 660 DtInsertSubtable (ParentTable, Subtable); 661 Count++; 662 } 663 664 Hint->HintCount = (UINT16) Count; 665 break; 666 667 default: 668 break; 669 } 670 } 671 672 return (AE_OK); 673 } 674 675 676 /****************************************************************************** 677 * 678 * FUNCTION: DtCompileNhlt 679 * 680 * PARAMETERS: List - Current field list pointer 681 * 682 * RETURN: Status 683 * 684 * DESCRIPTION: Compile NHLT. 685 * 686 *****************************************************************************/ 687 688 ACPI_STATUS 689 DtCompileNhlt ( 690 void **List) 691 { 692 ACPI_STATUS Status; 693 UINT32 EndpointCount; 694 UINT32 MicrophoneCount; 695 UINT32 FormatsCount; 696 DT_SUBTABLE *Subtable; 697 DT_SUBTABLE *ParentTable; 698 DT_FIELD **PFieldList = (DT_FIELD **) List; 699 UINT32 CapabilitiesSize; 700 UINT8 ArrayType; 701 UINT8 ConfigType; 702 UINT8 LinuxSpecificCount; 703 UINT32 i; 704 UINT32 j; 705 ACPI_TABLE_NHLT_ENDPOINT_COUNT *MainTable; 706 ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; 707 ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; 708 ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; 709 ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; 710 ACPI_NHLT_LINUX_SPECIFIC_COUNT *LinuxSpecific; 711 712 713 /* Main table */ 714 715 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt, 716 &Subtable); 717 if (ACPI_FAILURE (Status)) 718 { 719 return (Status); 720 } 721 722 /* Get the Endpoint Descriptor count */ 723 724 ParentTable = DtPeekSubtable (); 725 DtInsertSubtable (ParentTable, Subtable); 726 DtPushSubtable (Subtable); 727 728 MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer); 729 EndpointCount = MainTable->EndpointCount; 730 731 /* Subtables */ 732 733 while (*PFieldList) 734 { 735 /* Variable number of Endpoint descriptors */ 736 737 for (i = 0; i < EndpointCount; i++) 738 { 739 /* Do the Endpoint Descriptor */ 740 741 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0, 742 &Subtable); 743 if (ACPI_FAILURE (Status)) 744 { 745 return (Status); 746 } 747 748 ParentTable = DtPeekSubtable (); 749 DtInsertSubtable (ParentTable, Subtable); 750 DtPushSubtable (Subtable); 751 752 /* Do the Device Specific table */ 753 754 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, 755 &Subtable); 756 if (ACPI_FAILURE (Status)) 757 { 758 return (Status); 759 } 760 761 ParentTable = DtPeekSubtable (); 762 DtInsertSubtable (ParentTable, Subtable); 763 DtPushSubtable (Subtable); 764 765 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer); 766 CapabilitiesSize = DevSpecific->CapabilitiesSize; 767 768 ArrayType = 0; 769 ConfigType = 0; 770 771 switch (CapabilitiesSize) 772 { 773 case 0: 774 break; 775 776 case 1: 777 778 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c, 779 &Subtable); 780 if (ACPI_FAILURE (Status)) 781 { 782 return (Status); 783 } 784 785 ParentTable = DtPeekSubtable (); 786 DtInsertSubtable (ParentTable, Subtable); 787 break; 788 789 case 2: 790 791 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, 792 &Subtable); 793 if (ACPI_FAILURE (Status)) 794 { 795 return (Status); 796 } 797 798 ParentTable = DtPeekSubtable (); 799 DtInsertSubtable (ParentTable, Subtable); 800 break; 801 802 case 3: 803 804 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, 805 &Subtable); 806 if (ACPI_FAILURE (Status)) 807 { 808 return (Status); 809 } 810 811 ParentTable = DtPeekSubtable (); 812 DtInsertSubtable (ParentTable, Subtable); 813 814 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); 815 ArrayType = ConfigSpecific->ArrayType; 816 ConfigType = ConfigSpecific->ConfigType; 817 break; 818 819 case 7: 820 821 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, 822 &Subtable); 823 if (ACPI_FAILURE (Status)) 824 { 825 return (Status); 826 } 827 828 ParentTable = DtPeekSubtable (); 829 DtInsertSubtable (ParentTable, Subtable); 830 831 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b, 832 &Subtable); 833 if (ACPI_FAILURE (Status)) 834 { 835 return (Status); 836 } 837 838 ParentTable = DtPeekSubtable (); 839 DtInsertSubtable (ParentTable, Subtable); 840 841 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); 842 ArrayType = ConfigSpecific->ArrayType; 843 ConfigType = ConfigSpecific->ConfigType; 844 break; 845 846 default: 847 848 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, 849 &Subtable); 850 if (ACPI_FAILURE (Status)) 851 { 852 return (Status); 853 } 854 855 ParentTable = DtPeekSubtable (); 856 DtInsertSubtable (ParentTable, Subtable); 857 858 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); 859 ArrayType = ConfigSpecific->ArrayType; 860 ConfigType = ConfigSpecific->ConfigType; 861 break; 862 863 } /* switch (CapabilitiesSize) */ 864 865 if (CapabilitiesSize >= 3) 866 { 867 /* Check for a vendor-defined mic array */ 868 869 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) 870 { 871 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) 872 { 873 /* Get the microphone count */ 874 875 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a, 876 &Subtable); 877 if (ACPI_FAILURE (Status)) 878 { 879 return (Status); 880 } 881 882 MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer); 883 MicrophoneCount = MicCount->MicrophoneCount; 884 885 ParentTable = DtPeekSubtable (); 886 DtInsertSubtable (ParentTable, Subtable); 887 888 /* Variable number of microphones */ 889 890 for (j = 0; j < MicrophoneCount; j++) 891 { 892 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6, 893 &Subtable); 894 if (ACPI_FAILURE (Status)) 895 { 896 return (Status); 897 } 898 899 ParentTable = DtPeekSubtable (); 900 DtInsertSubtable (ParentTable, Subtable); 901 } 902 903 /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */ 904 905 if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) 906 { 907 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9, 908 &Subtable); 909 if (ACPI_FAILURE (Status)) 910 { 911 return (Status); 912 } 913 914 ParentTable = DtPeekSubtable (); 915 DtInsertSubtable (ParentTable, Subtable); 916 } 917 } 918 } 919 } 920 921 /* Get the formats count */ 922 923 DtPopSubtable (); 924 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4, 925 &Subtable); 926 if (ACPI_FAILURE (Status)) 927 { 928 return (Status); 929 } 930 931 ParentTable = DtPeekSubtable (); 932 DtInsertSubtable (ParentTable, Subtable); 933 934 FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer); 935 FormatsCount = FormatsConfig->FormatsCount; 936 937 /* Variable number of wave_format_extensible structs */ 938 939 for (j = 0; j < FormatsCount; j++) 940 { 941 /* Do the main wave_format_extensible structure */ 942 943 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3, 944 &Subtable); 945 if (ACPI_FAILURE (Status)) 946 { 947 return (Status); 948 } 949 950 ParentTable = DtPeekSubtable (); 951 DtInsertSubtable (ParentTable, Subtable); 952 DtPushSubtable (Subtable); 953 954 /* Do the capabilities list */ 955 956 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, 957 &Subtable); 958 if (ACPI_FAILURE (Status)) 959 { 960 return (Status); 961 } 962 963 DtPopSubtable (); 964 ParentTable = DtPeekSubtable (); 965 DtInsertSubtable (ParentTable, Subtable); 966 967 } /* for (j = 0; j < FormatsCount; j++) */ 968 969 /* 970 * If we are not done with the current Endpoint yet, then there must be 971 * some Linux-specific structure(s) yet to be processed. First, get 972 * the count of such structure(s). 973 */ 974 if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) 975 { 976 /* Get the count of Linux-specific structures */ 977 978 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7, 979 &Subtable); 980 if (ACPI_FAILURE (Status)) 981 { 982 return (Status); 983 } 984 985 ParentTable = DtPeekSubtable (); 986 DtInsertSubtable (ParentTable, Subtable); 987 988 LinuxSpecific = ACPI_CAST_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Subtable->Buffer); 989 LinuxSpecificCount = LinuxSpecific->StructureCount; 990 991 for (j = 0; j < LinuxSpecificCount; j++) 992 { 993 /* 994 * Compile the following Linux-specific fields: 995 * 1) Device ID 996 * 2) Device Instance ID 997 * 3) Device Port ID 998 */ 999 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a, 1000 &Subtable); 1001 if (ACPI_FAILURE (Status)) 1002 { 1003 return (Status); 1004 } 1005 1006 ParentTable = DtPeekSubtable (); 1007 DtInsertSubtable (ParentTable, Subtable); 1008 1009 /* 1010 * To have a valid Linux-specific "Specific Data" at this 1011 * point, we need: 1012 * 1) The next field must be named "Specific Data" 1013 */ 1014 if (!strcmp ((const char *) (*PFieldList)->Name, "Specific Data")) 1015 { 1016 /* Compile the "Specific Data" field */ 1017 1018 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, 1019 &Subtable); 1020 if (ACPI_FAILURE (Status)) 1021 { 1022 return (Status); 1023 } 1024 1025 ParentTable = DtPeekSubtable (); 1026 DtInsertSubtable (ParentTable, Subtable); 1027 } 1028 1029 } /* for (j = 0; j < LinuxSpecificCount; j++) */ 1030 } 1031 1032 DtPopSubtable (); 1033 1034 } /* for (i = 0; i < EndpointCount; i++) */ 1035 1036 /* 1037 * All Endpoint Descriptors are completed. 1038 * Do the table terminator structure (not in NHLT spec, optional) 1039 */ 1040 if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) 1041 { 1042 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt8, 1043 &Subtable); 1044 if (ACPI_FAILURE (Status)) 1045 { 1046 return (Status); 1047 } 1048 1049 ParentTable = DtPeekSubtable (); 1050 DtInsertSubtable (ParentTable, Subtable); 1051 } 1052 1053 return (AE_OK); 1054 } 1055 1056 return (AE_OK); 1057 } 1058 1059 1060 /****************************************************************************** 1061 * 1062 * FUNCTION: DtCompilePcct 1063 * 1064 * PARAMETERS: List - Current field list pointer 1065 * 1066 * RETURN: Status 1067 * 1068 * DESCRIPTION: Compile PCCT. 1069 * 1070 *****************************************************************************/ 1071 1072 ACPI_STATUS 1073 DtCompilePcct ( 1074 void **List) 1075 { 1076 ACPI_STATUS Status; 1077 DT_SUBTABLE *Subtable; 1078 DT_SUBTABLE *ParentTable; 1079 DT_FIELD **PFieldList = (DT_FIELD **) List; 1080 DT_FIELD *SubtableStart; 1081 ACPI_SUBTABLE_HEADER *PcctHeader; 1082 ACPI_DMTABLE_INFO *InfoTable; 1083 1084 1085 /* Main table */ 1086 1087 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct, 1088 &Subtable); 1089 if (ACPI_FAILURE (Status)) 1090 { 1091 return (Status); 1092 } 1093 1094 ParentTable = DtPeekSubtable (); 1095 DtInsertSubtable (ParentTable, Subtable); 1096 1097 /* Subtables */ 1098 1099 while (*PFieldList) 1100 { 1101 SubtableStart = *PFieldList; 1102 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr, 1103 &Subtable); 1104 if (ACPI_FAILURE (Status)) 1105 { 1106 return (Status); 1107 } 1108 1109 ParentTable = DtPeekSubtable (); 1110 DtInsertSubtable (ParentTable, Subtable); 1111 DtPushSubtable (Subtable); 1112 1113 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1114 1115 switch (PcctHeader->Type) 1116 { 1117 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 1118 1119 InfoTable = AcpiDmTableInfoPcct0; 1120 break; 1121 1122 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 1123 1124 InfoTable = AcpiDmTableInfoPcct1; 1125 break; 1126 1127 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 1128 1129 InfoTable = AcpiDmTableInfoPcct2; 1130 break; 1131 1132 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE: 1133 1134 InfoTable = AcpiDmTableInfoPcct3; 1135 break; 1136 1137 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE: 1138 1139 InfoTable = AcpiDmTableInfoPcct4; 1140 break; 1141 1142 case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE: 1143 1144 InfoTable = AcpiDmTableInfoPcct5; 1145 break; 1146 1147 default: 1148 1149 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT"); 1150 return (AE_ERROR); 1151 } 1152 1153 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1154 if (ACPI_FAILURE (Status)) 1155 { 1156 return (Status); 1157 } 1158 1159 ParentTable = DtPeekSubtable (); 1160 DtInsertSubtable (ParentTable, Subtable); 1161 DtPopSubtable (); 1162 } 1163 1164 return (AE_OK); 1165 } 1166 1167 1168 /****************************************************************************** 1169 * 1170 * FUNCTION: DtCompilePdtt 1171 * 1172 * PARAMETERS: List - Current field list pointer 1173 * 1174 * RETURN: Status 1175 * 1176 * DESCRIPTION: Compile PDTT. 1177 * 1178 *****************************************************************************/ 1179 1180 ACPI_STATUS 1181 DtCompilePdtt ( 1182 void **List) 1183 { 1184 ACPI_STATUS Status; 1185 DT_SUBTABLE *Subtable; 1186 DT_SUBTABLE *ParentTable; 1187 DT_FIELD **PFieldList = (DT_FIELD **) List; 1188 ACPI_TABLE_PDTT *PdttHeader; 1189 UINT32 Count = 0; 1190 1191 1192 /* Main table */ 1193 1194 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable); 1195 if (ACPI_FAILURE (Status)) 1196 { 1197 return (Status); 1198 } 1199 1200 ParentTable = DtPeekSubtable (); 1201 DtInsertSubtable (ParentTable, Subtable); 1202 1203 PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer); 1204 PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT); 1205 1206 /* There is only one type of subtable at this time, no need to decode */ 1207 1208 while (*PFieldList) 1209 { 1210 /* List of subchannel IDs, each 2 bytes */ 1211 1212 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0, 1213 &Subtable); 1214 if (ACPI_FAILURE (Status)) 1215 { 1216 return (Status); 1217 } 1218 1219 DtInsertSubtable (ParentTable, Subtable); 1220 Count++; 1221 } 1222 1223 PdttHeader->TriggerCount = (UINT8) Count; 1224 return (AE_OK); 1225 } 1226 1227 1228 /****************************************************************************** 1229 * 1230 * FUNCTION: DtCompilePhat 1231 * 1232 * PARAMETERS: List - Current field list pointer 1233 * 1234 * RETURN: Status 1235 * 1236 * DESCRIPTION: Compile Phat. 1237 * 1238 *****************************************************************************/ 1239 1240 ACPI_STATUS 1241 DtCompilePhat ( 1242 void **List) 1243 { 1244 ACPI_STATUS Status = AE_OK; 1245 DT_SUBTABLE *Subtable; 1246 DT_SUBTABLE *ParentTable; 1247 DT_FIELD **PFieldList = (DT_FIELD **) List; 1248 ACPI_PHAT_HEADER *PhatHeader; 1249 ACPI_DMTABLE_INFO *Info; 1250 ACPI_PHAT_VERSION_DATA *VersionData; 1251 UINT32 RecordCount; 1252 1253 1254 /* The table consist of subtables */ 1255 1256 while (*PFieldList) 1257 { 1258 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable); 1259 if (ACPI_FAILURE (Status)) 1260 { 1261 return (Status); 1262 } 1263 1264 ParentTable = DtPeekSubtable (); 1265 DtInsertSubtable (ParentTable, Subtable); 1266 DtPushSubtable (Subtable); 1267 1268 PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); 1269 1270 switch (PhatHeader->Type) 1271 { 1272 case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1273 1274 Info = AcpiDmTableInfoPhat0; 1275 PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA); 1276 break; 1277 1278 case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1279 1280 Info = AcpiDmTableInfoPhat1; 1281 PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA); 1282 break; 1283 1284 default: 1285 1286 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1287 return (AE_ERROR); 1288 1289 break; 1290 } 1291 1292 Status = DtCompileTable (PFieldList, Info, &Subtable); 1293 if (ACPI_FAILURE (Status)) 1294 { 1295 return (Status); 1296 } 1297 1298 ParentTable = DtPeekSubtable (); 1299 DtInsertSubtable (ParentTable, Subtable); 1300 1301 switch (PhatHeader->Type) 1302 { 1303 case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1304 1305 VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, 1306 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); 1307 RecordCount = VersionData->ElementCount; 1308 1309 while (RecordCount) 1310 { 1311 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a, 1312 &Subtable); 1313 if (ACPI_FAILURE (Status)) 1314 { 1315 return (Status); 1316 } 1317 ParentTable = DtPeekSubtable (); 1318 DtInsertSubtable (ParentTable, Subtable); 1319 1320 RecordCount--; 1321 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT); 1322 } 1323 break; 1324 1325 case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1326 1327 /* Compile device path */ 1328 1329 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable); 1330 if (ACPI_FAILURE (Status)) 1331 { 1332 return (Status); 1333 } 1334 ParentTable = DtPeekSubtable (); 1335 DtInsertSubtable (ParentTable, Subtable); 1336 1337 PhatHeader->Length += (UINT16) Subtable->Length; 1338 1339 /* Compile vendor specific data */ 1340 1341 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); 1342 if (ACPI_FAILURE (Status)) 1343 { 1344 return (Status); 1345 } 1346 ParentTable = DtPeekSubtable (); 1347 DtInsertSubtable (ParentTable, Subtable); 1348 1349 PhatHeader->Length += (UINT16) Subtable->Length; 1350 1351 break; 1352 1353 default: 1354 1355 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1356 return (AE_ERROR); 1357 } 1358 } 1359 1360 return (Status); 1361 } 1362 1363 1364 /****************************************************************************** 1365 * 1366 * FUNCTION: DtCompilePmtt 1367 * 1368 * PARAMETERS: List - Current field list pointer 1369 * 1370 * RETURN: Status 1371 * 1372 * DESCRIPTION: Compile PMTT. 1373 * 1374 *****************************************************************************/ 1375 1376 ACPI_STATUS 1377 DtCompilePmtt ( 1378 void **List) 1379 { 1380 ACPI_STATUS Status; 1381 DT_SUBTABLE *Subtable; 1382 DT_SUBTABLE *ParentTable; 1383 DT_FIELD **PFieldList = (DT_FIELD **) List; 1384 DT_FIELD *SubtableStart; 1385 UINT16 Type; 1386 1387 1388 /* Main table */ 1389 1390 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable); 1391 if (ACPI_FAILURE (Status)) 1392 { 1393 return (Status); 1394 } 1395 1396 ParentTable = DtPeekSubtable (); 1397 DtInsertSubtable (ParentTable, Subtable); 1398 DtPushSubtable (Subtable); 1399 1400 /* Subtables */ 1401 1402 while (*PFieldList) 1403 { 1404 SubtableStart = *PFieldList; 1405 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 1406 1407 switch (Type) 1408 { 1409 case ACPI_PMTT_TYPE_SOCKET: 1410 1411 /* Subtable: Socket Structure */ 1412 1413 DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n"); 1414 1415 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0, 1416 &Subtable); 1417 if (ACPI_FAILURE (Status)) 1418 { 1419 return (Status); 1420 } 1421 1422 break; 1423 1424 case ACPI_PMTT_TYPE_CONTROLLER: 1425 1426 /* Subtable: Memory Controller Structure */ 1427 1428 DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n"); 1429 1430 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1, 1431 &Subtable); 1432 if (ACPI_FAILURE (Status)) 1433 { 1434 return (Status); 1435 } 1436 1437 break; 1438 1439 case ACPI_PMTT_TYPE_DIMM: 1440 1441 /* Subtable: Physical Component (DIMM) Structure */ 1442 1443 DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n"); 1444 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2, 1445 &Subtable); 1446 if (ACPI_FAILURE (Status)) 1447 { 1448 return (Status); 1449 } 1450 1451 break; 1452 1453 case ACPI_PMTT_TYPE_VENDOR: 1454 1455 /* Subtable: Vendor-specific Structure */ 1456 1457 DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n"); 1458 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor, 1459 &Subtable); 1460 if (ACPI_FAILURE (Status)) 1461 { 1462 return (Status); 1463 } 1464 1465 break; 1466 1467 default: 1468 1469 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT"); 1470 return (AE_ERROR); 1471 } 1472 1473 DtInsertSubtable (ParentTable, Subtable); 1474 } 1475 1476 return (Status); 1477 } 1478 1479 1480 /****************************************************************************** 1481 * 1482 * FUNCTION: DtCompilePptt 1483 * 1484 * PARAMETERS: List - Current field list pointer 1485 * 1486 * RETURN: Status 1487 * 1488 * DESCRIPTION: Compile PPTT. 1489 * 1490 *****************************************************************************/ 1491 1492 ACPI_STATUS 1493 DtCompilePptt ( 1494 void **List) 1495 { 1496 ACPI_STATUS Status; 1497 ACPI_SUBTABLE_HEADER *PpttHeader; 1498 ACPI_PPTT_PROCESSOR *PpttProcessor = NULL; 1499 DT_SUBTABLE *Subtable; 1500 DT_SUBTABLE *ParentTable; 1501 ACPI_DMTABLE_INFO *InfoTable; 1502 DT_FIELD **PFieldList = (DT_FIELD **) List; 1503 DT_FIELD *SubtableStart; 1504 ACPI_TABLE_HEADER *PpttAcpiHeader; 1505 1506 1507 ParentTable = DtPeekSubtable (); 1508 while (*PFieldList) 1509 { 1510 SubtableStart = *PFieldList; 1511 1512 /* Compile PPTT subtable header */ 1513 1514 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr, 1515 &Subtable); 1516 if (ACPI_FAILURE (Status)) 1517 { 1518 return (Status); 1519 } 1520 DtInsertSubtable (ParentTable, Subtable); 1521 PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1522 PpttHeader->Length = (UINT8)(Subtable->Length); 1523 1524 switch (PpttHeader->Type) 1525 { 1526 case ACPI_PPTT_TYPE_PROCESSOR: 1527 1528 InfoTable = AcpiDmTableInfoPptt0; 1529 break; 1530 1531 case ACPI_PPTT_TYPE_CACHE: 1532 1533 InfoTable = AcpiDmTableInfoPptt1; 1534 break; 1535 1536 case ACPI_PPTT_TYPE_ID: 1537 1538 InfoTable = AcpiDmTableInfoPptt2; 1539 break; 1540 1541 default: 1542 1543 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT"); 1544 return (AE_ERROR); 1545 } 1546 1547 /* Compile PPTT subtable body */ 1548 1549 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1550 if (ACPI_FAILURE (Status)) 1551 { 1552 return (Status); 1553 } 1554 DtInsertSubtable (ParentTable, Subtable); 1555 PpttHeader->Length += (UINT8)(Subtable->Length); 1556 1557 /* Compile PPTT subtable additionals */ 1558 1559 switch (PpttHeader->Type) 1560 { 1561 case ACPI_PPTT_TYPE_PROCESSOR: 1562 1563 PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR, 1564 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER)); 1565 if (PpttProcessor) 1566 { 1567 /* Compile initiator proximity domain list */ 1568 1569 PpttProcessor->NumberOfPrivResources = 0; 1570 while (*PFieldList) 1571 { 1572 Status = DtCompileTable (PFieldList, 1573 AcpiDmTableInfoPptt0a, &Subtable); 1574 if (ACPI_FAILURE (Status)) 1575 { 1576 return (Status); 1577 } 1578 if (!Subtable) 1579 { 1580 break; 1581 } 1582 1583 DtInsertSubtable (ParentTable, Subtable); 1584 PpttHeader->Length += (UINT8)(Subtable->Length); 1585 PpttProcessor->NumberOfPrivResources++; 1586 } 1587 } 1588 break; 1589 1590 case ACPI_PPTT_TYPE_CACHE: 1591 1592 PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, 1593 AslGbl_RootTable->Buffer); 1594 if (PpttAcpiHeader->Revision < 3) 1595 { 1596 break; 1597 } 1598 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a, 1599 &Subtable); 1600 DtInsertSubtable (ParentTable, Subtable); 1601 PpttHeader->Length += (UINT8)(Subtable->Length); 1602 break; 1603 1604 default: 1605 1606 break; 1607 } 1608 } 1609 1610 return (AE_OK); 1611 } 1612 1613 1614 /****************************************************************************** 1615 * 1616 * FUNCTION: DtCompilePrmt 1617 * 1618 * PARAMETERS: List - Current field list pointer 1619 * 1620 * RETURN: Status 1621 * 1622 * DESCRIPTION: Compile PRMT. 1623 * 1624 *****************************************************************************/ 1625 1626 ACPI_STATUS 1627 DtCompilePrmt ( 1628 void **List) 1629 { 1630 ACPI_STATUS Status; 1631 ACPI_TABLE_PRMT_HEADER *PrmtHeader; 1632 ACPI_PRMT_MODULE_INFO *PrmtModuleInfo; 1633 DT_SUBTABLE *Subtable; 1634 DT_SUBTABLE *ParentTable; 1635 DT_FIELD **PFieldList = (DT_FIELD **) List; 1636 UINT32 i, j; 1637 1638 ParentTable = DtPeekSubtable (); 1639 1640 /* Compile PRMT subtable header */ 1641 1642 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr, 1643 &Subtable); 1644 if (ACPI_FAILURE (Status)) 1645 { 1646 return (Status); 1647 } 1648 DtInsertSubtable (ParentTable, Subtable); 1649 PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer); 1650 1651 for (i = 0; i < PrmtHeader->ModuleInfoCount; i++) 1652 { 1653 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule, 1654 &Subtable); 1655 if (ACPI_FAILURE (Status)) 1656 { 1657 return (Status); 1658 } 1659 DtInsertSubtable (ParentTable, Subtable); 1660 PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer); 1661 1662 for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++) 1663 { 1664 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler, 1665 &Subtable); 1666 if (ACPI_FAILURE (Status)) 1667 { 1668 return (Status); 1669 } 1670 DtInsertSubtable (ParentTable, Subtable); 1671 } 1672 } 1673 1674 return (AE_OK); 1675 } 1676 1677 1678 /****************************************************************************** 1679 * 1680 * FUNCTION: DtCompileRgrt 1681 * 1682 * PARAMETERS: List - Current field list pointer 1683 * 1684 * RETURN: Status 1685 * 1686 * DESCRIPTION: Compile RGRT. 1687 * 1688 *****************************************************************************/ 1689 1690 ACPI_STATUS 1691 DtCompileRgrt ( 1692 void **List) 1693 { 1694 ACPI_STATUS Status; 1695 DT_SUBTABLE *Subtable; 1696 DT_SUBTABLE *ParentTable; 1697 DT_FIELD **PFieldList = (DT_FIELD **) List; 1698 1699 1700 /* Compile the main table */ 1701 1702 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt, 1703 &Subtable); 1704 if (ACPI_FAILURE (Status)) 1705 { 1706 return (Status); 1707 } 1708 1709 ParentTable = DtPeekSubtable (); 1710 DtInsertSubtable (ParentTable, Subtable); 1711 1712 /* Compile the "Subtable" -- actually just the binary (PNG) image */ 1713 1714 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0, 1715 &Subtable); 1716 if (ACPI_FAILURE (Status)) 1717 { 1718 return (Status); 1719 } 1720 1721 DtInsertSubtable (ParentTable, Subtable); 1722 return (AE_OK); 1723 } 1724 1725 1726 /****************************************************************************** 1727 * 1728 * FUNCTION: DtCompileRsdt 1729 * 1730 * PARAMETERS: List - Current field list pointer 1731 * 1732 * RETURN: Status 1733 * 1734 * DESCRIPTION: Compile RSDT. 1735 * 1736 *****************************************************************************/ 1737 1738 ACPI_STATUS 1739 DtCompileRsdt ( 1740 void **List) 1741 { 1742 DT_SUBTABLE *Subtable; 1743 DT_SUBTABLE *ParentTable; 1744 DT_FIELD *FieldList = *(DT_FIELD **) List; 1745 UINT32 Address; 1746 1747 1748 ParentTable = DtPeekSubtable (); 1749 1750 while (FieldList) 1751 { 1752 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 1753 1754 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 1755 DtInsertSubtable (ParentTable, Subtable); 1756 FieldList = FieldList->Next; 1757 } 1758 1759 return (AE_OK); 1760 } 1761 1762 1763 /****************************************************************************** 1764 * 1765 * FUNCTION: DtCompileS3pt 1766 * 1767 * PARAMETERS: PFieldList - Current field list pointer 1768 * 1769 * RETURN: Status 1770 * 1771 * DESCRIPTION: Compile S3PT (Pointed to by FPDT) 1772 * 1773 *****************************************************************************/ 1774 1775 ACPI_STATUS 1776 DtCompileS3pt ( 1777 DT_FIELD **PFieldList) 1778 { 1779 ACPI_STATUS Status; 1780 ACPI_FPDT_HEADER *S3ptHeader; 1781 DT_SUBTABLE *Subtable; 1782 DT_SUBTABLE *ParentTable; 1783 ACPI_DMTABLE_INFO *InfoTable; 1784 DT_FIELD *SubtableStart; 1785 1786 1787 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, 1788 &AslGbl_RootTable); 1789 if (ACPI_FAILURE (Status)) 1790 { 1791 return (Status); 1792 } 1793 1794 DtPushSubtable (AslGbl_RootTable); 1795 1796 while (*PFieldList) 1797 { 1798 SubtableStart = *PFieldList; 1799 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr, 1800 &Subtable); 1801 if (ACPI_FAILURE (Status)) 1802 { 1803 return (Status); 1804 } 1805 1806 ParentTable = DtPeekSubtable (); 1807 DtInsertSubtable (ParentTable, Subtable); 1808 DtPushSubtable (Subtable); 1809 1810 S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 1811 1812 switch (S3ptHeader->Type) 1813 { 1814 case ACPI_S3PT_TYPE_RESUME: 1815 1816 InfoTable = AcpiDmTableInfoS3pt0; 1817 break; 1818 1819 case ACPI_S3PT_TYPE_SUSPEND: 1820 1821 InfoTable = AcpiDmTableInfoS3pt1; 1822 break; 1823 1824 default: 1825 1826 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); 1827 return (AE_ERROR); 1828 } 1829 1830 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1831 if (ACPI_FAILURE (Status)) 1832 { 1833 return (Status); 1834 } 1835 1836 ParentTable = DtPeekSubtable (); 1837 DtInsertSubtable (ParentTable, Subtable); 1838 DtPopSubtable (); 1839 } 1840 1841 return (AE_OK); 1842 } 1843 1844 1845 /****************************************************************************** 1846 * 1847 * FUNCTION: DtCompileSdev 1848 * 1849 * PARAMETERS: List - Current field list pointer 1850 * 1851 * RETURN: Status 1852 * 1853 * DESCRIPTION: Compile SDEV. 1854 * 1855 *****************************************************************************/ 1856 1857 ACPI_STATUS 1858 DtCompileSdev ( 1859 void **List) 1860 { 1861 ACPI_STATUS Status; 1862 ACPI_SDEV_HEADER *SdevHeader; 1863 ACPI_SDEV_HEADER *SecureComponentHeader; 1864 DT_SUBTABLE *Subtable; 1865 DT_SUBTABLE *ParentTable; 1866 ACPI_DMTABLE_INFO *InfoTable; 1867 ACPI_DMTABLE_INFO *SecureComponentInfoTable = NULL; 1868 DT_FIELD **PFieldList = (DT_FIELD **) List; 1869 DT_FIELD *SubtableStart; 1870 ACPI_SDEV_PCIE *Pcie = NULL; 1871 ACPI_SDEV_NAMESPACE *Namesp = NULL; 1872 UINT32 EntryCount; 1873 ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; 1874 UINT16 ComponentLength = 0; 1875 1876 1877 /* Subtables */ 1878 1879 while (*PFieldList) 1880 { 1881 /* Compile common SDEV subtable header */ 1882 1883 SubtableStart = *PFieldList; 1884 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr, 1885 &Subtable); 1886 if (ACPI_FAILURE (Status)) 1887 { 1888 return (Status); 1889 } 1890 1891 ParentTable = DtPeekSubtable (); 1892 DtInsertSubtable (ParentTable, Subtable); 1893 DtPushSubtable (Subtable); 1894 1895 SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 1896 SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER)); 1897 1898 switch (SdevHeader->Type) 1899 { 1900 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 1901 1902 InfoTable = AcpiDmTableInfoSdev0; 1903 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer); 1904 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT, 1905 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE))); 1906 break; 1907 1908 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 1909 1910 InfoTable = AcpiDmTableInfoSdev1; 1911 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer); 1912 break; 1913 1914 default: 1915 1916 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 1917 return (AE_ERROR); 1918 } 1919 1920 /* Compile SDEV subtable body */ 1921 1922 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1923 if (ACPI_FAILURE (Status)) 1924 { 1925 return (Status); 1926 } 1927 1928 ParentTable = DtPeekSubtable (); 1929 DtInsertSubtable (ParentTable, Subtable); 1930 1931 /* Optional data fields are appended to the main subtable body */ 1932 1933 switch (SdevHeader->Type) 1934 { 1935 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 1936 1937 /* 1938 * Device Id Offset will be be calculated differently depending on 1939 * the presence of secure access components. 1940 */ 1941 Namesp->DeviceIdOffset = 0; 1942 ComponentLength = 0; 1943 1944 /* If the secure access component exists, get the structures */ 1945 1946 if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT) 1947 { 1948 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b, 1949 &Subtable); 1950 if (ACPI_FAILURE (Status)) 1951 { 1952 return (Status); 1953 } 1954 ParentTable = DtPeekSubtable (); 1955 DtInsertSubtable (ParentTable, Subtable); 1956 1957 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT); 1958 1959 /* Compile a secure access component header */ 1960 1961 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr, 1962 &Subtable); 1963 if (ACPI_FAILURE (Status)) 1964 { 1965 return (Status); 1966 } 1967 ParentTable = DtPeekSubtable (); 1968 DtInsertSubtable (ParentTable, Subtable); 1969 1970 /* Compile the secure access component */ 1971 1972 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 1973 switch (SecureComponentHeader->Type) 1974 { 1975 case ACPI_SDEV_TYPE_ID_COMPONENT: 1976 1977 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId; 1978 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT); 1979 ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT); 1980 break; 1981 1982 case ACPI_SDEV_TYPE_MEM_COMPONENT: 1983 1984 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem; 1985 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT); 1986 ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT); 1987 break; 1988 1989 default: 1990 1991 /* Any other secure component types are undefined */ 1992 1993 return (AE_ERROR); 1994 } 1995 1996 Status = DtCompileTable (PFieldList, SecureComponentInfoTable, 1997 &Subtable); 1998 if (ACPI_FAILURE (Status)) 1999 { 2000 return (Status); 2001 } 2002 ParentTable = DtPeekSubtable (); 2003 DtInsertSubtable (ParentTable, Subtable); 2004 2005 SecureComponent->SecureComponentOffset = 2006 sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT); 2007 SecureComponent->SecureComponentLength = ComponentLength; 2008 2009 2010 /* 2011 * Add the secure component to the subtable to be added for the 2012 * the namespace subtable's length 2013 */ 2014 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT); 2015 } 2016 2017 /* Append DeviceId namespace string */ 2018 2019 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a, 2020 &Subtable); 2021 if (ACPI_FAILURE (Status)) 2022 { 2023 return (Status); 2024 } 2025 2026 if (!Subtable) 2027 { 2028 break; 2029 } 2030 2031 ParentTable = DtPeekSubtable (); 2032 DtInsertSubtable (ParentTable, Subtable); 2033 2034 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE); 2035 2036 Namesp->DeviceIdLength = (UINT16) Subtable->Length; 2037 2038 /* Append Vendor data */ 2039 2040 Namesp->VendorDataLength = 0; 2041 Namesp->VendorDataOffset = 0; 2042 2043 if (*PFieldList) 2044 { 2045 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 2046 &Subtable); 2047 if (ACPI_FAILURE (Status)) 2048 { 2049 return (Status); 2050 } 2051 2052 if (Subtable) 2053 { 2054 ParentTable = DtPeekSubtable (); 2055 DtInsertSubtable (ParentTable, Subtable); 2056 2057 Namesp->VendorDataOffset = 2058 Namesp->DeviceIdOffset + Namesp->DeviceIdLength; 2059 Namesp->VendorDataLength = 2060 (UINT16) Subtable->Length; 2061 2062 /* Final size of entire namespace structure */ 2063 2064 SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) + 2065 Subtable->Length + Namesp->DeviceIdLength) + ComponentLength; 2066 } 2067 } 2068 2069 break; 2070 2071 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 2072 2073 /* Append the PCIe path info first */ 2074 2075 EntryCount = 0; 2076 while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device")) 2077 { 2078 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a, 2079 &Subtable); 2080 if (ACPI_FAILURE (Status)) 2081 { 2082 return (Status); 2083 } 2084 2085 if (!Subtable) 2086 { 2087 DtPopSubtable (); 2088 break; 2089 } 2090 2091 ParentTable = DtPeekSubtable (); 2092 DtInsertSubtable (ParentTable, Subtable); 2093 EntryCount++; 2094 } 2095 2096 /* Path offset will point immediately after the main subtable */ 2097 2098 Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE); 2099 Pcie->PathLength = (UINT16) 2100 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH)); 2101 2102 /* Append the Vendor Data last */ 2103 2104 Pcie->VendorDataLength = 0; 2105 Pcie->VendorDataOffset = 0; 2106 2107 if (*PFieldList) 2108 { 2109 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 2110 &Subtable); 2111 if (ACPI_FAILURE (Status)) 2112 { 2113 return (Status); 2114 } 2115 2116 if (Subtable) 2117 { 2118 ParentTable = DtPeekSubtable (); 2119 DtInsertSubtable (ParentTable, Subtable); 2120 2121 Pcie->VendorDataOffset = 2122 Pcie->PathOffset + Pcie->PathLength; 2123 Pcie->VendorDataLength = (UINT16) 2124 Subtable->Length; 2125 } 2126 } 2127 2128 SdevHeader->Length = 2129 sizeof (ACPI_SDEV_PCIE) + 2130 Pcie->PathLength + Pcie->VendorDataLength; 2131 break; 2132 2133 default: 2134 2135 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 2136 return (AE_ERROR); 2137 } 2138 2139 DtPopSubtable (); 2140 } 2141 2142 return (AE_OK); 2143 } 2144 2145 2146 /****************************************************************************** 2147 * 2148 * FUNCTION: DtCompileSlic 2149 * 2150 * PARAMETERS: List - Current field list pointer 2151 * 2152 * RETURN: Status 2153 * 2154 * DESCRIPTION: Compile SLIC. 2155 * 2156 *****************************************************************************/ 2157 2158 ACPI_STATUS 2159 DtCompileSlic ( 2160 void **List) 2161 { 2162 ACPI_STATUS Status; 2163 DT_SUBTABLE *Subtable; 2164 DT_SUBTABLE *ParentTable; 2165 DT_FIELD **PFieldList = (DT_FIELD **) List; 2166 2167 2168 while (*PFieldList) 2169 { 2170 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic, 2171 &Subtable); 2172 if (ACPI_FAILURE (Status)) 2173 { 2174 return (Status); 2175 } 2176 2177 ParentTable = DtPeekSubtable (); 2178 DtInsertSubtable (ParentTable, Subtable); 2179 DtPushSubtable (Subtable); 2180 DtPopSubtable (); 2181 } 2182 2183 return (AE_OK); 2184 } 2185 2186 2187 /****************************************************************************** 2188 * 2189 * FUNCTION: DtCompileSlit 2190 * 2191 * PARAMETERS: List - Current field list pointer 2192 * 2193 * RETURN: Status 2194 * 2195 * DESCRIPTION: Compile SLIT. 2196 * 2197 *****************************************************************************/ 2198 2199 ACPI_STATUS 2200 DtCompileSlit ( 2201 void **List) 2202 { 2203 ACPI_STATUS Status; 2204 DT_SUBTABLE *Subtable; 2205 DT_SUBTABLE *ParentTable; 2206 DT_FIELD **PFieldList = (DT_FIELD **) List; 2207 DT_FIELD *FieldList; 2208 DT_FIELD *EndOfFieldList = NULL; 2209 UINT32 Localities; 2210 UINT32 LocalityListLength; 2211 UINT8 *LocalityBuffer; 2212 2213 2214 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 2215 &Subtable); 2216 if (ACPI_FAILURE (Status)) 2217 { 2218 return (Status); 2219 } 2220 2221 ParentTable = DtPeekSubtable (); 2222 DtInsertSubtable (ParentTable, Subtable); 2223 2224 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 2225 LocalityBuffer = UtLocalCalloc (Localities); 2226 LocalityListLength = 0; 2227 2228 /* Compile each locality buffer */ 2229 2230 FieldList = *PFieldList; 2231 while (FieldList) 2232 { 2233 DtCompileBuffer (LocalityBuffer, 2234 FieldList->Value, FieldList, Localities); 2235 2236 LocalityListLength++; 2237 DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 2238 DtInsertSubtable (ParentTable, Subtable); 2239 EndOfFieldList = FieldList; 2240 FieldList = FieldList->Next; 2241 } 2242 2243 if (LocalityListLength != Localities) 2244 { 2245 sprintf(AslGbl_MsgBuffer, 2246 "Found %u entries, must match LocalityCount: %u", 2247 LocalityListLength, Localities); 2248 DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer); 2249 ACPI_FREE (LocalityBuffer); 2250 return (AE_LIMIT); 2251 } 2252 2253 ACPI_FREE (LocalityBuffer); 2254 return (AE_OK); 2255 } 2256 2257 2258 /****************************************************************************** 2259 * 2260 * FUNCTION: DtCompileSrat 2261 * 2262 * PARAMETERS: List - Current field list pointer 2263 * 2264 * RETURN: Status 2265 * 2266 * DESCRIPTION: Compile SRAT. 2267 * 2268 *****************************************************************************/ 2269 2270 ACPI_STATUS 2271 DtCompileSrat ( 2272 void **List) 2273 { 2274 ACPI_STATUS Status; 2275 DT_SUBTABLE *Subtable; 2276 DT_SUBTABLE *ParentTable; 2277 DT_FIELD **PFieldList = (DT_FIELD **) List; 2278 DT_FIELD *SubtableStart; 2279 ACPI_SUBTABLE_HEADER *SratHeader; 2280 ACPI_DMTABLE_INFO *InfoTable; 2281 2282 2283 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 2284 &Subtable); 2285 if (ACPI_FAILURE (Status)) 2286 { 2287 return (Status); 2288 } 2289 2290 ParentTable = DtPeekSubtable (); 2291 DtInsertSubtable (ParentTable, Subtable); 2292 2293 while (*PFieldList) 2294 { 2295 SubtableStart = *PFieldList; 2296 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 2297 &Subtable); 2298 if (ACPI_FAILURE (Status)) 2299 { 2300 return (Status); 2301 } 2302 2303 ParentTable = DtPeekSubtable (); 2304 DtInsertSubtable (ParentTable, Subtable); 2305 DtPushSubtable (Subtable); 2306 2307 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 2308 2309 switch (SratHeader->Type) 2310 { 2311 case ACPI_SRAT_TYPE_CPU_AFFINITY: 2312 2313 InfoTable = AcpiDmTableInfoSrat0; 2314 break; 2315 2316 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2317 2318 InfoTable = AcpiDmTableInfoSrat1; 2319 break; 2320 2321 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2322 2323 InfoTable = AcpiDmTableInfoSrat2; 2324 break; 2325 2326 case ACPI_SRAT_TYPE_GICC_AFFINITY: 2327 2328 InfoTable = AcpiDmTableInfoSrat3; 2329 break; 2330 2331 case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY: 2332 2333 InfoTable = AcpiDmTableInfoSrat4; 2334 break; 2335 2336 case ACPI_SRAT_TYPE_GENERIC_AFFINITY: 2337 2338 InfoTable = AcpiDmTableInfoSrat5; 2339 break; 2340 2341 case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY: 2342 2343 InfoTable = AcpiDmTableInfoSrat6; 2344 break; 2345 2346 default: 2347 2348 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 2349 return (AE_ERROR); 2350 } 2351 2352 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2353 if (ACPI_FAILURE (Status)) 2354 { 2355 return (Status); 2356 } 2357 2358 ParentTable = DtPeekSubtable (); 2359 DtInsertSubtable (ParentTable, Subtable); 2360 DtPopSubtable (); 2361 } 2362 2363 return (AE_OK); 2364 } 2365 2366 2367 /****************************************************************************** 2368 * 2369 * FUNCTION: DtCompileStao 2370 * 2371 * PARAMETERS: PFieldList - Current field list pointer 2372 * 2373 * RETURN: Status 2374 * 2375 * DESCRIPTION: Compile STAO. 2376 * 2377 *****************************************************************************/ 2378 2379 ACPI_STATUS 2380 DtCompileStao ( 2381 void **List) 2382 { 2383 DT_FIELD **PFieldList = (DT_FIELD **) List; 2384 DT_SUBTABLE *Subtable; 2385 DT_SUBTABLE *ParentTable; 2386 ACPI_STATUS Status; 2387 2388 2389 /* Compile the main table */ 2390 2391 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao, 2392 &Subtable); 2393 if (ACPI_FAILURE (Status)) 2394 { 2395 return (Status); 2396 } 2397 2398 ParentTable = DtPeekSubtable (); 2399 DtInsertSubtable (ParentTable, Subtable); 2400 2401 /* Compile each ASCII namestring as a subtable */ 2402 2403 while (*PFieldList) 2404 { 2405 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr, 2406 &Subtable); 2407 if (ACPI_FAILURE (Status)) 2408 { 2409 return (Status); 2410 } 2411 2412 ParentTable = DtPeekSubtable (); 2413 DtInsertSubtable (ParentTable, Subtable); 2414 } 2415 2416 return (AE_OK); 2417 } 2418 2419 2420 /****************************************************************************** 2421 * 2422 * FUNCTION: DtCompileSvkl 2423 * 2424 * PARAMETERS: PFieldList - Current field list pointer 2425 * 2426 * RETURN: Status 2427 * 2428 * DESCRIPTION: Compile SVKL. 2429 * 2430 * NOTES: SVKL is essentially a flat table, with a small main table and 2431 * a variable number of a single type of subtable. 2432 * 2433 *****************************************************************************/ 2434 2435 ACPI_STATUS 2436 DtCompileSvkl ( 2437 void **List) 2438 { 2439 DT_FIELD **PFieldList = (DT_FIELD **) List; 2440 DT_SUBTABLE *Subtable; 2441 DT_SUBTABLE *ParentTable; 2442 ACPI_STATUS Status; 2443 2444 2445 /* Compile the main table */ 2446 2447 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl, 2448 &Subtable); 2449 if (ACPI_FAILURE (Status)) 2450 { 2451 return (Status); 2452 } 2453 2454 ParentTable = DtPeekSubtable (); 2455 DtInsertSubtable (ParentTable, Subtable); 2456 2457 /* Compile each subtable */ 2458 2459 while (*PFieldList) 2460 { 2461 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0, 2462 &Subtable); 2463 if (ACPI_FAILURE (Status)) 2464 { 2465 return (Status); 2466 } 2467 2468 ParentTable = DtPeekSubtable (); 2469 DtInsertSubtable (ParentTable, Subtable); 2470 } 2471 2472 return (AE_OK); 2473 } 2474 2475 2476 /****************************************************************************** 2477 * 2478 * FUNCTION: DtCompileTcpa 2479 * 2480 * PARAMETERS: PFieldList - Current field list pointer 2481 * 2482 * RETURN: Status 2483 * 2484 * DESCRIPTION: Compile TCPA. 2485 * 2486 *****************************************************************************/ 2487 2488 ACPI_STATUS 2489 DtCompileTcpa ( 2490 void **List) 2491 { 2492 DT_FIELD **PFieldList = (DT_FIELD **) List; 2493 DT_SUBTABLE *Subtable; 2494 ACPI_TABLE_TCPA_HDR *TcpaHeader; 2495 DT_SUBTABLE *ParentTable; 2496 ACPI_STATUS Status; 2497 2498 2499 /* Compile the main table */ 2500 2501 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr, 2502 &Subtable); 2503 if (ACPI_FAILURE (Status)) 2504 { 2505 return (Status); 2506 } 2507 2508 ParentTable = DtPeekSubtable (); 2509 DtInsertSubtable (ParentTable, Subtable); 2510 2511 /* 2512 * Examine the PlatformClass field to determine the table type. 2513 * Either a client or server table. Only one. 2514 */ 2515 TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer); 2516 2517 switch (TcpaHeader->PlatformClass) 2518 { 2519 case ACPI_TCPA_CLIENT_TABLE: 2520 2521 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient, 2522 &Subtable); 2523 break; 2524 2525 case ACPI_TCPA_SERVER_TABLE: 2526 2527 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer, 2528 &Subtable); 2529 break; 2530 2531 default: 2532 2533 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 2534 TcpaHeader->PlatformClass); 2535 Status = AE_ERROR; 2536 break; 2537 } 2538 2539 ParentTable = DtPeekSubtable (); 2540 DtInsertSubtable (ParentTable, Subtable); 2541 return (Status); 2542 } 2543 2544 2545 /****************************************************************************** 2546 * 2547 * FUNCTION: DtCompileTpm2Rev3 2548 * 2549 * PARAMETERS: PFieldList - Current field list pointer 2550 * 2551 * RETURN: Status 2552 * 2553 * DESCRIPTION: Compile TPM2 revision 3 2554 * 2555 *****************************************************************************/ 2556 static ACPI_STATUS 2557 DtCompileTpm2Rev3 ( 2558 void **List) 2559 { 2560 DT_FIELD **PFieldList = (DT_FIELD **) List; 2561 DT_SUBTABLE *Subtable; 2562 ACPI_TABLE_TPM23 *Tpm23Header; 2563 DT_SUBTABLE *ParentTable; 2564 ACPI_STATUS Status = AE_OK; 2565 2566 2567 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, 2568 &Subtable); 2569 2570 ParentTable = DtPeekSubtable (); 2571 DtInsertSubtable (ParentTable, Subtable); 2572 Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); 2573 2574 /* Subtable type depends on the StartMethod */ 2575 2576 switch (Tpm23Header->StartMethod) 2577 { 2578 case ACPI_TPM23_ACPI_START_METHOD: 2579 2580 /* Subtable specific to to ARM_SMC */ 2581 2582 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, 2583 &Subtable); 2584 if (ACPI_FAILURE (Status)) 2585 { 2586 return (Status); 2587 } 2588 2589 ParentTable = DtPeekSubtable (); 2590 DtInsertSubtable (ParentTable, Subtable); 2591 break; 2592 2593 default: 2594 break; 2595 } 2596 2597 return (Status); 2598 } 2599 2600 2601 /****************************************************************************** 2602 * 2603 * FUNCTION: DtCompileTpm2 2604 * 2605 * PARAMETERS: PFieldList - Current field list pointer 2606 * 2607 * RETURN: Status 2608 * 2609 * DESCRIPTION: Compile TPM2. 2610 * 2611 *****************************************************************************/ 2612 2613 ACPI_STATUS 2614 DtCompileTpm2 ( 2615 void **List) 2616 { 2617 DT_FIELD **PFieldList = (DT_FIELD **) List; 2618 DT_SUBTABLE *Subtable; 2619 ACPI_TABLE_TPM2 *Tpm2Header; 2620 DT_SUBTABLE *ParentTable; 2621 ACPI_STATUS Status = AE_OK; 2622 ACPI_TABLE_HEADER *Header; 2623 2624 2625 ParentTable = DtPeekSubtable (); 2626 2627 Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 2628 2629 if (Header->Revision == 3) 2630 { 2631 return (DtCompileTpm2Rev3 (List)); 2632 } 2633 2634 /* Compile the main table */ 2635 2636 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, 2637 &Subtable); 2638 if (ACPI_FAILURE (Status)) 2639 { 2640 return (Status); 2641 } 2642 2643 ParentTable = DtPeekSubtable (); 2644 DtInsertSubtable (ParentTable, Subtable); 2645 2646 Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer); 2647 2648 /* Method parameters */ 2649 /* Optional: Log area minimum length */ 2650 /* Optional: Log area start address */ 2651 /* TBD: Optional fields above not fully implemented (not optional at this time) */ 2652 2653 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a, 2654 &Subtable); 2655 if (ACPI_FAILURE (Status)) 2656 { 2657 return (Status); 2658 } 2659 2660 ParentTable = DtPeekSubtable (); 2661 DtInsertSubtable (ParentTable, Subtable); 2662 2663 2664 /* Subtable type depends on the StartMethod */ 2665 2666 switch (Tpm2Header->StartMethod) 2667 { 2668 case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: 2669 2670 /* Subtable specific to to ARM_SMC */ 2671 2672 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211, 2673 &Subtable); 2674 if (ACPI_FAILURE (Status)) 2675 { 2676 return (Status); 2677 } 2678 2679 ParentTable = DtPeekSubtable (); 2680 DtInsertSubtable (ParentTable, Subtable); 2681 break; 2682 2683 case ACPI_TPM2_START_METHOD: 2684 case ACPI_TPM2_MEMORY_MAPPED: 2685 case ACPI_TPM2_COMMAND_BUFFER: 2686 case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD: 2687 break; 2688 2689 case ACPI_TPM2_RESERVED1: 2690 case ACPI_TPM2_RESERVED3: 2691 case ACPI_TPM2_RESERVED4: 2692 case ACPI_TPM2_RESERVED5: 2693 case ACPI_TPM2_RESERVED9: 2694 case ACPI_TPM2_RESERVED10: 2695 2696 AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", 2697 Tpm2Header->StartMethod); 2698 Status = AE_ERROR; 2699 break; 2700 2701 case ACPI_TPM2_NOT_ALLOWED: 2702 default: 2703 2704 AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", 2705 Tpm2Header->StartMethod); 2706 Status = AE_ERROR; 2707 break; 2708 } 2709 2710 return (Status); 2711 } 2712 2713 2714 /****************************************************************************** 2715 * 2716 * FUNCTION: DtGetGenericTableInfo 2717 * 2718 * PARAMETERS: Name - Generic type name 2719 * 2720 * RETURN: Info entry 2721 * 2722 * DESCRIPTION: Obtain table info for a generic name entry 2723 * 2724 *****************************************************************************/ 2725 2726 ACPI_DMTABLE_INFO * 2727 DtGetGenericTableInfo ( 2728 char *Name) 2729 { 2730 ACPI_DMTABLE_INFO *Info; 2731 UINT32 i; 2732 2733 2734 if (!Name) 2735 { 2736 return (NULL); 2737 } 2738 2739 /* Search info table for name match */ 2740 2741 for (i = 0; ; i++) 2742 { 2743 Info = AcpiDmTableInfoGeneric[i]; 2744 if (Info->Opcode == ACPI_DMT_EXIT) 2745 { 2746 Info = NULL; 2747 break; 2748 } 2749 2750 /* Use caseless compare for generic keywords */ 2751 2752 if (!AcpiUtStricmp (Name, Info->Name)) 2753 { 2754 break; 2755 } 2756 } 2757 2758 return (Info); 2759 } 2760 2761 2762 /****************************************************************************** 2763 * 2764 * FUNCTION: DtCompileUefi 2765 * 2766 * PARAMETERS: List - Current field list pointer 2767 * 2768 * RETURN: Status 2769 * 2770 * DESCRIPTION: Compile UEFI. 2771 * 2772 *****************************************************************************/ 2773 2774 ACPI_STATUS 2775 DtCompileUefi ( 2776 void **List) 2777 { 2778 ACPI_STATUS Status; 2779 DT_SUBTABLE *Subtable; 2780 DT_SUBTABLE *ParentTable; 2781 DT_FIELD **PFieldList = (DT_FIELD **) List; 2782 UINT16 *DataOffset; 2783 2784 2785 /* Compile the predefined portion of the UEFI table */ 2786 2787 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi, 2788 &Subtable); 2789 if (ACPI_FAILURE (Status)) 2790 { 2791 return (Status); 2792 } 2793 2794 DataOffset = (UINT16 *) (Subtable->Buffer + 16); 2795 *DataOffset = sizeof (ACPI_TABLE_UEFI); 2796 2797 ParentTable = DtPeekSubtable (); 2798 DtInsertSubtable (ParentTable, Subtable); 2799 2800 /* 2801 * Compile the "generic" portion of the UEFI table. This 2802 * part of the table is not predefined and any of the generic 2803 * operators may be used. 2804 */ 2805 DtCompileGeneric ((void **) PFieldList, NULL, NULL); 2806 return (AE_OK); 2807 } 2808 2809 2810 /****************************************************************************** 2811 * 2812 * FUNCTION: DtCompileViot 2813 * 2814 * PARAMETERS: List - Current field list pointer 2815 * 2816 * RETURN: Status 2817 * 2818 * DESCRIPTION: Compile VIOT. 2819 * 2820 *****************************************************************************/ 2821 2822 ACPI_STATUS 2823 DtCompileViot ( 2824 void **List) 2825 { 2826 ACPI_STATUS Status; 2827 DT_SUBTABLE *Subtable; 2828 DT_SUBTABLE *ParentTable; 2829 DT_FIELD **PFieldList = (DT_FIELD **) List; 2830 DT_FIELD *SubtableStart; 2831 ACPI_TABLE_VIOT *Viot; 2832 ACPI_VIOT_HEADER *ViotHeader; 2833 ACPI_DMTABLE_INFO *InfoTable; 2834 UINT16 NodeCount; 2835 2836 ParentTable = DtPeekSubtable (); 2837 2838 Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable); 2839 if (ACPI_FAILURE (Status)) 2840 { 2841 return (Status); 2842 } 2843 DtInsertSubtable (ParentTable, Subtable); 2844 2845 /* 2846 * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 2847 * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 2848 */ 2849 Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer, 2850 sizeof (ACPI_TABLE_HEADER)); 2851 2852 Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT); 2853 2854 NodeCount = 0; 2855 while (*PFieldList) { 2856 SubtableStart = *PFieldList; 2857 Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader, 2858 &Subtable); 2859 if (ACPI_FAILURE (Status)) 2860 { 2861 return (Status); 2862 } 2863 2864 ParentTable = DtPeekSubtable (); 2865 DtInsertSubtable (ParentTable, Subtable); 2866 DtPushSubtable (Subtable); 2867 2868 ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer); 2869 2870 switch (ViotHeader->Type) 2871 { 2872 case ACPI_VIOT_NODE_PCI_RANGE: 2873 2874 InfoTable = AcpiDmTableInfoViot1; 2875 break; 2876 2877 case ACPI_VIOT_NODE_MMIO: 2878 2879 InfoTable = AcpiDmTableInfoViot2; 2880 break; 2881 2882 case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI: 2883 2884 InfoTable = AcpiDmTableInfoViot3; 2885 break; 2886 2887 case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO: 2888 2889 InfoTable = AcpiDmTableInfoViot4; 2890 break; 2891 2892 default: 2893 2894 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT"); 2895 return (AE_ERROR); 2896 } 2897 2898 Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2899 if (ACPI_FAILURE (Status)) 2900 { 2901 return (Status); 2902 } 2903 2904 ParentTable = DtPeekSubtable (); 2905 DtInsertSubtable (ParentTable, Subtable); 2906 DtPopSubtable (); 2907 NodeCount++; 2908 } 2909 2910 Viot->NodeCount = NodeCount; 2911 return (AE_OK); 2912 } 2913 2914 2915 /****************************************************************************** 2916 * 2917 * FUNCTION: DtCompileWdat 2918 * 2919 * PARAMETERS: List - Current field list pointer 2920 * 2921 * RETURN: Status 2922 * 2923 * DESCRIPTION: Compile WDAT. 2924 * 2925 *****************************************************************************/ 2926 2927 ACPI_STATUS 2928 DtCompileWdat ( 2929 void **List) 2930 { 2931 ACPI_STATUS Status; 2932 2933 2934 Status = DtCompileTwoSubtables (List, 2935 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 2936 return (Status); 2937 } 2938 2939 2940 /****************************************************************************** 2941 * 2942 * FUNCTION: DtCompileWpbt 2943 * 2944 * PARAMETERS: List - Current field list pointer 2945 * 2946 * RETURN: Status 2947 * 2948 * DESCRIPTION: Compile WPBT. 2949 * 2950 *****************************************************************************/ 2951 2952 ACPI_STATUS 2953 DtCompileWpbt ( 2954 void **List) 2955 { 2956 DT_FIELD **PFieldList = (DT_FIELD **) List; 2957 DT_SUBTABLE *Subtable; 2958 DT_SUBTABLE *ParentTable; 2959 ACPI_TABLE_WPBT *Table; 2960 ACPI_STATUS Status; 2961 2962 2963 /* Compile the main table */ 2964 2965 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable); 2966 if (ACPI_FAILURE (Status)) 2967 { 2968 return (Status); 2969 } 2970 2971 ParentTable = DtPeekSubtable (); 2972 DtInsertSubtable (ParentTable, Subtable); 2973 Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer); 2974 2975 /* 2976 * Exit now if there are no arguments specified. This is indicated by: 2977 * The "Command-line Arguments" field has not been specified (if specified, 2978 * it will be the last field in the field list -- after the main table). 2979 * Set the Argument Length in the main table to zero. 2980 */ 2981 if (!*PFieldList) 2982 { 2983 Table->ArgumentsLength = 0; 2984 return (AE_OK); 2985 } 2986 2987 /* Compile the argument list subtable */ 2988 2989 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable); 2990 if (ACPI_FAILURE (Status)) 2991 { 2992 return (Status); 2993 } 2994 2995 /* Extract the length of the Arguments buffer, insert into main table */ 2996 2997 Table->ArgumentsLength = (UINT16) Subtable->TotalLength; 2998 DtInsertSubtable (ParentTable, Subtable); 2999 return (AE_OK); 3000 } 3001 3002 3003 /****************************************************************************** 3004 * 3005 * FUNCTION: DtCompileXsdt 3006 * 3007 * PARAMETERS: List - Current field list pointer 3008 * 3009 * RETURN: Status 3010 * 3011 * DESCRIPTION: Compile XSDT. 3012 * 3013 *****************************************************************************/ 3014 3015 ACPI_STATUS 3016 DtCompileXsdt ( 3017 void **List) 3018 { 3019 DT_SUBTABLE *Subtable; 3020 DT_SUBTABLE *ParentTable; 3021 DT_FIELD *FieldList = *(DT_FIELD **) List; 3022 UINT64 Address; 3023 3024 3025 ParentTable = DtPeekSubtable (); 3026 3027 while (FieldList) 3028 { 3029 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 3030 3031 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 3032 DtInsertSubtable (ParentTable, Subtable); 3033 FieldList = FieldList->Next; 3034 } 3035 3036 return (AE_OK); 3037 } 3038 3039 3040 /****************************************************************************** 3041 * 3042 * FUNCTION: DtCompileGeneric 3043 * 3044 * PARAMETERS: List - Current field list pointer 3045 * Name - Field name to end generic compiling 3046 * Length - Compiled table length to return 3047 * 3048 * RETURN: Status 3049 * 3050 * DESCRIPTION: Compile generic unknown table. 3051 * 3052 *****************************************************************************/ 3053 3054 ACPI_STATUS 3055 DtCompileGeneric ( 3056 void **List, 3057 char *Name, 3058 UINT32 *Length) 3059 { 3060 ACPI_STATUS Status; 3061 DT_SUBTABLE *Subtable; 3062 DT_SUBTABLE *ParentTable; 3063 DT_FIELD **PFieldList = (DT_FIELD **) List; 3064 ACPI_DMTABLE_INFO *Info; 3065 3066 3067 ParentTable = DtPeekSubtable (); 3068 3069 /* 3070 * Compile the "generic" portion of the table. This 3071 * part of the table is not predefined and any of the generic 3072 * operators may be used. 3073 */ 3074 3075 /* Find any and all labels in the entire generic portion */ 3076 3077 DtDetectAllLabels (*PFieldList); 3078 3079 /* Now we can actually compile the parse tree */ 3080 3081 if (Length && *Length) 3082 { 3083 *Length = 0; 3084 } 3085 while (*PFieldList) 3086 { 3087 if (Name && !strcmp ((*PFieldList)->Name, Name)) 3088 { 3089 break; 3090 } 3091 3092 Info = DtGetGenericTableInfo ((*PFieldList)->Name); 3093 if (!Info) 3094 { 3095 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 3096 (*PFieldList)->Name); 3097 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 3098 (*PFieldList), AslGbl_MsgBuffer); 3099 3100 *PFieldList = (*PFieldList)->Next; 3101 continue; 3102 } 3103 3104 Status = DtCompileTable (PFieldList, Info, 3105 &Subtable); 3106 if (ACPI_SUCCESS (Status)) 3107 { 3108 DtInsertSubtable (ParentTable, Subtable); 3109 if (Length) 3110 { 3111 *Length += Subtable->Length; 3112 } 3113 } 3114 else 3115 { 3116 *PFieldList = (*PFieldList)->Next; 3117 3118 if (Status == AE_NOT_FOUND) 3119 { 3120 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 3121 (*PFieldList)->Name); 3122 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 3123 (*PFieldList), AslGbl_MsgBuffer); 3124 } 3125 } 3126 } 3127 3128 return (AE_OK); 3129 } 3130