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