xref: /netbsd-src/sys/external/bsd/acpica/dist/resources/rsmisc.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
128c506b8Sjruoho /*******************************************************************************
228c506b8Sjruoho  *
328c506b8Sjruoho  * Module Name: rsmisc - Miscellaneous resource descriptors
428c506b8Sjruoho  *
528c506b8Sjruoho  ******************************************************************************/
628c506b8Sjruoho 
7124f4c82Sjruoho /*
8*046a2985Schristos  * Copyright (C) 2000 - 2023, Intel Corp.
928c506b8Sjruoho  * All rights reserved.
1028c506b8Sjruoho  *
11124f4c82Sjruoho  * Redistribution and use in source and binary forms, with or without
12124f4c82Sjruoho  * modification, are permitted provided that the following conditions
13124f4c82Sjruoho  * are met:
14124f4c82Sjruoho  * 1. Redistributions of source code must retain the above copyright
15124f4c82Sjruoho  *    notice, this list of conditions, and the following disclaimer,
16124f4c82Sjruoho  *    without modification.
17124f4c82Sjruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18124f4c82Sjruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
19124f4c82Sjruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
20124f4c82Sjruoho  *    including a substantially similar Disclaimer requirement for further
21124f4c82Sjruoho  *    binary redistribution.
22124f4c82Sjruoho  * 3. Neither the names of the above-listed copyright holders nor the names
23124f4c82Sjruoho  *    of any contributors may be used to endorse or promote products derived
24124f4c82Sjruoho  *    from this software without specific prior written permission.
2528c506b8Sjruoho  *
26124f4c82Sjruoho  * Alternatively, this software may be distributed under the terms of the
27124f4c82Sjruoho  * GNU General Public License ("GPL") version 2 as published by the Free
28124f4c82Sjruoho  * Software Foundation.
2928c506b8Sjruoho  *
30124f4c82Sjruoho  * NO WARRANTY
31124f4c82Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32124f4c82Sjruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34124f4c82Sjruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35124f4c82Sjruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36124f4c82Sjruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37124f4c82Sjruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38124f4c82Sjruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39124f4c82Sjruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40124f4c82Sjruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41124f4c82Sjruoho  * POSSIBILITY OF SUCH DAMAGES.
42124f4c82Sjruoho  */
4328c506b8Sjruoho 
4428c506b8Sjruoho #include "acpi.h"
4528c506b8Sjruoho #include "accommon.h"
4628c506b8Sjruoho #include "acresrc.h"
4728c506b8Sjruoho 
4828c506b8Sjruoho #define _COMPONENT          ACPI_RESOURCES
4928c506b8Sjruoho         ACPI_MODULE_NAME    ("rsmisc")
5028c506b8Sjruoho 
5128c506b8Sjruoho 
5228c506b8Sjruoho #define INIT_RESOURCE_TYPE(i)       i->ResourceOffset
5328c506b8Sjruoho #define INIT_RESOURCE_LENGTH(i)     i->AmlOffset
5428c506b8Sjruoho #define INIT_TABLE_LENGTH(i)        i->Value
5528c506b8Sjruoho 
5628c506b8Sjruoho #define COMPARE_OPCODE(i)           i->ResourceOffset
5728c506b8Sjruoho #define COMPARE_TARGET(i)           i->AmlOffset
5828c506b8Sjruoho #define COMPARE_VALUE(i)            i->Value
5928c506b8Sjruoho 
6028c506b8Sjruoho 
6128c506b8Sjruoho /*******************************************************************************
6228c506b8Sjruoho  *
6328c506b8Sjruoho  * FUNCTION:    AcpiRsConvertAmlToResource
6428c506b8Sjruoho  *
6528c506b8Sjruoho  * PARAMETERS:  Resource            - Pointer to the resource descriptor
6628c506b8Sjruoho  *              Aml                 - Where the AML descriptor is returned
6728c506b8Sjruoho  *              Info                - Pointer to appropriate conversion table
6828c506b8Sjruoho  *
6928c506b8Sjruoho  * RETURN:      Status
7028c506b8Sjruoho  *
7128c506b8Sjruoho  * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
7228c506b8Sjruoho  *              internal resource descriptor
7328c506b8Sjruoho  *
7428c506b8Sjruoho  ******************************************************************************/
7528c506b8Sjruoho 
7628c506b8Sjruoho ACPI_STATUS
AcpiRsConvertAmlToResource(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)7728c506b8Sjruoho AcpiRsConvertAmlToResource (
7828c506b8Sjruoho     ACPI_RESOURCE           *Resource,
7928c506b8Sjruoho     AML_RESOURCE            *Aml,
8028c506b8Sjruoho     ACPI_RSCONVERT_INFO     *Info)
8128c506b8Sjruoho {
8228c506b8Sjruoho     ACPI_RS_LENGTH          AmlResourceLength;
8328c506b8Sjruoho     void                    *Source;
8428c506b8Sjruoho     void                    *Destination;
8528c506b8Sjruoho     char                    *Target;
8628c506b8Sjruoho     UINT8                   Count;
8728c506b8Sjruoho     UINT8                   FlagsMode = FALSE;
8828c506b8Sjruoho     UINT16                  ItemCount = 0;
8928c506b8Sjruoho     UINT16                  Temp16 = 0;
9028c506b8Sjruoho 
9128c506b8Sjruoho 
9228c506b8Sjruoho     ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
9328c506b8Sjruoho 
9428c506b8Sjruoho 
95ff4a156dSchristos     if (!Info)
96ff4a156dSchristos     {
97ff4a156dSchristos         return_ACPI_STATUS (AE_BAD_PARAMETER);
98ff4a156dSchristos     }
99ff4a156dSchristos 
10028c506b8Sjruoho     if (((ACPI_SIZE) Resource) & 0x3)
10128c506b8Sjruoho     {
10228c506b8Sjruoho         /* Each internal resource struct is expected to be 32-bit aligned */
10328c506b8Sjruoho 
10428c506b8Sjruoho         ACPI_WARNING ((AE_INFO,
10528c506b8Sjruoho             "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
10628c506b8Sjruoho             Resource, Resource->Type, Resource->Length));
10728c506b8Sjruoho     }
10828c506b8Sjruoho 
10928c506b8Sjruoho     /* Extract the resource Length field (does not include header length) */
11028c506b8Sjruoho 
11128c506b8Sjruoho     AmlResourceLength = AcpiUtGetResourceLength (Aml);
11228c506b8Sjruoho 
11328c506b8Sjruoho     /*
11428c506b8Sjruoho      * First table entry must be ACPI_RSC_INITxxx and must contain the
11528c506b8Sjruoho      * table length (# of table entries)
11628c506b8Sjruoho      */
11728c506b8Sjruoho     Count = INIT_TABLE_LENGTH (Info);
11828c506b8Sjruoho     while (Count)
11928c506b8Sjruoho     {
12046a330b4Schristos         Target = NULL;
12146a330b4Schristos 
12228c506b8Sjruoho         /*
12328c506b8Sjruoho          * Source is the external AML byte stream buffer,
12428c506b8Sjruoho          * destination is the internal resource descriptor
12528c506b8Sjruoho          */
12628c506b8Sjruoho         Source = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
12728c506b8Sjruoho         Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
12828c506b8Sjruoho 
12928c506b8Sjruoho         switch (Info->Opcode)
13028c506b8Sjruoho         {
13128c506b8Sjruoho         case ACPI_RSC_INITGET:
13228c506b8Sjruoho             /*
13328c506b8Sjruoho              * Get the resource type and the initial (minimum) length
13428c506b8Sjruoho              */
135c72da027Schristos             memset (Resource, 0, INIT_RESOURCE_LENGTH (Info));
13628c506b8Sjruoho             Resource->Type = INIT_RESOURCE_TYPE (Info);
13728c506b8Sjruoho             Resource->Length = INIT_RESOURCE_LENGTH (Info);
13828c506b8Sjruoho             break;
13928c506b8Sjruoho 
14028c506b8Sjruoho         case ACPI_RSC_INITSET:
14128c506b8Sjruoho             break;
14228c506b8Sjruoho 
14328c506b8Sjruoho         case ACPI_RSC_FLAGINIT:
14428c506b8Sjruoho 
14528c506b8Sjruoho             FlagsMode = TRUE;
14628c506b8Sjruoho             break;
14728c506b8Sjruoho 
14828c506b8Sjruoho         case ACPI_RSC_1BITFLAG:
14928c506b8Sjruoho             /*
15028c506b8Sjruoho              * Mask and shift the flag bit
15128c506b8Sjruoho              */
152ff4a156dSchristos             ACPI_SET8 (Destination,
153ff4a156dSchristos                 ((ACPI_GET8 (Source) >> Info->Value) & 0x01));
15428c506b8Sjruoho             break;
15528c506b8Sjruoho 
15628c506b8Sjruoho         case ACPI_RSC_2BITFLAG:
15728c506b8Sjruoho             /*
15828c506b8Sjruoho              * Mask and shift the flag bits
15928c506b8Sjruoho              */
160ff4a156dSchristos             ACPI_SET8 (Destination,
161ff4a156dSchristos                 ((ACPI_GET8 (Source) >> Info->Value) & 0x03));
16228c506b8Sjruoho             break;
16328c506b8Sjruoho 
164ff4a156dSchristos         case ACPI_RSC_3BITFLAG:
165ff4a156dSchristos             /*
166ff4a156dSchristos              * Mask and shift the flag bits
167ff4a156dSchristos              */
168ff4a156dSchristos             ACPI_SET8 (Destination,
169ff4a156dSchristos                 ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
170ff4a156dSchristos             break;
17128c506b8Sjruoho 
17246a330b4Schristos         case ACPI_RSC_6BITFLAG:
17346a330b4Schristos             /*
17446a330b4Schristos              * Mask and shift the flag bits
17546a330b4Schristos              */
17646a330b4Schristos             ACPI_SET8 (Destination,
17746a330b4Schristos                 ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
17846a330b4Schristos             break;
17946a330b4Schristos 
18028c506b8Sjruoho         case ACPI_RSC_COUNT:
18128c506b8Sjruoho 
18228c506b8Sjruoho             ItemCount = ACPI_GET8 (Source);
183ff4a156dSchristos             ACPI_SET8 (Destination, ItemCount);
18428c506b8Sjruoho 
18528c506b8Sjruoho             Resource->Length = Resource->Length +
18628c506b8Sjruoho                 (Info->Value * (ItemCount - 1));
18728c506b8Sjruoho             break;
18828c506b8Sjruoho 
18928c506b8Sjruoho         case ACPI_RSC_COUNT16:
19028c506b8Sjruoho 
19128c506b8Sjruoho             ItemCount = AmlResourceLength;
192ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
19328c506b8Sjruoho 
19428c506b8Sjruoho             Resource->Length = Resource->Length +
19528c506b8Sjruoho                 (Info->Value * (ItemCount - 1));
19628c506b8Sjruoho             break;
19728c506b8Sjruoho 
198ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_PIN:
199ff4a156dSchristos 
200ff4a156dSchristos             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
201ff4a156dSchristos             ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
202ff4a156dSchristos 
203ff4a156dSchristos             Resource->Length = Resource->Length + ItemCount;
204ff4a156dSchristos             ItemCount = ItemCount / 2;
205ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
206ff4a156dSchristos             break;
207ff4a156dSchristos 
208ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_VEN:
209ff4a156dSchristos 
210ff4a156dSchristos             ItemCount = ACPI_GET8 (Source);
211ff4a156dSchristos             ACPI_SET8 (Destination, ItemCount);
212ff4a156dSchristos 
21371e38f1dSchristos             Resource->Length = Resource->Length + (Info->Value * ItemCount);
214ff4a156dSchristos             break;
215ff4a156dSchristos 
216ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_RES:
217ff4a156dSchristos             /*
218ff4a156dSchristos              * Vendor data is optional (length/offset may both be zero)
219ff4a156dSchristos              * Examine vendor data length field first
220ff4a156dSchristos              */
221ff4a156dSchristos             Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
222ff4a156dSchristos             if (ACPI_GET16 (Target))
223ff4a156dSchristos             {
224ff4a156dSchristos                 /* Use vendor offset to get resource source length */
225ff4a156dSchristos 
226ff4a156dSchristos                 Target = ACPI_ADD_PTR (void, Aml, Info->Value);
227ff4a156dSchristos                 ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
228ff4a156dSchristos             }
229ff4a156dSchristos             else
230ff4a156dSchristos             {
231ff4a156dSchristos                 /* No vendor data to worry about */
232ff4a156dSchristos 
233ff4a156dSchristos                 ItemCount = Aml->LargeHeader.ResourceLength +
234ff4a156dSchristos                     sizeof (AML_RESOURCE_LARGE_HEADER) -
235ff4a156dSchristos                     ACPI_GET16 (Source);
236ff4a156dSchristos             }
237ff4a156dSchristos 
238ff4a156dSchristos             Resource->Length = Resource->Length + ItemCount;
239ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
240ff4a156dSchristos             break;
241ff4a156dSchristos 
242ff4a156dSchristos         case ACPI_RSC_COUNT_SERIAL_VEN:
243ff4a156dSchristos 
244*046a2985Schristos             ACPI_MOVE_16_TO_16(&Temp16, Source);
245*046a2985Schristos             ItemCount = Temp16 - Info->Value;
246ff4a156dSchristos 
247ff4a156dSchristos             Resource->Length = Resource->Length + ItemCount;
248ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
249ff4a156dSchristos             break;
250ff4a156dSchristos 
251ff4a156dSchristos         case ACPI_RSC_COUNT_SERIAL_RES:
252ff4a156dSchristos 
253*046a2985Schristos             ACPI_MOVE_16_TO_16(&Temp16, Source);
254ff4a156dSchristos             ItemCount = (AmlResourceLength +
255ff4a156dSchristos                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
256*046a2985Schristos                 Temp16 - Info->Value;
257ff4a156dSchristos 
258ff4a156dSchristos             Resource->Length = Resource->Length + ItemCount;
259ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
260ff4a156dSchristos             break;
26128c506b8Sjruoho 
26228c506b8Sjruoho         case ACPI_RSC_LENGTH:
26328c506b8Sjruoho 
26428c506b8Sjruoho             Resource->Length = Resource->Length + Info->Value;
26528c506b8Sjruoho             break;
26628c506b8Sjruoho 
26728c506b8Sjruoho         case ACPI_RSC_MOVE8:
26828c506b8Sjruoho         case ACPI_RSC_MOVE16:
26928c506b8Sjruoho         case ACPI_RSC_MOVE32:
27028c506b8Sjruoho         case ACPI_RSC_MOVE64:
27128c506b8Sjruoho             /*
27228c506b8Sjruoho              * Raw data move. Use the Info value field unless ItemCount has
27328c506b8Sjruoho              * been previously initialized via a COUNT opcode
27428c506b8Sjruoho              */
27528c506b8Sjruoho             if (Info->Value)
27628c506b8Sjruoho             {
27728c506b8Sjruoho                 ItemCount = Info->Value;
27828c506b8Sjruoho             }
27928c506b8Sjruoho             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
28028c506b8Sjruoho             break;
28128c506b8Sjruoho 
282ff4a156dSchristos         case ACPI_RSC_MOVE_GPIO_PIN:
283ff4a156dSchristos 
284ff4a156dSchristos             /* Generate and set the PIN data pointer */
285ff4a156dSchristos 
286ff4a156dSchristos             Target = (char *) ACPI_ADD_PTR (void, Resource,
287ff4a156dSchristos                 (Resource->Length - ItemCount * 2));
288ff4a156dSchristos             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
289ff4a156dSchristos 
290ff4a156dSchristos             /* Copy the PIN data */
291ff4a156dSchristos 
292ff4a156dSchristos             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
293ff4a156dSchristos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
294ff4a156dSchristos             break;
295ff4a156dSchristos 
296ff4a156dSchristos         case ACPI_RSC_MOVE_GPIO_RES:
297ff4a156dSchristos 
298ff4a156dSchristos             /* Generate and set the ResourceSource string pointer */
299ff4a156dSchristos 
300ff4a156dSchristos             Target = (char *) ACPI_ADD_PTR (void, Resource,
301ff4a156dSchristos                 (Resource->Length - ItemCount));
302ff4a156dSchristos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
303ff4a156dSchristos 
304ff4a156dSchristos             /* Copy the ResourceSource string */
305ff4a156dSchristos 
306ff4a156dSchristos             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
307ff4a156dSchristos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
308ff4a156dSchristos             break;
309ff4a156dSchristos 
310ff4a156dSchristos         case ACPI_RSC_MOVE_SERIAL_VEN:
311ff4a156dSchristos 
312ff4a156dSchristos             /* Generate and set the Vendor Data pointer */
313ff4a156dSchristos 
314ff4a156dSchristos             Target = (char *) ACPI_ADD_PTR (void, Resource,
315ff4a156dSchristos                 (Resource->Length - ItemCount));
316ff4a156dSchristos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
317ff4a156dSchristos 
318ff4a156dSchristos             /* Copy the Vendor Data */
319ff4a156dSchristos 
320ff4a156dSchristos             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
321ff4a156dSchristos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
322ff4a156dSchristos             break;
323ff4a156dSchristos 
324ff4a156dSchristos         case ACPI_RSC_MOVE_SERIAL_RES:
325ff4a156dSchristos 
326ff4a156dSchristos             /* Generate and set the ResourceSource string pointer */
327ff4a156dSchristos 
328ff4a156dSchristos             Target = (char *) ACPI_ADD_PTR (void, Resource,
329ff4a156dSchristos                 (Resource->Length - ItemCount));
330ff4a156dSchristos             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
331ff4a156dSchristos 
332ff4a156dSchristos             /* Copy the ResourceSource string */
333ff4a156dSchristos 
334*046a2985Schristos             ACPI_MOVE_16_TO_16 (&Temp16, Source);
33571e38f1dSchristos             Source = ACPI_ADD_PTR (
336*046a2985Schristos                 void, Aml, (Temp16 + Info->Value));
337ff4a156dSchristos             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
338ff4a156dSchristos             break;
33928c506b8Sjruoho 
34028c506b8Sjruoho         case ACPI_RSC_SET8:
34128c506b8Sjruoho 
342c72da027Schristos             memset (Destination, Info->AmlOffset, Info->Value);
34328c506b8Sjruoho             break;
34428c506b8Sjruoho 
34528c506b8Sjruoho         case ACPI_RSC_DATA8:
34628c506b8Sjruoho 
34728c506b8Sjruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
348c72da027Schristos             memcpy (Destination, Source,  ACPI_GET16 (Target));
34928c506b8Sjruoho             break;
35028c506b8Sjruoho 
35128c506b8Sjruoho         case ACPI_RSC_ADDRESS:
35228c506b8Sjruoho             /*
35328c506b8Sjruoho              * Common handler for address descriptor flags
35428c506b8Sjruoho              */
35528c506b8Sjruoho             if (!AcpiRsGetAddressCommon (Resource, Aml))
35628c506b8Sjruoho             {
35728c506b8Sjruoho                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
35828c506b8Sjruoho             }
35928c506b8Sjruoho             break;
36028c506b8Sjruoho 
36128c506b8Sjruoho         case ACPI_RSC_SOURCE:
36228c506b8Sjruoho             /*
36328c506b8Sjruoho              * Optional ResourceSource (Index and String)
36428c506b8Sjruoho              */
36528c506b8Sjruoho             Resource->Length +=
36628c506b8Sjruoho                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
36728c506b8Sjruoho                     Destination, Aml, NULL);
36828c506b8Sjruoho             break;
36928c506b8Sjruoho 
37028c506b8Sjruoho         case ACPI_RSC_SOURCEX:
37128c506b8Sjruoho             /*
37228c506b8Sjruoho              * Optional ResourceSource (Index and String). This is the more
37328c506b8Sjruoho              * complicated case used by the Interrupt() macro
37428c506b8Sjruoho              */
375ff4a156dSchristos             Target = ACPI_ADD_PTR (char, Resource,
376ff4a156dSchristos                 Info->AmlOffset + (ItemCount * 4));
37728c506b8Sjruoho 
37828c506b8Sjruoho             Resource->Length +=
379ff4a156dSchristos                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
380ff4a156dSchristos                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
38128c506b8Sjruoho                     Destination, Aml, Target);
38228c506b8Sjruoho             break;
38328c506b8Sjruoho 
38428c506b8Sjruoho         case ACPI_RSC_BITMASK:
38528c506b8Sjruoho             /*
38628c506b8Sjruoho              * 8-bit encoded bitmask (DMA macro)
38728c506b8Sjruoho              */
38828c506b8Sjruoho             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
38928c506b8Sjruoho             if (ItemCount)
39028c506b8Sjruoho             {
39128c506b8Sjruoho                 Resource->Length += (ItemCount - 1);
39228c506b8Sjruoho             }
39328c506b8Sjruoho 
39428c506b8Sjruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
395ff4a156dSchristos             ACPI_SET8 (Target, ItemCount);
39628c506b8Sjruoho             break;
39728c506b8Sjruoho 
39828c506b8Sjruoho         case ACPI_RSC_BITMASK16:
39928c506b8Sjruoho             /*
40028c506b8Sjruoho              * 16-bit encoded bitmask (IRQ macro)
40128c506b8Sjruoho              */
40228c506b8Sjruoho             ACPI_MOVE_16_TO_16 (&Temp16, Source);
40328c506b8Sjruoho 
40428c506b8Sjruoho             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
40528c506b8Sjruoho             if (ItemCount)
40628c506b8Sjruoho             {
40728c506b8Sjruoho                 Resource->Length += (ItemCount - 1);
40828c506b8Sjruoho             }
40928c506b8Sjruoho 
41028c506b8Sjruoho             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
411ff4a156dSchristos             ACPI_SET8 (Target, ItemCount);
41228c506b8Sjruoho             break;
41328c506b8Sjruoho 
41428c506b8Sjruoho         case ACPI_RSC_EXIT_NE:
41528c506b8Sjruoho             /*
41628c506b8Sjruoho              * Control - Exit conversion if not equal
41728c506b8Sjruoho              */
41828c506b8Sjruoho             switch (Info->ResourceOffset)
41928c506b8Sjruoho             {
42028c506b8Sjruoho             case ACPI_RSC_COMPARE_AML_LENGTH:
421ff4a156dSchristos 
42228c506b8Sjruoho                 if (AmlResourceLength != Info->Value)
42328c506b8Sjruoho                 {
42428c506b8Sjruoho                     goto Exit;
42528c506b8Sjruoho                 }
42628c506b8Sjruoho                 break;
42728c506b8Sjruoho 
42828c506b8Sjruoho             case ACPI_RSC_COMPARE_VALUE:
429ff4a156dSchristos 
43028c506b8Sjruoho                 if (ACPI_GET8 (Source) != Info->Value)
43128c506b8Sjruoho                 {
43228c506b8Sjruoho                     goto Exit;
43328c506b8Sjruoho                 }
43428c506b8Sjruoho                 break;
43528c506b8Sjruoho 
43628c506b8Sjruoho             default:
43728c506b8Sjruoho 
43828c506b8Sjruoho                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
43928c506b8Sjruoho                 return_ACPI_STATUS (AE_BAD_PARAMETER);
44028c506b8Sjruoho             }
44128c506b8Sjruoho             break;
44228c506b8Sjruoho 
44328c506b8Sjruoho         default:
44428c506b8Sjruoho 
44528c506b8Sjruoho             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
44628c506b8Sjruoho             return_ACPI_STATUS (AE_BAD_PARAMETER);
44728c506b8Sjruoho         }
44828c506b8Sjruoho 
44928c506b8Sjruoho         Count--;
45028c506b8Sjruoho         Info++;
45128c506b8Sjruoho     }
45228c506b8Sjruoho 
45328c506b8Sjruoho Exit:
45428c506b8Sjruoho     if (!FlagsMode)
45528c506b8Sjruoho     {
45628c506b8Sjruoho         /* Round the resource struct length up to the next boundary (32 or 64) */
45728c506b8Sjruoho 
45871e38f1dSchristos         Resource->Length = (UINT32)
45971e38f1dSchristos             ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
46028c506b8Sjruoho     }
46128c506b8Sjruoho     return_ACPI_STATUS (AE_OK);
46228c506b8Sjruoho }
46328c506b8Sjruoho 
46428c506b8Sjruoho 
46528c506b8Sjruoho /*******************************************************************************
46628c506b8Sjruoho  *
46728c506b8Sjruoho  * FUNCTION:    AcpiRsConvertResourceToAml
46828c506b8Sjruoho  *
46928c506b8Sjruoho  * PARAMETERS:  Resource            - Pointer to the resource descriptor
47028c506b8Sjruoho  *              Aml                 - Where the AML descriptor is returned
47128c506b8Sjruoho  *              Info                - Pointer to appropriate conversion table
47228c506b8Sjruoho  *
47328c506b8Sjruoho  * RETURN:      Status
47428c506b8Sjruoho  *
47528c506b8Sjruoho  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
47628c506b8Sjruoho  *              external AML resource descriptor.
47728c506b8Sjruoho  *
47828c506b8Sjruoho  ******************************************************************************/
47928c506b8Sjruoho 
48028c506b8Sjruoho ACPI_STATUS
AcpiRsConvertResourceToAml(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)48128c506b8Sjruoho AcpiRsConvertResourceToAml (
48228c506b8Sjruoho     ACPI_RESOURCE           *Resource,
48328c506b8Sjruoho     AML_RESOURCE            *Aml,
48428c506b8Sjruoho     ACPI_RSCONVERT_INFO     *Info)
48528c506b8Sjruoho {
48628c506b8Sjruoho     void                    *Source = NULL;
48728c506b8Sjruoho     void                    *Destination;
488ff4a156dSchristos     char                    *Target;
48928c506b8Sjruoho     ACPI_RSDESC_SIZE        AmlLength = 0;
49028c506b8Sjruoho     UINT8                   Count;
49128c506b8Sjruoho     UINT16                  Temp16 = 0;
49228c506b8Sjruoho     UINT16                  ItemCount = 0;
49328c506b8Sjruoho 
49428c506b8Sjruoho 
49528c506b8Sjruoho     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
49628c506b8Sjruoho 
49728c506b8Sjruoho 
498ff4a156dSchristos     if (!Info)
499ff4a156dSchristos     {
500ff4a156dSchristos         return_ACPI_STATUS (AE_BAD_PARAMETER);
501ff4a156dSchristos     }
502ff4a156dSchristos 
50328c506b8Sjruoho     /*
50428c506b8Sjruoho      * First table entry must be ACPI_RSC_INITxxx and must contain the
50528c506b8Sjruoho      * table length (# of table entries)
50628c506b8Sjruoho      */
50728c506b8Sjruoho     Count = INIT_TABLE_LENGTH (Info);
50828c506b8Sjruoho 
50928c506b8Sjruoho     while (Count)
51028c506b8Sjruoho     {
51128c506b8Sjruoho         /*
51228c506b8Sjruoho          * Source is the internal resource descriptor,
51328c506b8Sjruoho          * destination is the external AML byte stream buffer
51428c506b8Sjruoho          */
51528c506b8Sjruoho         Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
51628c506b8Sjruoho         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
51728c506b8Sjruoho 
51828c506b8Sjruoho         switch (Info->Opcode)
51928c506b8Sjruoho         {
52028c506b8Sjruoho         case ACPI_RSC_INITSET:
52128c506b8Sjruoho 
522c72da027Schristos             memset (Aml, 0, INIT_RESOURCE_LENGTH (Info));
52328c506b8Sjruoho             AmlLength = INIT_RESOURCE_LENGTH (Info);
52471e38f1dSchristos             AcpiRsSetResourceHeader (
52571e38f1dSchristos                 INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
52628c506b8Sjruoho             break;
52728c506b8Sjruoho 
52828c506b8Sjruoho         case ACPI_RSC_INITGET:
52928c506b8Sjruoho             break;
53028c506b8Sjruoho 
53128c506b8Sjruoho         case ACPI_RSC_FLAGINIT:
53228c506b8Sjruoho             /*
53328c506b8Sjruoho              * Clear the flag byte
53428c506b8Sjruoho              */
535ff4a156dSchristos             ACPI_SET8 (Destination, 0);
53628c506b8Sjruoho             break;
53728c506b8Sjruoho 
53828c506b8Sjruoho         case ACPI_RSC_1BITFLAG:
53928c506b8Sjruoho             /*
54028c506b8Sjruoho              * Mask and shift the flag bit
54128c506b8Sjruoho              */
542ff4a156dSchristos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
543ff4a156dSchristos                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
54428c506b8Sjruoho             break;
54528c506b8Sjruoho 
54628c506b8Sjruoho         case ACPI_RSC_2BITFLAG:
54728c506b8Sjruoho             /*
54828c506b8Sjruoho              * Mask and shift the flag bits
54928c506b8Sjruoho              */
550ff4a156dSchristos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
551ff4a156dSchristos                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
55228c506b8Sjruoho             break;
55328c506b8Sjruoho 
554ff4a156dSchristos         case ACPI_RSC_3BITFLAG:
555ff4a156dSchristos             /*
556ff4a156dSchristos              * Mask and shift the flag bits
557ff4a156dSchristos              */
558ff4a156dSchristos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
559ff4a156dSchristos                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
560ff4a156dSchristos             break;
56128c506b8Sjruoho 
56246a330b4Schristos         case ACPI_RSC_6BITFLAG:
56346a330b4Schristos             /*
56446a330b4Schristos              * Mask and shift the flag bits
56546a330b4Schristos              */
56646a330b4Schristos             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
56746a330b4Schristos                 ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
56846a330b4Schristos             break;
56946a330b4Schristos 
57028c506b8Sjruoho         case ACPI_RSC_COUNT:
57128c506b8Sjruoho 
57228c506b8Sjruoho             ItemCount = ACPI_GET8 (Source);
573ff4a156dSchristos             ACPI_SET8 (Destination, ItemCount);
57428c506b8Sjruoho 
57571e38f1dSchristos             AmlLength = (UINT16)
57671e38f1dSchristos                 (AmlLength + (Info->Value * (ItemCount - 1)));
57728c506b8Sjruoho             break;
57828c506b8Sjruoho 
57928c506b8Sjruoho         case ACPI_RSC_COUNT16:
58028c506b8Sjruoho 
58128c506b8Sjruoho             ItemCount = ACPI_GET16 (Source);
58228c506b8Sjruoho             AmlLength = (UINT16) (AmlLength + ItemCount);
58328c506b8Sjruoho             AcpiRsSetResourceLength (AmlLength, Aml);
58428c506b8Sjruoho             break;
58528c506b8Sjruoho 
586ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_PIN:
587ff4a156dSchristos 
588ff4a156dSchristos             ItemCount = ACPI_GET16 (Source);
589ff4a156dSchristos             ACPI_SET16 (Destination, AmlLength);
590ff4a156dSchristos 
591ff4a156dSchristos             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
592ff4a156dSchristos             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
593ff4a156dSchristos             ACPI_SET16 (Target, AmlLength);
594ff4a156dSchristos             AcpiRsSetResourceLength (AmlLength, Aml);
595ff4a156dSchristos             break;
596ff4a156dSchristos 
597ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_VEN:
598ff4a156dSchristos 
599ff4a156dSchristos             ItemCount = ACPI_GET16 (Source);
600ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount);
601ff4a156dSchristos 
60271e38f1dSchristos             AmlLength = (UINT16) (
60371e38f1dSchristos                 AmlLength + (Info->Value * ItemCount));
604ff4a156dSchristos             AcpiRsSetResourceLength (AmlLength, Aml);
605ff4a156dSchristos             break;
606ff4a156dSchristos 
607ff4a156dSchristos         case ACPI_RSC_COUNT_GPIO_RES:
608ff4a156dSchristos 
609ff4a156dSchristos             /* Set resource source string length */
610ff4a156dSchristos 
611ff4a156dSchristos             ItemCount = ACPI_GET16 (Source);
612ff4a156dSchristos             ACPI_SET16 (Destination, AmlLength);
613ff4a156dSchristos 
614ff4a156dSchristos             /* Compute offset for the Vendor Data */
615ff4a156dSchristos 
616ff4a156dSchristos             AmlLength = (UINT16) (AmlLength + ItemCount);
617ff4a156dSchristos             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
618ff4a156dSchristos 
619ff4a156dSchristos             /* Set vendor offset only if there is vendor data */
620ff4a156dSchristos 
621ff4a156dSchristos             ACPI_SET16 (Target, AmlLength);
622ff4a156dSchristos 
623ff4a156dSchristos             AcpiRsSetResourceLength (AmlLength, Aml);
624ff4a156dSchristos             break;
625ff4a156dSchristos 
626ff4a156dSchristos         case ACPI_RSC_COUNT_SERIAL_VEN:
627ff4a156dSchristos 
628ff4a156dSchristos             ItemCount = ACPI_GET16 (Source);
629ff4a156dSchristos             ACPI_SET16 (Destination, ItemCount + Info->Value);
630ff4a156dSchristos             AmlLength = (UINT16) (AmlLength + ItemCount);
631ff4a156dSchristos             AcpiRsSetResourceLength (AmlLength, Aml);
632ff4a156dSchristos             break;
633ff4a156dSchristos 
634ff4a156dSchristos         case ACPI_RSC_COUNT_SERIAL_RES:
635ff4a156dSchristos 
636ff4a156dSchristos             ItemCount = ACPI_GET16 (Source);
637ff4a156dSchristos             AmlLength = (UINT16) (AmlLength + ItemCount);
638ff4a156dSchristos             AcpiRsSetResourceLength (AmlLength, Aml);
639ff4a156dSchristos             break;
64028c506b8Sjruoho 
64128c506b8Sjruoho         case ACPI_RSC_LENGTH:
64228c506b8Sjruoho 
64328c506b8Sjruoho             AcpiRsSetResourceLength (Info->Value, Aml);
64428c506b8Sjruoho             break;
64528c506b8Sjruoho 
64628c506b8Sjruoho         case ACPI_RSC_MOVE8:
64728c506b8Sjruoho         case ACPI_RSC_MOVE16:
64828c506b8Sjruoho         case ACPI_RSC_MOVE32:
64928c506b8Sjruoho         case ACPI_RSC_MOVE64:
65028c506b8Sjruoho 
65128c506b8Sjruoho             if (Info->Value)
65228c506b8Sjruoho             {
65328c506b8Sjruoho                 ItemCount = Info->Value;
65428c506b8Sjruoho             }
65528c506b8Sjruoho             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
65628c506b8Sjruoho             break;
65728c506b8Sjruoho 
658ff4a156dSchristos         case ACPI_RSC_MOVE_GPIO_PIN:
659ff4a156dSchristos 
660ff4a156dSchristos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
661ff4a156dSchristos                 ACPI_GET16 (Destination));
662ff4a156dSchristos             Source = * (UINT16 **) Source;
663ff4a156dSchristos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
664ff4a156dSchristos             break;
665ff4a156dSchristos 
666ff4a156dSchristos         case ACPI_RSC_MOVE_GPIO_RES:
667ff4a156dSchristos 
668ff4a156dSchristos             /* Used for both ResourceSource string and VendorData */
669ff4a156dSchristos 
670ff4a156dSchristos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
671ff4a156dSchristos                 ACPI_GET16 (Destination));
672ff4a156dSchristos             Source = * (UINT8 **) Source;
673ff4a156dSchristos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
674ff4a156dSchristos             break;
675ff4a156dSchristos 
676ff4a156dSchristos         case ACPI_RSC_MOVE_SERIAL_VEN:
677ff4a156dSchristos 
678ff4a156dSchristos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
679ff4a156dSchristos                 (AmlLength - ItemCount));
680ff4a156dSchristos             Source = * (UINT8 **) Source;
681ff4a156dSchristos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
682ff4a156dSchristos             break;
683ff4a156dSchristos 
684ff4a156dSchristos         case ACPI_RSC_MOVE_SERIAL_RES:
685ff4a156dSchristos 
686ff4a156dSchristos             Destination = (char *) ACPI_ADD_PTR (void, Aml,
687ff4a156dSchristos                 (AmlLength - ItemCount));
688ff4a156dSchristos             Source = * (UINT8 **) Source;
689ff4a156dSchristos             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
690ff4a156dSchristos             break;
69128c506b8Sjruoho 
69228c506b8Sjruoho         case ACPI_RSC_ADDRESS:
69328c506b8Sjruoho 
69428c506b8Sjruoho             /* Set the Resource Type, General Flags, and Type-Specific Flags */
69528c506b8Sjruoho 
69628c506b8Sjruoho             AcpiRsSetAddressCommon (Aml, Resource);
69728c506b8Sjruoho             break;
69828c506b8Sjruoho 
69928c506b8Sjruoho         case ACPI_RSC_SOURCEX:
70028c506b8Sjruoho             /*
70128c506b8Sjruoho              * Optional ResourceSource (Index and String)
70228c506b8Sjruoho              */
70328c506b8Sjruoho             AmlLength = AcpiRsSetResourceSource (
70428c506b8Sjruoho                 Aml, (ACPI_RS_LENGTH) AmlLength, Source);
70528c506b8Sjruoho             AcpiRsSetResourceLength (AmlLength, Aml);
70628c506b8Sjruoho             break;
70728c506b8Sjruoho 
70828c506b8Sjruoho         case ACPI_RSC_SOURCE:
70928c506b8Sjruoho             /*
71028c506b8Sjruoho              * Optional ResourceSource (Index and String). This is the more
71128c506b8Sjruoho              * complicated case used by the Interrupt() macro
71228c506b8Sjruoho              */
71328c506b8Sjruoho             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
71428c506b8Sjruoho             AcpiRsSetResourceLength (AmlLength, Aml);
71528c506b8Sjruoho             break;
71628c506b8Sjruoho 
71728c506b8Sjruoho         case ACPI_RSC_BITMASK:
71828c506b8Sjruoho             /*
71928c506b8Sjruoho              * 8-bit encoded bitmask (DMA macro)
72028c506b8Sjruoho              */
721ff4a156dSchristos             ACPI_SET8 (Destination,
72228c506b8Sjruoho                 AcpiRsEncodeBitmask (Source,
723ff4a156dSchristos                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
72428c506b8Sjruoho             break;
72528c506b8Sjruoho 
72628c506b8Sjruoho         case ACPI_RSC_BITMASK16:
72728c506b8Sjruoho             /*
72828c506b8Sjruoho              * 16-bit encoded bitmask (IRQ macro)
72928c506b8Sjruoho              */
73071e38f1dSchristos             Temp16 = AcpiRsEncodeBitmask (
73171e38f1dSchristos                 Source, *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
73228c506b8Sjruoho             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
73328c506b8Sjruoho             break;
73428c506b8Sjruoho 
73528c506b8Sjruoho         case ACPI_RSC_EXIT_LE:
73628c506b8Sjruoho             /*
73728c506b8Sjruoho              * Control - Exit conversion if less than or equal
73828c506b8Sjruoho              */
73928c506b8Sjruoho             if (ItemCount <= Info->Value)
74028c506b8Sjruoho             {
74128c506b8Sjruoho                 goto Exit;
74228c506b8Sjruoho             }
74328c506b8Sjruoho             break;
74428c506b8Sjruoho 
74528c506b8Sjruoho         case ACPI_RSC_EXIT_NE:
74628c506b8Sjruoho             /*
74728c506b8Sjruoho              * Control - Exit conversion if not equal
74828c506b8Sjruoho              */
74928c506b8Sjruoho             switch (COMPARE_OPCODE (Info))
75028c506b8Sjruoho             {
75128c506b8Sjruoho             case ACPI_RSC_COMPARE_VALUE:
75228c506b8Sjruoho 
75328c506b8Sjruoho                 if (*ACPI_ADD_PTR (UINT8, Resource,
75428c506b8Sjruoho                     COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
75528c506b8Sjruoho                 {
75628c506b8Sjruoho                     goto Exit;
75728c506b8Sjruoho                 }
75828c506b8Sjruoho                 break;
75928c506b8Sjruoho 
76028c506b8Sjruoho             default:
76128c506b8Sjruoho 
76228c506b8Sjruoho                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
76328c506b8Sjruoho                 return_ACPI_STATUS (AE_BAD_PARAMETER);
76428c506b8Sjruoho             }
76528c506b8Sjruoho             break;
76628c506b8Sjruoho 
76728c506b8Sjruoho         case ACPI_RSC_EXIT_EQ:
76828c506b8Sjruoho             /*
76928c506b8Sjruoho              * Control - Exit conversion if equal
77028c506b8Sjruoho              */
77128c506b8Sjruoho             if (*ACPI_ADD_PTR (UINT8, Resource,
77228c506b8Sjruoho                 COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
77328c506b8Sjruoho             {
77428c506b8Sjruoho                 goto Exit;
77528c506b8Sjruoho             }
77628c506b8Sjruoho             break;
77728c506b8Sjruoho 
77828c506b8Sjruoho         default:
77928c506b8Sjruoho 
78028c506b8Sjruoho             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
78128c506b8Sjruoho             return_ACPI_STATUS (AE_BAD_PARAMETER);
78228c506b8Sjruoho         }
78328c506b8Sjruoho 
78428c506b8Sjruoho         Count--;
78528c506b8Sjruoho         Info++;
78628c506b8Sjruoho     }
78728c506b8Sjruoho 
78828c506b8Sjruoho Exit:
78928c506b8Sjruoho     return_ACPI_STATUS (AE_OK);
79028c506b8Sjruoho }
79128c506b8Sjruoho 
79228c506b8Sjruoho 
79328c506b8Sjruoho #if 0
79428c506b8Sjruoho /* Previous resource validations */
79528c506b8Sjruoho 
79671e38f1dSchristos     if (Aml->ExtAddress64.RevisionID !=
79771e38f1dSchristos         AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
79828c506b8Sjruoho     {
79928c506b8Sjruoho         return_ACPI_STATUS (AE_SUPPORT);
80028c506b8Sjruoho     }
80128c506b8Sjruoho 
80228c506b8Sjruoho     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
80328c506b8Sjruoho     {
80428c506b8Sjruoho         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
80528c506b8Sjruoho     }
80628c506b8Sjruoho 
80728c506b8Sjruoho     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
80828c506b8Sjruoho         ((Aml->Irq.Flags & 0x09) == 0x09))
80928c506b8Sjruoho     {
81028c506b8Sjruoho         /*
81128c506b8Sjruoho          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
81228c506b8Sjruoho          * polarity/trigger interrupts are allowed (ACPI spec, section
81328c506b8Sjruoho          * "IRQ Format"), so 0x00 and 0x09 are illegal.
81428c506b8Sjruoho          */
81528c506b8Sjruoho         ACPI_ERROR ((AE_INFO,
81628c506b8Sjruoho             "Invalid interrupt polarity/trigger in resource list, 0x%X",
81728c506b8Sjruoho             Aml->Irq.Flags));
81828c506b8Sjruoho         return_ACPI_STATUS (AE_BAD_DATA);
81928c506b8Sjruoho     }
82028c506b8Sjruoho 
82128c506b8Sjruoho     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
82228c506b8Sjruoho     if (Temp8 < 1)
82328c506b8Sjruoho     {
82428c506b8Sjruoho         /* Must have at least one IRQ */
82528c506b8Sjruoho 
82628c506b8Sjruoho         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
82728c506b8Sjruoho     }
82828c506b8Sjruoho 
82928c506b8Sjruoho     if (Resource->Data.Dma.Transfer == 0x03)
83028c506b8Sjruoho     {
83128c506b8Sjruoho         ACPI_ERROR ((AE_INFO,
83228c506b8Sjruoho             "Invalid DMA.Transfer preference (3)"));
83328c506b8Sjruoho         return_ACPI_STATUS (AE_BAD_DATA);
83428c506b8Sjruoho     }
83528c506b8Sjruoho #endif
836