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