1 /******************************************************************************* 2 * 3 * Module Name: dmresrcl.c - "Large" Resource Descriptor disassembly 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2016, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <contrib/dev/acpica/include/acpi.h> 45 #include <contrib/dev/acpica/include/accommon.h> 46 #include <contrib/dev/acpica/include/acdisasm.h> 47 48 49 #define _COMPONENT ACPI_CA_DEBUGGER 50 ACPI_MODULE_NAME ("dbresrcl") 51 52 53 /* Common names for address and memory descriptors */ 54 55 static const char *AcpiDmAddressNames[] = 56 { 57 "Granularity", 58 "Range Minimum", 59 "Range Maximum", 60 "Translation Offset", 61 "Length" 62 }; 63 64 static const char *AcpiDmMemoryNames[] = 65 { 66 "Range Minimum", 67 "Range Maximum", 68 "Alignment", 69 "Length" 70 }; 71 72 73 /* Local prototypes */ 74 75 static void 76 AcpiDmSpaceFlags ( 77 UINT8 Flags); 78 79 static void 80 AcpiDmIoFlags ( 81 UINT8 Flags); 82 83 static void 84 AcpiDmIoFlags2 ( 85 UINT8 SpecificFlags); 86 87 static void 88 AcpiDmMemoryFlags ( 89 UINT8 Flags, 90 UINT8 SpecificFlags); 91 92 static void 93 AcpiDmMemoryFlags2 ( 94 UINT8 SpecificFlags); 95 96 static void 97 AcpiDmResourceSource ( 98 AML_RESOURCE *Resource, 99 ACPI_SIZE MinimumLength, 100 UINT32 Length); 101 102 static void 103 AcpiDmAddressFields ( 104 void *Source, 105 UINT8 Type, 106 UINT32 Level); 107 108 static void 109 AcpiDmAddressPrefix ( 110 UINT8 Type); 111 112 static void 113 AcpiDmAddressCommon ( 114 AML_RESOURCE *Resource, 115 UINT8 Type, 116 UINT32 Level); 117 118 static void 119 AcpiDmAddressFlags ( 120 AML_RESOURCE *Resource); 121 122 123 /******************************************************************************* 124 * 125 * FUNCTION: AcpiDmMemoryFields 126 * 127 * PARAMETERS: Source - Pointer to the contiguous data fields 128 * Type - 16 or 32 (bit) 129 * Level - Current source code indentation level 130 * 131 * RETURN: None 132 * 133 * DESCRIPTION: Decode fields common to Memory24 and Memory32 descriptors 134 * 135 ******************************************************************************/ 136 137 static void 138 AcpiDmMemoryFields ( 139 void *Source, 140 UINT8 Type, 141 UINT32 Level) 142 { 143 UINT32 i; 144 145 146 for (i = 0; i < 4; i++) 147 { 148 AcpiDmIndent (Level + 1); 149 150 switch (Type) 151 { 152 case 16: 153 154 AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], 155 AcpiDmMemoryNames[i]); 156 break; 157 158 case 32: 159 160 AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], 161 AcpiDmMemoryNames[i]); 162 break; 163 164 default: 165 166 return; 167 } 168 } 169 } 170 171 172 /******************************************************************************* 173 * 174 * FUNCTION: AcpiDmAddressFields 175 * 176 * PARAMETERS: Source - Pointer to the contiguous data fields 177 * Type - 16, 32, or 64 (bit) 178 * Level - Current source code indentation level 179 * 180 * RETURN: None 181 * 182 * DESCRIPTION: Decode fields common to address descriptors 183 * 184 ******************************************************************************/ 185 186 static void 187 AcpiDmAddressFields ( 188 void *Source, 189 UINT8 Type, 190 UINT32 Level) 191 { 192 UINT32 i; 193 194 195 AcpiOsPrintf ("\n"); 196 197 for (i = 0; i < 5; i++) 198 { 199 AcpiDmIndent (Level + 1); 200 201 switch (Type) 202 { 203 case 16: 204 205 AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], 206 AcpiDmAddressNames[i]); 207 break; 208 209 case 32: 210 211 AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], 212 AcpiDmAddressNames[i]); 213 break; 214 215 case 64: 216 217 AcpiDmDumpInteger64 (ACPI_CAST_PTR (UINT64, Source)[i], 218 AcpiDmAddressNames[i]); 219 break; 220 221 default: 222 223 return; 224 } 225 } 226 } 227 228 229 /******************************************************************************* 230 * 231 * FUNCTION: AcpiDmAddressPrefix 232 * 233 * PARAMETERS: Type - Descriptor type 234 * 235 * RETURN: None 236 * 237 * DESCRIPTION: Emit name prefix representing the address descriptor type 238 * 239 ******************************************************************************/ 240 241 static void 242 AcpiDmAddressPrefix ( 243 UINT8 Type) 244 { 245 246 switch (Type) 247 { 248 case ACPI_RESOURCE_TYPE_ADDRESS16: 249 250 AcpiOsPrintf ("Word"); 251 break; 252 253 case ACPI_RESOURCE_TYPE_ADDRESS32: 254 255 AcpiOsPrintf ("DWord"); 256 break; 257 258 case ACPI_RESOURCE_TYPE_ADDRESS64: 259 260 AcpiOsPrintf ("QWord"); 261 break; 262 263 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: 264 265 AcpiOsPrintf ("Extended"); 266 break; 267 268 default: 269 270 return; 271 } 272 } 273 274 275 /******************************************************************************* 276 * 277 * FUNCTION: AcpiDmAddressCommon 278 * 279 * PARAMETERS: Resource - Raw AML descriptor 280 * Type - Descriptor type 281 * Level - Current source code indentation level 282 * 283 * RETURN: None 284 * 285 * DESCRIPTION: Emit common name and flag fields common to address descriptors 286 * 287 ******************************************************************************/ 288 289 static void 290 AcpiDmAddressCommon ( 291 AML_RESOURCE *Resource, 292 UINT8 Type, 293 UINT32 Level) 294 { 295 UINT8 ResourceType; 296 UINT8 SpecificFlags; 297 UINT8 Flags; 298 299 300 ResourceType = Resource->Address.ResourceType; 301 SpecificFlags = Resource->Address.SpecificFlags; 302 Flags = Resource->Address.Flags; 303 304 AcpiDmIndent (Level); 305 306 /* Validate ResourceType */ 307 308 if ((ResourceType > 2) && (ResourceType < 0xC0)) 309 { 310 AcpiOsPrintf ( 311 "/**** Invalid Resource Type: 0x%X ****/", ResourceType); 312 return; 313 } 314 315 /* Prefix is either Word, DWord, QWord, or Extended */ 316 317 AcpiDmAddressPrefix (Type); 318 319 /* Resource Types above 0xC0 are vendor-defined */ 320 321 if (ResourceType > 2) 322 { 323 AcpiOsPrintf ("Space (0x%2.2X, ", ResourceType); 324 AcpiDmSpaceFlags (Flags); 325 AcpiOsPrintf (" 0x%2.2X,", SpecificFlags); 326 return; 327 } 328 329 /* This is either a Memory, IO, or BusNumber descriptor (0,1,2) */ 330 331 AcpiOsPrintf ("%s (", 332 AcpiGbl_WordDecode [ACPI_GET_2BIT_FLAG (ResourceType)]); 333 334 /* Decode the general and type-specific flags */ 335 336 if (ResourceType == ACPI_MEMORY_RANGE) 337 { 338 AcpiDmMemoryFlags (Flags, SpecificFlags); 339 } 340 else /* IO range or BusNumberRange */ 341 { 342 AcpiDmIoFlags (Flags); 343 if (ResourceType == ACPI_IO_RANGE) 344 { 345 AcpiOsPrintf (" %s,", 346 AcpiGbl_RngDecode [ACPI_GET_2BIT_FLAG (SpecificFlags)]); 347 } 348 } 349 } 350 351 352 /******************************************************************************* 353 * 354 * FUNCTION: AcpiDmAddressFlags 355 * 356 * PARAMETERS: Resource - Raw AML descriptor 357 * 358 * RETURN: None 359 * 360 * DESCRIPTION: Emit flags common to address descriptors 361 * 362 ******************************************************************************/ 363 364 static void 365 AcpiDmAddressFlags ( 366 AML_RESOURCE *Resource) 367 { 368 369 if (Resource->Address.ResourceType == ACPI_IO_RANGE) 370 { 371 AcpiDmIoFlags2 (Resource->Address.SpecificFlags); 372 } 373 else if (Resource->Address.ResourceType == ACPI_MEMORY_RANGE) 374 { 375 AcpiDmMemoryFlags2 (Resource->Address.SpecificFlags); 376 } 377 } 378 379 380 /******************************************************************************* 381 * 382 * FUNCTION: AcpiDmSpaceFlags 383 * 384 * PARAMETERS: Flags - Flag byte to be decoded 385 * 386 * RETURN: None 387 * 388 * DESCRIPTION: Decode the flags specific to Space Address space descriptors 389 * 390 ******************************************************************************/ 391 392 static void 393 AcpiDmSpaceFlags ( 394 UINT8 Flags) 395 { 396 397 AcpiOsPrintf ("%s, %s, %s, %s,", 398 AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)], 399 AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)], 400 AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)], 401 AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)]); 402 } 403 404 405 /******************************************************************************* 406 * 407 * FUNCTION: AcpiDmIoFlags 408 * 409 * PARAMETERS: Flags - Flag byte to be decoded 410 * 411 * RETURN: None 412 * 413 * DESCRIPTION: Decode the flags specific to IO Address space descriptors 414 * 415 ******************************************************************************/ 416 417 static void 418 AcpiDmIoFlags ( 419 UINT8 Flags) 420 { 421 AcpiOsPrintf ("%s, %s, %s, %s,", 422 AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)], 423 AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)], 424 AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)], 425 AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)]); 426 } 427 428 429 /******************************************************************************* 430 * 431 * FUNCTION: AcpiDmIoFlags2 432 * 433 * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded 434 * 435 * RETURN: None 436 * 437 * DESCRIPTION: Decode the flags specific to IO Address space descriptors 438 * 439 ******************************************************************************/ 440 441 static void 442 AcpiDmIoFlags2 ( 443 UINT8 SpecificFlags) 444 { 445 446 /* _TTP */ 447 448 AcpiOsPrintf (", %s", 449 AcpiGbl_TtpDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 4)]); 450 451 /* 452 * TRS is only used if TTP is TypeTranslation. However, the disassembler 453 * always emits exactly what is in the AML. 454 */ 455 AcpiOsPrintf (", %s", 456 AcpiGbl_TrsDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]); 457 } 458 459 460 /******************************************************************************* 461 * 462 * FUNCTION: AcpiDmMemoryFlags 463 * 464 * PARAMETERS: Flags - Flag byte to be decoded 465 * SpecificFlags - "Specific" flag byte to be decoded 466 * 467 * RETURN: None 468 * 469 * DESCRIPTION: Decode flags specific to Memory Address Space descriptors 470 * 471 ******************************************************************************/ 472 473 static void 474 AcpiDmMemoryFlags ( 475 UINT8 Flags, 476 UINT8 SpecificFlags) 477 { 478 479 AcpiOsPrintf ("%s, %s, %s, %s, %s, %s,", 480 AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)], 481 AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)], 482 AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)], 483 AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)], 484 AcpiGbl_MemDecode [ACPI_EXTRACT_2BIT_FLAG (SpecificFlags, 1)], 485 AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (SpecificFlags)]); 486 } 487 488 489 /******************************************************************************* 490 * 491 * FUNCTION: AcpiDmMemoryFlags2 492 * 493 * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded 494 * 495 * RETURN: None 496 * 497 * DESCRIPTION: Decode flags specific to Memory Address Space descriptors 498 * 499 ******************************************************************************/ 500 501 static void 502 AcpiDmMemoryFlags2 ( 503 UINT8 SpecificFlags) 504 { 505 506 AcpiOsPrintf (", %s, %s", 507 AcpiGbl_MtpDecode [ACPI_EXTRACT_2BIT_FLAG (SpecificFlags, 3)], 508 AcpiGbl_TtpDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]); 509 } 510 511 512 /******************************************************************************* 513 * 514 * FUNCTION: AcpiDmResourceSource 515 * 516 * PARAMETERS: Resource - Raw AML descriptor 517 * MinimumLength - descriptor length without optional fields 518 * ResourceLength 519 * 520 * RETURN: None 521 * 522 * DESCRIPTION: Dump optional ResourceSource fields of an address descriptor 523 * 524 ******************************************************************************/ 525 526 static void 527 AcpiDmResourceSource ( 528 AML_RESOURCE *Resource, 529 ACPI_SIZE MinimumTotalLength, 530 UINT32 ResourceLength) 531 { 532 UINT8 *AmlResourceSource; 533 UINT32 TotalLength; 534 535 536 TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER); 537 538 /* Check if the optional ResourceSource fields are present */ 539 540 if (TotalLength <= MinimumTotalLength) 541 { 542 /* The two optional fields are not used */ 543 544 AcpiOsPrintf (",, "); 545 return; 546 } 547 548 /* Get a pointer to the ResourceSource */ 549 550 AmlResourceSource = ACPI_ADD_PTR (UINT8, Resource, MinimumTotalLength); 551 552 /* 553 * Always emit the ResourceSourceIndex (Byte) 554 * 555 * NOTE: Some ASL compilers always create a 0 byte (in the AML) for the 556 * Index even if the String does not exist. Although this is in violation 557 * of the ACPI specification, it is very important to emit ASL code that 558 * can be compiled back to the identical AML. There may be fields and/or 559 * indexes into the resource template buffer that are compiled to absolute 560 * offsets, and these will be broken if the AML length is changed. 561 */ 562 AcpiOsPrintf ("0x%2.2X,", (UINT32) AmlResourceSource[0]); 563 564 /* Make sure that the ResourceSource string exists before dumping it */ 565 566 if (TotalLength > (MinimumTotalLength + 1)) 567 { 568 AcpiOsPrintf (" "); 569 AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT16_MAX); 570 } 571 572 AcpiOsPrintf (", "); 573 } 574 575 576 /******************************************************************************* 577 * 578 * FUNCTION: AcpiDmWordDescriptor 579 * 580 * PARAMETERS: Info - Extra resource info 581 * Resource - Pointer to the resource descriptor 582 * Length - Length of the descriptor in bytes 583 * Level - Current source code indentation level 584 * 585 * RETURN: None 586 * 587 * DESCRIPTION: Decode a Word Address Space descriptor 588 * 589 ******************************************************************************/ 590 591 void 592 AcpiDmWordDescriptor ( 593 ACPI_OP_WALK_INFO *Info, 594 AML_RESOURCE *Resource, 595 UINT32 Length, 596 UINT32 Level) 597 { 598 599 /* Dump resource name and flags */ 600 601 AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS16, Level); 602 603 /* Dump the 5 contiguous WORD values */ 604 605 AcpiDmAddressFields (&Resource->Address16.Granularity, 16, Level); 606 607 /* The ResourceSource fields are optional */ 608 609 AcpiDmIndent (Level + 1); 610 AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS16), Length); 611 612 /* Insert a descriptor name */ 613 614 AcpiDmDescriptorName (); 615 616 /* Type-specific flags */ 617 618 AcpiDmAddressFlags (Resource); 619 AcpiOsPrintf (")\n"); 620 } 621 622 623 /******************************************************************************* 624 * 625 * FUNCTION: AcpiDmDwordDescriptor 626 * 627 * PARAMETERS: Info - Extra resource info 628 * Resource - Pointer to the resource descriptor 629 * Length - Length of the descriptor in bytes 630 * Level - Current source code indentation level 631 * 632 * RETURN: None 633 * 634 * DESCRIPTION: Decode a DWord Address Space descriptor 635 * 636 ******************************************************************************/ 637 638 void 639 AcpiDmDwordDescriptor ( 640 ACPI_OP_WALK_INFO *Info, 641 AML_RESOURCE *Resource, 642 UINT32 Length, 643 UINT32 Level) 644 { 645 646 /* Dump resource name and flags */ 647 648 AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS32, Level); 649 650 /* Dump the 5 contiguous DWORD values */ 651 652 AcpiDmAddressFields (&Resource->Address32.Granularity, 32, Level); 653 654 /* The ResourceSource fields are optional */ 655 656 AcpiDmIndent (Level + 1); 657 AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS32), Length); 658 659 /* Insert a descriptor name */ 660 661 AcpiDmDescriptorName (); 662 663 /* Type-specific flags */ 664 665 AcpiDmAddressFlags (Resource); 666 AcpiOsPrintf (")\n"); 667 } 668 669 670 /******************************************************************************* 671 * 672 * FUNCTION: AcpiDmQwordDescriptor 673 * 674 * PARAMETERS: Info - Extra resource info 675 * Resource - Pointer to the resource descriptor 676 * Length - Length of the descriptor in bytes 677 * Level - Current source code indentation level 678 * 679 * RETURN: None 680 * 681 * DESCRIPTION: Decode a QWord Address Space descriptor 682 * 683 ******************************************************************************/ 684 685 void 686 AcpiDmQwordDescriptor ( 687 ACPI_OP_WALK_INFO *Info, 688 AML_RESOURCE *Resource, 689 UINT32 Length, 690 UINT32 Level) 691 { 692 693 /* Dump resource name and flags */ 694 695 AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS64, Level); 696 697 /* Dump the 5 contiguous QWORD values */ 698 699 AcpiDmAddressFields (&Resource->Address64.Granularity, 64, Level); 700 701 /* The ResourceSource fields are optional */ 702 703 AcpiDmIndent (Level + 1); 704 AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS64), Length); 705 706 /* Insert a descriptor name */ 707 708 AcpiDmDescriptorName (); 709 710 /* Type-specific flags */ 711 712 AcpiDmAddressFlags (Resource); 713 AcpiOsPrintf (")\n"); 714 } 715 716 717 /******************************************************************************* 718 * 719 * FUNCTION: AcpiDmExtendedDescriptor 720 * 721 * PARAMETERS: Info - Extra resource info 722 * Resource - Pointer to the resource descriptor 723 * Length - Length of the descriptor in bytes 724 * Level - Current source code indentation level 725 * 726 * RETURN: None 727 * 728 * DESCRIPTION: Decode a Extended Address Space descriptor 729 * 730 ******************************************************************************/ 731 732 void 733 AcpiDmExtendedDescriptor ( 734 ACPI_OP_WALK_INFO *Info, 735 AML_RESOURCE *Resource, 736 UINT32 Length, 737 UINT32 Level) 738 { 739 740 /* Dump resource name and flags */ 741 742 AcpiDmAddressCommon ( 743 Resource, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, Level); 744 745 /* Dump the 5 contiguous QWORD values */ 746 747 AcpiDmAddressFields (&Resource->ExtAddress64.Granularity, 64, Level); 748 749 /* Extra field for this descriptor only */ 750 751 AcpiDmIndent (Level + 1); 752 AcpiDmDumpInteger64 (Resource->ExtAddress64.TypeSpecific, 753 "Type-Specific Attributes"); 754 755 /* Insert a descriptor name */ 756 757 AcpiDmIndent (Level + 1); 758 AcpiDmDescriptorName (); 759 760 /* Type-specific flags */ 761 762 AcpiDmAddressFlags (Resource); 763 AcpiOsPrintf (")\n"); 764 } 765 766 767 /******************************************************************************* 768 * 769 * FUNCTION: AcpiDmMemory24Descriptor 770 * 771 * PARAMETERS: Info - Extra resource info 772 * Resource - Pointer to the resource descriptor 773 * Length - Length of the descriptor in bytes 774 * Level - Current source code indentation level 775 * 776 * RETURN: None 777 * 778 * DESCRIPTION: Decode a Memory24 descriptor 779 * 780 ******************************************************************************/ 781 782 void 783 AcpiDmMemory24Descriptor ( 784 ACPI_OP_WALK_INFO *Info, 785 AML_RESOURCE *Resource, 786 UINT32 Length, 787 UINT32 Level) 788 { 789 790 /* Dump name and read/write flag */ 791 792 AcpiDmIndent (Level); 793 AcpiOsPrintf ("Memory24 (%s,\n", 794 AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->Memory24.Flags)]); 795 796 /* Dump the 4 contiguous WORD values */ 797 798 AcpiDmMemoryFields (&Resource->Memory24.Minimum, 16, Level); 799 800 /* Insert a descriptor name */ 801 802 AcpiDmIndent (Level + 1); 803 AcpiDmDescriptorName (); 804 AcpiOsPrintf (")\n"); 805 } 806 807 808 /******************************************************************************* 809 * 810 * FUNCTION: AcpiDmMemory32Descriptor 811 * 812 * PARAMETERS: Info - Extra resource info 813 * Resource - Pointer to the resource descriptor 814 * Length - Length of the descriptor in bytes 815 * Level - Current source code indentation level 816 * 817 * RETURN: None 818 * 819 * DESCRIPTION: Decode a Memory32 descriptor 820 * 821 ******************************************************************************/ 822 823 void 824 AcpiDmMemory32Descriptor ( 825 ACPI_OP_WALK_INFO *Info, 826 AML_RESOURCE *Resource, 827 UINT32 Length, 828 UINT32 Level) 829 { 830 831 /* Dump name and read/write flag */ 832 833 AcpiDmIndent (Level); 834 AcpiOsPrintf ("Memory32 (%s,\n", 835 AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->Memory32.Flags)]); 836 837 /* Dump the 4 contiguous DWORD values */ 838 839 AcpiDmMemoryFields (&Resource->Memory32.Minimum, 32, Level); 840 841 /* Insert a descriptor name */ 842 843 AcpiDmIndent (Level + 1); 844 AcpiDmDescriptorName (); 845 AcpiOsPrintf (")\n"); 846 } 847 848 849 /******************************************************************************* 850 * 851 * FUNCTION: AcpiDmFixedMemory32Descriptor 852 * 853 * PARAMETERS: Info - Extra resource info 854 * Resource - Pointer to the resource descriptor 855 * Length - Length of the descriptor in bytes 856 * Level - Current source code indentation level 857 * 858 * RETURN: None 859 * 860 * DESCRIPTION: Decode a Fixed Memory32 descriptor 861 * 862 ******************************************************************************/ 863 864 void 865 AcpiDmFixedMemory32Descriptor ( 866 ACPI_OP_WALK_INFO *Info, 867 AML_RESOURCE *Resource, 868 UINT32 Length, 869 UINT32 Level) 870 { 871 872 /* Dump name and read/write flag */ 873 874 AcpiDmIndent (Level); 875 AcpiOsPrintf ("Memory32Fixed (%s,\n", 876 AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->FixedMemory32.Flags)]); 877 878 AcpiDmIndent (Level + 1); 879 AcpiDmDumpInteger32 (Resource->FixedMemory32.Address, 880 "Address Base"); 881 882 AcpiDmIndent (Level + 1); 883 AcpiDmDumpInteger32 (Resource->FixedMemory32.AddressLength, 884 "Address Length"); 885 886 /* Insert a descriptor name */ 887 888 AcpiDmIndent (Level + 1); 889 AcpiDmDescriptorName (); 890 AcpiOsPrintf (")\n"); 891 } 892 893 894 /******************************************************************************* 895 * 896 * FUNCTION: AcpiDmGenericRegisterDescriptor 897 * 898 * PARAMETERS: Info - Extra resource info 899 * Resource - Pointer to the resource descriptor 900 * Length - Length of the descriptor in bytes 901 * Level - Current source code indentation level 902 * 903 * RETURN: None 904 * 905 * DESCRIPTION: Decode a Generic Register descriptor 906 * 907 ******************************************************************************/ 908 909 void 910 AcpiDmGenericRegisterDescriptor ( 911 ACPI_OP_WALK_INFO *Info, 912 AML_RESOURCE *Resource, 913 UINT32 Length, 914 UINT32 Level) 915 { 916 917 AcpiDmIndent (Level); 918 AcpiOsPrintf ("Register ("); 919 AcpiDmAddressSpace (Resource->GenericReg.AddressSpaceId); 920 AcpiOsPrintf ("\n"); 921 922 AcpiDmIndent (Level + 1); 923 AcpiDmDumpInteger8 (Resource->GenericReg.BitWidth, "Bit Width"); 924 925 AcpiDmIndent (Level + 1); 926 AcpiDmDumpInteger8 (Resource->GenericReg.BitOffset, "Bit Offset"); 927 928 AcpiDmIndent (Level + 1); 929 AcpiDmDumpInteger64 (Resource->GenericReg.Address, "Address"); 930 931 /* Optional field for ACPI 3.0 */ 932 933 AcpiDmIndent (Level + 1); 934 if (Resource->GenericReg.AccessSize) 935 { 936 AcpiOsPrintf ("0x%2.2X, // %s\n", 937 Resource->GenericReg.AccessSize, "Access Size"); 938 AcpiDmIndent (Level + 1); 939 } 940 else 941 { 942 AcpiOsPrintf (","); 943 } 944 945 /* DescriptorName was added for ACPI 3.0+ */ 946 947 AcpiDmDescriptorName (); 948 AcpiOsPrintf (")\n"); 949 } 950 951 952 /******************************************************************************* 953 * 954 * FUNCTION: AcpiDmInterruptDescriptor 955 * 956 * PARAMETERS: Info - Extra resource info 957 * Resource - Pointer to the resource descriptor 958 * Length - Length of the descriptor in bytes 959 * Level - Current source code indentation level 960 * 961 * RETURN: None 962 * 963 * DESCRIPTION: Decode a extended Interrupt descriptor 964 * 965 ******************************************************************************/ 966 967 void 968 AcpiDmInterruptDescriptor ( 969 ACPI_OP_WALK_INFO *Info, 970 AML_RESOURCE *Resource, 971 UINT32 Length, 972 UINT32 Level) 973 { 974 UINT32 i; 975 976 977 AcpiDmIndent (Level); 978 AcpiOsPrintf ("Interrupt (%s, %s, %s, %s, ", 979 AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->ExtendedIrq.Flags)], 980 AcpiGbl_HeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->ExtendedIrq.Flags, 1)], 981 AcpiGbl_LlDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->ExtendedIrq.Flags, 2)], 982 AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->ExtendedIrq.Flags, 3)]); 983 984 /* 985 * The ResourceSource fields are optional and appear after the interrupt 986 * list. Must compute length based on length of the list. First xrupt 987 * is included in the struct (reason for -1 below) 988 */ 989 AcpiDmResourceSource (Resource, 990 sizeof (AML_RESOURCE_EXTENDED_IRQ) + 991 ((UINT32) Resource->ExtendedIrq.InterruptCount - 1) * sizeof (UINT32), 992 Resource->ExtendedIrq.ResourceLength); 993 994 /* Insert a descriptor name */ 995 996 AcpiDmDescriptorName (); 997 AcpiOsPrintf (")\n"); 998 999 /* Dump the interrupt list */ 1000 1001 AcpiDmIndent (Level); 1002 AcpiOsPrintf ("{\n"); 1003 for (i = 0; i < Resource->ExtendedIrq.InterruptCount; i++) 1004 { 1005 AcpiDmIndent (Level + 1); 1006 AcpiOsPrintf ("0x%8.8X,\n", 1007 (UINT32) Resource->ExtendedIrq.Interrupts[i]); 1008 } 1009 1010 AcpiDmIndent (Level); 1011 AcpiOsPrintf ("}\n"); 1012 } 1013 1014 1015 /******************************************************************************* 1016 * 1017 * FUNCTION: AcpiDmVendorCommon 1018 * 1019 * PARAMETERS: Name - Descriptor name suffix 1020 * ByteData - Pointer to the vendor byte data 1021 * Length - Length of the byte data 1022 * Level - Current source code indentation level 1023 * 1024 * RETURN: None 1025 * 1026 * DESCRIPTION: Decode a Vendor descriptor, both Large and Small 1027 * 1028 ******************************************************************************/ 1029 1030 void 1031 AcpiDmVendorCommon ( 1032 const char *Name, 1033 UINT8 *ByteData, 1034 UINT32 Length, 1035 UINT32 Level) 1036 { 1037 1038 /* Dump macro name */ 1039 1040 AcpiDmIndent (Level); 1041 AcpiOsPrintf ("Vendor%s (", Name); 1042 1043 /* Insert a descriptor name */ 1044 1045 AcpiDmDescriptorName (); 1046 AcpiOsPrintf (") // Length = 0x%.2X\n", Length); 1047 1048 /* Dump the vendor bytes */ 1049 1050 AcpiDmIndent (Level); 1051 AcpiOsPrintf ("{\n"); 1052 1053 AcpiDmDisasmByteList (Level + 1, ByteData, Length); 1054 1055 AcpiDmIndent (Level); 1056 AcpiOsPrintf ("}\n"); 1057 } 1058 1059 1060 /******************************************************************************* 1061 * 1062 * FUNCTION: AcpiDmVendorLargeDescriptor 1063 * 1064 * PARAMETERS: Info - Extra resource info 1065 * Resource - Pointer to the resource descriptor 1066 * Length - Length of the descriptor in bytes 1067 * Level - Current source code indentation level 1068 * 1069 * RETURN: None 1070 * 1071 * DESCRIPTION: Decode a Vendor Large descriptor 1072 * 1073 ******************************************************************************/ 1074 1075 void 1076 AcpiDmVendorLargeDescriptor ( 1077 ACPI_OP_WALK_INFO *Info, 1078 AML_RESOURCE *Resource, 1079 UINT32 Length, 1080 UINT32 Level) 1081 { 1082 1083 AcpiDmVendorCommon ("Long ", 1084 ACPI_ADD_PTR (UINT8, Resource, sizeof (AML_RESOURCE_LARGE_HEADER)), 1085 Length, Level); 1086 } 1087