1*a159c266SJung-uk Kim /******************************************************************************* 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: dmresrc.c - Resource Descriptor disassembly 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim ******************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim 45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 49*a159c266SJung-uk Kim 50*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER 51*a159c266SJung-uk Kim 52*a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 53*a159c266SJung-uk Kim ACPI_MODULE_NAME ("dbresrc") 54*a159c266SJung-uk Kim 55*a159c266SJung-uk Kim 56*a159c266SJung-uk Kim /* Dispatch tables for Resource disassembly functions */ 57*a159c266SJung-uk Kim 58*a159c266SJung-uk Kim static ACPI_RESOURCE_HANDLER AcpiGbl_DmResourceDispatch [] = 59*a159c266SJung-uk Kim { 60*a159c266SJung-uk Kim /* Small descriptors */ 61*a159c266SJung-uk Kim 62*a159c266SJung-uk Kim NULL, /* 0x00, Reserved */ 63*a159c266SJung-uk Kim NULL, /* 0x01, Reserved */ 64*a159c266SJung-uk Kim NULL, /* 0x02, Reserved */ 65*a159c266SJung-uk Kim NULL, /* 0x03, Reserved */ 66*a159c266SJung-uk Kim AcpiDmIrqDescriptor, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */ 67*a159c266SJung-uk Kim AcpiDmDmaDescriptor, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */ 68*a159c266SJung-uk Kim AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ 69*a159c266SJung-uk Kim AcpiDmEndDependentDescriptor, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ 70*a159c266SJung-uk Kim AcpiDmIoDescriptor, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */ 71*a159c266SJung-uk Kim AcpiDmFixedIoDescriptor, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */ 72*a159c266SJung-uk Kim AcpiDmFixedDmaDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */ 73*a159c266SJung-uk Kim NULL, /* 0x0B, Reserved */ 74*a159c266SJung-uk Kim NULL, /* 0x0C, Reserved */ 75*a159c266SJung-uk Kim NULL, /* 0x0D, Reserved */ 76*a159c266SJung-uk Kim AcpiDmVendorSmallDescriptor, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */ 77*a159c266SJung-uk Kim NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */ 78*a159c266SJung-uk Kim 79*a159c266SJung-uk Kim /* Large descriptors */ 80*a159c266SJung-uk Kim 81*a159c266SJung-uk Kim NULL, /* 0x00, Reserved */ 82*a159c266SJung-uk Kim AcpiDmMemory24Descriptor, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */ 83*a159c266SJung-uk Kim AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ 84*a159c266SJung-uk Kim NULL, /* 0x03, Reserved */ 85*a159c266SJung-uk Kim AcpiDmVendorLargeDescriptor, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */ 86*a159c266SJung-uk Kim AcpiDmMemory32Descriptor, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */ 87*a159c266SJung-uk Kim AcpiDmFixedMemory32Descriptor, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */ 88*a159c266SJung-uk Kim AcpiDmDwordDescriptor, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */ 89*a159c266SJung-uk Kim AcpiDmWordDescriptor, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */ 90*a159c266SJung-uk Kim AcpiDmInterruptDescriptor, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */ 91*a159c266SJung-uk Kim AcpiDmQwordDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */ 92*a159c266SJung-uk Kim AcpiDmExtendedDescriptor, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */ 93*a159c266SJung-uk Kim AcpiDmGpioDescriptor, /* 0x0C, ACPI_RESOURCE_NAME_GPIO */ 94*a159c266SJung-uk Kim NULL, /* 0x0D, Reserved */ 95*a159c266SJung-uk Kim AcpiDmSerialBusDescriptor /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */ 96*a159c266SJung-uk Kim }; 97*a159c266SJung-uk Kim 98*a159c266SJung-uk Kim 99*a159c266SJung-uk Kim /* Only used for single-threaded applications */ 100*a159c266SJung-uk Kim /* TBD: remove when name is passed as parameter to the dump functions */ 101*a159c266SJung-uk Kim 102*a159c266SJung-uk Kim static UINT32 ResourceName; 103*a159c266SJung-uk Kim 104*a159c266SJung-uk Kim 105*a159c266SJung-uk Kim /******************************************************************************* 106*a159c266SJung-uk Kim * 107*a159c266SJung-uk Kim * FUNCTION: AcpiDmDescriptorName 108*a159c266SJung-uk Kim * 109*a159c266SJung-uk Kim * PARAMETERS: None 110*a159c266SJung-uk Kim * 111*a159c266SJung-uk Kim * RETURN: None 112*a159c266SJung-uk Kim * 113*a159c266SJung-uk Kim * DESCRIPTION: Emit a name for the descriptor if one is present (indicated 114*a159c266SJung-uk Kim * by the name being changed from the default name.) A name is only 115*a159c266SJung-uk Kim * emitted if a reference to the descriptor has been made somewhere 116*a159c266SJung-uk Kim * in the original ASL code. 117*a159c266SJung-uk Kim * 118*a159c266SJung-uk Kim ******************************************************************************/ 119*a159c266SJung-uk Kim 120*a159c266SJung-uk Kim void 121*a159c266SJung-uk Kim AcpiDmDescriptorName ( 122*a159c266SJung-uk Kim void) 123*a159c266SJung-uk Kim { 124*a159c266SJung-uk Kim 125*a159c266SJung-uk Kim if (ResourceName == ACPI_DEFAULT_RESNAME) 126*a159c266SJung-uk Kim { 127*a159c266SJung-uk Kim return; 128*a159c266SJung-uk Kim } 129*a159c266SJung-uk Kim 130*a159c266SJung-uk Kim AcpiOsPrintf ("%4.4s", (char *) &ResourceName); 131*a159c266SJung-uk Kim } 132*a159c266SJung-uk Kim 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim /******************************************************************************* 135*a159c266SJung-uk Kim * 136*a159c266SJung-uk Kim * FUNCTION: AcpiDmDumpInteger* 137*a159c266SJung-uk Kim * 138*a159c266SJung-uk Kim * PARAMETERS: Value - Value to emit 139*a159c266SJung-uk Kim * Name - Associated name (emitted as a comment) 140*a159c266SJung-uk Kim * 141*a159c266SJung-uk Kim * RETURN: None 142*a159c266SJung-uk Kim * 143*a159c266SJung-uk Kim * DESCRIPTION: Integer output helper functions 144*a159c266SJung-uk Kim * 145*a159c266SJung-uk Kim ******************************************************************************/ 146*a159c266SJung-uk Kim 147*a159c266SJung-uk Kim void 148*a159c266SJung-uk Kim AcpiDmDumpInteger8 ( 149*a159c266SJung-uk Kim UINT8 Value, 150*a159c266SJung-uk Kim char *Name) 151*a159c266SJung-uk Kim { 152*a159c266SJung-uk Kim AcpiOsPrintf ("0x%2.2X, // %s\n", Value, Name); 153*a159c266SJung-uk Kim } 154*a159c266SJung-uk Kim 155*a159c266SJung-uk Kim void 156*a159c266SJung-uk Kim AcpiDmDumpInteger16 ( 157*a159c266SJung-uk Kim UINT16 Value, 158*a159c266SJung-uk Kim char *Name) 159*a159c266SJung-uk Kim { 160*a159c266SJung-uk Kim AcpiOsPrintf ("0x%4.4X, // %s\n", Value, Name); 161*a159c266SJung-uk Kim } 162*a159c266SJung-uk Kim 163*a159c266SJung-uk Kim void 164*a159c266SJung-uk Kim AcpiDmDumpInteger32 ( 165*a159c266SJung-uk Kim UINT32 Value, 166*a159c266SJung-uk Kim char *Name) 167*a159c266SJung-uk Kim { 168*a159c266SJung-uk Kim AcpiOsPrintf ("0x%8.8X, // %s\n", Value, Name); 169*a159c266SJung-uk Kim } 170*a159c266SJung-uk Kim 171*a159c266SJung-uk Kim void 172*a159c266SJung-uk Kim AcpiDmDumpInteger64 ( 173*a159c266SJung-uk Kim UINT64 Value, 174*a159c266SJung-uk Kim char *Name) 175*a159c266SJung-uk Kim { 176*a159c266SJung-uk Kim AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name); 177*a159c266SJung-uk Kim } 178*a159c266SJung-uk Kim 179*a159c266SJung-uk Kim 180*a159c266SJung-uk Kim /******************************************************************************* 181*a159c266SJung-uk Kim * 182*a159c266SJung-uk Kim * FUNCTION: AcpiDmBitList 183*a159c266SJung-uk Kim * 184*a159c266SJung-uk Kim * PARAMETERS: Mask - 16-bit value corresponding to 16 interrupt 185*a159c266SJung-uk Kim * or DMA values 186*a159c266SJung-uk Kim * 187*a159c266SJung-uk Kim * RETURN: None 188*a159c266SJung-uk Kim * 189*a159c266SJung-uk Kim * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels. 190*a159c266SJung-uk Kim * 191*a159c266SJung-uk Kim ******************************************************************************/ 192*a159c266SJung-uk Kim 193*a159c266SJung-uk Kim void 194*a159c266SJung-uk Kim AcpiDmBitList ( 195*a159c266SJung-uk Kim UINT16 Mask) 196*a159c266SJung-uk Kim { 197*a159c266SJung-uk Kim UINT32 i; 198*a159c266SJung-uk Kim BOOLEAN Previous = FALSE; 199*a159c266SJung-uk Kim 200*a159c266SJung-uk Kim 201*a159c266SJung-uk Kim /* Open the initializer list */ 202*a159c266SJung-uk Kim 203*a159c266SJung-uk Kim AcpiOsPrintf ("{"); 204*a159c266SJung-uk Kim 205*a159c266SJung-uk Kim /* Examine each bit */ 206*a159c266SJung-uk Kim 207*a159c266SJung-uk Kim for (i = 0; i < 16; i++) 208*a159c266SJung-uk Kim { 209*a159c266SJung-uk Kim /* Only interested in bits that are set to 1 */ 210*a159c266SJung-uk Kim 211*a159c266SJung-uk Kim if (Mask & 1) 212*a159c266SJung-uk Kim { 213*a159c266SJung-uk Kim if (Previous) 214*a159c266SJung-uk Kim { 215*a159c266SJung-uk Kim AcpiOsPrintf (","); 216*a159c266SJung-uk Kim } 217*a159c266SJung-uk Kim Previous = TRUE; 218*a159c266SJung-uk Kim AcpiOsPrintf ("%u", i); 219*a159c266SJung-uk Kim } 220*a159c266SJung-uk Kim 221*a159c266SJung-uk Kim Mask >>= 1; 222*a159c266SJung-uk Kim } 223*a159c266SJung-uk Kim 224*a159c266SJung-uk Kim /* Close list */ 225*a159c266SJung-uk Kim 226*a159c266SJung-uk Kim AcpiOsPrintf ("}\n"); 227*a159c266SJung-uk Kim } 228*a159c266SJung-uk Kim 229*a159c266SJung-uk Kim 230*a159c266SJung-uk Kim /******************************************************************************* 231*a159c266SJung-uk Kim * 232*a159c266SJung-uk Kim * FUNCTION: AcpiDmResourceTemplate 233*a159c266SJung-uk Kim * 234*a159c266SJung-uk Kim * PARAMETERS: Info - Curent parse tree walk info 235*a159c266SJung-uk Kim * ByteData - Pointer to the byte list data 236*a159c266SJung-uk Kim * ByteCount - Length of the byte list 237*a159c266SJung-uk Kim * 238*a159c266SJung-uk Kim * RETURN: None 239*a159c266SJung-uk Kim * 240*a159c266SJung-uk Kim * DESCRIPTION: Dump the contents of a Resource Template containing a set of 241*a159c266SJung-uk Kim * Resource Descriptors. 242*a159c266SJung-uk Kim * 243*a159c266SJung-uk Kim ******************************************************************************/ 244*a159c266SJung-uk Kim 245*a159c266SJung-uk Kim void 246*a159c266SJung-uk Kim AcpiDmResourceTemplate ( 247*a159c266SJung-uk Kim ACPI_OP_WALK_INFO *Info, 248*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op, 249*a159c266SJung-uk Kim UINT8 *ByteData, 250*a159c266SJung-uk Kim UINT32 ByteCount) 251*a159c266SJung-uk Kim { 252*a159c266SJung-uk Kim ACPI_STATUS Status; 253*a159c266SJung-uk Kim UINT32 CurrentByteOffset; 254*a159c266SJung-uk Kim UINT8 ResourceType; 255*a159c266SJung-uk Kim UINT32 ResourceLength; 256*a159c266SJung-uk Kim void *Aml; 257*a159c266SJung-uk Kim UINT32 Level; 258*a159c266SJung-uk Kim BOOLEAN DependentFns = FALSE; 259*a159c266SJung-uk Kim UINT8 ResourceIndex; 260*a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 261*a159c266SJung-uk Kim 262*a159c266SJung-uk Kim 263*a159c266SJung-uk Kim Level = Info->Level; 264*a159c266SJung-uk Kim ResourceName = ACPI_DEFAULT_RESNAME; 265*a159c266SJung-uk Kim Node = Op->Common.Node; 266*a159c266SJung-uk Kim if (Node) 267*a159c266SJung-uk Kim { 268*a159c266SJung-uk Kim Node = Node->Child; 269*a159c266SJung-uk Kim } 270*a159c266SJung-uk Kim 271*a159c266SJung-uk Kim for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;) 272*a159c266SJung-uk Kim { 273*a159c266SJung-uk Kim Aml = &ByteData[CurrentByteOffset]; 274*a159c266SJung-uk Kim 275*a159c266SJung-uk Kim /* Get the descriptor type and length */ 276*a159c266SJung-uk Kim 277*a159c266SJung-uk Kim ResourceType = AcpiUtGetResourceType (Aml); 278*a159c266SJung-uk Kim ResourceLength = AcpiUtGetResourceLength (Aml); 279*a159c266SJung-uk Kim 280*a159c266SJung-uk Kim /* Validate the Resource Type and Resource Length */ 281*a159c266SJung-uk Kim 282*a159c266SJung-uk Kim Status = AcpiUtValidateResource (Aml, &ResourceIndex); 283*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 284*a159c266SJung-uk Kim { 285*a159c266SJung-uk Kim AcpiOsPrintf ("/*** Could not validate Resource, type (%X) %s***/\n", 286*a159c266SJung-uk Kim ResourceType, AcpiFormatException (Status)); 287*a159c266SJung-uk Kim return; 288*a159c266SJung-uk Kim } 289*a159c266SJung-uk Kim 290*a159c266SJung-uk Kim /* Point to next descriptor */ 291*a159c266SJung-uk Kim 292*a159c266SJung-uk Kim CurrentByteOffset += AcpiUtGetDescriptorLength (Aml); 293*a159c266SJung-uk Kim 294*a159c266SJung-uk Kim /* Descriptor pre-processing */ 295*a159c266SJung-uk Kim 296*a159c266SJung-uk Kim switch (ResourceType) 297*a159c266SJung-uk Kim { 298*a159c266SJung-uk Kim case ACPI_RESOURCE_NAME_START_DEPENDENT: 299*a159c266SJung-uk Kim 300*a159c266SJung-uk Kim /* Finish a previous StartDependentFns */ 301*a159c266SJung-uk Kim 302*a159c266SJung-uk Kim if (DependentFns) 303*a159c266SJung-uk Kim { 304*a159c266SJung-uk Kim Level--; 305*a159c266SJung-uk Kim AcpiDmIndent (Level); 306*a159c266SJung-uk Kim AcpiOsPrintf ("}\n"); 307*a159c266SJung-uk Kim } 308*a159c266SJung-uk Kim break; 309*a159c266SJung-uk Kim 310*a159c266SJung-uk Kim case ACPI_RESOURCE_NAME_END_DEPENDENT: 311*a159c266SJung-uk Kim 312*a159c266SJung-uk Kim Level--; 313*a159c266SJung-uk Kim DependentFns = FALSE; 314*a159c266SJung-uk Kim break; 315*a159c266SJung-uk Kim 316*a159c266SJung-uk Kim case ACPI_RESOURCE_NAME_END_TAG: 317*a159c266SJung-uk Kim 318*a159c266SJung-uk Kim /* Normal exit, the resource list is finished */ 319*a159c266SJung-uk Kim 320*a159c266SJung-uk Kim if (DependentFns) 321*a159c266SJung-uk Kim { 322*a159c266SJung-uk Kim /* 323*a159c266SJung-uk Kim * Close an open StartDependentDescriptor. This indicates a 324*a159c266SJung-uk Kim * missing EndDependentDescriptor. 325*a159c266SJung-uk Kim */ 326*a159c266SJung-uk Kim Level--; 327*a159c266SJung-uk Kim DependentFns = FALSE; 328*a159c266SJung-uk Kim 329*a159c266SJung-uk Kim /* Go ahead and insert EndDependentFn() */ 330*a159c266SJung-uk Kim 331*a159c266SJung-uk Kim AcpiDmEndDependentDescriptor (Aml, ResourceLength, Level); 332*a159c266SJung-uk Kim 333*a159c266SJung-uk Kim AcpiDmIndent (Level); 334*a159c266SJung-uk Kim AcpiOsPrintf ( 335*a159c266SJung-uk Kim "/*** Disassembler: inserted missing EndDependentFn () ***/\n"); 336*a159c266SJung-uk Kim } 337*a159c266SJung-uk Kim return; 338*a159c266SJung-uk Kim 339*a159c266SJung-uk Kim default: 340*a159c266SJung-uk Kim break; 341*a159c266SJung-uk Kim } 342*a159c266SJung-uk Kim 343*a159c266SJung-uk Kim /* Disassemble the resource structure */ 344*a159c266SJung-uk Kim 345*a159c266SJung-uk Kim if (Node) 346*a159c266SJung-uk Kim { 347*a159c266SJung-uk Kim ResourceName = Node->Name.Integer; 348*a159c266SJung-uk Kim Node = Node->Peer; 349*a159c266SJung-uk Kim } 350*a159c266SJung-uk Kim 351*a159c266SJung-uk Kim AcpiGbl_DmResourceDispatch [ResourceIndex] ( 352*a159c266SJung-uk Kim Aml, ResourceLength, Level); 353*a159c266SJung-uk Kim 354*a159c266SJung-uk Kim /* Descriptor post-processing */ 355*a159c266SJung-uk Kim 356*a159c266SJung-uk Kim if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT) 357*a159c266SJung-uk Kim { 358*a159c266SJung-uk Kim DependentFns = TRUE; 359*a159c266SJung-uk Kim Level++; 360*a159c266SJung-uk Kim } 361*a159c266SJung-uk Kim } 362*a159c266SJung-uk Kim } 363*a159c266SJung-uk Kim 364*a159c266SJung-uk Kim 365*a159c266SJung-uk Kim /******************************************************************************* 366*a159c266SJung-uk Kim * 367*a159c266SJung-uk Kim * FUNCTION: AcpiDmIsResourceTemplate 368*a159c266SJung-uk Kim * 369*a159c266SJung-uk Kim * PARAMETERS: Op - Buffer Op to be examined 370*a159c266SJung-uk Kim * 371*a159c266SJung-uk Kim * RETURN: Status. AE_OK if valid template 372*a159c266SJung-uk Kim * 373*a159c266SJung-uk Kim * DESCRIPTION: Walk a byte list to determine if it consists of a valid set 374*a159c266SJung-uk Kim * of resource descriptors. Nothing is output. 375*a159c266SJung-uk Kim * 376*a159c266SJung-uk Kim ******************************************************************************/ 377*a159c266SJung-uk Kim 378*a159c266SJung-uk Kim ACPI_STATUS 379*a159c266SJung-uk Kim AcpiDmIsResourceTemplate ( 380*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 381*a159c266SJung-uk Kim { 382*a159c266SJung-uk Kim ACPI_STATUS Status; 383*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 384*a159c266SJung-uk Kim UINT8 *Aml; 385*a159c266SJung-uk Kim UINT8 *EndAml; 386*a159c266SJung-uk Kim ACPI_SIZE Length; 387*a159c266SJung-uk Kim 388*a159c266SJung-uk Kim 389*a159c266SJung-uk Kim /* This op must be a buffer */ 390*a159c266SJung-uk Kim 391*a159c266SJung-uk Kim if (Op->Common.AmlOpcode != AML_BUFFER_OP) 392*a159c266SJung-uk Kim { 393*a159c266SJung-uk Kim return (AE_TYPE); 394*a159c266SJung-uk Kim } 395*a159c266SJung-uk Kim 396*a159c266SJung-uk Kim /* Get the ByteData list and length */ 397*a159c266SJung-uk Kim 398*a159c266SJung-uk Kim NextOp = Op->Common.Value.Arg; 399*a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 400*a159c266SJung-uk Kim if (!NextOp) 401*a159c266SJung-uk Kim { 402*a159c266SJung-uk Kim return (AE_TYPE); 403*a159c266SJung-uk Kim } 404*a159c266SJung-uk Kim 405*a159c266SJung-uk Kim Aml = NextOp->Named.Data; 406*a159c266SJung-uk Kim Length = (ACPI_SIZE) NextOp->Common.Value.Integer; 407*a159c266SJung-uk Kim 408*a159c266SJung-uk Kim /* Walk the byte list, abort on any invalid descriptor type or length */ 409*a159c266SJung-uk Kim 410*a159c266SJung-uk Kim Status = AcpiUtWalkAmlResources (Aml, Length, NULL, &EndAml); 411*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 412*a159c266SJung-uk Kim { 413*a159c266SJung-uk Kim return (AE_TYPE); 414*a159c266SJung-uk Kim } 415*a159c266SJung-uk Kim 416*a159c266SJung-uk Kim /* 417*a159c266SJung-uk Kim * For the resource template to be valid, one EndTag must appear 418*a159c266SJung-uk Kim * at the very end of the ByteList, not before. (For proper disassembly 419*a159c266SJung-uk Kim * of a ResourceTemplate, the buffer must not have any extra data after 420*a159c266SJung-uk Kim * the EndTag.) 421*a159c266SJung-uk Kim */ 422*a159c266SJung-uk Kim if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml) 423*a159c266SJung-uk Kim { 424*a159c266SJung-uk Kim return (AE_AML_NO_RESOURCE_END_TAG); 425*a159c266SJung-uk Kim } 426*a159c266SJung-uk Kim 427*a159c266SJung-uk Kim /* 428*a159c266SJung-uk Kim * All resource descriptors are valid, therefore this list appears 429*a159c266SJung-uk Kim * to be a valid resource template 430*a159c266SJung-uk Kim */ 431*a159c266SJung-uk Kim return (AE_OK); 432*a159c266SJung-uk Kim } 433*a159c266SJung-uk Kim 434*a159c266SJung-uk Kim #endif 435