Home | History | Annotate | Line # | Download | only in resources
rsmisc.c revision 1.1.1.15
      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.15  christos  * Copyright (C) 2000 - 2023, 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.13  christos  * 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.13  christos         Target = NULL;
    121  1.1.1.13  christos 
    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.13  christos         case ACPI_RSC_6BITFLAG:
    173  1.1.1.13  christos             /*
    174  1.1.1.13  christos              * Mask and shift the flag bits
    175  1.1.1.13  christos              */
    176  1.1.1.13  christos             ACPI_SET8 (Destination,
    177  1.1.1.13  christos                 ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
    178  1.1.1.13  christos             break;
    179  1.1.1.13  christos 
    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.15  christos             ACPI_MOVE_16_TO_16(&Temp16, Source);
    245  1.1.1.15  christos             ItemCount = Temp16 - Info->Value;
    246   1.1.1.3  christos 
    247   1.1.1.3  christos             Resource->Length = Resource->Length + ItemCount;
    248   1.1.1.3  christos             ACPI_SET16 (Destination, ItemCount);
    249   1.1.1.3  christos             break;
    250   1.1.1.3  christos 
    251   1.1.1.3  christos         case ACPI_RSC_COUNT_SERIAL_RES:
    252   1.1.1.3  christos 
    253  1.1.1.15  christos             ACPI_MOVE_16_TO_16(&Temp16, Source);
    254   1.1.1.3  christos             ItemCount = (AmlResourceLength +
    255   1.1.1.3  christos                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
    256  1.1.1.15  christos                 Temp16 - Info->Value;
    257   1.1.1.3  christos 
    258   1.1.1.3  christos             Resource->Length = Resource->Length + ItemCount;
    259   1.1.1.3  christos             ACPI_SET16 (Destination, ItemCount);
    260   1.1.1.3  christos             break;
    261       1.1    jruoho 
    262       1.1    jruoho         case ACPI_RSC_LENGTH:
    263       1.1    jruoho 
    264       1.1    jruoho             Resource->Length = Resource->Length + Info->Value;
    265       1.1    jruoho             break;
    266       1.1    jruoho 
    267       1.1    jruoho         case ACPI_RSC_MOVE8:
    268       1.1    jruoho         case ACPI_RSC_MOVE16:
    269       1.1    jruoho         case ACPI_RSC_MOVE32:
    270       1.1    jruoho         case ACPI_RSC_MOVE64:
    271       1.1    jruoho             /*
    272       1.1    jruoho              * Raw data move. Use the Info value field unless ItemCount has
    273       1.1    jruoho              * been previously initialized via a COUNT opcode
    274       1.1    jruoho              */
    275       1.1    jruoho             if (Info->Value)
    276       1.1    jruoho             {
    277       1.1    jruoho                 ItemCount = Info->Value;
    278       1.1    jruoho             }
    279       1.1    jruoho             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    280       1.1    jruoho             break;
    281       1.1    jruoho 
    282   1.1.1.3  christos         case ACPI_RSC_MOVE_GPIO_PIN:
    283   1.1.1.3  christos 
    284   1.1.1.3  christos             /* Generate and set the PIN data pointer */
    285   1.1.1.3  christos 
    286   1.1.1.3  christos             Target = (char *) ACPI_ADD_PTR (void, Resource,
    287   1.1.1.7  christos                 (Resource->Length - ItemCount * 2));
    288   1.1.1.3  christos             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
    289   1.1.1.3  christos 
    290   1.1.1.3  christos             /* Copy the PIN data */
    291   1.1.1.3  christos 
    292   1.1.1.3  christos             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
    293   1.1.1.3  christos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    294   1.1.1.3  christos             break;
    295   1.1.1.3  christos 
    296   1.1.1.3  christos         case ACPI_RSC_MOVE_GPIO_RES:
    297   1.1.1.3  christos 
    298   1.1.1.3  christos             /* Generate and set the ResourceSource string pointer */
    299   1.1.1.3  christos 
    300   1.1.1.3  christos             Target = (char *) ACPI_ADD_PTR (void, Resource,
    301   1.1.1.7  christos                 (Resource->Length - ItemCount));
    302   1.1.1.3  christos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    303   1.1.1.3  christos 
    304   1.1.1.3  christos             /* Copy the ResourceSource string */
    305   1.1.1.3  christos 
    306   1.1.1.3  christos             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
    307   1.1.1.3  christos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    308   1.1.1.3  christos             break;
    309   1.1.1.3  christos 
    310   1.1.1.3  christos         case ACPI_RSC_MOVE_SERIAL_VEN:
    311   1.1.1.3  christos 
    312   1.1.1.3  christos             /* Generate and set the Vendor Data pointer */
    313   1.1.1.3  christos 
    314   1.1.1.3  christos             Target = (char *) ACPI_ADD_PTR (void, Resource,
    315   1.1.1.7  christos                 (Resource->Length - ItemCount));
    316   1.1.1.3  christos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    317   1.1.1.3  christos 
    318   1.1.1.3  christos             /* Copy the Vendor Data */
    319   1.1.1.3  christos 
    320   1.1.1.3  christos             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
    321   1.1.1.3  christos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    322   1.1.1.3  christos             break;
    323   1.1.1.3  christos 
    324   1.1.1.3  christos         case ACPI_RSC_MOVE_SERIAL_RES:
    325   1.1.1.3  christos 
    326   1.1.1.3  christos             /* Generate and set the ResourceSource string pointer */
    327   1.1.1.3  christos 
    328   1.1.1.3  christos             Target = (char *) ACPI_ADD_PTR (void, Resource,
    329   1.1.1.7  christos                 (Resource->Length - ItemCount));
    330   1.1.1.3  christos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
    331   1.1.1.3  christos 
    332   1.1.1.3  christos             /* Copy the ResourceSource string */
    333   1.1.1.3  christos 
    334  1.1.1.15  christos             ACPI_MOVE_16_TO_16 (&Temp16, Source);
    335   1.1.1.7  christos             Source = ACPI_ADD_PTR (
    336  1.1.1.15  christos                 void, Aml, (Temp16 + Info->Value));
    337   1.1.1.3  christos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
    338   1.1.1.3  christos             break;
    339       1.1    jruoho 
    340       1.1    jruoho         case ACPI_RSC_SET8:
    341       1.1    jruoho 
    342   1.1.1.6  christos             memset (Destination, Info->AmlOffset, Info->Value);
    343       1.1    jruoho             break;
    344       1.1    jruoho 
    345       1.1    jruoho         case ACPI_RSC_DATA8:
    346       1.1    jruoho 
    347       1.1    jruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    348   1.1.1.6  christos             memcpy (Destination, Source,  ACPI_GET16 (Target));
    349       1.1    jruoho             break;
    350       1.1    jruoho 
    351       1.1    jruoho         case ACPI_RSC_ADDRESS:
    352       1.1    jruoho             /*
    353       1.1    jruoho              * Common handler for address descriptor flags
    354       1.1    jruoho              */
    355       1.1    jruoho             if (!AcpiRsGetAddressCommon (Resource, Aml))
    356       1.1    jruoho             {
    357       1.1    jruoho                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
    358       1.1    jruoho             }
    359       1.1    jruoho             break;
    360       1.1    jruoho 
    361       1.1    jruoho         case ACPI_RSC_SOURCE:
    362       1.1    jruoho             /*
    363       1.1    jruoho              * Optional ResourceSource (Index and String)
    364       1.1    jruoho              */
    365       1.1    jruoho             Resource->Length +=
    366       1.1    jruoho                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
    367       1.1    jruoho                     Destination, Aml, NULL);
    368       1.1    jruoho             break;
    369       1.1    jruoho 
    370       1.1    jruoho         case ACPI_RSC_SOURCEX:
    371       1.1    jruoho             /*
    372       1.1    jruoho              * Optional ResourceSource (Index and String). This is the more
    373       1.1    jruoho              * complicated case used by the Interrupt() macro
    374       1.1    jruoho              */
    375   1.1.1.3  christos             Target = ACPI_ADD_PTR (char, Resource,
    376   1.1.1.3  christos                 Info->AmlOffset + (ItemCount * 4));
    377       1.1    jruoho 
    378       1.1    jruoho             Resource->Length +=
    379   1.1.1.3  christos                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
    380   1.1.1.3  christos                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
    381       1.1    jruoho                     Destination, Aml, Target);
    382       1.1    jruoho             break;
    383       1.1    jruoho 
    384       1.1    jruoho         case ACPI_RSC_BITMASK:
    385       1.1    jruoho             /*
    386       1.1    jruoho              * 8-bit encoded bitmask (DMA macro)
    387       1.1    jruoho              */
    388       1.1    jruoho             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
    389       1.1    jruoho             if (ItemCount)
    390       1.1    jruoho             {
    391       1.1    jruoho                 Resource->Length += (ItemCount - 1);
    392       1.1    jruoho             }
    393       1.1    jruoho 
    394       1.1    jruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    395   1.1.1.3  christos             ACPI_SET8 (Target, ItemCount);
    396       1.1    jruoho             break;
    397       1.1    jruoho 
    398       1.1    jruoho         case ACPI_RSC_BITMASK16:
    399       1.1    jruoho             /*
    400       1.1    jruoho              * 16-bit encoded bitmask (IRQ macro)
    401       1.1    jruoho              */
    402       1.1    jruoho             ACPI_MOVE_16_TO_16 (&Temp16, Source);
    403       1.1    jruoho 
    404       1.1    jruoho             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
    405       1.1    jruoho             if (ItemCount)
    406       1.1    jruoho             {
    407       1.1    jruoho                 Resource->Length += (ItemCount - 1);
    408       1.1    jruoho             }
    409       1.1    jruoho 
    410       1.1    jruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
    411   1.1.1.3  christos             ACPI_SET8 (Target, ItemCount);
    412       1.1    jruoho             break;
    413       1.1    jruoho 
    414       1.1    jruoho         case ACPI_RSC_EXIT_NE:
    415       1.1    jruoho             /*
    416       1.1    jruoho              * Control - Exit conversion if not equal
    417       1.1    jruoho              */
    418       1.1    jruoho             switch (Info->ResourceOffset)
    419       1.1    jruoho             {
    420       1.1    jruoho             case ACPI_RSC_COMPARE_AML_LENGTH:
    421   1.1.1.3  christos 
    422       1.1    jruoho                 if (AmlResourceLength != Info->Value)
    423       1.1    jruoho                 {
    424       1.1    jruoho                     goto Exit;
    425       1.1    jruoho                 }
    426       1.1    jruoho                 break;
    427       1.1    jruoho 
    428       1.1    jruoho             case ACPI_RSC_COMPARE_VALUE:
    429   1.1.1.3  christos 
    430       1.1    jruoho                 if (ACPI_GET8 (Source) != Info->Value)
    431       1.1    jruoho                 {
    432       1.1    jruoho                     goto Exit;
    433       1.1    jruoho                 }
    434       1.1    jruoho                 break;
    435       1.1    jruoho 
    436       1.1    jruoho             default:
    437       1.1    jruoho 
    438       1.1    jruoho                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
    439       1.1    jruoho                 return_ACPI_STATUS (AE_BAD_PARAMETER);
    440       1.1    jruoho             }
    441       1.1    jruoho             break;
    442       1.1    jruoho 
    443       1.1    jruoho         default:
    444       1.1    jruoho 
    445       1.1    jruoho             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
    446       1.1    jruoho             return_ACPI_STATUS (AE_BAD_PARAMETER);
    447       1.1    jruoho         }
    448       1.1    jruoho 
    449       1.1    jruoho         Count--;
    450       1.1    jruoho         Info++;
    451       1.1    jruoho     }
    452       1.1    jruoho 
    453       1.1    jruoho Exit:
    454       1.1    jruoho     if (!FlagsMode)
    455       1.1    jruoho     {
    456       1.1    jruoho         /* Round the resource struct length up to the next boundary (32 or 64) */
    457       1.1    jruoho 
    458   1.1.1.7  christos         Resource->Length = (UINT32)
    459   1.1.1.7  christos             ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
    460       1.1    jruoho     }
    461       1.1    jruoho     return_ACPI_STATUS (AE_OK);
    462       1.1    jruoho }
    463       1.1    jruoho 
    464       1.1    jruoho 
    465       1.1    jruoho /*******************************************************************************
    466       1.1    jruoho  *
    467       1.1    jruoho  * FUNCTION:    AcpiRsConvertResourceToAml
    468       1.1    jruoho  *
    469       1.1    jruoho  * PARAMETERS:  Resource            - Pointer to the resource descriptor
    470       1.1    jruoho  *              Aml                 - Where the AML descriptor is returned
    471       1.1    jruoho  *              Info                - Pointer to appropriate conversion table
    472       1.1    jruoho  *
    473       1.1    jruoho  * RETURN:      Status
    474       1.1    jruoho  *
    475       1.1    jruoho  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
    476       1.1    jruoho  *              external AML resource descriptor.
    477       1.1    jruoho  *
    478       1.1    jruoho  ******************************************************************************/
    479       1.1    jruoho 
    480       1.1    jruoho ACPI_STATUS
    481       1.1    jruoho AcpiRsConvertResourceToAml (
    482       1.1    jruoho     ACPI_RESOURCE           *Resource,
    483       1.1    jruoho     AML_RESOURCE            *Aml,
    484       1.1    jruoho     ACPI_RSCONVERT_INFO     *Info)
    485       1.1    jruoho {
    486       1.1    jruoho     void                    *Source = NULL;
    487       1.1    jruoho     void                    *Destination;
    488   1.1.1.3  christos     char                    *Target;
    489       1.1    jruoho     ACPI_RSDESC_SIZE        AmlLength = 0;
    490       1.1    jruoho     UINT8                   Count;
    491       1.1    jruoho     UINT16                  Temp16 = 0;
    492       1.1    jruoho     UINT16                  ItemCount = 0;
    493       1.1    jruoho 
    494       1.1    jruoho 
    495       1.1    jruoho     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
    496       1.1    jruoho 
    497       1.1    jruoho 
    498   1.1.1.3  christos     if (!Info)
    499   1.1.1.3  christos     {
    500   1.1.1.3  christos         return_ACPI_STATUS (AE_BAD_PARAMETER);
    501   1.1.1.3  christos     }
    502   1.1.1.3  christos 
    503       1.1    jruoho     /*
    504       1.1    jruoho      * First table entry must be ACPI_RSC_INITxxx and must contain the
    505       1.1    jruoho      * table length (# of table entries)
    506       1.1    jruoho      */
    507       1.1    jruoho     Count = INIT_TABLE_LENGTH (Info);
    508       1.1    jruoho 
    509       1.1    jruoho     while (Count)
    510       1.1    jruoho     {
    511       1.1    jruoho         /*
    512       1.1    jruoho          * Source is the internal resource descriptor,
    513       1.1    jruoho          * destination is the external AML byte stream buffer
    514       1.1    jruoho          */
    515   1.1.1.7  christos         Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
    516       1.1    jruoho         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
    517       1.1    jruoho 
    518       1.1    jruoho         switch (Info->Opcode)
    519       1.1    jruoho         {
    520       1.1    jruoho         case ACPI_RSC_INITSET:
    521       1.1    jruoho 
    522   1.1.1.6  christos             memset (Aml, 0, INIT_RESOURCE_LENGTH (Info));
    523       1.1    jruoho             AmlLength = INIT_RESOURCE_LENGTH (Info);
    524   1.1.1.7  christos             AcpiRsSetResourceHeader (
    525   1.1.1.7  christos                 INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
    526       1.1    jruoho             break;
    527       1.1    jruoho 
    528       1.1    jruoho         case ACPI_RSC_INITGET:
    529       1.1    jruoho             break;
    530       1.1    jruoho 
    531       1.1    jruoho         case ACPI_RSC_FLAGINIT:
    532       1.1    jruoho             /*
    533       1.1    jruoho              * Clear the flag byte
    534       1.1    jruoho              */
    535   1.1.1.3  christos             ACPI_SET8 (Destination, 0);
    536       1.1    jruoho             break;
    537       1.1    jruoho 
    538       1.1    jruoho         case ACPI_RSC_1BITFLAG:
    539       1.1    jruoho             /*
    540       1.1    jruoho              * Mask and shift the flag bit
    541       1.1    jruoho              */
    542   1.1.1.3  christos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    543   1.1.1.3  christos                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
    544       1.1    jruoho             break;
    545       1.1    jruoho 
    546       1.1    jruoho         case ACPI_RSC_2BITFLAG:
    547       1.1    jruoho             /*
    548       1.1    jruoho              * Mask and shift the flag bits
    549       1.1    jruoho              */
    550   1.1.1.3  christos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    551   1.1.1.3  christos                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
    552       1.1    jruoho             break;
    553       1.1    jruoho 
    554   1.1.1.3  christos         case ACPI_RSC_3BITFLAG:
    555   1.1.1.3  christos             /*
    556   1.1.1.3  christos              * Mask and shift the flag bits
    557   1.1.1.3  christos              */
    558   1.1.1.3  christos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    559   1.1.1.3  christos                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
    560   1.1.1.3  christos             break;
    561       1.1    jruoho 
    562  1.1.1.13  christos         case ACPI_RSC_6BITFLAG:
    563  1.1.1.13  christos             /*
    564  1.1.1.13  christos              * Mask and shift the flag bits
    565  1.1.1.13  christos              */
    566  1.1.1.13  christos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    567  1.1.1.13  christos                 ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
    568  1.1.1.13  christos             break;
    569  1.1.1.13  christos 
    570       1.1    jruoho         case ACPI_RSC_COUNT:
    571       1.1    jruoho 
    572       1.1    jruoho             ItemCount = ACPI_GET8 (Source);
    573   1.1.1.3  christos             ACPI_SET8 (Destination, ItemCount);
    574       1.1    jruoho 
    575   1.1.1.7  christos             AmlLength = (UINT16)
    576   1.1.1.7  christos                 (AmlLength + (Info->Value * (ItemCount - 1)));
    577       1.1    jruoho             break;
    578       1.1    jruoho 
    579       1.1    jruoho         case ACPI_RSC_COUNT16:
    580       1.1    jruoho 
    581       1.1    jruoho             ItemCount = ACPI_GET16 (Source);
    582       1.1    jruoho             AmlLength = (UINT16) (AmlLength + ItemCount);
    583       1.1    jruoho             AcpiRsSetResourceLength (AmlLength, Aml);
    584       1.1    jruoho             break;
    585       1.1    jruoho 
    586   1.1.1.3  christos         case ACPI_RSC_COUNT_GPIO_PIN:
    587   1.1.1.3  christos 
    588   1.1.1.3  christos             ItemCount = ACPI_GET16 (Source);
    589   1.1.1.3  christos             ACPI_SET16 (Destination, AmlLength);
    590   1.1.1.3  christos 
    591   1.1.1.3  christos             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
    592   1.1.1.3  christos             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    593   1.1.1.3  christos             ACPI_SET16 (Target, AmlLength);
    594   1.1.1.3  christos             AcpiRsSetResourceLength (AmlLength, Aml);
    595   1.1.1.3  christos             break;
    596   1.1.1.3  christos 
    597   1.1.1.3  christos         case ACPI_RSC_COUNT_GPIO_VEN:
    598   1.1.1.3  christos 
    599   1.1.1.3  christos             ItemCount = ACPI_GET16 (Source);
    600   1.1.1.3  christos             ACPI_SET16 (Destination, ItemCount);
    601   1.1.1.3  christos 
    602   1.1.1.7  christos             AmlLength = (UINT16) (
    603   1.1.1.7  christos                 AmlLength + (Info->Value * ItemCount));
    604   1.1.1.3  christos             AcpiRsSetResourceLength (AmlLength, Aml);
    605   1.1.1.3  christos             break;
    606   1.1.1.3  christos 
    607   1.1.1.3  christos         case ACPI_RSC_COUNT_GPIO_RES:
    608   1.1.1.3  christos 
    609   1.1.1.3  christos             /* Set resource source string length */
    610   1.1.1.3  christos 
    611   1.1.1.3  christos             ItemCount = ACPI_GET16 (Source);
    612   1.1.1.3  christos             ACPI_SET16 (Destination, AmlLength);
    613   1.1.1.3  christos 
    614   1.1.1.3  christos             /* Compute offset for the Vendor Data */
    615   1.1.1.3  christos 
    616   1.1.1.3  christos             AmlLength = (UINT16) (AmlLength + ItemCount);
    617   1.1.1.3  christos             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
    618   1.1.1.3  christos 
    619   1.1.1.3  christos             /* Set vendor offset only if there is vendor data */
    620   1.1.1.3  christos 
    621   1.1.1.9  christos             ACPI_SET16 (Target, AmlLength);
    622   1.1.1.3  christos 
    623   1.1.1.3  christos             AcpiRsSetResourceLength (AmlLength, Aml);
    624   1.1.1.3  christos             break;
    625   1.1.1.3  christos 
    626   1.1.1.3  christos         case ACPI_RSC_COUNT_SERIAL_VEN:
    627   1.1.1.3  christos 
    628   1.1.1.3  christos             ItemCount = ACPI_GET16 (Source);
    629   1.1.1.3  christos             ACPI_SET16 (Destination, ItemCount + Info->Value);
    630   1.1.1.3  christos             AmlLength = (UINT16) (AmlLength + ItemCount);
    631   1.1.1.3  christos             AcpiRsSetResourceLength (AmlLength, Aml);
    632   1.1.1.3  christos             break;
    633   1.1.1.3  christos 
    634   1.1.1.3  christos         case ACPI_RSC_COUNT_SERIAL_RES:
    635   1.1.1.3  christos 
    636   1.1.1.3  christos             ItemCount = ACPI_GET16 (Source);
    637   1.1.1.3  christos             AmlLength = (UINT16) (AmlLength + ItemCount);
    638   1.1.1.3  christos             AcpiRsSetResourceLength (AmlLength, Aml);
    639   1.1.1.3  christos             break;
    640       1.1    jruoho 
    641       1.1    jruoho         case ACPI_RSC_LENGTH:
    642       1.1    jruoho 
    643       1.1    jruoho             AcpiRsSetResourceLength (Info->Value, Aml);
    644       1.1    jruoho             break;
    645       1.1    jruoho 
    646       1.1    jruoho         case ACPI_RSC_MOVE8:
    647       1.1    jruoho         case ACPI_RSC_MOVE16:
    648       1.1    jruoho         case ACPI_RSC_MOVE32:
    649       1.1    jruoho         case ACPI_RSC_MOVE64:
    650       1.1    jruoho 
    651       1.1    jruoho             if (Info->Value)
    652       1.1    jruoho             {
    653       1.1    jruoho                 ItemCount = Info->Value;
    654       1.1    jruoho             }
    655       1.1    jruoho             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    656       1.1    jruoho             break;
    657       1.1    jruoho 
    658   1.1.1.3  christos         case ACPI_RSC_MOVE_GPIO_PIN:
    659   1.1.1.3  christos 
    660   1.1.1.3  christos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    661   1.1.1.7  christos                 ACPI_GET16 (Destination));
    662   1.1.1.3  christos             Source = * (UINT16 **) Source;
    663   1.1.1.3  christos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    664   1.1.1.3  christos             break;
    665   1.1.1.3  christos 
    666   1.1.1.3  christos         case ACPI_RSC_MOVE_GPIO_RES:
    667   1.1.1.3  christos 
    668   1.1.1.3  christos             /* Used for both ResourceSource string and VendorData */
    669   1.1.1.3  christos 
    670   1.1.1.3  christos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    671   1.1.1.7  christos                 ACPI_GET16 (Destination));
    672   1.1.1.3  christos             Source = * (UINT8 **) Source;
    673   1.1.1.3  christos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    674   1.1.1.3  christos             break;
    675   1.1.1.3  christos 
    676   1.1.1.3  christos         case ACPI_RSC_MOVE_SERIAL_VEN:
    677   1.1.1.3  christos 
    678   1.1.1.3  christos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    679   1.1.1.7  christos                 (AmlLength - ItemCount));
    680   1.1.1.3  christos             Source = * (UINT8 **) Source;
    681   1.1.1.3  christos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    682   1.1.1.3  christos             break;
    683   1.1.1.3  christos 
    684   1.1.1.3  christos         case ACPI_RSC_MOVE_SERIAL_RES:
    685   1.1.1.3  christos 
    686   1.1.1.3  christos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
    687   1.1.1.7  christos                 (AmlLength - ItemCount));
    688   1.1.1.3  christos             Source = * (UINT8 **) Source;
    689   1.1.1.3  christos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
    690   1.1.1.3  christos             break;
    691       1.1    jruoho 
    692       1.1    jruoho         case ACPI_RSC_ADDRESS:
    693       1.1    jruoho 
    694       1.1    jruoho             /* Set the Resource Type, General Flags, and Type-Specific Flags */
    695       1.1    jruoho 
    696       1.1    jruoho             AcpiRsSetAddressCommon (Aml, Resource);
    697       1.1    jruoho             break;
    698       1.1    jruoho 
    699       1.1    jruoho         case ACPI_RSC_SOURCEX:
    700       1.1    jruoho             /*
    701       1.1    jruoho              * Optional ResourceSource (Index and String)
    702       1.1    jruoho              */
    703       1.1    jruoho             AmlLength = AcpiRsSetResourceSource (
    704   1.1.1.7  christos                 Aml, (ACPI_RS_LENGTH) AmlLength, Source);
    705       1.1    jruoho             AcpiRsSetResourceLength (AmlLength, Aml);
    706       1.1    jruoho             break;
    707       1.1    jruoho 
    708       1.1    jruoho         case ACPI_RSC_SOURCE:
    709       1.1    jruoho             /*
    710       1.1    jruoho              * Optional ResourceSource (Index and String). This is the more
    711       1.1    jruoho              * complicated case used by the Interrupt() macro
    712       1.1    jruoho              */
    713       1.1    jruoho             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
    714       1.1    jruoho             AcpiRsSetResourceLength (AmlLength, Aml);
    715       1.1    jruoho             break;
    716       1.1    jruoho 
    717       1.1    jruoho         case ACPI_RSC_BITMASK:
    718       1.1    jruoho             /*
    719       1.1    jruoho              * 8-bit encoded bitmask (DMA macro)
    720       1.1    jruoho              */
    721   1.1.1.3  christos             ACPI_SET8 (Destination,
    722       1.1    jruoho                 AcpiRsEncodeBitmask (Source,
    723   1.1.1.3  christos                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
    724       1.1    jruoho             break;
    725       1.1    jruoho 
    726       1.1    jruoho         case ACPI_RSC_BITMASK16:
    727       1.1    jruoho             /*
    728       1.1    jruoho              * 16-bit encoded bitmask (IRQ macro)
    729       1.1    jruoho              */
    730   1.1.1.7  christos             Temp16 = AcpiRsEncodeBitmask (
    731   1.1.1.7  christos                 Source, *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
    732       1.1    jruoho             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
    733       1.1    jruoho             break;
    734       1.1    jruoho 
    735       1.1    jruoho         case ACPI_RSC_EXIT_LE:
    736       1.1    jruoho             /*
    737       1.1    jruoho              * Control - Exit conversion if less than or equal
    738       1.1    jruoho              */
    739       1.1    jruoho             if (ItemCount <= Info->Value)
    740       1.1    jruoho             {
    741       1.1    jruoho                 goto Exit;
    742       1.1    jruoho             }
    743       1.1    jruoho             break;
    744       1.1    jruoho 
    745       1.1    jruoho         case ACPI_RSC_EXIT_NE:
    746       1.1    jruoho             /*
    747       1.1    jruoho              * Control - Exit conversion if not equal
    748       1.1    jruoho              */
    749       1.1    jruoho             switch (COMPARE_OPCODE (Info))
    750       1.1    jruoho             {
    751       1.1    jruoho             case ACPI_RSC_COMPARE_VALUE:
    752       1.1    jruoho 
    753       1.1    jruoho                 if (*ACPI_ADD_PTR (UINT8, Resource,
    754   1.1.1.7  christos                     COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
    755       1.1    jruoho                 {
    756       1.1    jruoho                     goto Exit;
    757       1.1    jruoho                 }
    758       1.1    jruoho                 break;
    759       1.1    jruoho 
    760       1.1    jruoho             default:
    761       1.1    jruoho 
    762       1.1    jruoho                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
    763       1.1    jruoho                 return_ACPI_STATUS (AE_BAD_PARAMETER);
    764       1.1    jruoho             }
    765       1.1    jruoho             break;
    766       1.1    jruoho 
    767       1.1    jruoho         case ACPI_RSC_EXIT_EQ:
    768       1.1    jruoho             /*
    769       1.1    jruoho              * Control - Exit conversion if equal
    770       1.1    jruoho              */
    771       1.1    jruoho             if (*ACPI_ADD_PTR (UINT8, Resource,
    772   1.1.1.7  christos                 COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
    773       1.1    jruoho             {
    774       1.1    jruoho                 goto Exit;
    775       1.1    jruoho             }
    776       1.1    jruoho             break;
    777       1.1    jruoho 
    778       1.1    jruoho         default:
    779       1.1    jruoho 
    780       1.1    jruoho             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
    781       1.1    jruoho             return_ACPI_STATUS (AE_BAD_PARAMETER);
    782       1.1    jruoho         }
    783       1.1    jruoho 
    784       1.1    jruoho         Count--;
    785       1.1    jruoho         Info++;
    786       1.1    jruoho     }
    787       1.1    jruoho 
    788       1.1    jruoho Exit:
    789       1.1    jruoho     return_ACPI_STATUS (AE_OK);
    790       1.1    jruoho }
    791       1.1    jruoho 
    792       1.1    jruoho 
    793       1.1    jruoho #if 0
    794       1.1    jruoho /* Previous resource validations */
    795       1.1    jruoho 
    796   1.1.1.7  christos     if (Aml->ExtAddress64.RevisionID !=
    797   1.1.1.7  christos         AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
    798       1.1    jruoho     {
    799       1.1    jruoho         return_ACPI_STATUS (AE_SUPPORT);
    800       1.1    jruoho     }
    801       1.1    jruoho 
    802       1.1    jruoho     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
    803       1.1    jruoho     {
    804       1.1    jruoho         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
    805       1.1    jruoho     }
    806       1.1    jruoho 
    807       1.1    jruoho     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
    808       1.1    jruoho         ((Aml->Irq.Flags & 0x09) == 0x09))
    809       1.1    jruoho     {
    810       1.1    jruoho         /*
    811       1.1    jruoho          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
    812       1.1    jruoho          * polarity/trigger interrupts are allowed (ACPI spec, section
    813       1.1    jruoho          * "IRQ Format"), so 0x00 and 0x09 are illegal.
    814       1.1    jruoho          */
    815       1.1    jruoho         ACPI_ERROR ((AE_INFO,
    816       1.1    jruoho             "Invalid interrupt polarity/trigger in resource list, 0x%X",
    817       1.1    jruoho             Aml->Irq.Flags));
    818       1.1    jruoho         return_ACPI_STATUS (AE_BAD_DATA);
    819       1.1    jruoho     }
    820       1.1    jruoho 
    821       1.1    jruoho     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
    822       1.1    jruoho     if (Temp8 < 1)
    823       1.1    jruoho     {
    824       1.1    jruoho         /* Must have at least one IRQ */
    825       1.1    jruoho 
    826       1.1    jruoho         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
    827       1.1    jruoho     }
    828       1.1    jruoho 
    829       1.1    jruoho     if (Resource->Data.Dma.Transfer == 0x03)
    830       1.1    jruoho     {
    831       1.1    jruoho         ACPI_ERROR ((AE_INFO,
    832       1.1    jruoho             "Invalid DMA.Transfer preference (3)"));
    833       1.1    jruoho         return_ACPI_STATUS (AE_BAD_DATA);
    834       1.1    jruoho     }
    835       1.1    jruoho #endif
    836