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