Home | History | Annotate | Line # | Download | only in resources
rsmisc.c revision 1.1.1.13
      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.13  christos  * 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.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.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.13  christos         case ACPI_RSC_6BITFLAG:
    560  1.1.1.13  christos             /*
    561  1.1.1.13  christos              * Mask and shift the flag bits
    562  1.1.1.13  christos              */
    563  1.1.1.13  christos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
    564  1.1.1.13  christos                 ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
    565  1.1.1.13  christos             break;
    566  1.1.1.13  christos 
    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