diff options
Diffstat (limited to 'sys/contrib/dev/acpica/dmresrcl.c')
-rw-r--r-- | sys/contrib/dev/acpica/dmresrcl.c | 832 |
1 files changed, 649 insertions, 183 deletions
diff --git a/sys/contrib/dev/acpica/dmresrcl.c b/sys/contrib/dev/acpica/dmresrcl.c index d7e3227..ca8b780 100644 --- a/sys/contrib/dev/acpica/dmresrcl.c +++ b/sys/contrib/dev/acpica/dmresrcl.c @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dmresrcl.c - "Large" Resource Descriptor disassembly - * $Revision: 12 $ + * $Revision: 1.29 $ * ******************************************************************************/ @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp. * All rights reserved. * * 2. License @@ -125,6 +125,338 @@ ACPI_MODULE_NAME ("dbresrcl") +/* Common names for address and memory descriptors */ + +static char *AcpiDmAddressNames[] = +{ + "Address Space Granularity", + "Address Range Minimum", + "Address Range Maximum", + "Address Translation Offset", + "Address Length" +}; + +static char *AcpiDmMemoryNames[] = +{ + "Address Range Minimum", + "Address Range Maximum", + "Address Alignment", + "Address Length" +}; + + +/* Local prototypes */ + +static void +AcpiDmSpaceFlags ( + UINT8 Flags); + +static void +AcpiDmIoFlags ( + UINT8 Flags); + +static void +AcpiDmIoFlags2 ( + UINT8 SpecificFlags); + +static void +AcpiDmMemoryFlags ( + UINT8 Flags, + UINT8 SpecificFlags); + +static void +AcpiDmMemoryFlags2 ( + UINT8 SpecificFlags); + +static void +AcpiDmResourceSource ( + AML_RESOURCE *Resource, + ACPI_SIZE MinimumLength, + UINT32 Length); + +static void +AcpiDmAddressFields ( + void *Source, + UINT8 Type, + UINT32 Level); + +static void +AcpiDmAddressPrefix ( + UINT8 Type); + +static void +AcpiDmAddressCommon ( + AML_RESOURCE *Resource, + UINT8 Type, + UINT32 Level); + +static void +AcpiDmAddressFlags ( + AML_RESOURCE *Resource); + + +/******************************************************************************* + * + * FUNCTION: AcpiDmMemoryFields + * + * PARAMETERS: Source - Pointer to the contiguous data fields + * Type - 16 or 32 (bit) + * Level - Current source code indentation level + * + * RETURN: None + * + * DESCRIPTION: Decode fields common to Memory24 and Memory32 descriptors + * + ******************************************************************************/ + +static void +AcpiDmMemoryFields ( + void *Source, + UINT8 Type, + UINT32 Level) +{ + ACPI_NATIVE_UINT i; + + + for (i = 0; i < 4; i++) + { + AcpiDmIndent (Level + 1); + + switch (Type) + { + case 16: + AcpiDmDumpInteger16 (((UINT16 *) Source)[i], AcpiDmMemoryNames[i]); + break; + + case 32: + AcpiDmDumpInteger32 (((UINT32 *) Source)[i], AcpiDmMemoryNames[i]); + break; + + default: + return; + } + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDm + * + * PARAMETERS: Source - Pointer to the contiguous data fields + * Type - 16, 32, or 64 (bit) + * Level - Current source code indentation level + * + * RETURN: None + * + * DESCRIPTION: Decode fields common to address descriptors + * + ******************************************************************************/ + +static void +AcpiDmAddressFields ( + void *Source, + UINT8 Type, + UINT32 Level) +{ + ACPI_NATIVE_UINT i; + + + AcpiOsPrintf ("\n"); + + for (i = 0; i < 5; i++) + { + AcpiDmIndent (Level + 1); + + switch (Type) + { + case 16: + AcpiDmDumpInteger16 (((UINT16 *) Source)[i], AcpiDmAddressNames[i]); + break; + + case 32: + AcpiDmDumpInteger32 (((UINT32 *) Source)[i], AcpiDmAddressNames[i]); + break; + + case 64: + AcpiDmDumpInteger64 (((UINT64 *) Source)[i], AcpiDmAddressNames[i]); + break; + + default: + return; + } + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmAddressPrefix + * + * PARAMETERS: Type - Descriptor type + * + * RETURN: None + * + * DESCRIPTION: Emit name prefix representing the address descriptor type + * + ******************************************************************************/ + +static void +AcpiDmAddressPrefix ( + UINT8 Type) +{ + + switch (Type) + { + case ACPI_RESOURCE_TYPE_ADDRESS16: + AcpiOsPrintf ("Word"); + break; + + case ACPI_RESOURCE_TYPE_ADDRESS32: + AcpiOsPrintf ("DWord"); + break; + + case ACPI_RESOURCE_TYPE_ADDRESS64: + AcpiOsPrintf ("QWord"); + break; + + case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + AcpiOsPrintf ("Extended"); + break; + + default: + return; + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmAddressCommon + * + * PARAMETERS: Resource - Raw AML descriptor + * Type - Descriptor type + * Level - Current source code indentation level + * + * RETURN: None + * + * DESCRIPTION: Emit common name and flag fields common to address descriptors + * + ******************************************************************************/ + +static void +AcpiDmAddressCommon ( + AML_RESOURCE *Resource, + UINT8 Type, + UINT32 Level) +{ + UINT8 ResourceType; + UINT8 SpecificFlags; + UINT8 Flags; + + + ResourceType = Resource->Address.ResourceType; + SpecificFlags = Resource->Address.SpecificFlags; + Flags = Resource->Address.Flags; + + AcpiDmIndent (Level); + + /* Validate ResourceType */ + + if ((ResourceType > 2) && (ResourceType < 0xC0)) + { + AcpiOsPrintf ("/**** Invalid Resource Type: 0x%X ****/", ResourceType); + return; + } + + /* Prefix is either Word, DWord, QWord, or Extended */ + + AcpiDmAddressPrefix (Type); + + /* Resource Types above 0xC0 are vendor-defined */ + + if (ResourceType > 2) + { + AcpiOsPrintf ("Space (0x%2.2X, ", ResourceType); + AcpiDmSpaceFlags (Flags); + AcpiOsPrintf (" 0x%2.2X,", SpecificFlags); + return; + } + + /* This is either a Memory, IO, or BusNumber descriptor (0,1,2) */ + + AcpiOsPrintf ("%s (", AcpiGbl_WordDecode [ResourceType]); + + /* Decode the general and type-specific flags */ + + if (ResourceType == ACPI_MEMORY_RANGE) + { + AcpiDmMemoryFlags (Flags, SpecificFlags); + } + else /* IO range or BusNumberRange */ + { + AcpiDmIoFlags (Flags); + if (ResourceType == ACPI_IO_RANGE) + { + AcpiOsPrintf (" %s,", AcpiGbl_RNGDecode [SpecificFlags & 0x3]); + } + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmAddressFlags + * + * PARAMETERS: Resource - Raw AML descriptor + * + * RETURN: None + * + * DESCRIPTION: Emit flags common to address descriptors + * + ******************************************************************************/ + +static void +AcpiDmAddressFlags ( + AML_RESOURCE *Resource) +{ + + if (Resource->Address.ResourceType == ACPI_IO_RANGE) + { + AcpiDmIoFlags2 (Resource->Address.SpecificFlags); + } + else if (Resource->Address.ResourceType == ACPI_MEMORY_RANGE) + { + AcpiDmMemoryFlags2 (Resource->Address.SpecificFlags); + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmSpaceFlags + * + * PARAMETERS: Flags - Flag byte to be decoded + * + * RETURN: None + * + * DESCRIPTION: Decode the flags specific to Space Address space descriptors + * + ******************************************************************************/ + +static void +AcpiDmSpaceFlags ( + UINT8 Flags) +{ + + AcpiOsPrintf ("%s, %s, %s, %s,", + AcpiGbl_ConsumeDecode [(Flags & 1)], + AcpiGbl_DECDecode [(Flags & 0x2) >> 1], + AcpiGbl_MinDecode [(Flags & 0x4) >> 2], + AcpiGbl_MaxDecode [(Flags & 0x8) >> 3]); +} + + /******************************************************************************* * * FUNCTION: AcpiDmIoFlags @@ -137,7 +469,7 @@ * ******************************************************************************/ -void +static void AcpiDmIoFlags ( UINT8 Flags) { @@ -151,6 +483,36 @@ AcpiDmIoFlags ( /******************************************************************************* * + * FUNCTION: AcpiDmIoFlags2 + * + * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded + * + * RETURN: None + * + * DESCRIPTION: Decode the flags specific to IO Address space descriptors + * + ******************************************************************************/ + +static void +AcpiDmIoFlags2 ( + UINT8 SpecificFlags) +{ + + AcpiOsPrintf (", %s", + AcpiGbl_TTPDecode [(SpecificFlags & 0x10) >> 4]); + + /* TRS is only used if TTP is TypeTranslation */ + + if (SpecificFlags & 0x10) + { + AcpiOsPrintf (", %s", + AcpiGbl_TRSDecode [(SpecificFlags & 0x20) >> 5]); + } +} + + +/******************************************************************************* + * * FUNCTION: AcpiDmMemoryFlags * * PARAMETERS: Flags - Flag byte to be decoded @@ -162,11 +524,12 @@ AcpiDmIoFlags ( * ******************************************************************************/ -void +static void AcpiDmMemoryFlags ( UINT8 Flags, UINT8 SpecificFlags) { + AcpiOsPrintf ("%s, %s, %s, %s, %s, %s,", AcpiGbl_ConsumeDecode [(Flags & 1)], AcpiGbl_DECDecode [(Flags & 0x2) >> 1], @@ -179,6 +542,93 @@ AcpiDmMemoryFlags ( /******************************************************************************* * + * FUNCTION: AcpiDmMemoryFlags2 + * + * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded + * + * RETURN: None + * + * DESCRIPTION: Decode flags specific to Memory Address Space descriptors + * + ******************************************************************************/ + +static void +AcpiDmMemoryFlags2 ( + UINT8 SpecificFlags) +{ + + AcpiOsPrintf (", %s, %s", + AcpiGbl_MTPDecode [(SpecificFlags & 0x18) >> 3], + AcpiGbl_TTPDecode [(SpecificFlags & 0x20) >> 5]); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmResourceSource + * + * PARAMETERS: Resource - Raw AML descriptor + * MinimumLength - descriptor length without optional fields + * ResourceLength + * + * RETURN: None + * + * DESCRIPTION: Dump optional ResourceSource fields of an address descriptor + * + ******************************************************************************/ + +static void +AcpiDmResourceSource ( + AML_RESOURCE *Resource, + ACPI_SIZE MinimumTotalLength, + UINT32 ResourceLength) +{ + UINT8 *AmlResourceSource; + UINT32 TotalLength; + + + TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER); + + /* Check if the optional ResourceSource fields are present */ + + if (TotalLength <= MinimumTotalLength) + { + /* The two optional fields are not used */ + + AcpiOsPrintf (",,"); + return; + } + + /* Get a pointer to the ResourceSource */ + + AmlResourceSource = ((UINT8 *) Resource) + MinimumTotalLength; + + /* + * Always emit the ResourceSourceIndex (Byte) + * + * NOTE: Some ASL compilers always create a 0 byte (in the AML) for the + * Index even if the String does not exist. Although this is in violation + * of the ACPI specification, it is very important to emit ASL code that + * can be compiled back to the identical AML. There may be fields and/or + * indexes into the resource template buffer that are compiled to absolute + * offsets, and these will be broken if the AML length is changed. + */ + AcpiOsPrintf ("0x%2.2X,", (UINT32) AmlResourceSource[0]); + + /* Make sure that the ResourceSource string exists before dumping it */ + + if (TotalLength > (MinimumTotalLength + 1)) + { + AcpiOsPrintf (" "); + AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT8_MAX); + } + + AcpiOsPrintf (","); +} + + +/******************************************************************************* + * * FUNCTION: AcpiDmWordDescriptor * * PARAMETERS: Resource - Pointer to the resource descriptor @@ -193,55 +643,27 @@ AcpiDmMemoryFlags ( void AcpiDmWordDescriptor ( - ASL_WORD_ADDRESS_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { - AcpiDmIndent (Level); - AcpiOsPrintf ("%s (", - AcpiGbl_WordDecode [(Resource->ResourceType & 3)]); + /* Dump resource name and flags */ - AcpiDmIoFlags (Resource->Flags); + AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS16, Level); - if ((Resource->ResourceType & 0x3) == 1) - { - AcpiOsPrintf (" %s,", - AcpiGbl_RNGDecode [(Resource->SpecificFlags & 0x3)]); - } + /* Dump the 5 contiguous WORD values */ - /* The WORD values */ + AcpiDmAddressFields (&Resource->Address16.Granularity, 16, Level); - AcpiOsPrintf ("\n"); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%4.4X,\n", - (UINT32) Resource->Granularity); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%4.4X,\n", - (UINT32) Resource->AddressMin); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%4.4X,\n", - (UINT32) Resource->AddressMax); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%4.4X,\n", - (UINT32) Resource->TranslationOffset); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%4.4X", - (UINT32) Resource->AddressLength); + /* The ResourceSource fields are optional */ - /* Optional fields */ + AcpiDmIndent (Level + 1); + AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS16), Length); - if (Length > 13) - { - AcpiOsPrintf (", 0x%2.2X", - (UINT32) Resource->OptionalFields[0]); - } + /* Type-specific flags */ - if (Length > 14) - { - AcpiOsPrintf (", %s", - &Resource->OptionalFields[1]); - } + AcpiDmAddressFlags (Resource); AcpiOsPrintf (")\n"); } @@ -262,57 +684,27 @@ AcpiDmWordDescriptor ( void AcpiDmDwordDescriptor ( - ASL_DWORD_ADDRESS_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { - AcpiDmIndent (Level); - AcpiOsPrintf ("D%s (", - AcpiGbl_WordDecode [(Resource->ResourceType & 3)]); + /* Dump resource name and flags */ - if ((Resource->ResourceType & 0x3) == 1) - { - AcpiDmIoFlags (Resource->Flags); - AcpiOsPrintf (" %s,", - AcpiGbl_RNGDecode [(Resource->SpecificFlags & 0x3)]); - } - else - { - AcpiDmMemoryFlags (Resource->Flags, Resource->SpecificFlags); - } + AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS32, Level); - /* The DWORD values */ + /* Dump the 5 contiguous DWORD values */ + + AcpiDmAddressFields (&Resource->Address32.Granularity, 32, Level); + + /* The ResourceSource fields are optional */ - AcpiOsPrintf ("\n"); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X,\n", - Resource->Granularity); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X,\n", - Resource->AddressMin); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X,\n", - Resource->AddressMax); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X,\n", - Resource->TranslationOffset); AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X", - Resource->AddressLength); + AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS32), Length); - /* Optional fields */ + /* Type-specific flags */ - if (Length > 23) - { - AcpiOsPrintf (", 0x%2.2X", - Resource->OptionalFields[0]); - } - if (Length > 24) - { - AcpiOsPrintf (", %s", - &Resource->OptionalFields[1]); - } + AcpiDmAddressFlags (Resource); AcpiOsPrintf (")\n"); } @@ -333,62 +725,70 @@ AcpiDmDwordDescriptor ( void AcpiDmQwordDescriptor ( - ASL_QWORD_ADDRESS_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { - AcpiDmIndent (Level); - AcpiOsPrintf ("Q%s (", - AcpiGbl_WordDecode [(Resource->ResourceType & 3)]); + /* Dump resource name and flags */ - if ((Resource->ResourceType & 0x3) == 1) - { - AcpiDmIoFlags (Resource->Flags); - AcpiOsPrintf (" %s,", - AcpiGbl_RNGDecode [(Resource->SpecificFlags & 0x3)]); - } - else - { - AcpiDmMemoryFlags (Resource->Flags, Resource->SpecificFlags); - } + AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS64, Level); - /* The QWORD values */ + /* Dump the 5 contiguous QWORD values */ - AcpiOsPrintf ("\n"); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X%8.8X,\n", - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->Granularity))); + AcpiDmAddressFields (&Resource->Address64.Granularity, 64, Level); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X%8.8X,\n", - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->AddressMin))); + /* The ResourceSource fields are optional */ AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X%8.8X,\n", - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->AddressMax))); + AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS64), Length); - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X%8.8X,\n", - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->TranslationOffset))); + /* Type-specific flags */ - AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X%8.8X", - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->AddressLength))); + AcpiDmAddressFlags (Resource); + AcpiOsPrintf (")\n"); +} - /* Optional fields */ - if (Length > 43) - { - AcpiOsPrintf (", 0x%2.2X", - Resource->OptionalFields[0]); - } - if (Length > 44) - { - AcpiOsPrintf (", %s", - &Resource->OptionalFields[1]); - } +/******************************************************************************* + * + * FUNCTION: AcpiDmExtendedDescriptor + * + * PARAMETERS: Resource - Pointer to the resource descriptor + * Length - Length of the descriptor in bytes + * Level - Current source code indentation level + * + * RETURN: None + * + * DESCRIPTION: Decode a Extended Address Space descriptor + * + ******************************************************************************/ + +void +AcpiDmExtendedDescriptor ( + AML_RESOURCE *Resource, + UINT32 Length, + UINT32 Level) +{ + + /* Dump resource name and flags */ + + AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, Level); + + /* Dump the 5 contiguous QWORD values */ + + AcpiDmAddressFields (&Resource->ExtAddress64.Granularity, 64, Level); + + /* Extra field for this descriptor only */ + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger64 (Resource->ExtAddress64.TypeSpecific, + "Type-Specific Attributes"); + + /* Type-specific flags */ + + AcpiDmIndent (Level + 1); + AcpiDmAddressFlags (Resource); AcpiOsPrintf (")\n"); } @@ -409,18 +809,23 @@ AcpiDmQwordDescriptor ( void AcpiDmMemory24Descriptor ( - ASL_MEMORY_24_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { + /* Dump name and read/write flag */ + AcpiDmIndent (Level); - AcpiOsPrintf ("Memory24 (%s, 0x%4.4X, 0x%4.4X, 0x%4.4X, 0x%4.4X)\n", - AcpiGbl_RWDecode [Resource->Information & 1], - (UINT32) Resource->AddressMin, - (UINT32) Resource->AddressMax, - (UINT32) Resource->Alignment, - (UINT32) Resource->RangeLength); + AcpiOsPrintf ("Memory24 (%s,\n", + AcpiGbl_RWDecode [Resource->Memory24.Flags & 1]); + + /* Dump the 4 contiguous WORD values */ + + AcpiDmMemoryFields (&Resource->Memory24.Minimum, 16, Level); + + AcpiDmIndent (Level + 1); + AcpiOsPrintf (")\n"); } @@ -440,24 +845,29 @@ AcpiDmMemory24Descriptor ( void AcpiDmMemory32Descriptor ( - ASL_MEMORY_32_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { + /* Dump name and read/write flag */ + AcpiDmIndent (Level); - AcpiOsPrintf ("Memory32 (%s, 0x%8.8X, 0x%8.8X, 0x%8.8X, 0x%8.8X)\n", - AcpiGbl_RWDecode [Resource->Information & 1], - Resource->AddressMin, - Resource->AddressMax, - Resource->Alignment, - Resource->RangeLength); + AcpiOsPrintf ("Memory32 (%s,\n", + AcpiGbl_RWDecode [Resource->Memory32.Flags & 1]); + + /* Dump the 4 contiguous DWORD values */ + + AcpiDmMemoryFields (&Resource->Memory32.Minimum, 32, Level); + + AcpiDmIndent (Level + 1); + AcpiOsPrintf (")\n"); } /******************************************************************************* * - * FUNCTION: AcpiDmFixedMem32Descriptor + * FUNCTION: AcpiDmFixedMemory32Descriptor * * PARAMETERS: Resource - Pointer to the resource descriptor * Length - Length of the descriptor in bytes @@ -470,17 +880,26 @@ AcpiDmMemory32Descriptor ( ******************************************************************************/ void -AcpiDmFixedMem32Descriptor ( - ASL_FIXED_MEMORY_32_DESC *Resource, +AcpiDmFixedMemory32Descriptor ( + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { + /* Dump name and read/write flag */ + AcpiDmIndent (Level); - AcpiOsPrintf ("Memory32Fixed (%s, 0x%8.8X, 0x%8.8X)\n", - AcpiGbl_RWDecode [Resource->Information & 1], - Resource->BaseAddress, - Resource->RangeLength); + AcpiOsPrintf ("Memory32Fixed (%s,\n", + AcpiGbl_RWDecode [Resource->FixedMemory32.Flags & 1]); + + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger32 (Resource->FixedMemory32.Address, "Address Base"); + + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger32 (Resource->FixedMemory32.AddressLength, "Address Length"); + + AcpiDmIndent (Level + 1); + AcpiOsPrintf (")\n"); } @@ -500,20 +919,36 @@ AcpiDmFixedMem32Descriptor ( void AcpiDmGenericRegisterDescriptor ( - ASL_GENERAL_REGISTER_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { AcpiDmIndent (Level); AcpiOsPrintf ("Register ("); + AcpiDmAddressSpace (Resource->GenericReg.AddressSpaceId); + AcpiOsPrintf ("\n"); + + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger8 (Resource->GenericReg.BitWidth, "Register Bit Width"); + + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger8 (Resource->GenericReg.BitOffset, "Register Bit Offset"); - AcpiDmAddressSpace (Resource->AddressSpaceId); + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger64 (Resource->GenericReg.Address, "Register Address"); + + /* Optional field for ACPI 3.0 */ + + if (Resource->GenericReg.AccessSize) + { + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("0x%2.2X // %s\n", + Resource->GenericReg.AccessSize, "Access Size"); + } - AcpiOsPrintf ("0x%2.2X, 0x%2.2X, 0x%8.8X%8.8X)\n", - (UINT32) Resource->BitWidth, - (UINT32) Resource->BitOffset, - ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Resource->Address))); + AcpiDmIndent (Level + 1); + AcpiOsPrintf (")\n"); } @@ -533,42 +968,40 @@ AcpiDmGenericRegisterDescriptor ( void AcpiDmInterruptDescriptor ( - ASL_EXTENDED_XRUPT_DESC *Resource, + AML_RESOURCE *Resource, UINT32 Length, UINT32 Level) { UINT32 i; - UINT8 *Rover; AcpiDmIndent (Level); - AcpiOsPrintf ("Interrupt (%s, %s, %s, %s", - AcpiGbl_ConsumeDecode [(Resource->Flags & 1)], - AcpiGbl_HEDecode [(Resource->Flags >> 1) & 1], - AcpiGbl_LLDecode [(Resource->Flags >> 2) & 1], - AcpiGbl_SHRDecode [(Resource->Flags >> 3) & 1]); - - /* Resource Index/Source, optional -- at end of descriptor */ - - if (Resource->Length > (UINT16) (4 * Resource->TableLength) + 2) - { - /* Get a pointer past the interrupt values */ - - Rover = ((UINT8 *) Resource) + ((4 * Resource->TableLength) + 5); - - /* Resource Index */ - /* Resource Source */ - - AcpiOsPrintf (", 0x%X, \"%s\"", (UINT32) Rover[0], (char *) &Rover[1]); - } + AcpiOsPrintf ("Interrupt (%s, %s, %s, %s, ", + AcpiGbl_ConsumeDecode [(Resource->ExtendedIrq.Flags & 1)], + AcpiGbl_HEDecode [(Resource->ExtendedIrq.Flags >> 1) & 1], + AcpiGbl_LLDecode [(Resource->ExtendedIrq.Flags >> 2) & 1], + AcpiGbl_SHRDecode [(Resource->ExtendedIrq.Flags >> 3) & 1]); + + /* + * The ResourceSource fields are optional and appear after the interrupt + * list. Must compute length based on length of the list. First xrupt + * is included in the struct (reason for -1 below) + */ + AcpiDmResourceSource (Resource, + sizeof (AML_RESOURCE_EXTENDED_IRQ) + + (Resource->ExtendedIrq.InterruptCount - 1) * sizeof (UINT32), + Resource->ExtendedIrq.ResourceLength); + + /* Dump the interrupt list */ AcpiOsPrintf (")\n"); AcpiDmIndent (Level); AcpiOsPrintf ("{\n"); - for (i = 0; i < Resource->TableLength; i++) + for (i = 0; i < Resource->ExtendedIrq.InterruptCount; i++) { AcpiDmIndent (Level + 1); - AcpiOsPrintf ("0x%8.8X,\n", (UINT32) Resource->InterruptNumber[i]); + AcpiOsPrintf ("0x%8.8X,\n", + (UINT32) Resource->ExtendedIrq.Interrupts[i]); } AcpiDmIndent (Level); @@ -578,36 +1011,69 @@ AcpiDmInterruptDescriptor ( /******************************************************************************* * - * FUNCTION: AcpiDmVendorLargeDescriptor + * FUNCTION: AcpiDmVendorCommon * - * PARAMETERS: Resource - Pointer to the resource descriptor - * Length - Length of the descriptor in bytes + * PARAMETERS: Name - Descriptor name suffix + * ByteData - Pointer to the vendor byte data + * Length - Length of the byte data * Level - Current source code indentation level * * RETURN: None * - * DESCRIPTION: Decode a Vendor Large descriptor + * DESCRIPTION: Decode a Vendor descriptor, both Large and Small * ******************************************************************************/ void -AcpiDmVendorLargeDescriptor ( - ASL_LARGE_VENDOR_DESC *Resource, +AcpiDmVendorCommon ( + char *Name, + UINT8 *ByteData, UINT32 Length, UINT32 Level) { + /* Dump descriptor name */ + AcpiDmIndent (Level); - AcpiOsPrintf ("VendorLong ()\n"); - AcpiDmIndent (Level); + AcpiOsPrintf ("Vendor%s // Length = 0x%.2X\n", Name, Length); + + /* Dump the vendor bytes */ + AcpiDmIndent (Level); AcpiOsPrintf ("{\n"); - AcpiDmDisasmByteList (Level + 1, (UINT8 *) Resource->VendorDefined, Length); + AcpiDmDisasmByteList (Level + 1, ByteData, Length); + AcpiDmIndent (Level); AcpiOsPrintf ("}\n"); } +/******************************************************************************* + * + * FUNCTION: AcpiDmVendorLargeDescriptor + * + * PARAMETERS: Resource - Pointer to the resource descriptor + * Length - Length of the descriptor in bytes + * Level - Current source code indentation level + * + * RETURN: None + * + * DESCRIPTION: Decode a Vendor Large descriptor + * + ******************************************************************************/ + +void +AcpiDmVendorLargeDescriptor ( + AML_RESOURCE *Resource, + UINT32 Length, + UINT32 Level) +{ + + AcpiDmVendorCommon ("Long () ", + ((UINT8 *) Resource) + sizeof (AML_RESOURCE_LARGE_HEADER), + Length, Level); +} + #endif |