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