Home | History | Annotate | Line # | Download | only in resources
rsmisc.c revision 1.1.1.3
      1 /*******************************************************************************
      2  *
      3  * Module Name: rsmisc - Miscellaneous resource descriptors
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2013, 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 __RSMISC_C__
     45 
     46 #include "acpi.h"
     47 #include "accommon.h"
     48 #include "acresrc.h"
     49 
     50 #define _COMPONENT          ACPI_RESOURCES
     51         ACPI_MODULE_NAME    ("rsmisc")
     52 
     53 
     54 #define INIT_RESOURCE_TYPE(i)       i->ResourceOffset
     55 #define INIT_RESOURCE_LENGTH(i)     i->AmlOffset
     56 #define INIT_TABLE_LENGTH(i)        i->Value
     57 
     58 #define COMPARE_OPCODE(i)           i->ResourceOffset
     59 #define COMPARE_TARGET(i)           i->AmlOffset
     60 #define COMPARE_VALUE(i)            i->Value
     61 
     62 
     63 /*******************************************************************************
     64  *
     65  * FUNCTION:    AcpiRsConvertAmlToResource
     66  *
     67  * PARAMETERS:  Resource            - Pointer to the resource descriptor
     68  *              Aml                 - Where the AML descriptor is returned
     69  *              Info                - Pointer to appropriate conversion table
     70  *
     71  * RETURN:      Status
     72  *
     73  * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
     74  *              internal resource descriptor
     75  *
     76  ******************************************************************************/
     77 
     78 ACPI_STATUS
     79 AcpiRsConvertAmlToResource (
     80     ACPI_RESOURCE           *Resource,
     81     AML_RESOURCE            *Aml,
     82     ACPI_RSCONVERT_INFO     *Info)
     83 {
     84     ACPI_RS_LENGTH          AmlResourceLength;
     85     void                    *Source;
     86     void                    *Destination;
     87     char                    *Target;
     88     UINT8                   Count;
     89     UINT8                   FlagsMode = FALSE;
     90     UINT16                  ItemCount = 0;
     91     UINT16                  Temp16 = 0;
     92 
     93 
     94     ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
     95 
     96 
     97     if (!Info)
     98     {
     99         return_ACPI_STATUS (AE_BAD_PARAMETER);
    100     }
    101 
    102     if (((ACPI_SIZE) Resource) & 0x3)
    103     {
    104         /* Each internal resource struct is expected to be 32-bit aligned */
    105 
    106         ACPI_WARNING ((AE_INFO,
    107             "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
    108             Resource, Resource->Type, Resource->Length));
    109     }
    110 
    111     /* Extract the resource Length field (does not include header length) */
    112 
    113     AmlResourceLength = AcpiUtGetResourceLength (Aml);
    114 
    115     /*
    116      * First table entry must be ACPI_RSC_INITxxx and must contain the
    117      * table length (# of table entries)
    118      */
    119     Count = INIT_TABLE_LENGTH (Info);
    120     while (Count)
    121     {
    122         /*
    123          * Source is the external AML byte stream buffer,
    124          * destination is the internal resource descriptor
    125          */
    126         Source      = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
    127         Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
    128 
    129         switch (Info->Opcode)
    130         {
    131         case ACPI_RSC_INITGET:
    132             /*
    133              * Get the resource type and the initial (minimum) length
    134              */
    135             ACPI_MEMSET (Resource, 0, INIT_RESOURCE_LENGTH (Info));
    136             Resource->Type = INIT_RESOURCE_TYPE (Info);
    137             Resource->Length = INIT_RESOURCE_LENGTH (Info);
    138             break;
    139 
    140         case ACPI_RSC_INITSET:
    141             break;
    142 
    143         case ACPI_RSC_FLAGINIT:
    144 
    145             FlagsMode = TRUE;
    146             break;
    147 
    148         case ACPI_RSC_1BITFLAG:
    149             /*
    150              * Mask and shift the flag bit
    151              */
    152             ACPI_SET8 (Destination,
    153                 ((ACPI_GET8 (Source) >> Info->Value) & 0x01));
    154             break;
    155 
    156         case ACPI_RSC_2BITFLAG:
    157             /*
    158              * Mask and shift the flag bits
    159              */
    160             ACPI_SET8 (Destination,
    161                 ((ACPI_GET8 (Source) >> Info->Value) & 0x03));
    162             break;
    163 
    164         case ACPI_RSC_3BITFLAG:
    165             /*
    166              * Mask and shift the flag bits
    167              */
    168             ACPI_SET8 (Destination,
    169                 ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
    170             break;
    171 
    172         case ACPI_RSC_COUNT:
    173 
    174             ItemCount = ACPI_GET8 (Source);
    175             ACPI_SET8 (Destination, ItemCount);
    176 
    177             Resource->Length = Resource->Length +
    178                 (Info->Value * (ItemCount - 1));
    179             break;
    180 
    181         case ACPI_RSC_COUNT16:
    182 
    183             ItemCount = AmlResourceLength;
    184             ACPI_SET16 (Destination, ItemCount);
    185 
    186             Resource->Length = Resource->Length +
    187                 (Info->Value * (ItemCount - 1));
    188             break;
    189 
    190         case ACPI_RSC_COUNT_GPIO_PIN:
    191 
    192             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    193             ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
    194 
    195             Resource->Length = Resource->Length + ItemCount;
    196             ItemCount = ItemCount / 2;
    197             ACPI_SET16 (Destination, ItemCount);
    198             break;
    199 
    200         case ACPI_RSC_COUNT_GPIO_VEN:
    201 
    202             ItemCount = ACPI_GET8 (Source);
    203             ACPI_SET8 (Destination, ItemCount);
    204 
    205             Resource->Length = Resource->Length +
    206                 (Info->Value * ItemCount);
    207             break;
    208 
    209         case ACPI_RSC_COUNT_GPIO_RES:
    210             /*
    211              * Vendor data is optional (length/offset may both be zero)
    212              * Examine vendor data length field first
    213              */
    214             Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
    215             if (ACPI_GET16 (Target))
    216             {
    217                 /* Use vendor offset to get resource source length */
    218 
    219                 Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    220                 ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
    221             }
    222             else
    223             {
    224                 /* No vendor data to worry about */
    225 
    226                 ItemCount = Aml->LargeHeader.ResourceLength +
    227                     sizeof (AML_RESOURCE_LARGE_HEADER) -
    228                     ACPI_GET16 (Source);
    229             }
    230 
    231             Resource->Length = Resource->Length + ItemCount;
    232             ACPI_SET16 (Destination, ItemCount);
    233             break;
    234 
    235         case ACPI_RSC_COUNT_SERIAL_VEN:
    236 
    237             ItemCount = ACPI_GET16 (Source) - Info->Value;
    238 
    239             Resource->Length = Resource->Length + ItemCount;
    240             ACPI_SET16 (Destination, ItemCount);
    241             break;
    242 
    243         case ACPI_RSC_COUNT_SERIAL_RES:
    244 
    245             ItemCount = (AmlResourceLength +
    246                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
    247                 ACPI_GET16 (Source) - Info->Value;
    248 
    249             Resource->Length = Resource->Length + ItemCount;
    250             ACPI_SET16 (Destination, ItemCount);
    251             break;
    252 
    253         case ACPI_RSC_LENGTH:
    254 
    255             Resource->Length = Resource->Length + Info->Value;
    256             break;
    257 
    258         case ACPI_RSC_MOVE8:
    259         case ACPI_RSC_MOVE16:
    260         case ACPI_RSC_MOVE32:
    261         case ACPI_RSC_MOVE64:
    262             /*
    263              * Raw data move. Use the Info value field unless ItemCount has
    264              * been previously initialized via a COUNT opcode
    265              */
    266             if (Info->Value)
    267             {
    268                 ItemCount = Info->Value;
    269             }
    270             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    271             break;
    272 
    273         case ACPI_RSC_MOVE_GPIO_PIN:
    274 
    275             /* Generate and set the PIN data pointer */
    276 
    277             Target = (char *) ACPI_ADD_PTR (void, Resource,
    278                   (Resource->Length - ItemCount * 2));
    279             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
    280 
    281             /* Copy the PIN data */
    282 
    283             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
    284             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    285             break;
    286 
    287         case ACPI_RSC_MOVE_GPIO_RES:
    288 
    289             /* Generate and set the ResourceSource string pointer */
    290 
    291             Target = (char *) ACPI_ADD_PTR (void, Resource,
    292                   (Resource->Length - ItemCount));
    293             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    294 
    295             /* Copy the ResourceSource string */
    296 
    297             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
    298             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    299             break;
    300 
    301         case ACPI_RSC_MOVE_SERIAL_VEN:
    302 
    303             /* Generate and set the Vendor Data pointer */
    304 
    305             Target = (char *) ACPI_ADD_PTR (void, Resource,
    306                   (Resource->Length - ItemCount));
    307             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    308 
    309             /* Copy the Vendor Data */
    310 
    311             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
    312             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    313             break;
    314 
    315         case ACPI_RSC_MOVE_SERIAL_RES:
    316 
    317             /* Generate and set the ResourceSource string pointer */
    318 
    319             Target = (char *) ACPI_ADD_PTR (void, Resource,
    320                   (Resource->Length - ItemCount));
    321             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    322 
    323             /* Copy the ResourceSource string */
    324 
    325             Source = ACPI_ADD_PTR (void, Aml, (ACPI_GET16 (Source) + Info->Value));
    326             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    327             break;
    328 
    329         case ACPI_RSC_SET8:
    330 
    331             ACPI_MEMSET (Destination, Info->AmlOffset, Info->Value);
    332             break;
    333 
    334         case ACPI_RSC_DATA8:
    335 
    336             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    337             ACPI_MEMCPY (Destination, Source,  ACPI_GET16 (Target));
    338             break;
    339 
    340         case ACPI_RSC_ADDRESS:
    341             /*
    342              * Common handler for address descriptor flags
    343              */
    344             if (!AcpiRsGetAddressCommon (Resource, Aml))
    345             {
    346                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
    347             }
    348             break;
    349 
    350         case ACPI_RSC_SOURCE:
    351             /*
    352              * Optional ResourceSource (Index and String)
    353              */
    354             Resource->Length +=
    355                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
    356                     Destination, Aml, NULL);
    357             break;
    358 
    359         case ACPI_RSC_SOURCEX:
    360             /*
    361              * Optional ResourceSource (Index and String). This is the more
    362              * complicated case used by the Interrupt() macro
    363              */
    364             Target = ACPI_ADD_PTR (char, Resource,
    365                 Info->AmlOffset + (ItemCount * 4));
    366 
    367             Resource->Length +=
    368                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
    369                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
    370                     Destination, Aml, Target);
    371             break;
    372 
    373         case ACPI_RSC_BITMASK:
    374             /*
    375              * 8-bit encoded bitmask (DMA macro)
    376              */
    377             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
    378             if (ItemCount)
    379             {
    380                 Resource->Length += (ItemCount - 1);
    381             }
    382 
    383             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    384             ACPI_SET8 (Target, ItemCount);
    385             break;
    386 
    387         case ACPI_RSC_BITMASK16:
    388             /*
    389              * 16-bit encoded bitmask (IRQ macro)
    390              */
    391             ACPI_MOVE_16_TO_16 (&Temp16, Source);
    392 
    393             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
    394             if (ItemCount)
    395             {
    396                 Resource->Length += (ItemCount - 1);
    397             }
    398 
    399             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    400             ACPI_SET8 (Target, ItemCount);
    401             break;
    402 
    403         case ACPI_RSC_EXIT_NE:
    404             /*
    405              * Control - Exit conversion if not equal
    406              */
    407             switch (Info->ResourceOffset)
    408             {
    409             case ACPI_RSC_COMPARE_AML_LENGTH:
    410 
    411                 if (AmlResourceLength != Info->Value)
    412                 {
    413                     goto Exit;
    414                 }
    415                 break;
    416 
    417             case ACPI_RSC_COMPARE_VALUE:
    418 
    419                 if (ACPI_GET8 (Source) != Info->Value)
    420                 {
    421                     goto Exit;
    422                 }
    423                 break;
    424 
    425             default:
    426 
    427                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
    428                 return_ACPI_STATUS (AE_BAD_PARAMETER);
    429             }
    430             break;
    431 
    432         default:
    433 
    434             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
    435             return_ACPI_STATUS (AE_BAD_PARAMETER);
    436         }
    437 
    438         Count--;
    439         Info++;
    440     }
    441 
    442 Exit:
    443     if (!FlagsMode)
    444     {
    445         /* Round the resource struct length up to the next boundary (32 or 64) */
    446 
    447         Resource->Length = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
    448     }
    449     return_ACPI_STATUS (AE_OK);
    450 }
    451 
    452 
    453 /*******************************************************************************
    454  *
    455  * FUNCTION:    AcpiRsConvertResourceToAml
    456  *
    457  * PARAMETERS:  Resource            - Pointer to the resource descriptor
    458  *              Aml                 - Where the AML descriptor is returned
    459  *              Info                - Pointer to appropriate conversion table
    460  *
    461  * RETURN:      Status
    462  *
    463  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
    464  *              external AML resource descriptor.
    465  *
    466  ******************************************************************************/
    467 
    468 ACPI_STATUS
    469 AcpiRsConvertResourceToAml (
    470     ACPI_RESOURCE           *Resource,
    471     AML_RESOURCE            *Aml,
    472     ACPI_RSCONVERT_INFO     *Info)
    473 {
    474     void                    *Source = NULL;
    475     void                    *Destination;
    476     char                    *Target;
    477     ACPI_RSDESC_SIZE        AmlLength = 0;
    478     UINT8                   Count;
    479     UINT16                  Temp16 = 0;
    480     UINT16                  ItemCount = 0;
    481 
    482 
    483     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
    484 
    485 
    486     if (!Info)
    487     {
    488         return_ACPI_STATUS (AE_BAD_PARAMETER);
    489     }
    490 
    491     /*
    492      * First table entry must be ACPI_RSC_INITxxx and must contain the
    493      * table length (# of table entries)
    494      */
    495     Count = INIT_TABLE_LENGTH (Info);
    496 
    497     while (Count)
    498     {
    499         /*
    500          * Source is the internal resource descriptor,
    501          * destination is the external AML byte stream buffer
    502          */
    503         Source      = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
    504         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
    505 
    506         switch (Info->Opcode)
    507         {
    508         case ACPI_RSC_INITSET:
    509 
    510             ACPI_MEMSET (Aml, 0, INIT_RESOURCE_LENGTH (Info));
    511             AmlLength = INIT_RESOURCE_LENGTH (Info);
    512             AcpiRsSetResourceHeader (INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
    513             break;
    514 
    515         case ACPI_RSC_INITGET:
    516             break;
    517 
    518         case ACPI_RSC_FLAGINIT:
    519             /*
    520              * Clear the flag byte
    521              */
    522             ACPI_SET8 (Destination, 0);
    523             break;
    524 
    525         case ACPI_RSC_1BITFLAG:
    526             /*
    527              * Mask and shift the flag bit
    528              */
    529             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    530                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
    531             break;
    532 
    533         case ACPI_RSC_2BITFLAG:
    534             /*
    535              * Mask and shift the flag bits
    536              */
    537             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    538                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
    539             break;
    540 
    541         case ACPI_RSC_3BITFLAG:
    542             /*
    543              * Mask and shift the flag bits
    544              */
    545             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    546                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
    547             break;
    548 
    549         case ACPI_RSC_COUNT:
    550 
    551             ItemCount = ACPI_GET8 (Source);
    552             ACPI_SET8 (Destination, ItemCount);
    553 
    554             AmlLength = (UINT16) (AmlLength + (Info->Value * (ItemCount - 1)));
    555             break;
    556 
    557         case ACPI_RSC_COUNT16:
    558 
    559             ItemCount = ACPI_GET16 (Source);
    560             AmlLength = (UINT16) (AmlLength + ItemCount);
    561             AcpiRsSetResourceLength (AmlLength, Aml);
    562             break;
    563 
    564         case ACPI_RSC_COUNT_GPIO_PIN:
    565 
    566             ItemCount = ACPI_GET16 (Source);
    567             ACPI_SET16 (Destination, AmlLength);
    568 
    569             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
    570             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    571             ACPI_SET16 (Target, AmlLength);
    572             AcpiRsSetResourceLength (AmlLength, Aml);
    573             break;
    574 
    575         case ACPI_RSC_COUNT_GPIO_VEN:
    576 
    577             ItemCount = ACPI_GET16 (Source);
    578             ACPI_SET16 (Destination, ItemCount);
    579 
    580             AmlLength = (UINT16) (AmlLength + (Info->Value * ItemCount));
    581             AcpiRsSetResourceLength (AmlLength, Aml);
    582             break;
    583 
    584         case ACPI_RSC_COUNT_GPIO_RES:
    585 
    586             /* Set resource source string length */
    587 
    588             ItemCount = ACPI_GET16 (Source);
    589             ACPI_SET16 (Destination, AmlLength);
    590 
    591             /* Compute offset for the Vendor Data */
    592 
    593             AmlLength = (UINT16) (AmlLength + ItemCount);
    594             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    595 
    596             /* Set vendor offset only if there is vendor data */
    597 
    598             if (Resource->Data.Gpio.VendorLength)
    599             {
    600                 ACPI_SET16 (Target, AmlLength);
    601             }
    602 
    603             AcpiRsSetResourceLength (AmlLength, Aml);
    604             break;
    605 
    606         case ACPI_RSC_COUNT_SERIAL_VEN:
    607 
    608             ItemCount = ACPI_GET16 (Source);
    609             ACPI_SET16 (Destination, ItemCount + Info->Value);
    610             AmlLength = (UINT16) (AmlLength + ItemCount);
    611             AcpiRsSetResourceLength (AmlLength, Aml);
    612             break;
    613 
    614         case ACPI_RSC_COUNT_SERIAL_RES:
    615 
    616             ItemCount = ACPI_GET16 (Source);
    617             AmlLength = (UINT16) (AmlLength + ItemCount);
    618             AcpiRsSetResourceLength (AmlLength, Aml);
    619             break;
    620 
    621         case ACPI_RSC_LENGTH:
    622 
    623             AcpiRsSetResourceLength (Info->Value, Aml);
    624             break;
    625 
    626         case ACPI_RSC_MOVE8:
    627         case ACPI_RSC_MOVE16:
    628         case ACPI_RSC_MOVE32:
    629         case ACPI_RSC_MOVE64:
    630 
    631             if (Info->Value)
    632             {
    633                 ItemCount = Info->Value;
    634             }
    635             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    636             break;
    637 
    638         case ACPI_RSC_MOVE_GPIO_PIN:
    639 
    640             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    641                   ACPI_GET16 (Destination));
    642             Source = * (UINT16 **) Source;
    643             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    644             break;
    645 
    646         case ACPI_RSC_MOVE_GPIO_RES:
    647 
    648             /* Used for both ResourceSource string and VendorData */
    649 
    650             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    651                   ACPI_GET16 (Destination));
    652             Source = * (UINT8 **) Source;
    653             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    654             break;
    655 
    656         case ACPI_RSC_MOVE_SERIAL_VEN:
    657 
    658             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    659                   (AmlLength - ItemCount));
    660             Source = * (UINT8 **) Source;
    661             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    662             break;
    663 
    664         case ACPI_RSC_MOVE_SERIAL_RES:
    665 
    666             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    667                   (AmlLength - ItemCount));
    668             Source = * (UINT8 **) Source;
    669             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    670             break;
    671 
    672         case ACPI_RSC_ADDRESS:
    673 
    674             /* Set the Resource Type, General Flags, and Type-Specific Flags */
    675 
    676             AcpiRsSetAddressCommon (Aml, Resource);
    677             break;
    678 
    679         case ACPI_RSC_SOURCEX:
    680             /*
    681              * Optional ResourceSource (Index and String)
    682              */
    683             AmlLength = AcpiRsSetResourceSource (
    684                             Aml, (ACPI_RS_LENGTH) AmlLength, Source);
    685             AcpiRsSetResourceLength (AmlLength, Aml);
    686             break;
    687 
    688         case ACPI_RSC_SOURCE:
    689             /*
    690              * Optional ResourceSource (Index and String). This is the more
    691              * complicated case used by the Interrupt() macro
    692              */
    693             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
    694             AcpiRsSetResourceLength (AmlLength, Aml);
    695             break;
    696 
    697         case ACPI_RSC_BITMASK:
    698             /*
    699              * 8-bit encoded bitmask (DMA macro)
    700              */
    701             ACPI_SET8 (Destination,
    702                 AcpiRsEncodeBitmask (Source,
    703                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
    704             break;
    705 
    706         case ACPI_RSC_BITMASK16:
    707             /*
    708              * 16-bit encoded bitmask (IRQ macro)
    709              */
    710             Temp16 = AcpiRsEncodeBitmask (Source,
    711                         *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
    712             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
    713             break;
    714 
    715         case ACPI_RSC_EXIT_LE:
    716             /*
    717              * Control - Exit conversion if less than or equal
    718              */
    719             if (ItemCount <= Info->Value)
    720             {
    721                 goto Exit;
    722             }
    723             break;
    724 
    725         case ACPI_RSC_EXIT_NE:
    726             /*
    727              * Control - Exit conversion if not equal
    728              */
    729             switch (COMPARE_OPCODE (Info))
    730             {
    731             case ACPI_RSC_COMPARE_VALUE:
    732 
    733                 if (*ACPI_ADD_PTR (UINT8, Resource,
    734                         COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
    735                 {
    736                     goto Exit;
    737                 }
    738                 break;
    739 
    740             default:
    741 
    742                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
    743                 return_ACPI_STATUS (AE_BAD_PARAMETER);
    744             }
    745             break;
    746 
    747         case ACPI_RSC_EXIT_EQ:
    748             /*
    749              * Control - Exit conversion if equal
    750              */
    751             if (*ACPI_ADD_PTR (UINT8, Resource,
    752                     COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
    753             {
    754                 goto Exit;
    755             }
    756             break;
    757 
    758         default:
    759 
    760             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
    761             return_ACPI_STATUS (AE_BAD_PARAMETER);
    762         }
    763 
    764         Count--;
    765         Info++;
    766     }
    767 
    768 Exit:
    769     return_ACPI_STATUS (AE_OK);
    770 }
    771 
    772 
    773 #if 0
    774 /* Previous resource validations */
    775 
    776     if (Aml->ExtAddress64.RevisionID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
    777     {
    778         return_ACPI_STATUS (AE_SUPPORT);
    779     }
    780 
    781     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
    782     {
    783         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
    784     }
    785 
    786     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
    787         ((Aml->Irq.Flags & 0x09) == 0x09))
    788     {
    789         /*
    790          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
    791          * polarity/trigger interrupts are allowed (ACPI spec, section
    792          * "IRQ Format"), so 0x00 and 0x09 are illegal.
    793          */
    794         ACPI_ERROR ((AE_INFO,
    795             "Invalid interrupt polarity/trigger in resource list, 0x%X",
    796             Aml->Irq.Flags));
    797         return_ACPI_STATUS (AE_BAD_DATA);
    798     }
    799 
    800     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
    801     if (Temp8 < 1)
    802     {
    803         /* Must have at least one IRQ */
    804 
    805         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
    806     }
    807 
    808     if (Resource->Data.Dma.Transfer == 0x03)
    809     {
    810         ACPI_ERROR ((AE_INFO,
    811             "Invalid DMA.Transfer preference (3)"));
    812         return_ACPI_STATUS (AE_BAD_DATA);
    813     }
    814 #endif
    815