1433d6423SLionel Sambuc /*******************************************************************************
2433d6423SLionel Sambuc *
3433d6423SLionel Sambuc * Module Name: rsmisc - Miscellaneous resource descriptors
4433d6423SLionel Sambuc *
5433d6423SLionel Sambuc ******************************************************************************/
6433d6423SLionel Sambuc
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek * Copyright (C) 2000 - 2014, Intel Corp.
9433d6423SLionel Sambuc * All rights reserved.
10433d6423SLionel Sambuc *
11*29492bb7SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
12*29492bb7SDavid van Moolenbroek * modification, are permitted provided that the following conditions
13*29492bb7SDavid van Moolenbroek * are met:
14*29492bb7SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
15*29492bb7SDavid van Moolenbroek * notice, this list of conditions, and the following disclaimer,
16*29492bb7SDavid van Moolenbroek * without modification.
17*29492bb7SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*29492bb7SDavid van Moolenbroek * substantially similar to the "NO WARRANTY" disclaimer below
19*29492bb7SDavid van Moolenbroek * ("Disclaimer") and any redistribution must be conditioned upon
20*29492bb7SDavid van Moolenbroek * including a substantially similar Disclaimer requirement for further
21*29492bb7SDavid van Moolenbroek * binary redistribution.
22*29492bb7SDavid van Moolenbroek * 3. Neither the names of the above-listed copyright holders nor the names
23*29492bb7SDavid van Moolenbroek * of any contributors may be used to endorse or promote products derived
24*29492bb7SDavid van Moolenbroek * from this software without specific prior written permission.
25433d6423SLionel Sambuc *
26*29492bb7SDavid van Moolenbroek * Alternatively, this software may be distributed under the terms of the
27*29492bb7SDavid van Moolenbroek * GNU General Public License ("GPL") version 2 as published by the Free
28*29492bb7SDavid van Moolenbroek * Software Foundation.
29433d6423SLionel Sambuc *
30*29492bb7SDavid van Moolenbroek * NO WARRANTY
31*29492bb7SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*29492bb7SDavid van Moolenbroek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*29492bb7SDavid van Moolenbroek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*29492bb7SDavid van Moolenbroek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*29492bb7SDavid van Moolenbroek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*29492bb7SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*29492bb7SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*29492bb7SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*29492bb7SDavid van Moolenbroek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*29492bb7SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*29492bb7SDavid van Moolenbroek * POSSIBILITY OF SUCH DAMAGES.
42*29492bb7SDavid van Moolenbroek */
43433d6423SLionel Sambuc
44433d6423SLionel Sambuc #include "acpi.h"
45433d6423SLionel Sambuc #include "accommon.h"
46433d6423SLionel Sambuc #include "acresrc.h"
47433d6423SLionel Sambuc
48433d6423SLionel Sambuc #define _COMPONENT ACPI_RESOURCES
49433d6423SLionel Sambuc ACPI_MODULE_NAME ("rsmisc")
50433d6423SLionel Sambuc
51433d6423SLionel Sambuc
52433d6423SLionel Sambuc #define INIT_RESOURCE_TYPE(i) i->ResourceOffset
53433d6423SLionel Sambuc #define INIT_RESOURCE_LENGTH(i) i->AmlOffset
54433d6423SLionel Sambuc #define INIT_TABLE_LENGTH(i) i->Value
55433d6423SLionel Sambuc
56433d6423SLionel Sambuc #define COMPARE_OPCODE(i) i->ResourceOffset
57433d6423SLionel Sambuc #define COMPARE_TARGET(i) i->AmlOffset
58433d6423SLionel Sambuc #define COMPARE_VALUE(i) i->Value
59433d6423SLionel Sambuc
60433d6423SLionel Sambuc
61433d6423SLionel Sambuc /*******************************************************************************
62433d6423SLionel Sambuc *
63433d6423SLionel Sambuc * FUNCTION: AcpiRsConvertAmlToResource
64433d6423SLionel Sambuc *
65433d6423SLionel Sambuc * PARAMETERS: Resource - Pointer to the resource descriptor
66433d6423SLionel Sambuc * Aml - Where the AML descriptor is returned
67433d6423SLionel Sambuc * Info - Pointer to appropriate conversion table
68433d6423SLionel Sambuc *
69433d6423SLionel Sambuc * RETURN: Status
70433d6423SLionel Sambuc *
71433d6423SLionel Sambuc * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
72433d6423SLionel Sambuc * internal resource descriptor
73433d6423SLionel Sambuc *
74433d6423SLionel Sambuc ******************************************************************************/
75433d6423SLionel Sambuc
76433d6423SLionel Sambuc ACPI_STATUS
AcpiRsConvertAmlToResource(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)77433d6423SLionel Sambuc AcpiRsConvertAmlToResource (
78433d6423SLionel Sambuc ACPI_RESOURCE *Resource,
79433d6423SLionel Sambuc AML_RESOURCE *Aml,
80433d6423SLionel Sambuc ACPI_RSCONVERT_INFO *Info)
81433d6423SLionel Sambuc {
82433d6423SLionel Sambuc ACPI_RS_LENGTH AmlResourceLength;
83433d6423SLionel Sambuc void *Source;
84433d6423SLionel Sambuc void *Destination;
85433d6423SLionel Sambuc char *Target;
86433d6423SLionel Sambuc UINT8 Count;
87433d6423SLionel Sambuc UINT8 FlagsMode = FALSE;
88433d6423SLionel Sambuc UINT16 ItemCount = 0;
89433d6423SLionel Sambuc UINT16 Temp16 = 0;
90433d6423SLionel Sambuc
91433d6423SLionel Sambuc
92433d6423SLionel Sambuc ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
93433d6423SLionel Sambuc
94433d6423SLionel Sambuc
95*29492bb7SDavid van Moolenbroek if (!Info)
96*29492bb7SDavid van Moolenbroek {
97*29492bb7SDavid van Moolenbroek return_ACPI_STATUS (AE_BAD_PARAMETER);
98*29492bb7SDavid van Moolenbroek }
99*29492bb7SDavid van Moolenbroek
100433d6423SLionel Sambuc if (((ACPI_SIZE) Resource) & 0x3)
101433d6423SLionel Sambuc {
102433d6423SLionel Sambuc /* Each internal resource struct is expected to be 32-bit aligned */
103433d6423SLionel Sambuc
104433d6423SLionel Sambuc ACPI_WARNING ((AE_INFO,
105433d6423SLionel Sambuc "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
106433d6423SLionel Sambuc Resource, Resource->Type, Resource->Length));
107433d6423SLionel Sambuc }
108433d6423SLionel Sambuc
109433d6423SLionel Sambuc /* Extract the resource Length field (does not include header length) */
110433d6423SLionel Sambuc
111433d6423SLionel Sambuc AmlResourceLength = AcpiUtGetResourceLength (Aml);
112433d6423SLionel Sambuc
113433d6423SLionel Sambuc /*
114433d6423SLionel Sambuc * First table entry must be ACPI_RSC_INITxxx and must contain the
115433d6423SLionel Sambuc * table length (# of table entries)
116433d6423SLionel Sambuc */
117433d6423SLionel Sambuc Count = INIT_TABLE_LENGTH (Info);
118433d6423SLionel Sambuc while (Count)
119433d6423SLionel Sambuc {
120433d6423SLionel Sambuc /*
121433d6423SLionel Sambuc * Source is the external AML byte stream buffer,
122433d6423SLionel Sambuc * destination is the internal resource descriptor
123433d6423SLionel Sambuc */
124433d6423SLionel Sambuc Source = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
125433d6423SLionel Sambuc Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
126433d6423SLionel Sambuc
127433d6423SLionel Sambuc switch (Info->Opcode)
128433d6423SLionel Sambuc {
129433d6423SLionel Sambuc case ACPI_RSC_INITGET:
130433d6423SLionel Sambuc /*
131433d6423SLionel Sambuc * Get the resource type and the initial (minimum) length
132433d6423SLionel Sambuc */
133433d6423SLionel Sambuc ACPI_MEMSET (Resource, 0, INIT_RESOURCE_LENGTH (Info));
134433d6423SLionel Sambuc Resource->Type = INIT_RESOURCE_TYPE (Info);
135433d6423SLionel Sambuc Resource->Length = INIT_RESOURCE_LENGTH (Info);
136433d6423SLionel Sambuc break;
137433d6423SLionel Sambuc
138433d6423SLionel Sambuc case ACPI_RSC_INITSET:
139433d6423SLionel Sambuc break;
140433d6423SLionel Sambuc
141433d6423SLionel Sambuc case ACPI_RSC_FLAGINIT:
142433d6423SLionel Sambuc
143433d6423SLionel Sambuc FlagsMode = TRUE;
144433d6423SLionel Sambuc break;
145433d6423SLionel Sambuc
146433d6423SLionel Sambuc case ACPI_RSC_1BITFLAG:
147433d6423SLionel Sambuc /*
148433d6423SLionel Sambuc * Mask and shift the flag bit
149433d6423SLionel Sambuc */
150*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination,
151*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) >> Info->Value) & 0x01));
152433d6423SLionel Sambuc break;
153433d6423SLionel Sambuc
154433d6423SLionel Sambuc case ACPI_RSC_2BITFLAG:
155433d6423SLionel Sambuc /*
156433d6423SLionel Sambuc * Mask and shift the flag bits
157433d6423SLionel Sambuc */
158*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination,
159*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) >> Info->Value) & 0x03));
160433d6423SLionel Sambuc break;
161433d6423SLionel Sambuc
162*29492bb7SDavid van Moolenbroek case ACPI_RSC_3BITFLAG:
163*29492bb7SDavid van Moolenbroek /*
164*29492bb7SDavid van Moolenbroek * Mask and shift the flag bits
165*29492bb7SDavid van Moolenbroek */
166*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination,
167*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
168*29492bb7SDavid van Moolenbroek break;
169433d6423SLionel Sambuc
170433d6423SLionel Sambuc case ACPI_RSC_COUNT:
171433d6423SLionel Sambuc
172433d6423SLionel Sambuc ItemCount = ACPI_GET8 (Source);
173*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination, ItemCount);
174433d6423SLionel Sambuc
175433d6423SLionel Sambuc Resource->Length = Resource->Length +
176433d6423SLionel Sambuc (Info->Value * (ItemCount - 1));
177433d6423SLionel Sambuc break;
178433d6423SLionel Sambuc
179433d6423SLionel Sambuc case ACPI_RSC_COUNT16:
180433d6423SLionel Sambuc
181433d6423SLionel Sambuc ItemCount = AmlResourceLength;
182*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
183433d6423SLionel Sambuc
184433d6423SLionel Sambuc Resource->Length = Resource->Length +
185433d6423SLionel Sambuc (Info->Value * (ItemCount - 1));
186433d6423SLionel Sambuc break;
187433d6423SLionel Sambuc
188*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_PIN:
189*29492bb7SDavid van Moolenbroek
190*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (void, Aml, Info->Value);
191*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
192*29492bb7SDavid van Moolenbroek
193*29492bb7SDavid van Moolenbroek Resource->Length = Resource->Length + ItemCount;
194*29492bb7SDavid van Moolenbroek ItemCount = ItemCount / 2;
195*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
196*29492bb7SDavid van Moolenbroek break;
197*29492bb7SDavid van Moolenbroek
198*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_VEN:
199*29492bb7SDavid van Moolenbroek
200*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET8 (Source);
201*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination, ItemCount);
202*29492bb7SDavid van Moolenbroek
203*29492bb7SDavid van Moolenbroek Resource->Length = Resource->Length +
204*29492bb7SDavid van Moolenbroek (Info->Value * ItemCount);
205*29492bb7SDavid van Moolenbroek break;
206*29492bb7SDavid van Moolenbroek
207*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_RES:
208*29492bb7SDavid van Moolenbroek /*
209*29492bb7SDavid van Moolenbroek * Vendor data is optional (length/offset may both be zero)
210*29492bb7SDavid van Moolenbroek * Examine vendor data length field first
211*29492bb7SDavid van Moolenbroek */
212*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
213*29492bb7SDavid van Moolenbroek if (ACPI_GET16 (Target))
214*29492bb7SDavid van Moolenbroek {
215*29492bb7SDavid van Moolenbroek /* Use vendor offset to get resource source length */
216*29492bb7SDavid van Moolenbroek
217*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (void, Aml, Info->Value);
218*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
219*29492bb7SDavid van Moolenbroek }
220*29492bb7SDavid van Moolenbroek else
221*29492bb7SDavid van Moolenbroek {
222*29492bb7SDavid van Moolenbroek /* No vendor data to worry about */
223*29492bb7SDavid van Moolenbroek
224*29492bb7SDavid van Moolenbroek ItemCount = Aml->LargeHeader.ResourceLength +
225*29492bb7SDavid van Moolenbroek sizeof (AML_RESOURCE_LARGE_HEADER) -
226*29492bb7SDavid van Moolenbroek ACPI_GET16 (Source);
227*29492bb7SDavid van Moolenbroek }
228*29492bb7SDavid van Moolenbroek
229*29492bb7SDavid van Moolenbroek Resource->Length = Resource->Length + ItemCount;
230*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
231*29492bb7SDavid van Moolenbroek break;
232*29492bb7SDavid van Moolenbroek
233*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_SERIAL_VEN:
234*29492bb7SDavid van Moolenbroek
235*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source) - Info->Value;
236*29492bb7SDavid van Moolenbroek
237*29492bb7SDavid van Moolenbroek Resource->Length = Resource->Length + ItemCount;
238*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
239*29492bb7SDavid van Moolenbroek break;
240*29492bb7SDavid van Moolenbroek
241*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_SERIAL_RES:
242*29492bb7SDavid van Moolenbroek
243*29492bb7SDavid van Moolenbroek ItemCount = (AmlResourceLength +
244*29492bb7SDavid van Moolenbroek sizeof (AML_RESOURCE_LARGE_HEADER)) -
245*29492bb7SDavid van Moolenbroek ACPI_GET16 (Source) - Info->Value;
246*29492bb7SDavid van Moolenbroek
247*29492bb7SDavid van Moolenbroek Resource->Length = Resource->Length + ItemCount;
248*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
249*29492bb7SDavid van Moolenbroek break;
250433d6423SLionel Sambuc
251433d6423SLionel Sambuc case ACPI_RSC_LENGTH:
252433d6423SLionel Sambuc
253433d6423SLionel Sambuc Resource->Length = Resource->Length + Info->Value;
254433d6423SLionel Sambuc break;
255433d6423SLionel Sambuc
256433d6423SLionel Sambuc case ACPI_RSC_MOVE8:
257433d6423SLionel Sambuc case ACPI_RSC_MOVE16:
258433d6423SLionel Sambuc case ACPI_RSC_MOVE32:
259433d6423SLionel Sambuc case ACPI_RSC_MOVE64:
260433d6423SLionel Sambuc /*
261433d6423SLionel Sambuc * Raw data move. Use the Info value field unless ItemCount has
262433d6423SLionel Sambuc * been previously initialized via a COUNT opcode
263433d6423SLionel Sambuc */
264433d6423SLionel Sambuc if (Info->Value)
265433d6423SLionel Sambuc {
266433d6423SLionel Sambuc ItemCount = Info->Value;
267433d6423SLionel Sambuc }
268433d6423SLionel Sambuc AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
269433d6423SLionel Sambuc break;
270433d6423SLionel Sambuc
271*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_GPIO_PIN:
272*29492bb7SDavid van Moolenbroek
273*29492bb7SDavid van Moolenbroek /* Generate and set the PIN data pointer */
274*29492bb7SDavid van Moolenbroek
275*29492bb7SDavid van Moolenbroek Target = (char *) ACPI_ADD_PTR (void, Resource,
276*29492bb7SDavid van Moolenbroek (Resource->Length - ItemCount * 2));
277*29492bb7SDavid van Moolenbroek *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
278*29492bb7SDavid van Moolenbroek
279*29492bb7SDavid van Moolenbroek /* Copy the PIN data */
280*29492bb7SDavid van Moolenbroek
281*29492bb7SDavid van Moolenbroek Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
282*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
283*29492bb7SDavid van Moolenbroek break;
284*29492bb7SDavid van Moolenbroek
285*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_GPIO_RES:
286*29492bb7SDavid van Moolenbroek
287*29492bb7SDavid van Moolenbroek /* Generate and set the ResourceSource string pointer */
288*29492bb7SDavid van Moolenbroek
289*29492bb7SDavid van Moolenbroek Target = (char *) ACPI_ADD_PTR (void, Resource,
290*29492bb7SDavid van Moolenbroek (Resource->Length - ItemCount));
291*29492bb7SDavid van Moolenbroek *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
292*29492bb7SDavid van Moolenbroek
293*29492bb7SDavid van Moolenbroek /* Copy the ResourceSource string */
294*29492bb7SDavid van Moolenbroek
295*29492bb7SDavid van Moolenbroek Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
296*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
297*29492bb7SDavid van Moolenbroek break;
298*29492bb7SDavid van Moolenbroek
299*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_SERIAL_VEN:
300*29492bb7SDavid van Moolenbroek
301*29492bb7SDavid van Moolenbroek /* Generate and set the Vendor Data pointer */
302*29492bb7SDavid van Moolenbroek
303*29492bb7SDavid van Moolenbroek Target = (char *) ACPI_ADD_PTR (void, Resource,
304*29492bb7SDavid van Moolenbroek (Resource->Length - ItemCount));
305*29492bb7SDavid van Moolenbroek *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
306*29492bb7SDavid van Moolenbroek
307*29492bb7SDavid van Moolenbroek /* Copy the Vendor Data */
308*29492bb7SDavid van Moolenbroek
309*29492bb7SDavid van Moolenbroek Source = ACPI_ADD_PTR (void, Aml, Info->Value);
310*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
311*29492bb7SDavid van Moolenbroek break;
312*29492bb7SDavid van Moolenbroek
313*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_SERIAL_RES:
314*29492bb7SDavid van Moolenbroek
315*29492bb7SDavid van Moolenbroek /* Generate and set the ResourceSource string pointer */
316*29492bb7SDavid van Moolenbroek
317*29492bb7SDavid van Moolenbroek Target = (char *) ACPI_ADD_PTR (void, Resource,
318*29492bb7SDavid van Moolenbroek (Resource->Length - ItemCount));
319*29492bb7SDavid van Moolenbroek *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
320*29492bb7SDavid van Moolenbroek
321*29492bb7SDavid van Moolenbroek /* Copy the ResourceSource string */
322*29492bb7SDavid van Moolenbroek
323*29492bb7SDavid van Moolenbroek Source = ACPI_ADD_PTR (void, Aml, (ACPI_GET16 (Source) + Info->Value));
324*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
325*29492bb7SDavid van Moolenbroek break;
326433d6423SLionel Sambuc
327433d6423SLionel Sambuc case ACPI_RSC_SET8:
328433d6423SLionel Sambuc
329433d6423SLionel Sambuc ACPI_MEMSET (Destination, Info->AmlOffset, Info->Value);
330433d6423SLionel Sambuc break;
331433d6423SLionel Sambuc
332433d6423SLionel Sambuc case ACPI_RSC_DATA8:
333433d6423SLionel Sambuc
334433d6423SLionel Sambuc Target = ACPI_ADD_PTR (char, Resource, Info->Value);
335433d6423SLionel Sambuc ACPI_MEMCPY (Destination, Source, ACPI_GET16 (Target));
336433d6423SLionel Sambuc break;
337433d6423SLionel Sambuc
338433d6423SLionel Sambuc case ACPI_RSC_ADDRESS:
339433d6423SLionel Sambuc /*
340433d6423SLionel Sambuc * Common handler for address descriptor flags
341433d6423SLionel Sambuc */
342433d6423SLionel Sambuc if (!AcpiRsGetAddressCommon (Resource, Aml))
343433d6423SLionel Sambuc {
344433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
345433d6423SLionel Sambuc }
346433d6423SLionel Sambuc break;
347433d6423SLionel Sambuc
348433d6423SLionel Sambuc case ACPI_RSC_SOURCE:
349433d6423SLionel Sambuc /*
350433d6423SLionel Sambuc * Optional ResourceSource (Index and String)
351433d6423SLionel Sambuc */
352433d6423SLionel Sambuc Resource->Length +=
353433d6423SLionel Sambuc AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
354433d6423SLionel Sambuc Destination, Aml, NULL);
355433d6423SLionel Sambuc break;
356433d6423SLionel Sambuc
357433d6423SLionel Sambuc case ACPI_RSC_SOURCEX:
358433d6423SLionel Sambuc /*
359433d6423SLionel Sambuc * Optional ResourceSource (Index and String). This is the more
360433d6423SLionel Sambuc * complicated case used by the Interrupt() macro
361433d6423SLionel Sambuc */
362*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (char, Resource,
363*29492bb7SDavid van Moolenbroek Info->AmlOffset + (ItemCount * 4));
364433d6423SLionel Sambuc
365433d6423SLionel Sambuc Resource->Length +=
366*29492bb7SDavid van Moolenbroek AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
367*29492bb7SDavid van Moolenbroek (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
368433d6423SLionel Sambuc Destination, Aml, Target);
369433d6423SLionel Sambuc break;
370433d6423SLionel Sambuc
371433d6423SLionel Sambuc case ACPI_RSC_BITMASK:
372433d6423SLionel Sambuc /*
373433d6423SLionel Sambuc * 8-bit encoded bitmask (DMA macro)
374433d6423SLionel Sambuc */
375433d6423SLionel Sambuc ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
376433d6423SLionel Sambuc if (ItemCount)
377433d6423SLionel Sambuc {
378433d6423SLionel Sambuc Resource->Length += (ItemCount - 1);
379433d6423SLionel Sambuc }
380433d6423SLionel Sambuc
381433d6423SLionel Sambuc Target = ACPI_ADD_PTR (char, Resource, Info->Value);
382*29492bb7SDavid van Moolenbroek ACPI_SET8 (Target, ItemCount);
383433d6423SLionel Sambuc break;
384433d6423SLionel Sambuc
385433d6423SLionel Sambuc case ACPI_RSC_BITMASK16:
386433d6423SLionel Sambuc /*
387433d6423SLionel Sambuc * 16-bit encoded bitmask (IRQ macro)
388433d6423SLionel Sambuc */
389433d6423SLionel Sambuc ACPI_MOVE_16_TO_16 (&Temp16, Source);
390433d6423SLionel Sambuc
391433d6423SLionel Sambuc ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
392433d6423SLionel Sambuc if (ItemCount)
393433d6423SLionel Sambuc {
394433d6423SLionel Sambuc Resource->Length += (ItemCount - 1);
395433d6423SLionel Sambuc }
396433d6423SLionel Sambuc
397433d6423SLionel Sambuc Target = ACPI_ADD_PTR (char, Resource, Info->Value);
398*29492bb7SDavid van Moolenbroek ACPI_SET8 (Target, ItemCount);
399433d6423SLionel Sambuc break;
400433d6423SLionel Sambuc
401433d6423SLionel Sambuc case ACPI_RSC_EXIT_NE:
402433d6423SLionel Sambuc /*
403433d6423SLionel Sambuc * Control - Exit conversion if not equal
404433d6423SLionel Sambuc */
405433d6423SLionel Sambuc switch (Info->ResourceOffset)
406433d6423SLionel Sambuc {
407433d6423SLionel Sambuc case ACPI_RSC_COMPARE_AML_LENGTH:
408*29492bb7SDavid van Moolenbroek
409433d6423SLionel Sambuc if (AmlResourceLength != Info->Value)
410433d6423SLionel Sambuc {
411433d6423SLionel Sambuc goto Exit;
412433d6423SLionel Sambuc }
413433d6423SLionel Sambuc break;
414433d6423SLionel Sambuc
415433d6423SLionel Sambuc case ACPI_RSC_COMPARE_VALUE:
416*29492bb7SDavid van Moolenbroek
417433d6423SLionel Sambuc if (ACPI_GET8 (Source) != Info->Value)
418433d6423SLionel Sambuc {
419433d6423SLionel Sambuc goto Exit;
420433d6423SLionel Sambuc }
421433d6423SLionel Sambuc break;
422433d6423SLionel Sambuc
423433d6423SLionel Sambuc default:
424433d6423SLionel Sambuc
425433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
426433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_PARAMETER);
427433d6423SLionel Sambuc }
428433d6423SLionel Sambuc break;
429433d6423SLionel Sambuc
430433d6423SLionel Sambuc default:
431433d6423SLionel Sambuc
432433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
433433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_PARAMETER);
434433d6423SLionel Sambuc }
435433d6423SLionel Sambuc
436433d6423SLionel Sambuc Count--;
437433d6423SLionel Sambuc Info++;
438433d6423SLionel Sambuc }
439433d6423SLionel Sambuc
440433d6423SLionel Sambuc Exit:
441433d6423SLionel Sambuc if (!FlagsMode)
442433d6423SLionel Sambuc {
443433d6423SLionel Sambuc /* Round the resource struct length up to the next boundary (32 or 64) */
444433d6423SLionel Sambuc
445433d6423SLionel Sambuc Resource->Length = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
446433d6423SLionel Sambuc }
447433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
448433d6423SLionel Sambuc }
449433d6423SLionel Sambuc
450433d6423SLionel Sambuc
451433d6423SLionel Sambuc /*******************************************************************************
452433d6423SLionel Sambuc *
453433d6423SLionel Sambuc * FUNCTION: AcpiRsConvertResourceToAml
454433d6423SLionel Sambuc *
455433d6423SLionel Sambuc * PARAMETERS: Resource - Pointer to the resource descriptor
456433d6423SLionel Sambuc * Aml - Where the AML descriptor is returned
457433d6423SLionel Sambuc * Info - Pointer to appropriate conversion table
458433d6423SLionel Sambuc *
459433d6423SLionel Sambuc * RETURN: Status
460433d6423SLionel Sambuc *
461433d6423SLionel Sambuc * DESCRIPTION: Convert an internal resource descriptor to the corresponding
462433d6423SLionel Sambuc * external AML resource descriptor.
463433d6423SLionel Sambuc *
464433d6423SLionel Sambuc ******************************************************************************/
465433d6423SLionel Sambuc
466433d6423SLionel Sambuc ACPI_STATUS
AcpiRsConvertResourceToAml(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)467433d6423SLionel Sambuc AcpiRsConvertResourceToAml (
468433d6423SLionel Sambuc ACPI_RESOURCE *Resource,
469433d6423SLionel Sambuc AML_RESOURCE *Aml,
470433d6423SLionel Sambuc ACPI_RSCONVERT_INFO *Info)
471433d6423SLionel Sambuc {
472433d6423SLionel Sambuc void *Source = NULL;
473433d6423SLionel Sambuc void *Destination;
474*29492bb7SDavid van Moolenbroek char *Target;
475433d6423SLionel Sambuc ACPI_RSDESC_SIZE AmlLength = 0;
476433d6423SLionel Sambuc UINT8 Count;
477433d6423SLionel Sambuc UINT16 Temp16 = 0;
478433d6423SLionel Sambuc UINT16 ItemCount = 0;
479433d6423SLionel Sambuc
480433d6423SLionel Sambuc
481433d6423SLionel Sambuc ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
482433d6423SLionel Sambuc
483433d6423SLionel Sambuc
484*29492bb7SDavid van Moolenbroek if (!Info)
485*29492bb7SDavid van Moolenbroek {
486*29492bb7SDavid van Moolenbroek return_ACPI_STATUS (AE_BAD_PARAMETER);
487*29492bb7SDavid van Moolenbroek }
488*29492bb7SDavid van Moolenbroek
489433d6423SLionel Sambuc /*
490433d6423SLionel Sambuc * First table entry must be ACPI_RSC_INITxxx and must contain the
491433d6423SLionel Sambuc * table length (# of table entries)
492433d6423SLionel Sambuc */
493433d6423SLionel Sambuc Count = INIT_TABLE_LENGTH (Info);
494433d6423SLionel Sambuc
495433d6423SLionel Sambuc while (Count)
496433d6423SLionel Sambuc {
497433d6423SLionel Sambuc /*
498433d6423SLionel Sambuc * Source is the internal resource descriptor,
499433d6423SLionel Sambuc * destination is the external AML byte stream buffer
500433d6423SLionel Sambuc */
501433d6423SLionel Sambuc Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
502433d6423SLionel Sambuc Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
503433d6423SLionel Sambuc
504433d6423SLionel Sambuc switch (Info->Opcode)
505433d6423SLionel Sambuc {
506433d6423SLionel Sambuc case ACPI_RSC_INITSET:
507433d6423SLionel Sambuc
508433d6423SLionel Sambuc ACPI_MEMSET (Aml, 0, INIT_RESOURCE_LENGTH (Info));
509433d6423SLionel Sambuc AmlLength = INIT_RESOURCE_LENGTH (Info);
510433d6423SLionel Sambuc AcpiRsSetResourceHeader (INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
511433d6423SLionel Sambuc break;
512433d6423SLionel Sambuc
513433d6423SLionel Sambuc case ACPI_RSC_INITGET:
514433d6423SLionel Sambuc break;
515433d6423SLionel Sambuc
516433d6423SLionel Sambuc case ACPI_RSC_FLAGINIT:
517433d6423SLionel Sambuc /*
518433d6423SLionel Sambuc * Clear the flag byte
519433d6423SLionel Sambuc */
520*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination, 0);
521433d6423SLionel Sambuc break;
522433d6423SLionel Sambuc
523433d6423SLionel Sambuc case ACPI_RSC_1BITFLAG:
524433d6423SLionel Sambuc /*
525433d6423SLionel Sambuc * Mask and shift the flag bit
526433d6423SLionel Sambuc */
527*29492bb7SDavid van Moolenbroek ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
528*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) & 0x01) << Info->Value));
529433d6423SLionel Sambuc break;
530433d6423SLionel Sambuc
531433d6423SLionel Sambuc case ACPI_RSC_2BITFLAG:
532433d6423SLionel Sambuc /*
533433d6423SLionel Sambuc * Mask and shift the flag bits
534433d6423SLionel Sambuc */
535*29492bb7SDavid van Moolenbroek ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
536*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) & 0x03) << Info->Value));
537433d6423SLionel Sambuc break;
538433d6423SLionel Sambuc
539*29492bb7SDavid van Moolenbroek case ACPI_RSC_3BITFLAG:
540*29492bb7SDavid van Moolenbroek /*
541*29492bb7SDavid van Moolenbroek * Mask and shift the flag bits
542*29492bb7SDavid van Moolenbroek */
543*29492bb7SDavid van Moolenbroek ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
544*29492bb7SDavid van Moolenbroek ((ACPI_GET8 (Source) & 0x07) << Info->Value));
545*29492bb7SDavid van Moolenbroek break;
546433d6423SLionel Sambuc
547433d6423SLionel Sambuc case ACPI_RSC_COUNT:
548433d6423SLionel Sambuc
549433d6423SLionel Sambuc ItemCount = ACPI_GET8 (Source);
550*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination, ItemCount);
551433d6423SLionel Sambuc
552433d6423SLionel Sambuc AmlLength = (UINT16) (AmlLength + (Info->Value * (ItemCount - 1)));
553433d6423SLionel Sambuc break;
554433d6423SLionel Sambuc
555433d6423SLionel Sambuc case ACPI_RSC_COUNT16:
556433d6423SLionel Sambuc
557433d6423SLionel Sambuc ItemCount = ACPI_GET16 (Source);
558433d6423SLionel Sambuc AmlLength = (UINT16) (AmlLength + ItemCount);
559433d6423SLionel Sambuc AcpiRsSetResourceLength (AmlLength, Aml);
560433d6423SLionel Sambuc break;
561433d6423SLionel Sambuc
562*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_PIN:
563*29492bb7SDavid van Moolenbroek
564*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source);
565*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, AmlLength);
566*29492bb7SDavid van Moolenbroek
567*29492bb7SDavid van Moolenbroek AmlLength = (UINT16) (AmlLength + ItemCount * 2);
568*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (void, Aml, Info->Value);
569*29492bb7SDavid van Moolenbroek ACPI_SET16 (Target, AmlLength);
570*29492bb7SDavid van Moolenbroek AcpiRsSetResourceLength (AmlLength, Aml);
571*29492bb7SDavid van Moolenbroek break;
572*29492bb7SDavid van Moolenbroek
573*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_VEN:
574*29492bb7SDavid van Moolenbroek
575*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source);
576*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount);
577*29492bb7SDavid van Moolenbroek
578*29492bb7SDavid van Moolenbroek AmlLength = (UINT16) (AmlLength + (Info->Value * ItemCount));
579*29492bb7SDavid van Moolenbroek AcpiRsSetResourceLength (AmlLength, Aml);
580*29492bb7SDavid van Moolenbroek break;
581*29492bb7SDavid van Moolenbroek
582*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_GPIO_RES:
583*29492bb7SDavid van Moolenbroek
584*29492bb7SDavid van Moolenbroek /* Set resource source string length */
585*29492bb7SDavid van Moolenbroek
586*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source);
587*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, AmlLength);
588*29492bb7SDavid van Moolenbroek
589*29492bb7SDavid van Moolenbroek /* Compute offset for the Vendor Data */
590*29492bb7SDavid van Moolenbroek
591*29492bb7SDavid van Moolenbroek AmlLength = (UINT16) (AmlLength + ItemCount);
592*29492bb7SDavid van Moolenbroek Target = ACPI_ADD_PTR (void, Aml, Info->Value);
593*29492bb7SDavid van Moolenbroek
594*29492bb7SDavid van Moolenbroek /* Set vendor offset only if there is vendor data */
595*29492bb7SDavid van Moolenbroek
596*29492bb7SDavid van Moolenbroek if (Resource->Data.Gpio.VendorLength)
597*29492bb7SDavid van Moolenbroek {
598*29492bb7SDavid van Moolenbroek ACPI_SET16 (Target, AmlLength);
599*29492bb7SDavid van Moolenbroek }
600*29492bb7SDavid van Moolenbroek
601*29492bb7SDavid van Moolenbroek AcpiRsSetResourceLength (AmlLength, Aml);
602*29492bb7SDavid van Moolenbroek break;
603*29492bb7SDavid van Moolenbroek
604*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_SERIAL_VEN:
605*29492bb7SDavid van Moolenbroek
606*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source);
607*29492bb7SDavid van Moolenbroek ACPI_SET16 (Destination, ItemCount + Info->Value);
608*29492bb7SDavid van Moolenbroek AmlLength = (UINT16) (AmlLength + ItemCount);
609*29492bb7SDavid van Moolenbroek AcpiRsSetResourceLength (AmlLength, Aml);
610*29492bb7SDavid van Moolenbroek break;
611*29492bb7SDavid van Moolenbroek
612*29492bb7SDavid van Moolenbroek case ACPI_RSC_COUNT_SERIAL_RES:
613*29492bb7SDavid van Moolenbroek
614*29492bb7SDavid van Moolenbroek ItemCount = ACPI_GET16 (Source);
615*29492bb7SDavid van Moolenbroek AmlLength = (UINT16) (AmlLength + ItemCount);
616*29492bb7SDavid van Moolenbroek AcpiRsSetResourceLength (AmlLength, Aml);
617*29492bb7SDavid van Moolenbroek break;
618433d6423SLionel Sambuc
619433d6423SLionel Sambuc case ACPI_RSC_LENGTH:
620433d6423SLionel Sambuc
621433d6423SLionel Sambuc AcpiRsSetResourceLength (Info->Value, Aml);
622433d6423SLionel Sambuc break;
623433d6423SLionel Sambuc
624433d6423SLionel Sambuc case ACPI_RSC_MOVE8:
625433d6423SLionel Sambuc case ACPI_RSC_MOVE16:
626433d6423SLionel Sambuc case ACPI_RSC_MOVE32:
627433d6423SLionel Sambuc case ACPI_RSC_MOVE64:
628433d6423SLionel Sambuc
629433d6423SLionel Sambuc if (Info->Value)
630433d6423SLionel Sambuc {
631433d6423SLionel Sambuc ItemCount = Info->Value;
632433d6423SLionel Sambuc }
633433d6423SLionel Sambuc AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
634433d6423SLionel Sambuc break;
635433d6423SLionel Sambuc
636*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_GPIO_PIN:
637*29492bb7SDavid van Moolenbroek
638*29492bb7SDavid van Moolenbroek Destination = (char *) ACPI_ADD_PTR (void, Aml,
639*29492bb7SDavid van Moolenbroek ACPI_GET16 (Destination));
640*29492bb7SDavid van Moolenbroek Source = * (UINT16 **) Source;
641*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
642*29492bb7SDavid van Moolenbroek break;
643*29492bb7SDavid van Moolenbroek
644*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_GPIO_RES:
645*29492bb7SDavid van Moolenbroek
646*29492bb7SDavid van Moolenbroek /* Used for both ResourceSource string and VendorData */
647*29492bb7SDavid van Moolenbroek
648*29492bb7SDavid van Moolenbroek Destination = (char *) ACPI_ADD_PTR (void, Aml,
649*29492bb7SDavid van Moolenbroek ACPI_GET16 (Destination));
650*29492bb7SDavid van Moolenbroek Source = * (UINT8 **) Source;
651*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
652*29492bb7SDavid van Moolenbroek break;
653*29492bb7SDavid van Moolenbroek
654*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_SERIAL_VEN:
655*29492bb7SDavid van Moolenbroek
656*29492bb7SDavid van Moolenbroek Destination = (char *) ACPI_ADD_PTR (void, Aml,
657*29492bb7SDavid van Moolenbroek (AmlLength - ItemCount));
658*29492bb7SDavid van Moolenbroek Source = * (UINT8 **) Source;
659*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
660*29492bb7SDavid van Moolenbroek break;
661*29492bb7SDavid van Moolenbroek
662*29492bb7SDavid van Moolenbroek case ACPI_RSC_MOVE_SERIAL_RES:
663*29492bb7SDavid van Moolenbroek
664*29492bb7SDavid van Moolenbroek Destination = (char *) ACPI_ADD_PTR (void, Aml,
665*29492bb7SDavid van Moolenbroek (AmlLength - ItemCount));
666*29492bb7SDavid van Moolenbroek Source = * (UINT8 **) Source;
667*29492bb7SDavid van Moolenbroek AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
668*29492bb7SDavid van Moolenbroek break;
669433d6423SLionel Sambuc
670433d6423SLionel Sambuc case ACPI_RSC_ADDRESS:
671433d6423SLionel Sambuc
672433d6423SLionel Sambuc /* Set the Resource Type, General Flags, and Type-Specific Flags */
673433d6423SLionel Sambuc
674433d6423SLionel Sambuc AcpiRsSetAddressCommon (Aml, Resource);
675433d6423SLionel Sambuc break;
676433d6423SLionel Sambuc
677433d6423SLionel Sambuc case ACPI_RSC_SOURCEX:
678433d6423SLionel Sambuc /*
679433d6423SLionel Sambuc * Optional ResourceSource (Index and String)
680433d6423SLionel Sambuc */
681433d6423SLionel Sambuc AmlLength = AcpiRsSetResourceSource (
682433d6423SLionel Sambuc Aml, (ACPI_RS_LENGTH) AmlLength, Source);
683433d6423SLionel Sambuc AcpiRsSetResourceLength (AmlLength, Aml);
684433d6423SLionel Sambuc break;
685433d6423SLionel Sambuc
686433d6423SLionel Sambuc case ACPI_RSC_SOURCE:
687433d6423SLionel Sambuc /*
688433d6423SLionel Sambuc * Optional ResourceSource (Index and String). This is the more
689433d6423SLionel Sambuc * complicated case used by the Interrupt() macro
690433d6423SLionel Sambuc */
691433d6423SLionel Sambuc AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
692433d6423SLionel Sambuc AcpiRsSetResourceLength (AmlLength, Aml);
693433d6423SLionel Sambuc break;
694433d6423SLionel Sambuc
695433d6423SLionel Sambuc case ACPI_RSC_BITMASK:
696433d6423SLionel Sambuc /*
697433d6423SLionel Sambuc * 8-bit encoded bitmask (DMA macro)
698433d6423SLionel Sambuc */
699*29492bb7SDavid van Moolenbroek ACPI_SET8 (Destination,
700433d6423SLionel Sambuc AcpiRsEncodeBitmask (Source,
701*29492bb7SDavid van Moolenbroek *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
702433d6423SLionel Sambuc break;
703433d6423SLionel Sambuc
704433d6423SLionel Sambuc case ACPI_RSC_BITMASK16:
705433d6423SLionel Sambuc /*
706433d6423SLionel Sambuc * 16-bit encoded bitmask (IRQ macro)
707433d6423SLionel Sambuc */
708433d6423SLionel Sambuc Temp16 = AcpiRsEncodeBitmask (Source,
709433d6423SLionel Sambuc *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
710433d6423SLionel Sambuc ACPI_MOVE_16_TO_16 (Destination, &Temp16);
711433d6423SLionel Sambuc break;
712433d6423SLionel Sambuc
713433d6423SLionel Sambuc case ACPI_RSC_EXIT_LE:
714433d6423SLionel Sambuc /*
715433d6423SLionel Sambuc * Control - Exit conversion if less than or equal
716433d6423SLionel Sambuc */
717433d6423SLionel Sambuc if (ItemCount <= Info->Value)
718433d6423SLionel Sambuc {
719433d6423SLionel Sambuc goto Exit;
720433d6423SLionel Sambuc }
721433d6423SLionel Sambuc break;
722433d6423SLionel Sambuc
723433d6423SLionel Sambuc case ACPI_RSC_EXIT_NE:
724433d6423SLionel Sambuc /*
725433d6423SLionel Sambuc * Control - Exit conversion if not equal
726433d6423SLionel Sambuc */
727433d6423SLionel Sambuc switch (COMPARE_OPCODE (Info))
728433d6423SLionel Sambuc {
729433d6423SLionel Sambuc case ACPI_RSC_COMPARE_VALUE:
730433d6423SLionel Sambuc
731433d6423SLionel Sambuc if (*ACPI_ADD_PTR (UINT8, Resource,
732433d6423SLionel Sambuc COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
733433d6423SLionel Sambuc {
734433d6423SLionel Sambuc goto Exit;
735433d6423SLionel Sambuc }
736433d6423SLionel Sambuc break;
737433d6423SLionel Sambuc
738433d6423SLionel Sambuc default:
739433d6423SLionel Sambuc
740433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
741433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_PARAMETER);
742433d6423SLionel Sambuc }
743433d6423SLionel Sambuc break;
744433d6423SLionel Sambuc
745433d6423SLionel Sambuc case ACPI_RSC_EXIT_EQ:
746433d6423SLionel Sambuc /*
747433d6423SLionel Sambuc * Control - Exit conversion if equal
748433d6423SLionel Sambuc */
749433d6423SLionel Sambuc if (*ACPI_ADD_PTR (UINT8, Resource,
750433d6423SLionel Sambuc COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
751433d6423SLionel Sambuc {
752433d6423SLionel Sambuc goto Exit;
753433d6423SLionel Sambuc }
754433d6423SLionel Sambuc break;
755433d6423SLionel Sambuc
756433d6423SLionel Sambuc default:
757433d6423SLionel Sambuc
758433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
759433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_PARAMETER);
760433d6423SLionel Sambuc }
761433d6423SLionel Sambuc
762433d6423SLionel Sambuc Count--;
763433d6423SLionel Sambuc Info++;
764433d6423SLionel Sambuc }
765433d6423SLionel Sambuc
766433d6423SLionel Sambuc Exit:
767433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
768433d6423SLionel Sambuc }
769433d6423SLionel Sambuc
770433d6423SLionel Sambuc
771433d6423SLionel Sambuc #if 0
772433d6423SLionel Sambuc /* Previous resource validations */
773433d6423SLionel Sambuc
774433d6423SLionel Sambuc if (Aml->ExtAddress64.RevisionID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
775433d6423SLionel Sambuc {
776433d6423SLionel Sambuc return_ACPI_STATUS (AE_SUPPORT);
777433d6423SLionel Sambuc }
778433d6423SLionel Sambuc
779433d6423SLionel Sambuc if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
780433d6423SLionel Sambuc {
781433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
782433d6423SLionel Sambuc }
783433d6423SLionel Sambuc
784433d6423SLionel Sambuc if (((Aml->Irq.Flags & 0x09) == 0x00) ||
785433d6423SLionel Sambuc ((Aml->Irq.Flags & 0x09) == 0x09))
786433d6423SLionel Sambuc {
787433d6423SLionel Sambuc /*
788433d6423SLionel Sambuc * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
789433d6423SLionel Sambuc * polarity/trigger interrupts are allowed (ACPI spec, section
790433d6423SLionel Sambuc * "IRQ Format"), so 0x00 and 0x09 are illegal.
791433d6423SLionel Sambuc */
792433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO,
793433d6423SLionel Sambuc "Invalid interrupt polarity/trigger in resource list, 0x%X",
794433d6423SLionel Sambuc Aml->Irq.Flags));
795433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_DATA);
796433d6423SLionel Sambuc }
797433d6423SLionel Sambuc
798433d6423SLionel Sambuc Resource->Data.ExtendedIrq.InterruptCount = Temp8;
799433d6423SLionel Sambuc if (Temp8 < 1)
800433d6423SLionel Sambuc {
801433d6423SLionel Sambuc /* Must have at least one IRQ */
802433d6423SLionel Sambuc
803433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
804433d6423SLionel Sambuc }
805433d6423SLionel Sambuc
806433d6423SLionel Sambuc if (Resource->Data.Dma.Transfer == 0x03)
807433d6423SLionel Sambuc {
808433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO,
809433d6423SLionel Sambuc "Invalid DMA.Transfer preference (3)"));
810433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_DATA);
811433d6423SLionel Sambuc }
812433d6423SLionel Sambuc #endif
813