Home | History | Annotate | Line # | Download | only in utilities
utresrc.c revision 1.1.1.4
      1 /*******************************************************************************
      2  *
      3  * Module Name: utresrc - Resource management utilities
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2014, 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 #define __UTRESRC_C__
     45 
     46 #include "acpi.h"
     47 #include "accommon.h"
     48 #include "acresrc.h"
     49 
     50 
     51 #define _COMPONENT          ACPI_UTILITIES
     52         ACPI_MODULE_NAME    ("utresrc")
     53 
     54 
     55 #if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
     56 
     57 /*
     58  * Strings used to decode resource descriptors.
     59  * Used by both the disassembler and the debugger resource dump routines
     60  */
     61 const char                      *AcpiGbl_BmDecode[] =
     62 {
     63     "NotBusMaster",
     64     "BusMaster"
     65 };
     66 
     67 const char                      *AcpiGbl_ConfigDecode[] =
     68 {
     69     "0 - Good Configuration",
     70     "1 - Acceptable Configuration",
     71     "2 - Suboptimal Configuration",
     72     "3 - ***Invalid Configuration***",
     73 };
     74 
     75 const char                      *AcpiGbl_ConsumeDecode[] =
     76 {
     77     "ResourceProducer",
     78     "ResourceConsumer"
     79 };
     80 
     81 const char                      *AcpiGbl_DecDecode[] =
     82 {
     83     "PosDecode",
     84     "SubDecode"
     85 };
     86 
     87 const char                      *AcpiGbl_HeDecode[] =
     88 {
     89     "Level",
     90     "Edge"
     91 };
     92 
     93 const char                      *AcpiGbl_IoDecode[] =
     94 {
     95     "Decode10",
     96     "Decode16"
     97 };
     98 
     99 const char                      *AcpiGbl_LlDecode[] =
    100 {
    101     "ActiveHigh",
    102     "ActiveLow",
    103     "ActiveBoth",
    104     "Reserved"
    105 };
    106 
    107 const char                      *AcpiGbl_MaxDecode[] =
    108 {
    109     "MaxNotFixed",
    110     "MaxFixed"
    111 };
    112 
    113 const char                      *AcpiGbl_MemDecode[] =
    114 {
    115     "NonCacheable",
    116     "Cacheable",
    117     "WriteCombining",
    118     "Prefetchable"
    119 };
    120 
    121 const char                      *AcpiGbl_MinDecode[] =
    122 {
    123     "MinNotFixed",
    124     "MinFixed"
    125 };
    126 
    127 const char                      *AcpiGbl_MtpDecode[] =
    128 {
    129     "AddressRangeMemory",
    130     "AddressRangeReserved",
    131     "AddressRangeACPI",
    132     "AddressRangeNVS"
    133 };
    134 
    135 const char                      *AcpiGbl_RngDecode[] =
    136 {
    137     "InvalidRanges",
    138     "NonISAOnlyRanges",
    139     "ISAOnlyRanges",
    140     "EntireRange"
    141 };
    142 
    143 const char                      *AcpiGbl_RwDecode[] =
    144 {
    145     "ReadOnly",
    146     "ReadWrite"
    147 };
    148 
    149 const char                      *AcpiGbl_ShrDecode[] =
    150 {
    151     "Exclusive",
    152     "Shared",
    153     "ExclusiveAndWake",         /* ACPI 5.0 */
    154     "SharedAndWake"             /* ACPI 5.0 */
    155 };
    156 
    157 const char                      *AcpiGbl_SizDecode[] =
    158 {
    159     "Transfer8",
    160     "Transfer8_16",
    161     "Transfer16",
    162     "InvalidSize"
    163 };
    164 
    165 const char                      *AcpiGbl_TrsDecode[] =
    166 {
    167     "DenseTranslation",
    168     "SparseTranslation"
    169 };
    170 
    171 const char                      *AcpiGbl_TtpDecode[] =
    172 {
    173     "TypeStatic",
    174     "TypeTranslation"
    175 };
    176 
    177 const char                      *AcpiGbl_TypDecode[] =
    178 {
    179     "Compatibility",
    180     "TypeA",
    181     "TypeB",
    182     "TypeF"
    183 };
    184 
    185 const char                      *AcpiGbl_PpcDecode[] =
    186 {
    187     "PullDefault",
    188     "PullUp",
    189     "PullDown",
    190     "PullNone"
    191 };
    192 
    193 const char                      *AcpiGbl_IorDecode[] =
    194 {
    195     "IoRestrictionNone",
    196     "IoRestrictionInputOnly",
    197     "IoRestrictionOutputOnly",
    198     "IoRestrictionNoneAndPreserve"
    199 };
    200 
    201 const char                      *AcpiGbl_DtsDecode[] =
    202 {
    203     "Width8bit",
    204     "Width16bit",
    205     "Width32bit",
    206     "Width64bit",
    207     "Width128bit",
    208     "Width256bit",
    209 };
    210 
    211 /* GPIO connection type */
    212 
    213 const char                      *AcpiGbl_CtDecode[] =
    214 {
    215     "Interrupt",
    216     "I/O"
    217 };
    218 
    219 /* Serial bus type */
    220 
    221 const char                      *AcpiGbl_SbtDecode[] =
    222 {
    223     "/* UNKNOWN serial bus type */",
    224     "I2C",
    225     "SPI",
    226     "UART"
    227 };
    228 
    229 /* I2C serial bus access mode */
    230 
    231 const char                      *AcpiGbl_AmDecode[] =
    232 {
    233     "AddressingMode7Bit",
    234     "AddressingMode10Bit"
    235 };
    236 
    237 /* I2C serial bus slave mode */
    238 
    239 const char                      *AcpiGbl_SmDecode[] =
    240 {
    241     "ControllerInitiated",
    242     "DeviceInitiated"
    243 };
    244 
    245 /* SPI serial bus wire mode */
    246 
    247 const char                      *AcpiGbl_WmDecode[] =
    248 {
    249     "FourWireMode",
    250     "ThreeWireMode"
    251 };
    252 
    253 /* SPI serial clock phase */
    254 
    255 const char                      *AcpiGbl_CphDecode[] =
    256 {
    257     "ClockPhaseFirst",
    258     "ClockPhaseSecond"
    259 };
    260 
    261 /* SPI serial bus clock polarity */
    262 
    263 const char                      *AcpiGbl_CpoDecode[] =
    264 {
    265     "ClockPolarityLow",
    266     "ClockPolarityHigh"
    267 };
    268 
    269 /* SPI serial bus device polarity */
    270 
    271 const char                      *AcpiGbl_DpDecode[] =
    272 {
    273     "PolarityLow",
    274     "PolarityHigh"
    275 };
    276 
    277 /* UART serial bus endian */
    278 
    279 const char                      *AcpiGbl_EdDecode[] =
    280 {
    281     "LittleEndian",
    282     "BigEndian"
    283 };
    284 
    285 /* UART serial bus bits per byte */
    286 
    287 const char                      *AcpiGbl_BpbDecode[] =
    288 {
    289     "DataBitsFive",
    290     "DataBitsSix",
    291     "DataBitsSeven",
    292     "DataBitsEight",
    293     "DataBitsNine",
    294     "/* UNKNOWN Bits per byte */",
    295     "/* UNKNOWN Bits per byte */",
    296     "/* UNKNOWN Bits per byte */"
    297 };
    298 
    299 /* UART serial bus stop bits */
    300 
    301 const char                      *AcpiGbl_SbDecode[] =
    302 {
    303     "StopBitsNone",
    304     "StopBitsOne",
    305     "StopBitsOnePlusHalf",
    306     "StopBitsTwo"
    307 };
    308 
    309 /* UART serial bus flow control */
    310 
    311 const char                      *AcpiGbl_FcDecode[] =
    312 {
    313     "FlowControlNone",
    314     "FlowControlHardware",
    315     "FlowControlXON",
    316     "/* UNKNOWN flow control keyword */"
    317 };
    318 
    319 /* UART serial bus parity type */
    320 
    321 const char                      *AcpiGbl_PtDecode[] =
    322 {
    323     "ParityTypeNone",
    324     "ParityTypeEven",
    325     "ParityTypeOdd",
    326     "ParityTypeMark",
    327     "ParityTypeSpace",
    328     "/* UNKNOWN parity keyword */",
    329     "/* UNKNOWN parity keyword */",
    330     "/* UNKNOWN parity keyword */"
    331 };
    332 
    333 #endif
    334 
    335 
    336 /*
    337  * Base sizes of the raw AML resource descriptors, indexed by resource type.
    338  * Zero indicates a reserved (and therefore invalid) resource type.
    339  */
    340 const UINT8                 AcpiGbl_ResourceAmlSizes[] =
    341 {
    342     /* Small descriptors */
    343 
    344     0,
    345     0,
    346     0,
    347     0,
    348     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IRQ),
    349     ACPI_AML_SIZE_SMALL (AML_RESOURCE_DMA),
    350     ACPI_AML_SIZE_SMALL (AML_RESOURCE_START_DEPENDENT),
    351     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_DEPENDENT),
    352     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IO),
    353     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_IO),
    354     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_DMA),
    355     0,
    356     0,
    357     0,
    358     ACPI_AML_SIZE_SMALL (AML_RESOURCE_VENDOR_SMALL),
    359     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_TAG),
    360 
    361     /* Large descriptors */
    362 
    363     0,
    364     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY24),
    365     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GENERIC_REGISTER),
    366     0,
    367     ACPI_AML_SIZE_LARGE (AML_RESOURCE_VENDOR_LARGE),
    368     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY32),
    369     ACPI_AML_SIZE_LARGE (AML_RESOURCE_FIXED_MEMORY32),
    370     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS32),
    371     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS16),
    372     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_IRQ),
    373     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
    374     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
    375     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
    376     0,
    377     ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
    378 };
    379 
    380 const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
    381 {
    382     0,
    383     ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
    384     ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
    385     ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
    386 };
    387 
    388 
    389 /*
    390  * Resource types, used to validate the resource length field.
    391  * The length of fixed-length types must match exactly, variable
    392  * lengths must meet the minimum required length, etc.
    393  * Zero indicates a reserved (and therefore invalid) resource type.
    394  */
    395 static const UINT8          AcpiGbl_ResourceTypes[] =
    396 {
    397     /* Small descriptors */
    398 
    399     0,
    400     0,
    401     0,
    402     0,
    403     ACPI_SMALL_VARIABLE_LENGTH,     /* 04 IRQ */
    404     ACPI_FIXED_LENGTH,              /* 05 DMA */
    405     ACPI_SMALL_VARIABLE_LENGTH,     /* 06 StartDependentFunctions */
    406     ACPI_FIXED_LENGTH,              /* 07 EndDependentFunctions */
    407     ACPI_FIXED_LENGTH,              /* 08 IO */
    408     ACPI_FIXED_LENGTH,              /* 09 FixedIO */
    409     ACPI_FIXED_LENGTH,              /* 0A FixedDMA */
    410     0,
    411     0,
    412     0,
    413     ACPI_VARIABLE_LENGTH,           /* 0E VendorShort */
    414     ACPI_FIXED_LENGTH,              /* 0F EndTag */
    415 
    416     /* Large descriptors */
    417 
    418     0,
    419     ACPI_FIXED_LENGTH,              /* 01 Memory24 */
    420     ACPI_FIXED_LENGTH,              /* 02 GenericRegister */
    421     0,
    422     ACPI_VARIABLE_LENGTH,           /* 04 VendorLong */
    423     ACPI_FIXED_LENGTH,              /* 05 Memory32 */
    424     ACPI_FIXED_LENGTH,              /* 06 Memory32Fixed */
    425     ACPI_VARIABLE_LENGTH,           /* 07 Dword* address */
    426     ACPI_VARIABLE_LENGTH,           /* 08 Word* address */
    427     ACPI_VARIABLE_LENGTH,           /* 09 ExtendedIRQ */
    428     ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
    429     ACPI_FIXED_LENGTH,              /* 0B Extended* address */
    430     ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
    431     0,
    432     ACPI_VARIABLE_LENGTH            /* 0E *SerialBus */
    433 };
    434 
    435 
    436 /*******************************************************************************
    437  *
    438  * FUNCTION:    AcpiUtWalkAmlResources
    439  *
    440  * PARAMETERS:  WalkState           - Current walk info
    441  * PARAMETERS:  Aml                 - Pointer to the raw AML resource template
    442  *              AmlLength           - Length of the entire template
    443  *              UserFunction        - Called once for each descriptor found. If
    444  *                                    NULL, a pointer to the EndTag is returned
    445  *              Context             - Passed to UserFunction
    446  *
    447  * RETURN:      Status
    448  *
    449  * DESCRIPTION: Walk a raw AML resource list(buffer). User function called
    450  *              once for each resource found.
    451  *
    452  ******************************************************************************/
    453 
    454 ACPI_STATUS
    455 AcpiUtWalkAmlResources (
    456     ACPI_WALK_STATE         *WalkState,
    457     UINT8                   *Aml,
    458     ACPI_SIZE               AmlLength,
    459     ACPI_WALK_AML_CALLBACK  UserFunction,
    460     void                    **Context)
    461 {
    462     ACPI_STATUS             Status;
    463     UINT8                   *EndAml;
    464     UINT8                   ResourceIndex;
    465     UINT32                  Length;
    466     UINT32                  Offset = 0;
    467     UINT8                   EndTag[2] = {0x79, 0x00};
    468 
    469 
    470     ACPI_FUNCTION_TRACE (UtWalkAmlResources);
    471 
    472 
    473     /* The absolute minimum resource template is one EndTag descriptor */
    474 
    475     if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
    476     {
    477         return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
    478     }
    479 
    480     /* Point to the end of the resource template buffer */
    481 
    482     EndAml = Aml + AmlLength;
    483 
    484     /* Walk the byte list, abort on any invalid descriptor type or length */
    485 
    486     while (Aml < EndAml)
    487     {
    488         /* Validate the Resource Type and Resource Length */
    489 
    490         Status = AcpiUtValidateResource (WalkState, Aml, &ResourceIndex);
    491         if (ACPI_FAILURE (Status))
    492         {
    493             /*
    494              * Exit on failure. Cannot continue because the descriptor length
    495              * may be bogus also.
    496              */
    497             return_ACPI_STATUS (Status);
    498         }
    499 
    500         /* Get the length of this descriptor */
    501 
    502         Length = AcpiUtGetDescriptorLength (Aml);
    503 
    504         /* Invoke the user function */
    505 
    506         if (UserFunction)
    507         {
    508             Status = UserFunction (Aml, Length, Offset, ResourceIndex, Context);
    509             if (ACPI_FAILURE (Status))
    510             {
    511                 return_ACPI_STATUS (Status);
    512             }
    513         }
    514 
    515         /* An EndTag descriptor terminates this resource template */
    516 
    517         if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)
    518         {
    519             /*
    520              * There must be at least one more byte in the buffer for
    521              * the 2nd byte of the EndTag
    522              */
    523             if ((Aml + 1) >= EndAml)
    524             {
    525                 return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
    526             }
    527 
    528             /* Return the pointer to the EndTag if requested */
    529 
    530             if (!UserFunction)
    531             {
    532                 *Context = Aml;
    533             }
    534 
    535             /* Normal exit */
    536 
    537             return_ACPI_STATUS (AE_OK);
    538         }
    539 
    540         Aml += Length;
    541         Offset += Length;
    542     }
    543 
    544     /* Did not find an EndTag descriptor */
    545 
    546     if (UserFunction)
    547     {
    548         /* Insert an EndTag anyway. AcpiRsGetListLength always leaves room */
    549 
    550         (void) AcpiUtValidateResource (WalkState, EndTag, &ResourceIndex);
    551         Status = UserFunction (EndTag, 2, Offset, ResourceIndex, Context);
    552         if (ACPI_FAILURE (Status))
    553         {
    554             return_ACPI_STATUS (Status);
    555         }
    556     }
    557 
    558     return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
    559 }
    560 
    561 
    562 /*******************************************************************************
    563  *
    564  * FUNCTION:    AcpiUtValidateResource
    565  *
    566  * PARAMETERS:  WalkState           - Current walk info
    567  *              Aml                 - Pointer to the raw AML resource descriptor
    568  *              ReturnIndex         - Where the resource index is returned. NULL
    569  *                                    if the index is not required.
    570  *
    571  * RETURN:      Status, and optionally the Index into the global resource tables
    572  *
    573  * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
    574  *              Type and Resource Length. Returns an index into the global
    575  *              resource information/dispatch tables for later use.
    576  *
    577  ******************************************************************************/
    578 
    579 ACPI_STATUS
    580 AcpiUtValidateResource (
    581     ACPI_WALK_STATE         *WalkState,
    582     void                    *Aml,
    583     UINT8                   *ReturnIndex)
    584 {
    585     AML_RESOURCE            *AmlResource;
    586     UINT8                   ResourceType;
    587     UINT8                   ResourceIndex;
    588     ACPI_RS_LENGTH          ResourceLength;
    589     ACPI_RS_LENGTH          MinimumResourceLength;
    590 
    591 
    592     ACPI_FUNCTION_ENTRY ();
    593 
    594 
    595     /*
    596      * 1) Validate the ResourceType field (Byte 0)
    597      */
    598     ResourceType = ACPI_GET8 (Aml);
    599 
    600     /*
    601      * Byte 0 contains the descriptor name (Resource Type)
    602      * Examine the large/small bit in the resource header
    603      */
    604     if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
    605     {
    606         /* Verify the large resource type (name) against the max */
    607 
    608         if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
    609         {
    610             goto InvalidResource;
    611         }
    612 
    613         /*
    614          * Large Resource Type -- bits 6:0 contain the name
    615          * Translate range 0x80-0x8B to index range 0x10-0x1B
    616          */
    617         ResourceIndex = (UINT8) (ResourceType - 0x70);
    618     }
    619     else
    620     {
    621         /*
    622          * Small Resource Type -- bits 6:3 contain the name
    623          * Shift range to index range 0x00-0x0F
    624          */
    625         ResourceIndex = (UINT8)
    626             ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
    627     }
    628 
    629     /*
    630      * Check validity of the resource type, via AcpiGbl_ResourceTypes. Zero
    631      * indicates an invalid resource.
    632      */
    633     if (!AcpiGbl_ResourceTypes[ResourceIndex])
    634     {
    635         goto InvalidResource;
    636     }
    637 
    638     /*
    639      * Validate the ResourceLength field. This ensures that the length
    640      * is at least reasonable, and guarantees that it is non-zero.
    641      */
    642     ResourceLength = AcpiUtGetResourceLength (Aml);
    643     MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
    644 
    645     /* Validate based upon the type of resource - fixed length or variable */
    646 
    647     switch (AcpiGbl_ResourceTypes[ResourceIndex])
    648     {
    649     case ACPI_FIXED_LENGTH:
    650 
    651         /* Fixed length resource, length must match exactly */
    652 
    653         if (ResourceLength != MinimumResourceLength)
    654         {
    655             goto BadResourceLength;
    656         }
    657         break;
    658 
    659     case ACPI_VARIABLE_LENGTH:
    660 
    661         /* Variable length resource, length must be at least the minimum */
    662 
    663         if (ResourceLength < MinimumResourceLength)
    664         {
    665             goto BadResourceLength;
    666         }
    667         break;
    668 
    669     case ACPI_SMALL_VARIABLE_LENGTH:
    670 
    671         /* Small variable length resource, length can be (Min) or (Min-1) */
    672 
    673         if ((ResourceLength > MinimumResourceLength) ||
    674             (ResourceLength < (MinimumResourceLength - 1)))
    675         {
    676             goto BadResourceLength;
    677         }
    678         break;
    679 
    680     default:
    681 
    682         /* Shouldn't happen (because of validation earlier), but be sure */
    683 
    684         goto InvalidResource;
    685     }
    686 
    687     AmlResource = ACPI_CAST_PTR (AML_RESOURCE, Aml);
    688     if (ResourceType == ACPI_RESOURCE_NAME_SERIAL_BUS)
    689     {
    690         /* Validate the BusType field */
    691 
    692         if ((AmlResource->CommonSerialBus.Type == 0) ||
    693             (AmlResource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
    694         {
    695             if (WalkState)
    696             {
    697                 ACPI_ERROR ((AE_INFO,
    698                     "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
    699                     AmlResource->CommonSerialBus.Type));
    700             }
    701             return (AE_AML_INVALID_RESOURCE_TYPE);
    702         }
    703     }
    704 
    705     /* Optionally return the resource table index */
    706 
    707     if (ReturnIndex)
    708     {
    709         *ReturnIndex = ResourceIndex;
    710     }
    711 
    712     return (AE_OK);
    713 
    714 
    715 InvalidResource:
    716 
    717     if (WalkState)
    718     {
    719         ACPI_ERROR ((AE_INFO,
    720             "Invalid/unsupported resource descriptor: Type 0x%2.2X",
    721             ResourceType));
    722     }
    723     return (AE_AML_INVALID_RESOURCE_TYPE);
    724 
    725 BadResourceLength:
    726 
    727     if (WalkState)
    728     {
    729         ACPI_ERROR ((AE_INFO,
    730             "Invalid resource descriptor length: Type "
    731             "0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
    732             ResourceType, ResourceLength, MinimumResourceLength));
    733     }
    734     return (AE_AML_BAD_RESOURCE_LENGTH);
    735 }
    736 
    737 
    738 /*******************************************************************************
    739  *
    740  * FUNCTION:    AcpiUtGetResourceType
    741  *
    742  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
    743  *
    744  * RETURN:      The Resource Type with no extraneous bits (except the
    745  *              Large/Small descriptor bit -- this is left alone)
    746  *
    747  * DESCRIPTION: Extract the Resource Type/Name from the first byte of
    748  *              a resource descriptor.
    749  *
    750  ******************************************************************************/
    751 
    752 UINT8
    753 AcpiUtGetResourceType (
    754     void                    *Aml)
    755 {
    756     ACPI_FUNCTION_ENTRY ();
    757 
    758 
    759     /*
    760      * Byte 0 contains the descriptor name (Resource Type)
    761      * Examine the large/small bit in the resource header
    762      */
    763     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
    764     {
    765         /* Large Resource Type -- bits 6:0 contain the name */
    766 
    767         return (ACPI_GET8 (Aml));
    768     }
    769     else
    770     {
    771         /* Small Resource Type -- bits 6:3 contain the name */
    772 
    773         return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
    774     }
    775 }
    776 
    777 
    778 /*******************************************************************************
    779  *
    780  * FUNCTION:    AcpiUtGetResourceLength
    781  *
    782  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
    783  *
    784  * RETURN:      Byte Length
    785  *
    786  * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
    787  *              definition, this does not include the size of the descriptor
    788  *              header or the length field itself.
    789  *
    790  ******************************************************************************/
    791 
    792 UINT16
    793 AcpiUtGetResourceLength (
    794     void                    *Aml)
    795 {
    796     ACPI_RS_LENGTH          ResourceLength;
    797 
    798 
    799     ACPI_FUNCTION_ENTRY ();
    800 
    801 
    802     /*
    803      * Byte 0 contains the descriptor name (Resource Type)
    804      * Examine the large/small bit in the resource header
    805      */
    806     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
    807     {
    808         /* Large Resource type -- bytes 1-2 contain the 16-bit length */
    809 
    810         ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));
    811 
    812     }
    813     else
    814     {
    815         /* Small Resource type -- bits 2:0 of byte 0 contain the length */
    816 
    817         ResourceLength = (UINT16) (ACPI_GET8 (Aml) &
    818                                     ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
    819     }
    820 
    821     return (ResourceLength);
    822 }
    823 
    824 
    825 /*******************************************************************************
    826  *
    827  * FUNCTION:    AcpiUtGetResourceHeaderLength
    828  *
    829  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
    830  *
    831  * RETURN:      Length of the AML header (depends on large/small descriptor)
    832  *
    833  * DESCRIPTION: Get the length of the header for this resource.
    834  *
    835  ******************************************************************************/
    836 
    837 UINT8
    838 AcpiUtGetResourceHeaderLength (
    839     void                    *Aml)
    840 {
    841     ACPI_FUNCTION_ENTRY ();
    842 
    843 
    844     /* Examine the large/small bit in the resource header */
    845 
    846     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
    847     {
    848         return (sizeof (AML_RESOURCE_LARGE_HEADER));
    849     }
    850     else
    851     {
    852         return (sizeof (AML_RESOURCE_SMALL_HEADER));
    853     }
    854 }
    855 
    856 
    857 /*******************************************************************************
    858  *
    859  * FUNCTION:    AcpiUtGetDescriptorLength
    860  *
    861  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
    862  *
    863  * RETURN:      Byte length
    864  *
    865  * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
    866  *              length of the descriptor header and the length field itself.
    867  *              Used to walk descriptor lists.
    868  *
    869  ******************************************************************************/
    870 
    871 UINT32
    872 AcpiUtGetDescriptorLength (
    873     void                    *Aml)
    874 {
    875     ACPI_FUNCTION_ENTRY ();
    876 
    877 
    878     /*
    879      * Get the Resource Length (does not include header length) and add
    880      * the header length (depends on if this is a small or large resource)
    881      */
    882     return (AcpiUtGetResourceLength (Aml) +
    883             AcpiUtGetResourceHeaderLength (Aml));
    884 }
    885 
    886 
    887 /*******************************************************************************
    888  *
    889  * FUNCTION:    AcpiUtGetResourceEndTag
    890  *
    891  * PARAMETERS:  ObjDesc         - The resource template buffer object
    892  *              EndTag          - Where the pointer to the EndTag is returned
    893  *
    894  * RETURN:      Status, pointer to the end tag
    895  *
    896  * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template
    897  *              Note: allows a buffer length of zero.
    898  *
    899  ******************************************************************************/
    900 
    901 ACPI_STATUS
    902 AcpiUtGetResourceEndTag (
    903     ACPI_OPERAND_OBJECT     *ObjDesc,
    904     UINT8                   **EndTag)
    905 {
    906     ACPI_STATUS             Status;
    907 
    908 
    909     ACPI_FUNCTION_TRACE (UtGetResourceEndTag);
    910 
    911 
    912     /* Allow a buffer length of zero */
    913 
    914     if (!ObjDesc->Buffer.Length)
    915     {
    916         *EndTag = ObjDesc->Buffer.Pointer;
    917         return_ACPI_STATUS (AE_OK);
    918     }
    919 
    920     /* Validate the template and get a pointer to the EndTag */
    921 
    922     Status = AcpiUtWalkAmlResources (NULL, ObjDesc->Buffer.Pointer,
    923                 ObjDesc->Buffer.Length, NULL, (void **) EndTag);
    924 
    925     return_ACPI_STATUS (Status);
    926 }
    927