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