xref: /minix3/minix/drivers/power/acpi/utilities/utresrc.c (revision 29492bb71c7148a089a5afafa0c99409161218df)
1433d6423SLionel Sambuc /*******************************************************************************
2433d6423SLionel Sambuc  *
3*29492bb7SDavid van Moolenbroek  * Module Name: utresrc - Resource management utilities
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"
46*29492bb7SDavid van Moolenbroek #include "acresrc.h"
47433d6423SLionel Sambuc 
48433d6423SLionel Sambuc 
49433d6423SLionel Sambuc #define _COMPONENT          ACPI_UTILITIES
50433d6423SLionel Sambuc         ACPI_MODULE_NAME    ("utresrc")
51433d6423SLionel Sambuc 
52433d6423SLionel Sambuc 
53*29492bb7SDavid van Moolenbroek #if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
54433d6423SLionel Sambuc 
55433d6423SLionel Sambuc /*
56433d6423SLionel Sambuc  * Strings used to decode resource descriptors.
57*29492bb7SDavid van Moolenbroek  * Used by both the disassembler and the debugger resource dump routines
58433d6423SLionel Sambuc  */
59433d6423SLionel Sambuc const char                      *AcpiGbl_BmDecode[] =
60433d6423SLionel Sambuc {
61433d6423SLionel Sambuc     "NotBusMaster",
62433d6423SLionel Sambuc     "BusMaster"
63433d6423SLionel Sambuc };
64433d6423SLionel Sambuc 
65433d6423SLionel Sambuc const char                      *AcpiGbl_ConfigDecode[] =
66433d6423SLionel Sambuc {
67433d6423SLionel Sambuc     "0 - Good Configuration",
68433d6423SLionel Sambuc     "1 - Acceptable Configuration",
69433d6423SLionel Sambuc     "2 - Suboptimal Configuration",
70433d6423SLionel Sambuc     "3 - ***Invalid Configuration***",
71433d6423SLionel Sambuc };
72433d6423SLionel Sambuc 
73433d6423SLionel Sambuc const char                      *AcpiGbl_ConsumeDecode[] =
74433d6423SLionel Sambuc {
75433d6423SLionel Sambuc     "ResourceProducer",
76433d6423SLionel Sambuc     "ResourceConsumer"
77433d6423SLionel Sambuc };
78433d6423SLionel Sambuc 
79433d6423SLionel Sambuc const char                      *AcpiGbl_DecDecode[] =
80433d6423SLionel Sambuc {
81433d6423SLionel Sambuc     "PosDecode",
82433d6423SLionel Sambuc     "SubDecode"
83433d6423SLionel Sambuc };
84433d6423SLionel Sambuc 
85433d6423SLionel Sambuc const char                      *AcpiGbl_HeDecode[] =
86433d6423SLionel Sambuc {
87433d6423SLionel Sambuc     "Level",
88433d6423SLionel Sambuc     "Edge"
89433d6423SLionel Sambuc };
90433d6423SLionel Sambuc 
91433d6423SLionel Sambuc const char                      *AcpiGbl_IoDecode[] =
92433d6423SLionel Sambuc {
93433d6423SLionel Sambuc     "Decode10",
94433d6423SLionel Sambuc     "Decode16"
95433d6423SLionel Sambuc };
96433d6423SLionel Sambuc 
97433d6423SLionel Sambuc const char                      *AcpiGbl_LlDecode[] =
98433d6423SLionel Sambuc {
99433d6423SLionel Sambuc     "ActiveHigh",
100*29492bb7SDavid van Moolenbroek     "ActiveLow",
101*29492bb7SDavid van Moolenbroek     "ActiveBoth",
102*29492bb7SDavid van Moolenbroek     "Reserved"
103433d6423SLionel Sambuc };
104433d6423SLionel Sambuc 
105433d6423SLionel Sambuc const char                      *AcpiGbl_MaxDecode[] =
106433d6423SLionel Sambuc {
107433d6423SLionel Sambuc     "MaxNotFixed",
108433d6423SLionel Sambuc     "MaxFixed"
109433d6423SLionel Sambuc };
110433d6423SLionel Sambuc 
111433d6423SLionel Sambuc const char                      *AcpiGbl_MemDecode[] =
112433d6423SLionel Sambuc {
113433d6423SLionel Sambuc     "NonCacheable",
114433d6423SLionel Sambuc     "Cacheable",
115433d6423SLionel Sambuc     "WriteCombining",
116433d6423SLionel Sambuc     "Prefetchable"
117433d6423SLionel Sambuc };
118433d6423SLionel Sambuc 
119433d6423SLionel Sambuc const char                      *AcpiGbl_MinDecode[] =
120433d6423SLionel Sambuc {
121433d6423SLionel Sambuc     "MinNotFixed",
122433d6423SLionel Sambuc     "MinFixed"
123433d6423SLionel Sambuc };
124433d6423SLionel Sambuc 
125433d6423SLionel Sambuc const char                      *AcpiGbl_MtpDecode[] =
126433d6423SLionel Sambuc {
127433d6423SLionel Sambuc     "AddressRangeMemory",
128433d6423SLionel Sambuc     "AddressRangeReserved",
129433d6423SLionel Sambuc     "AddressRangeACPI",
130433d6423SLionel Sambuc     "AddressRangeNVS"
131433d6423SLionel Sambuc };
132433d6423SLionel Sambuc 
133433d6423SLionel Sambuc const char                      *AcpiGbl_RngDecode[] =
134433d6423SLionel Sambuc {
135433d6423SLionel Sambuc     "InvalidRanges",
136433d6423SLionel Sambuc     "NonISAOnlyRanges",
137433d6423SLionel Sambuc     "ISAOnlyRanges",
138433d6423SLionel Sambuc     "EntireRange"
139433d6423SLionel Sambuc };
140433d6423SLionel Sambuc 
141433d6423SLionel Sambuc const char                      *AcpiGbl_RwDecode[] =
142433d6423SLionel Sambuc {
143433d6423SLionel Sambuc     "ReadOnly",
144433d6423SLionel Sambuc     "ReadWrite"
145433d6423SLionel Sambuc };
146433d6423SLionel Sambuc 
147433d6423SLionel Sambuc const char                      *AcpiGbl_ShrDecode[] =
148433d6423SLionel Sambuc {
149433d6423SLionel Sambuc     "Exclusive",
150*29492bb7SDavid van Moolenbroek     "Shared",
151*29492bb7SDavid van Moolenbroek     "ExclusiveAndWake",         /* ACPI 5.0 */
152*29492bb7SDavid van Moolenbroek     "SharedAndWake"             /* ACPI 5.0 */
153433d6423SLionel Sambuc };
154433d6423SLionel Sambuc 
155433d6423SLionel Sambuc const char                      *AcpiGbl_SizDecode[] =
156433d6423SLionel Sambuc {
157433d6423SLionel Sambuc     "Transfer8",
158433d6423SLionel Sambuc     "Transfer8_16",
159433d6423SLionel Sambuc     "Transfer16",
160433d6423SLionel Sambuc     "InvalidSize"
161433d6423SLionel Sambuc };
162433d6423SLionel Sambuc 
163433d6423SLionel Sambuc const char                      *AcpiGbl_TrsDecode[] =
164433d6423SLionel Sambuc {
165433d6423SLionel Sambuc     "DenseTranslation",
166433d6423SLionel Sambuc     "SparseTranslation"
167433d6423SLionel Sambuc };
168433d6423SLionel Sambuc 
169433d6423SLionel Sambuc const char                      *AcpiGbl_TtpDecode[] =
170433d6423SLionel Sambuc {
171433d6423SLionel Sambuc     "TypeStatic",
172433d6423SLionel Sambuc     "TypeTranslation"
173433d6423SLionel Sambuc };
174433d6423SLionel Sambuc 
175433d6423SLionel Sambuc const char                      *AcpiGbl_TypDecode[] =
176433d6423SLionel Sambuc {
177433d6423SLionel Sambuc     "Compatibility",
178433d6423SLionel Sambuc     "TypeA",
179433d6423SLionel Sambuc     "TypeB",
180433d6423SLionel Sambuc     "TypeF"
181433d6423SLionel Sambuc };
182433d6423SLionel Sambuc 
183*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_PpcDecode[] =
184*29492bb7SDavid van Moolenbroek {
185*29492bb7SDavid van Moolenbroek     "PullDefault",
186*29492bb7SDavid van Moolenbroek     "PullUp",
187*29492bb7SDavid van Moolenbroek     "PullDown",
188*29492bb7SDavid van Moolenbroek     "PullNone"
189*29492bb7SDavid van Moolenbroek };
190*29492bb7SDavid van Moolenbroek 
191*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_IorDecode[] =
192*29492bb7SDavid van Moolenbroek {
193*29492bb7SDavid van Moolenbroek     "IoRestrictionNone",
194*29492bb7SDavid van Moolenbroek     "IoRestrictionInputOnly",
195*29492bb7SDavid van Moolenbroek     "IoRestrictionOutputOnly",
196*29492bb7SDavid van Moolenbroek     "IoRestrictionNoneAndPreserve"
197*29492bb7SDavid van Moolenbroek };
198*29492bb7SDavid van Moolenbroek 
199*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_DtsDecode[] =
200*29492bb7SDavid van Moolenbroek {
201*29492bb7SDavid van Moolenbroek     "Width8bit",
202*29492bb7SDavid van Moolenbroek     "Width16bit",
203*29492bb7SDavid van Moolenbroek     "Width32bit",
204*29492bb7SDavid van Moolenbroek     "Width64bit",
205*29492bb7SDavid van Moolenbroek     "Width128bit",
206*29492bb7SDavid van Moolenbroek     "Width256bit",
207*29492bb7SDavid van Moolenbroek };
208*29492bb7SDavid van Moolenbroek 
209*29492bb7SDavid van Moolenbroek /* GPIO connection type */
210*29492bb7SDavid van Moolenbroek 
211*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_CtDecode[] =
212*29492bb7SDavid van Moolenbroek {
213*29492bb7SDavid van Moolenbroek     "Interrupt",
214*29492bb7SDavid van Moolenbroek     "I/O"
215*29492bb7SDavid van Moolenbroek };
216*29492bb7SDavid van Moolenbroek 
217*29492bb7SDavid van Moolenbroek /* Serial bus type */
218*29492bb7SDavid van Moolenbroek 
219*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_SbtDecode[] =
220*29492bb7SDavid van Moolenbroek {
221*29492bb7SDavid van Moolenbroek     "/* UNKNOWN serial bus type */",
222*29492bb7SDavid van Moolenbroek     "I2C",
223*29492bb7SDavid van Moolenbroek     "SPI",
224*29492bb7SDavid van Moolenbroek     "UART"
225*29492bb7SDavid van Moolenbroek };
226*29492bb7SDavid van Moolenbroek 
227*29492bb7SDavid van Moolenbroek /* I2C serial bus access mode */
228*29492bb7SDavid van Moolenbroek 
229*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_AmDecode[] =
230*29492bb7SDavid van Moolenbroek {
231*29492bb7SDavid van Moolenbroek     "AddressingMode7Bit",
232*29492bb7SDavid van Moolenbroek     "AddressingMode10Bit"
233*29492bb7SDavid van Moolenbroek };
234*29492bb7SDavid van Moolenbroek 
235*29492bb7SDavid van Moolenbroek /* I2C serial bus slave mode */
236*29492bb7SDavid van Moolenbroek 
237*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_SmDecode[] =
238*29492bb7SDavid van Moolenbroek {
239*29492bb7SDavid van Moolenbroek     "ControllerInitiated",
240*29492bb7SDavid van Moolenbroek     "DeviceInitiated"
241*29492bb7SDavid van Moolenbroek };
242*29492bb7SDavid van Moolenbroek 
243*29492bb7SDavid van Moolenbroek /* SPI serial bus wire mode */
244*29492bb7SDavid van Moolenbroek 
245*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_WmDecode[] =
246*29492bb7SDavid van Moolenbroek {
247*29492bb7SDavid van Moolenbroek     "FourWireMode",
248*29492bb7SDavid van Moolenbroek     "ThreeWireMode"
249*29492bb7SDavid van Moolenbroek };
250*29492bb7SDavid van Moolenbroek 
251*29492bb7SDavid van Moolenbroek /* SPI serial clock phase */
252*29492bb7SDavid van Moolenbroek 
253*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_CphDecode[] =
254*29492bb7SDavid van Moolenbroek {
255*29492bb7SDavid van Moolenbroek     "ClockPhaseFirst",
256*29492bb7SDavid van Moolenbroek     "ClockPhaseSecond"
257*29492bb7SDavid van Moolenbroek };
258*29492bb7SDavid van Moolenbroek 
259*29492bb7SDavid van Moolenbroek /* SPI serial bus clock polarity */
260*29492bb7SDavid van Moolenbroek 
261*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_CpoDecode[] =
262*29492bb7SDavid van Moolenbroek {
263*29492bb7SDavid van Moolenbroek     "ClockPolarityLow",
264*29492bb7SDavid van Moolenbroek     "ClockPolarityHigh"
265*29492bb7SDavid van Moolenbroek };
266*29492bb7SDavid van Moolenbroek 
267*29492bb7SDavid van Moolenbroek /* SPI serial bus device polarity */
268*29492bb7SDavid van Moolenbroek 
269*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_DpDecode[] =
270*29492bb7SDavid van Moolenbroek {
271*29492bb7SDavid van Moolenbroek     "PolarityLow",
272*29492bb7SDavid van Moolenbroek     "PolarityHigh"
273*29492bb7SDavid van Moolenbroek };
274*29492bb7SDavid van Moolenbroek 
275*29492bb7SDavid van Moolenbroek /* UART serial bus endian */
276*29492bb7SDavid van Moolenbroek 
277*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_EdDecode[] =
278*29492bb7SDavid van Moolenbroek {
279*29492bb7SDavid van Moolenbroek     "LittleEndian",
280*29492bb7SDavid van Moolenbroek     "BigEndian"
281*29492bb7SDavid van Moolenbroek };
282*29492bb7SDavid van Moolenbroek 
283*29492bb7SDavid van Moolenbroek /* UART serial bus bits per byte */
284*29492bb7SDavid van Moolenbroek 
285*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_BpbDecode[] =
286*29492bb7SDavid van Moolenbroek {
287*29492bb7SDavid van Moolenbroek     "DataBitsFive",
288*29492bb7SDavid van Moolenbroek     "DataBitsSix",
289*29492bb7SDavid van Moolenbroek     "DataBitsSeven",
290*29492bb7SDavid van Moolenbroek     "DataBitsEight",
291*29492bb7SDavid van Moolenbroek     "DataBitsNine",
292*29492bb7SDavid van Moolenbroek     "/* UNKNOWN Bits per byte */",
293*29492bb7SDavid van Moolenbroek     "/* UNKNOWN Bits per byte */",
294*29492bb7SDavid van Moolenbroek     "/* UNKNOWN Bits per byte */"
295*29492bb7SDavid van Moolenbroek };
296*29492bb7SDavid van Moolenbroek 
297*29492bb7SDavid van Moolenbroek /* UART serial bus stop bits */
298*29492bb7SDavid van Moolenbroek 
299*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_SbDecode[] =
300*29492bb7SDavid van Moolenbroek {
301*29492bb7SDavid van Moolenbroek     "StopBitsZero",
302*29492bb7SDavid van Moolenbroek     "StopBitsOne",
303*29492bb7SDavid van Moolenbroek     "StopBitsOnePlusHalf",
304*29492bb7SDavid van Moolenbroek     "StopBitsTwo"
305*29492bb7SDavid van Moolenbroek };
306*29492bb7SDavid van Moolenbroek 
307*29492bb7SDavid van Moolenbroek /* UART serial bus flow control */
308*29492bb7SDavid van Moolenbroek 
309*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_FcDecode[] =
310*29492bb7SDavid van Moolenbroek {
311*29492bb7SDavid van Moolenbroek     "FlowControlNone",
312*29492bb7SDavid van Moolenbroek     "FlowControlHardware",
313*29492bb7SDavid van Moolenbroek     "FlowControlXON",
314*29492bb7SDavid van Moolenbroek     "/* UNKNOWN flow control keyword */"
315*29492bb7SDavid van Moolenbroek };
316*29492bb7SDavid van Moolenbroek 
317*29492bb7SDavid van Moolenbroek /* UART serial bus parity type */
318*29492bb7SDavid van Moolenbroek 
319*29492bb7SDavid van Moolenbroek const char                      *AcpiGbl_PtDecode[] =
320*29492bb7SDavid van Moolenbroek {
321*29492bb7SDavid van Moolenbroek     "ParityTypeNone",
322*29492bb7SDavid van Moolenbroek     "ParityTypeEven",
323*29492bb7SDavid van Moolenbroek     "ParityTypeOdd",
324*29492bb7SDavid van Moolenbroek     "ParityTypeMark",
325*29492bb7SDavid van Moolenbroek     "ParityTypeSpace",
326*29492bb7SDavid van Moolenbroek     "/* UNKNOWN parity keyword */",
327*29492bb7SDavid van Moolenbroek     "/* UNKNOWN parity keyword */",
328*29492bb7SDavid van Moolenbroek     "/* UNKNOWN parity keyword */"
329*29492bb7SDavid van Moolenbroek };
330*29492bb7SDavid van Moolenbroek 
331433d6423SLionel Sambuc #endif
332433d6423SLionel Sambuc 
333433d6423SLionel Sambuc 
334433d6423SLionel Sambuc /*
335433d6423SLionel Sambuc  * Base sizes of the raw AML resource descriptors, indexed by resource type.
336433d6423SLionel Sambuc  * Zero indicates a reserved (and therefore invalid) resource type.
337433d6423SLionel Sambuc  */
338433d6423SLionel Sambuc const UINT8                 AcpiGbl_ResourceAmlSizes[] =
339433d6423SLionel Sambuc {
340433d6423SLionel Sambuc     /* Small descriptors */
341433d6423SLionel Sambuc 
342433d6423SLionel Sambuc     0,
343433d6423SLionel Sambuc     0,
344433d6423SLionel Sambuc     0,
345433d6423SLionel Sambuc     0,
346433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IRQ),
347433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_DMA),
348433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_START_DEPENDENT),
349433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_DEPENDENT),
350433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IO),
351433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_IO),
352*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_DMA),
353433d6423SLionel Sambuc     0,
354433d6423SLionel Sambuc     0,
355433d6423SLionel Sambuc     0,
356433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_VENDOR_SMALL),
357433d6423SLionel Sambuc     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_TAG),
358433d6423SLionel Sambuc 
359433d6423SLionel Sambuc     /* Large descriptors */
360433d6423SLionel Sambuc 
361433d6423SLionel Sambuc     0,
362433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY24),
363433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GENERIC_REGISTER),
364433d6423SLionel Sambuc     0,
365433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_VENDOR_LARGE),
366433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY32),
367433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_FIXED_MEMORY32),
368433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS32),
369433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS16),
370433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_IRQ),
371433d6423SLionel Sambuc     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
372*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
373*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
374*29492bb7SDavid van Moolenbroek     0,
375*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
376*29492bb7SDavid van Moolenbroek };
377*29492bb7SDavid van Moolenbroek 
378*29492bb7SDavid van Moolenbroek const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
379*29492bb7SDavid van Moolenbroek {
380*29492bb7SDavid van Moolenbroek     0,
381*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
382*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
383*29492bb7SDavid van Moolenbroek     ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
384433d6423SLionel Sambuc };
385433d6423SLionel Sambuc 
386433d6423SLionel Sambuc 
387433d6423SLionel Sambuc /*
388433d6423SLionel Sambuc  * Resource types, used to validate the resource length field.
389433d6423SLionel Sambuc  * The length of fixed-length types must match exactly, variable
390433d6423SLionel Sambuc  * lengths must meet the minimum required length, etc.
391433d6423SLionel Sambuc  * Zero indicates a reserved (and therefore invalid) resource type.
392433d6423SLionel Sambuc  */
393433d6423SLionel Sambuc static const UINT8          AcpiGbl_ResourceTypes[] =
394433d6423SLionel Sambuc {
395433d6423SLionel Sambuc     /* Small descriptors */
396433d6423SLionel Sambuc 
397433d6423SLionel Sambuc     0,
398433d6423SLionel Sambuc     0,
399433d6423SLionel Sambuc     0,
400433d6423SLionel Sambuc     0,
401*29492bb7SDavid van Moolenbroek     ACPI_SMALL_VARIABLE_LENGTH,     /* 04 IRQ */
402*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 05 DMA */
403*29492bb7SDavid van Moolenbroek     ACPI_SMALL_VARIABLE_LENGTH,     /* 06 StartDependentFunctions */
404*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 07 EndDependentFunctions */
405*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 08 IO */
406*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 09 FixedIO */
407*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 0A FixedDMA */
408433d6423SLionel Sambuc     0,
409433d6423SLionel Sambuc     0,
410433d6423SLionel Sambuc     0,
411*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 0E VendorShort */
412*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 0F EndTag */
413433d6423SLionel Sambuc 
414433d6423SLionel Sambuc     /* Large descriptors */
415433d6423SLionel Sambuc 
416433d6423SLionel Sambuc     0,
417*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 01 Memory24 */
418*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 02 GenericRegister */
419433d6423SLionel Sambuc     0,
420*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 04 VendorLong */
421*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 05 Memory32 */
422*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 06 Memory32Fixed */
423*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 07 Dword* address */
424*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 08 Word* address */
425*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 09 ExtendedIRQ */
426*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
427*29492bb7SDavid van Moolenbroek     ACPI_FIXED_LENGTH,              /* 0B Extended* address */
428*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
429*29492bb7SDavid van Moolenbroek     0,
430*29492bb7SDavid van Moolenbroek     ACPI_VARIABLE_LENGTH            /* 0E *SerialBus */
431433d6423SLionel Sambuc };
432433d6423SLionel Sambuc 
433433d6423SLionel Sambuc 
434433d6423SLionel Sambuc /*******************************************************************************
435433d6423SLionel Sambuc  *
436433d6423SLionel Sambuc  * FUNCTION:    AcpiUtWalkAmlResources
437433d6423SLionel Sambuc  *
438*29492bb7SDavid van Moolenbroek  * PARAMETERS:  WalkState           - Current walk info
439433d6423SLionel Sambuc  * PARAMETERS:  Aml                 - Pointer to the raw AML resource template
440433d6423SLionel Sambuc  *              AmlLength           - Length of the entire template
441433d6423SLionel Sambuc  *              UserFunction        - Called once for each descriptor found. If
442433d6423SLionel Sambuc  *                                    NULL, a pointer to the EndTag is returned
443433d6423SLionel Sambuc  *              Context             - Passed to UserFunction
444433d6423SLionel Sambuc  *
445433d6423SLionel Sambuc  * RETURN:      Status
446433d6423SLionel Sambuc  *
447433d6423SLionel Sambuc  * DESCRIPTION: Walk a raw AML resource list(buffer). User function called
448433d6423SLionel Sambuc  *              once for each resource found.
449433d6423SLionel Sambuc  *
450433d6423SLionel Sambuc  ******************************************************************************/
451433d6423SLionel Sambuc 
452433d6423SLionel Sambuc ACPI_STATUS
AcpiUtWalkAmlResources(ACPI_WALK_STATE * WalkState,UINT8 * Aml,ACPI_SIZE AmlLength,ACPI_WALK_AML_CALLBACK UserFunction,void ** Context)453433d6423SLionel Sambuc AcpiUtWalkAmlResources (
454*29492bb7SDavid van Moolenbroek     ACPI_WALK_STATE         *WalkState,
455433d6423SLionel Sambuc     UINT8                   *Aml,
456433d6423SLionel Sambuc     ACPI_SIZE               AmlLength,
457433d6423SLionel Sambuc     ACPI_WALK_AML_CALLBACK  UserFunction,
458*29492bb7SDavid van Moolenbroek     void                    **Context)
459433d6423SLionel Sambuc {
460433d6423SLionel Sambuc     ACPI_STATUS             Status;
461433d6423SLionel Sambuc     UINT8                   *EndAml;
462433d6423SLionel Sambuc     UINT8                   ResourceIndex;
463433d6423SLionel Sambuc     UINT32                  Length;
464433d6423SLionel Sambuc     UINT32                  Offset = 0;
465*29492bb7SDavid van Moolenbroek     UINT8                   EndTag[2] = {0x79, 0x00};
466433d6423SLionel Sambuc 
467433d6423SLionel Sambuc 
468433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (UtWalkAmlResources);
469433d6423SLionel Sambuc 
470433d6423SLionel Sambuc 
471433d6423SLionel Sambuc     /* The absolute minimum resource template is one EndTag descriptor */
472433d6423SLionel Sambuc 
473433d6423SLionel Sambuc     if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
474433d6423SLionel Sambuc     {
475433d6423SLionel Sambuc         return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
476433d6423SLionel Sambuc     }
477433d6423SLionel Sambuc 
478433d6423SLionel Sambuc     /* Point to the end of the resource template buffer */
479433d6423SLionel Sambuc 
480433d6423SLionel Sambuc     EndAml = Aml + AmlLength;
481433d6423SLionel Sambuc 
482433d6423SLionel Sambuc     /* Walk the byte list, abort on any invalid descriptor type or length */
483433d6423SLionel Sambuc 
484433d6423SLionel Sambuc     while (Aml < EndAml)
485433d6423SLionel Sambuc     {
486433d6423SLionel Sambuc         /* Validate the Resource Type and Resource Length */
487433d6423SLionel Sambuc 
488*29492bb7SDavid van Moolenbroek         Status = AcpiUtValidateResource (WalkState, Aml, &ResourceIndex);
489433d6423SLionel Sambuc         if (ACPI_FAILURE (Status))
490433d6423SLionel Sambuc         {
491*29492bb7SDavid van Moolenbroek             /*
492*29492bb7SDavid van Moolenbroek              * Exit on failure. Cannot continue because the descriptor length
493*29492bb7SDavid van Moolenbroek              * may be bogus also.
494*29492bb7SDavid van Moolenbroek              */
495433d6423SLionel Sambuc             return_ACPI_STATUS (Status);
496433d6423SLionel Sambuc         }
497433d6423SLionel Sambuc 
498433d6423SLionel Sambuc         /* Get the length of this descriptor */
499433d6423SLionel Sambuc 
500433d6423SLionel Sambuc         Length = AcpiUtGetDescriptorLength (Aml);
501433d6423SLionel Sambuc 
502433d6423SLionel Sambuc         /* Invoke the user function */
503433d6423SLionel Sambuc 
504433d6423SLionel Sambuc         if (UserFunction)
505433d6423SLionel Sambuc         {
506433d6423SLionel Sambuc             Status = UserFunction (Aml, Length, Offset, ResourceIndex, Context);
507433d6423SLionel Sambuc             if (ACPI_FAILURE (Status))
508433d6423SLionel Sambuc             {
509*29492bb7SDavid van Moolenbroek                 return_ACPI_STATUS (Status);
510433d6423SLionel Sambuc             }
511433d6423SLionel Sambuc         }
512433d6423SLionel Sambuc 
513433d6423SLionel Sambuc         /* An EndTag descriptor terminates this resource template */
514433d6423SLionel Sambuc 
515433d6423SLionel Sambuc         if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)
516433d6423SLionel Sambuc         {
517433d6423SLionel Sambuc             /*
518433d6423SLionel Sambuc              * There must be at least one more byte in the buffer for
519433d6423SLionel Sambuc              * the 2nd byte of the EndTag
520433d6423SLionel Sambuc              */
521433d6423SLionel Sambuc             if ((Aml + 1) >= EndAml)
522433d6423SLionel Sambuc             {
523433d6423SLionel Sambuc                 return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
524433d6423SLionel Sambuc             }
525433d6423SLionel Sambuc 
526433d6423SLionel Sambuc             /* Return the pointer to the EndTag if requested */
527433d6423SLionel Sambuc 
528433d6423SLionel Sambuc             if (!UserFunction)
529433d6423SLionel Sambuc             {
530*29492bb7SDavid van Moolenbroek                 *Context = Aml;
531433d6423SLionel Sambuc             }
532433d6423SLionel Sambuc 
533433d6423SLionel Sambuc             /* Normal exit */
534433d6423SLionel Sambuc 
535433d6423SLionel Sambuc             return_ACPI_STATUS (AE_OK);
536433d6423SLionel Sambuc         }
537433d6423SLionel Sambuc 
538433d6423SLionel Sambuc         Aml += Length;
539433d6423SLionel Sambuc         Offset += Length;
540433d6423SLionel Sambuc     }
541433d6423SLionel Sambuc 
542433d6423SLionel Sambuc     /* Did not find an EndTag descriptor */
543433d6423SLionel Sambuc 
544*29492bb7SDavid van Moolenbroek     if (UserFunction)
545*29492bb7SDavid van Moolenbroek     {
546*29492bb7SDavid van Moolenbroek         /* Insert an EndTag anyway. AcpiRsGetListLength always leaves room */
547*29492bb7SDavid van Moolenbroek 
548*29492bb7SDavid van Moolenbroek         (void) AcpiUtValidateResource (WalkState, EndTag, &ResourceIndex);
549*29492bb7SDavid van Moolenbroek         Status = UserFunction (EndTag, 2, Offset, ResourceIndex, Context);
550*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
551*29492bb7SDavid van Moolenbroek         {
552*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (Status);
553*29492bb7SDavid van Moolenbroek         }
554*29492bb7SDavid van Moolenbroek     }
555*29492bb7SDavid van Moolenbroek 
556*29492bb7SDavid van Moolenbroek     return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
557433d6423SLionel Sambuc }
558433d6423SLionel Sambuc 
559433d6423SLionel Sambuc 
560433d6423SLionel Sambuc /*******************************************************************************
561433d6423SLionel Sambuc  *
562433d6423SLionel Sambuc  * FUNCTION:    AcpiUtValidateResource
563433d6423SLionel Sambuc  *
564*29492bb7SDavid van Moolenbroek  * PARAMETERS:  WalkState           - Current walk info
565*29492bb7SDavid van Moolenbroek  *              Aml                 - Pointer to the raw AML resource descriptor
566433d6423SLionel Sambuc  *              ReturnIndex         - Where the resource index is returned. NULL
567433d6423SLionel Sambuc  *                                    if the index is not required.
568433d6423SLionel Sambuc  *
569433d6423SLionel Sambuc  * RETURN:      Status, and optionally the Index into the global resource tables
570433d6423SLionel Sambuc  *
571433d6423SLionel Sambuc  * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
572433d6423SLionel Sambuc  *              Type and Resource Length. Returns an index into the global
573433d6423SLionel Sambuc  *              resource information/dispatch tables for later use.
574433d6423SLionel Sambuc  *
575433d6423SLionel Sambuc  ******************************************************************************/
576433d6423SLionel Sambuc 
577433d6423SLionel Sambuc ACPI_STATUS
AcpiUtValidateResource(ACPI_WALK_STATE * WalkState,void * Aml,UINT8 * ReturnIndex)578433d6423SLionel Sambuc AcpiUtValidateResource (
579*29492bb7SDavid van Moolenbroek     ACPI_WALK_STATE         *WalkState,
580433d6423SLionel Sambuc     void                    *Aml,
581433d6423SLionel Sambuc     UINT8                   *ReturnIndex)
582433d6423SLionel Sambuc {
583*29492bb7SDavid van Moolenbroek     AML_RESOURCE            *AmlResource;
584433d6423SLionel Sambuc     UINT8                   ResourceType;
585433d6423SLionel Sambuc     UINT8                   ResourceIndex;
586433d6423SLionel Sambuc     ACPI_RS_LENGTH          ResourceLength;
587433d6423SLionel Sambuc     ACPI_RS_LENGTH          MinimumResourceLength;
588433d6423SLionel Sambuc 
589433d6423SLionel Sambuc 
590433d6423SLionel Sambuc     ACPI_FUNCTION_ENTRY ();
591433d6423SLionel Sambuc 
592433d6423SLionel Sambuc 
593433d6423SLionel Sambuc     /*
594433d6423SLionel Sambuc      * 1) Validate the ResourceType field (Byte 0)
595433d6423SLionel Sambuc      */
596433d6423SLionel Sambuc     ResourceType = ACPI_GET8 (Aml);
597433d6423SLionel Sambuc 
598433d6423SLionel Sambuc     /*
599433d6423SLionel Sambuc      * Byte 0 contains the descriptor name (Resource Type)
600433d6423SLionel Sambuc      * Examine the large/small bit in the resource header
601433d6423SLionel Sambuc      */
602433d6423SLionel Sambuc     if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
603433d6423SLionel Sambuc     {
604433d6423SLionel Sambuc         /* Verify the large resource type (name) against the max */
605433d6423SLionel Sambuc 
606433d6423SLionel Sambuc         if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
607433d6423SLionel Sambuc         {
608*29492bb7SDavid van Moolenbroek             goto InvalidResource;
609433d6423SLionel Sambuc         }
610433d6423SLionel Sambuc 
611433d6423SLionel Sambuc         /*
612433d6423SLionel Sambuc          * Large Resource Type -- bits 6:0 contain the name
613433d6423SLionel Sambuc          * Translate range 0x80-0x8B to index range 0x10-0x1B
614433d6423SLionel Sambuc          */
615433d6423SLionel Sambuc         ResourceIndex = (UINT8) (ResourceType - 0x70);
616433d6423SLionel Sambuc     }
617433d6423SLionel Sambuc     else
618433d6423SLionel Sambuc     {
619433d6423SLionel Sambuc         /*
620433d6423SLionel Sambuc          * Small Resource Type -- bits 6:3 contain the name
621433d6423SLionel Sambuc          * Shift range to index range 0x00-0x0F
622433d6423SLionel Sambuc          */
623433d6423SLionel Sambuc         ResourceIndex = (UINT8)
624433d6423SLionel Sambuc             ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
625433d6423SLionel Sambuc     }
626433d6423SLionel Sambuc 
627*29492bb7SDavid van Moolenbroek     /*
628*29492bb7SDavid van Moolenbroek      * Check validity of the resource type, via AcpiGbl_ResourceTypes. Zero
629*29492bb7SDavid van Moolenbroek      * indicates an invalid resource.
630*29492bb7SDavid van Moolenbroek      */
631433d6423SLionel Sambuc     if (!AcpiGbl_ResourceTypes[ResourceIndex])
632433d6423SLionel Sambuc     {
633*29492bb7SDavid van Moolenbroek         goto InvalidResource;
634433d6423SLionel Sambuc     }
635433d6423SLionel Sambuc 
636433d6423SLionel Sambuc     /*
637*29492bb7SDavid van Moolenbroek      * Validate the ResourceLength field. This ensures that the length
638433d6423SLionel Sambuc      * is at least reasonable, and guarantees that it is non-zero.
639433d6423SLionel Sambuc      */
640433d6423SLionel Sambuc     ResourceLength = AcpiUtGetResourceLength (Aml);
641433d6423SLionel Sambuc     MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
642433d6423SLionel Sambuc 
643433d6423SLionel Sambuc     /* Validate based upon the type of resource - fixed length or variable */
644433d6423SLionel Sambuc 
645433d6423SLionel Sambuc     switch (AcpiGbl_ResourceTypes[ResourceIndex])
646433d6423SLionel Sambuc     {
647433d6423SLionel Sambuc     case ACPI_FIXED_LENGTH:
648433d6423SLionel Sambuc 
649433d6423SLionel Sambuc         /* Fixed length resource, length must match exactly */
650433d6423SLionel Sambuc 
651433d6423SLionel Sambuc         if (ResourceLength != MinimumResourceLength)
652433d6423SLionel Sambuc         {
653*29492bb7SDavid van Moolenbroek             goto BadResourceLength;
654433d6423SLionel Sambuc         }
655433d6423SLionel Sambuc         break;
656433d6423SLionel Sambuc 
657433d6423SLionel Sambuc     case ACPI_VARIABLE_LENGTH:
658433d6423SLionel Sambuc 
659433d6423SLionel Sambuc         /* Variable length resource, length must be at least the minimum */
660433d6423SLionel Sambuc 
661433d6423SLionel Sambuc         if (ResourceLength < MinimumResourceLength)
662433d6423SLionel Sambuc         {
663*29492bb7SDavid van Moolenbroek             goto BadResourceLength;
664433d6423SLionel Sambuc         }
665433d6423SLionel Sambuc         break;
666433d6423SLionel Sambuc 
667433d6423SLionel Sambuc     case ACPI_SMALL_VARIABLE_LENGTH:
668433d6423SLionel Sambuc 
669433d6423SLionel Sambuc         /* Small variable length resource, length can be (Min) or (Min-1) */
670433d6423SLionel Sambuc 
671433d6423SLionel Sambuc         if ((ResourceLength > MinimumResourceLength) ||
672433d6423SLionel Sambuc             (ResourceLength < (MinimumResourceLength - 1)))
673433d6423SLionel Sambuc         {
674*29492bb7SDavid van Moolenbroek             goto BadResourceLength;
675433d6423SLionel Sambuc         }
676433d6423SLionel Sambuc         break;
677433d6423SLionel Sambuc 
678433d6423SLionel Sambuc     default:
679433d6423SLionel Sambuc 
680433d6423SLionel Sambuc         /* Shouldn't happen (because of validation earlier), but be sure */
681433d6423SLionel Sambuc 
682*29492bb7SDavid van Moolenbroek         goto InvalidResource;
683*29492bb7SDavid van Moolenbroek     }
684*29492bb7SDavid van Moolenbroek 
685*29492bb7SDavid van Moolenbroek     AmlResource = ACPI_CAST_PTR (AML_RESOURCE, Aml);
686*29492bb7SDavid van Moolenbroek     if (ResourceType == ACPI_RESOURCE_NAME_SERIAL_BUS)
687*29492bb7SDavid van Moolenbroek     {
688*29492bb7SDavid van Moolenbroek         /* Validate the BusType field */
689*29492bb7SDavid van Moolenbroek 
690*29492bb7SDavid van Moolenbroek         if ((AmlResource->CommonSerialBus.Type == 0) ||
691*29492bb7SDavid van Moolenbroek             (AmlResource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
692*29492bb7SDavid van Moolenbroek         {
693*29492bb7SDavid van Moolenbroek             if (WalkState)
694*29492bb7SDavid van Moolenbroek             {
695*29492bb7SDavid van Moolenbroek                 ACPI_ERROR ((AE_INFO,
696*29492bb7SDavid van Moolenbroek                     "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
697*29492bb7SDavid van Moolenbroek                     AmlResource->CommonSerialBus.Type));
698*29492bb7SDavid van Moolenbroek             }
699433d6423SLionel Sambuc             return (AE_AML_INVALID_RESOURCE_TYPE);
700433d6423SLionel Sambuc         }
701*29492bb7SDavid van Moolenbroek     }
702433d6423SLionel Sambuc 
703433d6423SLionel Sambuc     /* Optionally return the resource table index */
704433d6423SLionel Sambuc 
705433d6423SLionel Sambuc     if (ReturnIndex)
706433d6423SLionel Sambuc     {
707433d6423SLionel Sambuc         *ReturnIndex = ResourceIndex;
708433d6423SLionel Sambuc     }
709433d6423SLionel Sambuc 
710433d6423SLionel Sambuc     return (AE_OK);
711*29492bb7SDavid van Moolenbroek 
712*29492bb7SDavid van Moolenbroek 
713*29492bb7SDavid van Moolenbroek InvalidResource:
714*29492bb7SDavid van Moolenbroek 
715*29492bb7SDavid van Moolenbroek     if (WalkState)
716*29492bb7SDavid van Moolenbroek     {
717*29492bb7SDavid van Moolenbroek         ACPI_ERROR ((AE_INFO,
718*29492bb7SDavid van Moolenbroek             "Invalid/unsupported resource descriptor: Type 0x%2.2X",
719*29492bb7SDavid van Moolenbroek             ResourceType));
720*29492bb7SDavid van Moolenbroek     }
721*29492bb7SDavid van Moolenbroek     return (AE_AML_INVALID_RESOURCE_TYPE);
722*29492bb7SDavid van Moolenbroek 
723*29492bb7SDavid van Moolenbroek BadResourceLength:
724*29492bb7SDavid van Moolenbroek 
725*29492bb7SDavid van Moolenbroek     if (WalkState)
726*29492bb7SDavid van Moolenbroek     {
727*29492bb7SDavid van Moolenbroek         ACPI_ERROR ((AE_INFO,
728*29492bb7SDavid van Moolenbroek             "Invalid resource descriptor length: Type "
729*29492bb7SDavid van Moolenbroek             "0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
730*29492bb7SDavid van Moolenbroek             ResourceType, ResourceLength, MinimumResourceLength));
731*29492bb7SDavid van Moolenbroek     }
732*29492bb7SDavid van Moolenbroek     return (AE_AML_BAD_RESOURCE_LENGTH);
733433d6423SLionel Sambuc }
734433d6423SLionel Sambuc 
735433d6423SLionel Sambuc 
736433d6423SLionel Sambuc /*******************************************************************************
737433d6423SLionel Sambuc  *
738433d6423SLionel Sambuc  * FUNCTION:    AcpiUtGetResourceType
739433d6423SLionel Sambuc  *
740433d6423SLionel Sambuc  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
741433d6423SLionel Sambuc  *
742433d6423SLionel Sambuc  * RETURN:      The Resource Type with no extraneous bits (except the
743433d6423SLionel Sambuc  *              Large/Small descriptor bit -- this is left alone)
744433d6423SLionel Sambuc  *
745433d6423SLionel Sambuc  * DESCRIPTION: Extract the Resource Type/Name from the first byte of
746433d6423SLionel Sambuc  *              a resource descriptor.
747433d6423SLionel Sambuc  *
748433d6423SLionel Sambuc  ******************************************************************************/
749433d6423SLionel Sambuc 
750433d6423SLionel Sambuc UINT8
AcpiUtGetResourceType(void * Aml)751433d6423SLionel Sambuc AcpiUtGetResourceType (
752433d6423SLionel Sambuc     void                    *Aml)
753433d6423SLionel Sambuc {
754433d6423SLionel Sambuc     ACPI_FUNCTION_ENTRY ();
755433d6423SLionel Sambuc 
756433d6423SLionel Sambuc 
757433d6423SLionel Sambuc     /*
758433d6423SLionel Sambuc      * Byte 0 contains the descriptor name (Resource Type)
759433d6423SLionel Sambuc      * Examine the large/small bit in the resource header
760433d6423SLionel Sambuc      */
761433d6423SLionel Sambuc     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
762433d6423SLionel Sambuc     {
763433d6423SLionel Sambuc         /* Large Resource Type -- bits 6:0 contain the name */
764433d6423SLionel Sambuc 
765433d6423SLionel Sambuc         return (ACPI_GET8 (Aml));
766433d6423SLionel Sambuc     }
767433d6423SLionel Sambuc     else
768433d6423SLionel Sambuc     {
769433d6423SLionel Sambuc         /* Small Resource Type -- bits 6:3 contain the name */
770433d6423SLionel Sambuc 
771433d6423SLionel Sambuc         return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
772433d6423SLionel Sambuc     }
773433d6423SLionel Sambuc }
774433d6423SLionel Sambuc 
775433d6423SLionel Sambuc 
776433d6423SLionel Sambuc /*******************************************************************************
777433d6423SLionel Sambuc  *
778433d6423SLionel Sambuc  * FUNCTION:    AcpiUtGetResourceLength
779433d6423SLionel Sambuc  *
780433d6423SLionel Sambuc  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
781433d6423SLionel Sambuc  *
782433d6423SLionel Sambuc  * RETURN:      Byte Length
783433d6423SLionel Sambuc  *
784433d6423SLionel Sambuc  * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
785433d6423SLionel Sambuc  *              definition, this does not include the size of the descriptor
786433d6423SLionel Sambuc  *              header or the length field itself.
787433d6423SLionel Sambuc  *
788433d6423SLionel Sambuc  ******************************************************************************/
789433d6423SLionel Sambuc 
790433d6423SLionel Sambuc UINT16
AcpiUtGetResourceLength(void * Aml)791433d6423SLionel Sambuc AcpiUtGetResourceLength (
792433d6423SLionel Sambuc     void                    *Aml)
793433d6423SLionel Sambuc {
794433d6423SLionel Sambuc     ACPI_RS_LENGTH          ResourceLength;
795433d6423SLionel Sambuc 
796433d6423SLionel Sambuc 
797433d6423SLionel Sambuc     ACPI_FUNCTION_ENTRY ();
798433d6423SLionel Sambuc 
799433d6423SLionel Sambuc 
800433d6423SLionel Sambuc     /*
801433d6423SLionel Sambuc      * Byte 0 contains the descriptor name (Resource Type)
802433d6423SLionel Sambuc      * Examine the large/small bit in the resource header
803433d6423SLionel Sambuc      */
804433d6423SLionel Sambuc     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
805433d6423SLionel Sambuc     {
806433d6423SLionel Sambuc         /* Large Resource type -- bytes 1-2 contain the 16-bit length */
807433d6423SLionel Sambuc 
808433d6423SLionel Sambuc         ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));
809433d6423SLionel Sambuc 
810433d6423SLionel Sambuc     }
811433d6423SLionel Sambuc     else
812433d6423SLionel Sambuc     {
813433d6423SLionel Sambuc         /* Small Resource type -- bits 2:0 of byte 0 contain the length */
814433d6423SLionel Sambuc 
815433d6423SLionel Sambuc         ResourceLength = (UINT16) (ACPI_GET8 (Aml) &
816433d6423SLionel Sambuc                                     ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
817433d6423SLionel Sambuc     }
818433d6423SLionel Sambuc 
819433d6423SLionel Sambuc     return (ResourceLength);
820433d6423SLionel Sambuc }
821433d6423SLionel Sambuc 
822433d6423SLionel Sambuc 
823433d6423SLionel Sambuc /*******************************************************************************
824433d6423SLionel Sambuc  *
825433d6423SLionel Sambuc  * FUNCTION:    AcpiUtGetResourceHeaderLength
826433d6423SLionel Sambuc  *
827433d6423SLionel Sambuc  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
828433d6423SLionel Sambuc  *
829433d6423SLionel Sambuc  * RETURN:      Length of the AML header (depends on large/small descriptor)
830433d6423SLionel Sambuc  *
831433d6423SLionel Sambuc  * DESCRIPTION: Get the length of the header for this resource.
832433d6423SLionel Sambuc  *
833433d6423SLionel Sambuc  ******************************************************************************/
834433d6423SLionel Sambuc 
835433d6423SLionel Sambuc UINT8
AcpiUtGetResourceHeaderLength(void * Aml)836433d6423SLionel Sambuc AcpiUtGetResourceHeaderLength (
837433d6423SLionel Sambuc     void                    *Aml)
838433d6423SLionel Sambuc {
839433d6423SLionel Sambuc     ACPI_FUNCTION_ENTRY ();
840433d6423SLionel Sambuc 
841433d6423SLionel Sambuc 
842433d6423SLionel Sambuc     /* Examine the large/small bit in the resource header */
843433d6423SLionel Sambuc 
844433d6423SLionel Sambuc     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
845433d6423SLionel Sambuc     {
846433d6423SLionel Sambuc         return (sizeof (AML_RESOURCE_LARGE_HEADER));
847433d6423SLionel Sambuc     }
848433d6423SLionel Sambuc     else
849433d6423SLionel Sambuc     {
850433d6423SLionel Sambuc         return (sizeof (AML_RESOURCE_SMALL_HEADER));
851433d6423SLionel Sambuc     }
852433d6423SLionel Sambuc }
853433d6423SLionel Sambuc 
854433d6423SLionel Sambuc 
855433d6423SLionel Sambuc /*******************************************************************************
856433d6423SLionel Sambuc  *
857433d6423SLionel Sambuc  * FUNCTION:    AcpiUtGetDescriptorLength
858433d6423SLionel Sambuc  *
859433d6423SLionel Sambuc  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
860433d6423SLionel Sambuc  *
861433d6423SLionel Sambuc  * RETURN:      Byte length
862433d6423SLionel Sambuc  *
863433d6423SLionel Sambuc  * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
864433d6423SLionel Sambuc  *              length of the descriptor header and the length field itself.
865433d6423SLionel Sambuc  *              Used to walk descriptor lists.
866433d6423SLionel Sambuc  *
867433d6423SLionel Sambuc  ******************************************************************************/
868433d6423SLionel Sambuc 
869433d6423SLionel Sambuc UINT32
AcpiUtGetDescriptorLength(void * Aml)870433d6423SLionel Sambuc AcpiUtGetDescriptorLength (
871433d6423SLionel Sambuc     void                    *Aml)
872433d6423SLionel Sambuc {
873433d6423SLionel Sambuc     ACPI_FUNCTION_ENTRY ();
874433d6423SLionel Sambuc 
875433d6423SLionel Sambuc 
876433d6423SLionel Sambuc     /*
877433d6423SLionel Sambuc      * Get the Resource Length (does not include header length) and add
878433d6423SLionel Sambuc      * the header length (depends on if this is a small or large resource)
879433d6423SLionel Sambuc      */
880433d6423SLionel Sambuc     return (AcpiUtGetResourceLength (Aml) +
881433d6423SLionel Sambuc             AcpiUtGetResourceHeaderLength (Aml));
882433d6423SLionel Sambuc }
883433d6423SLionel Sambuc 
884433d6423SLionel Sambuc 
885433d6423SLionel Sambuc /*******************************************************************************
886433d6423SLionel Sambuc  *
887433d6423SLionel Sambuc  * FUNCTION:    AcpiUtGetResourceEndTag
888433d6423SLionel Sambuc  *
889433d6423SLionel Sambuc  * PARAMETERS:  ObjDesc         - The resource template buffer object
890433d6423SLionel Sambuc  *              EndTag          - Where the pointer to the EndTag is returned
891433d6423SLionel Sambuc  *
892433d6423SLionel Sambuc  * RETURN:      Status, pointer to the end tag
893433d6423SLionel Sambuc  *
894433d6423SLionel Sambuc  * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template
895433d6423SLionel Sambuc  *              Note: allows a buffer length of zero.
896433d6423SLionel Sambuc  *
897433d6423SLionel Sambuc  ******************************************************************************/
898433d6423SLionel Sambuc 
899433d6423SLionel Sambuc ACPI_STATUS
AcpiUtGetResourceEndTag(ACPI_OPERAND_OBJECT * ObjDesc,UINT8 ** EndTag)900433d6423SLionel Sambuc AcpiUtGetResourceEndTag (
901433d6423SLionel Sambuc     ACPI_OPERAND_OBJECT     *ObjDesc,
902433d6423SLionel Sambuc     UINT8                   **EndTag)
903433d6423SLionel Sambuc {
904433d6423SLionel Sambuc     ACPI_STATUS             Status;
905433d6423SLionel Sambuc 
906433d6423SLionel Sambuc 
907433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (UtGetResourceEndTag);
908433d6423SLionel Sambuc 
909433d6423SLionel Sambuc 
910433d6423SLionel Sambuc     /* Allow a buffer length of zero */
911433d6423SLionel Sambuc 
912433d6423SLionel Sambuc     if (!ObjDesc->Buffer.Length)
913433d6423SLionel Sambuc     {
914433d6423SLionel Sambuc         *EndTag = ObjDesc->Buffer.Pointer;
915433d6423SLionel Sambuc         return_ACPI_STATUS (AE_OK);
916433d6423SLionel Sambuc     }
917433d6423SLionel Sambuc 
918433d6423SLionel Sambuc     /* Validate the template and get a pointer to the EndTag */
919433d6423SLionel Sambuc 
920*29492bb7SDavid van Moolenbroek     Status = AcpiUtWalkAmlResources (NULL, ObjDesc->Buffer.Pointer,
921*29492bb7SDavid van Moolenbroek                 ObjDesc->Buffer.Length, NULL, (void **) EndTag);
922433d6423SLionel Sambuc 
923433d6423SLionel Sambuc     return_ACPI_STATUS (Status);
924433d6423SLionel Sambuc }
925