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