xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utresrc.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: utresrc - Resource managment utilities
4*a159c266SJung-uk Kim  *
5*a159c266SJung-uk Kim  ******************************************************************************/
6*a159c266SJung-uk Kim 
7*a159c266SJung-uk Kim /*
8*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
9*a159c266SJung-uk Kim  * All rights reserved.
10*a159c266SJung-uk Kim  *
11*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13*a159c266SJung-uk Kim  * are met:
14*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*a159c266SJung-uk Kim  *    without modification.
17*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*a159c266SJung-uk Kim  *    binary redistribution.
22*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25*a159c266SJung-uk Kim  *
26*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*a159c266SJung-uk Kim  * Software Foundation.
29*a159c266SJung-uk Kim  *
30*a159c266SJung-uk Kim  * NO WARRANTY
31*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*a159c266SJung-uk Kim  */
43*a159c266SJung-uk Kim 
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim #define __UTRESRC_C__
46*a159c266SJung-uk Kim 
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h>
50*a159c266SJung-uk Kim 
51*a159c266SJung-uk Kim 
52*a159c266SJung-uk Kim #define _COMPONENT          ACPI_UTILITIES
53*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("utresrc")
54*a159c266SJung-uk Kim 
55*a159c266SJung-uk Kim 
56*a159c266SJung-uk Kim #if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
57*a159c266SJung-uk Kim 
58*a159c266SJung-uk Kim /*
59*a159c266SJung-uk Kim  * Strings used to decode resource descriptors.
60*a159c266SJung-uk Kim  * Used by both the disasssembler and the debugger resource dump routines
61*a159c266SJung-uk Kim  */
62*a159c266SJung-uk Kim const char                      *AcpiGbl_BmDecode[] =
63*a159c266SJung-uk Kim {
64*a159c266SJung-uk Kim     "NotBusMaster",
65*a159c266SJung-uk Kim     "BusMaster"
66*a159c266SJung-uk Kim };
67*a159c266SJung-uk Kim 
68*a159c266SJung-uk Kim const char                      *AcpiGbl_ConfigDecode[] =
69*a159c266SJung-uk Kim {
70*a159c266SJung-uk Kim     "0 - Good Configuration",
71*a159c266SJung-uk Kim     "1 - Acceptable Configuration",
72*a159c266SJung-uk Kim     "2 - Suboptimal Configuration",
73*a159c266SJung-uk Kim     "3 - ***Invalid Configuration***",
74*a159c266SJung-uk Kim };
75*a159c266SJung-uk Kim 
76*a159c266SJung-uk Kim const char                      *AcpiGbl_ConsumeDecode[] =
77*a159c266SJung-uk Kim {
78*a159c266SJung-uk Kim     "ResourceProducer",
79*a159c266SJung-uk Kim     "ResourceConsumer"
80*a159c266SJung-uk Kim };
81*a159c266SJung-uk Kim 
82*a159c266SJung-uk Kim const char                      *AcpiGbl_DecDecode[] =
83*a159c266SJung-uk Kim {
84*a159c266SJung-uk Kim     "PosDecode",
85*a159c266SJung-uk Kim     "SubDecode"
86*a159c266SJung-uk Kim };
87*a159c266SJung-uk Kim 
88*a159c266SJung-uk Kim const char                      *AcpiGbl_HeDecode[] =
89*a159c266SJung-uk Kim {
90*a159c266SJung-uk Kim     "Level",
91*a159c266SJung-uk Kim     "Edge"
92*a159c266SJung-uk Kim };
93*a159c266SJung-uk Kim 
94*a159c266SJung-uk Kim const char                      *AcpiGbl_IoDecode[] =
95*a159c266SJung-uk Kim {
96*a159c266SJung-uk Kim     "Decode10",
97*a159c266SJung-uk Kim     "Decode16"
98*a159c266SJung-uk Kim };
99*a159c266SJung-uk Kim 
100*a159c266SJung-uk Kim const char                      *AcpiGbl_LlDecode[] =
101*a159c266SJung-uk Kim {
102*a159c266SJung-uk Kim     "ActiveHigh",
103*a159c266SJung-uk Kim     "ActiveLow"
104*a159c266SJung-uk Kim };
105*a159c266SJung-uk Kim 
106*a159c266SJung-uk Kim const char                      *AcpiGbl_MaxDecode[] =
107*a159c266SJung-uk Kim {
108*a159c266SJung-uk Kim     "MaxNotFixed",
109*a159c266SJung-uk Kim     "MaxFixed"
110*a159c266SJung-uk Kim };
111*a159c266SJung-uk Kim 
112*a159c266SJung-uk Kim const char                      *AcpiGbl_MemDecode[] =
113*a159c266SJung-uk Kim {
114*a159c266SJung-uk Kim     "NonCacheable",
115*a159c266SJung-uk Kim     "Cacheable",
116*a159c266SJung-uk Kim     "WriteCombining",
117*a159c266SJung-uk Kim     "Prefetchable"
118*a159c266SJung-uk Kim };
119*a159c266SJung-uk Kim 
120*a159c266SJung-uk Kim const char                      *AcpiGbl_MinDecode[] =
121*a159c266SJung-uk Kim {
122*a159c266SJung-uk Kim     "MinNotFixed",
123*a159c266SJung-uk Kim     "MinFixed"
124*a159c266SJung-uk Kim };
125*a159c266SJung-uk Kim 
126*a159c266SJung-uk Kim const char                      *AcpiGbl_MtpDecode[] =
127*a159c266SJung-uk Kim {
128*a159c266SJung-uk Kim     "AddressRangeMemory",
129*a159c266SJung-uk Kim     "AddressRangeReserved",
130*a159c266SJung-uk Kim     "AddressRangeACPI",
131*a159c266SJung-uk Kim     "AddressRangeNVS"
132*a159c266SJung-uk Kim };
133*a159c266SJung-uk Kim 
134*a159c266SJung-uk Kim const char                      *AcpiGbl_RngDecode[] =
135*a159c266SJung-uk Kim {
136*a159c266SJung-uk Kim     "InvalidRanges",
137*a159c266SJung-uk Kim     "NonISAOnlyRanges",
138*a159c266SJung-uk Kim     "ISAOnlyRanges",
139*a159c266SJung-uk Kim     "EntireRange"
140*a159c266SJung-uk Kim };
141*a159c266SJung-uk Kim 
142*a159c266SJung-uk Kim const char                      *AcpiGbl_RwDecode[] =
143*a159c266SJung-uk Kim {
144*a159c266SJung-uk Kim     "ReadOnly",
145*a159c266SJung-uk Kim     "ReadWrite"
146*a159c266SJung-uk Kim };
147*a159c266SJung-uk Kim 
148*a159c266SJung-uk Kim const char                      *AcpiGbl_ShrDecode[] =
149*a159c266SJung-uk Kim {
150*a159c266SJung-uk Kim     "Exclusive",
151*a159c266SJung-uk Kim     "Shared"
152*a159c266SJung-uk Kim };
153*a159c266SJung-uk Kim 
154*a159c266SJung-uk Kim const char                      *AcpiGbl_SizDecode[] =
155*a159c266SJung-uk Kim {
156*a159c266SJung-uk Kim     "Transfer8",
157*a159c266SJung-uk Kim     "Transfer8_16",
158*a159c266SJung-uk Kim     "Transfer16",
159*a159c266SJung-uk Kim     "InvalidSize"
160*a159c266SJung-uk Kim };
161*a159c266SJung-uk Kim 
162*a159c266SJung-uk Kim const char                      *AcpiGbl_TrsDecode[] =
163*a159c266SJung-uk Kim {
164*a159c266SJung-uk Kim     "DenseTranslation",
165*a159c266SJung-uk Kim     "SparseTranslation"
166*a159c266SJung-uk Kim };
167*a159c266SJung-uk Kim 
168*a159c266SJung-uk Kim const char                      *AcpiGbl_TtpDecode[] =
169*a159c266SJung-uk Kim {
170*a159c266SJung-uk Kim     "TypeStatic",
171*a159c266SJung-uk Kim     "TypeTranslation"
172*a159c266SJung-uk Kim };
173*a159c266SJung-uk Kim 
174*a159c266SJung-uk Kim const char                      *AcpiGbl_TypDecode[] =
175*a159c266SJung-uk Kim {
176*a159c266SJung-uk Kim     "Compatibility",
177*a159c266SJung-uk Kim     "TypeA",
178*a159c266SJung-uk Kim     "TypeB",
179*a159c266SJung-uk Kim     "TypeF"
180*a159c266SJung-uk Kim };
181*a159c266SJung-uk Kim 
182*a159c266SJung-uk Kim const char                      *AcpiGbl_PpcDecode[] =
183*a159c266SJung-uk Kim {
184*a159c266SJung-uk Kim     "PullDefault",
185*a159c266SJung-uk Kim     "PullUp",
186*a159c266SJung-uk Kim     "PullDown",
187*a159c266SJung-uk Kim     "PullNone"
188*a159c266SJung-uk Kim };
189*a159c266SJung-uk Kim 
190*a159c266SJung-uk Kim const char                      *AcpiGbl_IorDecode[] =
191*a159c266SJung-uk Kim {
192*a159c266SJung-uk Kim     "IoRestrictionNone",
193*a159c266SJung-uk Kim     "IoRestrictionInputOnly",
194*a159c266SJung-uk Kim     "IoRestrictionOutputOnly",
195*a159c266SJung-uk Kim     "IoRestrictionNoneAndPreserve"
196*a159c266SJung-uk Kim };
197*a159c266SJung-uk Kim 
198*a159c266SJung-uk Kim const char                      *AcpiGbl_DtsDecode[] =
199*a159c266SJung-uk Kim {
200*a159c266SJung-uk Kim     "Width8bit",
201*a159c266SJung-uk Kim     "Width16bit",
202*a159c266SJung-uk Kim     "Width32bit",
203*a159c266SJung-uk Kim     "Width64bit",
204*a159c266SJung-uk Kim     "Width128bit",
205*a159c266SJung-uk Kim     "Width256bit",
206*a159c266SJung-uk Kim };
207*a159c266SJung-uk Kim 
208*a159c266SJung-uk Kim /* GPIO connection type */
209*a159c266SJung-uk Kim 
210*a159c266SJung-uk Kim const char                      *AcpiGbl_CtDecode[] =
211*a159c266SJung-uk Kim {
212*a159c266SJung-uk Kim     "Interrupt",
213*a159c266SJung-uk Kim     "I/O"
214*a159c266SJung-uk Kim };
215*a159c266SJung-uk Kim 
216*a159c266SJung-uk Kim /* Serial bus type */
217*a159c266SJung-uk Kim 
218*a159c266SJung-uk Kim const char                      *AcpiGbl_SbtDecode[] =
219*a159c266SJung-uk Kim {
220*a159c266SJung-uk Kim     "/* UNKNOWN serial bus type */",
221*a159c266SJung-uk Kim     "I2C",
222*a159c266SJung-uk Kim     "SPI",
223*a159c266SJung-uk Kim     "UART"
224*a159c266SJung-uk Kim };
225*a159c266SJung-uk Kim 
226*a159c266SJung-uk Kim /* I2C serial bus access mode */
227*a159c266SJung-uk Kim 
228*a159c266SJung-uk Kim const char                      *AcpiGbl_AmDecode[] =
229*a159c266SJung-uk Kim {
230*a159c266SJung-uk Kim     "AddressingMode7Bit",
231*a159c266SJung-uk Kim     "AddressingMode10Bit"
232*a159c266SJung-uk Kim };
233*a159c266SJung-uk Kim 
234*a159c266SJung-uk Kim /* I2C serial bus slave mode */
235*a159c266SJung-uk Kim 
236*a159c266SJung-uk Kim const char                      *AcpiGbl_SmDecode[] =
237*a159c266SJung-uk Kim {
238*a159c266SJung-uk Kim     "ControllerInitiated",
239*a159c266SJung-uk Kim     "DeviceInitiated"
240*a159c266SJung-uk Kim };
241*a159c266SJung-uk Kim 
242*a159c266SJung-uk Kim /* SPI serial bus wire mode */
243*a159c266SJung-uk Kim 
244*a159c266SJung-uk Kim const char                      *AcpiGbl_WmDecode[] =
245*a159c266SJung-uk Kim {
246*a159c266SJung-uk Kim     "FourWireMode",
247*a159c266SJung-uk Kim     "ThreeWireMode"
248*a159c266SJung-uk Kim };
249*a159c266SJung-uk Kim 
250*a159c266SJung-uk Kim /* SPI serial clock phase */
251*a159c266SJung-uk Kim 
252*a159c266SJung-uk Kim const char                      *AcpiGbl_CphDecode[] =
253*a159c266SJung-uk Kim {
254*a159c266SJung-uk Kim     "ClockPhaseFirst",
255*a159c266SJung-uk Kim     "ClockPhaseSecond"
256*a159c266SJung-uk Kim };
257*a159c266SJung-uk Kim 
258*a159c266SJung-uk Kim /* SPI serial bus clock polarity */
259*a159c266SJung-uk Kim 
260*a159c266SJung-uk Kim const char                      *AcpiGbl_CpoDecode[] =
261*a159c266SJung-uk Kim {
262*a159c266SJung-uk Kim     "ClockPolarityLow",
263*a159c266SJung-uk Kim     "ClockPolarityHigh"
264*a159c266SJung-uk Kim };
265*a159c266SJung-uk Kim 
266*a159c266SJung-uk Kim /* SPI serial bus device polarity */
267*a159c266SJung-uk Kim 
268*a159c266SJung-uk Kim const char                      *AcpiGbl_DpDecode[] =
269*a159c266SJung-uk Kim {
270*a159c266SJung-uk Kim     "PolarityLow",
271*a159c266SJung-uk Kim     "PolarityHigh"
272*a159c266SJung-uk Kim };
273*a159c266SJung-uk Kim 
274*a159c266SJung-uk Kim /* UART serial bus endian */
275*a159c266SJung-uk Kim 
276*a159c266SJung-uk Kim const char                      *AcpiGbl_EdDecode[] =
277*a159c266SJung-uk Kim {
278*a159c266SJung-uk Kim     "LittleEndian",
279*a159c266SJung-uk Kim     "BigEndian"
280*a159c266SJung-uk Kim };
281*a159c266SJung-uk Kim 
282*a159c266SJung-uk Kim /* UART serial bus bits per byte */
283*a159c266SJung-uk Kim 
284*a159c266SJung-uk Kim const char                      *AcpiGbl_BpbDecode[] =
285*a159c266SJung-uk Kim {
286*a159c266SJung-uk Kim     "DataBitsFive",
287*a159c266SJung-uk Kim     "DataBitsSix",
288*a159c266SJung-uk Kim     "DataBitsSeven",
289*a159c266SJung-uk Kim     "DataBitsEight",
290*a159c266SJung-uk Kim     "DataBitsNine",
291*a159c266SJung-uk Kim     "/* UNKNOWN Bits per byte */",
292*a159c266SJung-uk Kim     "/* UNKNOWN Bits per byte */",
293*a159c266SJung-uk Kim     "/* UNKNOWN Bits per byte */"
294*a159c266SJung-uk Kim };
295*a159c266SJung-uk Kim 
296*a159c266SJung-uk Kim /* UART serial bus stop bits */
297*a159c266SJung-uk Kim 
298*a159c266SJung-uk Kim const char                      *AcpiGbl_SbDecode[] =
299*a159c266SJung-uk Kim {
300*a159c266SJung-uk Kim     "StopBitsNone",
301*a159c266SJung-uk Kim     "StopBitsOne",
302*a159c266SJung-uk Kim     "StopBitsOnePlusHalf",
303*a159c266SJung-uk Kim     "StopBitsTwo"
304*a159c266SJung-uk Kim };
305*a159c266SJung-uk Kim 
306*a159c266SJung-uk Kim /* UART serial bus flow control */
307*a159c266SJung-uk Kim 
308*a159c266SJung-uk Kim const char                      *AcpiGbl_FcDecode[] =
309*a159c266SJung-uk Kim {
310*a159c266SJung-uk Kim     "FlowControlNone",
311*a159c266SJung-uk Kim     "FlowControlHardware",
312*a159c266SJung-uk Kim     "FlowControlXON",
313*a159c266SJung-uk Kim     "/* UNKNOWN flow control keyword */"
314*a159c266SJung-uk Kim };
315*a159c266SJung-uk Kim 
316*a159c266SJung-uk Kim /* UART serial bus parity type */
317*a159c266SJung-uk Kim 
318*a159c266SJung-uk Kim const char                      *AcpiGbl_PtDecode[] =
319*a159c266SJung-uk Kim {
320*a159c266SJung-uk Kim     "ParityTypeNone",
321*a159c266SJung-uk Kim     "ParityTypeEven",
322*a159c266SJung-uk Kim     "ParityTypeOdd",
323*a159c266SJung-uk Kim     "ParityTypeMark",
324*a159c266SJung-uk Kim     "ParityTypeSpace",
325*a159c266SJung-uk Kim     "/* UNKNOWN parity keyword */",
326*a159c266SJung-uk Kim     "/* UNKNOWN parity keyword */",
327*a159c266SJung-uk Kim     "/* UNKNOWN parity keyword */"
328*a159c266SJung-uk Kim };
329*a159c266SJung-uk Kim 
330*a159c266SJung-uk Kim #endif
331*a159c266SJung-uk Kim 
332*a159c266SJung-uk Kim 
333*a159c266SJung-uk Kim /*
334*a159c266SJung-uk Kim  * Base sizes of the raw AML resource descriptors, indexed by resource type.
335*a159c266SJung-uk Kim  * Zero indicates a reserved (and therefore invalid) resource type.
336*a159c266SJung-uk Kim  */
337*a159c266SJung-uk Kim const UINT8                 AcpiGbl_ResourceAmlSizes[] =
338*a159c266SJung-uk Kim {
339*a159c266SJung-uk Kim     /* Small descriptors */
340*a159c266SJung-uk Kim 
341*a159c266SJung-uk Kim     0,
342*a159c266SJung-uk Kim     0,
343*a159c266SJung-uk Kim     0,
344*a159c266SJung-uk Kim     0,
345*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IRQ),
346*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_DMA),
347*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_START_DEPENDENT),
348*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_DEPENDENT),
349*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IO),
350*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_IO),
351*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_DMA),
352*a159c266SJung-uk Kim     0,
353*a159c266SJung-uk Kim     0,
354*a159c266SJung-uk Kim     0,
355*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_VENDOR_SMALL),
356*a159c266SJung-uk Kim     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_TAG),
357*a159c266SJung-uk Kim 
358*a159c266SJung-uk Kim     /* Large descriptors */
359*a159c266SJung-uk Kim 
360*a159c266SJung-uk Kim     0,
361*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY24),
362*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GENERIC_REGISTER),
363*a159c266SJung-uk Kim     0,
364*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_VENDOR_LARGE),
365*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY32),
366*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_FIXED_MEMORY32),
367*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS32),
368*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS16),
369*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_IRQ),
370*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
371*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
372*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
373*a159c266SJung-uk Kim     0,
374*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
375*a159c266SJung-uk Kim };
376*a159c266SJung-uk Kim 
377*a159c266SJung-uk Kim const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
378*a159c266SJung-uk Kim {
379*a159c266SJung-uk Kim     0,
380*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
381*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
382*a159c266SJung-uk Kim     ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
383*a159c266SJung-uk Kim };
384*a159c266SJung-uk Kim 
385*a159c266SJung-uk Kim 
386*a159c266SJung-uk Kim /*
387*a159c266SJung-uk Kim  * Resource types, used to validate the resource length field.
388*a159c266SJung-uk Kim  * The length of fixed-length types must match exactly, variable
389*a159c266SJung-uk Kim  * lengths must meet the minimum required length, etc.
390*a159c266SJung-uk Kim  * Zero indicates a reserved (and therefore invalid) resource type.
391*a159c266SJung-uk Kim  */
392*a159c266SJung-uk Kim static const UINT8          AcpiGbl_ResourceTypes[] =
393*a159c266SJung-uk Kim {
394*a159c266SJung-uk Kim     /* Small descriptors */
395*a159c266SJung-uk Kim 
396*a159c266SJung-uk Kim     0,
397*a159c266SJung-uk Kim     0,
398*a159c266SJung-uk Kim     0,
399*a159c266SJung-uk Kim     0,
400*a159c266SJung-uk Kim     ACPI_SMALL_VARIABLE_LENGTH,     /* 04 IRQ */
401*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 05 DMA */
402*a159c266SJung-uk Kim     ACPI_SMALL_VARIABLE_LENGTH,     /* 06 StartDependentFunctions */
403*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 07 EndDependentFunctions */
404*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 08 IO */
405*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 09 FixedIO */
406*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 0A FixedDMA */
407*a159c266SJung-uk Kim     0,
408*a159c266SJung-uk Kim     0,
409*a159c266SJung-uk Kim     0,
410*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 0E VendorShort */
411*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 0F EndTag */
412*a159c266SJung-uk Kim 
413*a159c266SJung-uk Kim     /* Large descriptors */
414*a159c266SJung-uk Kim 
415*a159c266SJung-uk Kim     0,
416*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 01 Memory24 */
417*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 02 GenericRegister */
418*a159c266SJung-uk Kim     0,
419*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 04 VendorLong */
420*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 05 Memory32 */
421*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 06 Memory32Fixed */
422*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 07 Dword* address */
423*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 08 Word* address */
424*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 09 ExtendedIRQ */
425*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
426*a159c266SJung-uk Kim     ACPI_FIXED_LENGTH,              /* 0B Extended* address */
427*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
428*a159c266SJung-uk Kim     0,
429*a159c266SJung-uk Kim     ACPI_VARIABLE_LENGTH            /* 0E *SerialBus */
430*a159c266SJung-uk Kim };
431*a159c266SJung-uk Kim 
432*a159c266SJung-uk Kim /*
433*a159c266SJung-uk Kim  * For the iASL compiler/disassembler, we don't want any error messages
434*a159c266SJung-uk Kim  * because the disassembler uses the resource validation code to determine
435*a159c266SJung-uk Kim  * if Buffer objects are actually Resource Templates.
436*a159c266SJung-uk Kim  */
437*a159c266SJung-uk Kim #ifdef ACPI_ASL_COMPILER
438*a159c266SJung-uk Kim #define ACPI_RESOURCE_ERROR(plist)
439*a159c266SJung-uk Kim #else
440*a159c266SJung-uk Kim #define ACPI_RESOURCE_ERROR(plist)  ACPI_ERROR(plist)
441*a159c266SJung-uk Kim #endif
442*a159c266SJung-uk Kim 
443*a159c266SJung-uk Kim 
444*a159c266SJung-uk Kim /*******************************************************************************
445*a159c266SJung-uk Kim  *
446*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtWalkAmlResources
447*a159c266SJung-uk Kim  *
448*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource template
449*a159c266SJung-uk Kim  *              AmlLength       - Length of the entire template
450*a159c266SJung-uk Kim  *              UserFunction    - Called once for each descriptor found. If
451*a159c266SJung-uk Kim  *                                NULL, a pointer to the EndTag is returned
452*a159c266SJung-uk Kim  *              Context         - Passed to UserFunction
453*a159c266SJung-uk Kim  *
454*a159c266SJung-uk Kim  * RETURN:      Status
455*a159c266SJung-uk Kim  *
456*a159c266SJung-uk Kim  * DESCRIPTION: Walk a raw AML resource list(buffer). User function called
457*a159c266SJung-uk Kim  *              once for each resource found.
458*a159c266SJung-uk Kim  *
459*a159c266SJung-uk Kim  ******************************************************************************/
460*a159c266SJung-uk Kim 
461*a159c266SJung-uk Kim ACPI_STATUS
462*a159c266SJung-uk Kim AcpiUtWalkAmlResources (
463*a159c266SJung-uk Kim     UINT8                   *Aml,
464*a159c266SJung-uk Kim     ACPI_SIZE               AmlLength,
465*a159c266SJung-uk Kim     ACPI_WALK_AML_CALLBACK  UserFunction,
466*a159c266SJung-uk Kim     void                    *Context)
467*a159c266SJung-uk Kim {
468*a159c266SJung-uk Kim     ACPI_STATUS             Status;
469*a159c266SJung-uk Kim     UINT8                   *EndAml;
470*a159c266SJung-uk Kim     UINT8                   ResourceIndex;
471*a159c266SJung-uk Kim     UINT32                  Length;
472*a159c266SJung-uk Kim     UINT32                  Offset = 0;
473*a159c266SJung-uk Kim     UINT8                   EndTag[2] = {0x79, 0x00};
474*a159c266SJung-uk Kim 
475*a159c266SJung-uk Kim 
476*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (UtWalkAmlResources);
477*a159c266SJung-uk Kim 
478*a159c266SJung-uk Kim 
479*a159c266SJung-uk Kim     /* The absolute minimum resource template is one EndTag descriptor */
480*a159c266SJung-uk Kim 
481*a159c266SJung-uk Kim     if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
482*a159c266SJung-uk Kim     {
483*a159c266SJung-uk Kim         return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
484*a159c266SJung-uk Kim     }
485*a159c266SJung-uk Kim 
486*a159c266SJung-uk Kim     /* Point to the end of the resource template buffer */
487*a159c266SJung-uk Kim 
488*a159c266SJung-uk Kim     EndAml = Aml + AmlLength;
489*a159c266SJung-uk Kim 
490*a159c266SJung-uk Kim     /* Walk the byte list, abort on any invalid descriptor type or length */
491*a159c266SJung-uk Kim 
492*a159c266SJung-uk Kim     while (Aml < EndAml)
493*a159c266SJung-uk Kim     {
494*a159c266SJung-uk Kim         /* Validate the Resource Type and Resource Length */
495*a159c266SJung-uk Kim 
496*a159c266SJung-uk Kim         Status = AcpiUtValidateResource (Aml, &ResourceIndex);
497*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
498*a159c266SJung-uk Kim         {
499*a159c266SJung-uk Kim             /*
500*a159c266SJung-uk Kim              * Exit on failure. Cannot continue because the descriptor length
501*a159c266SJung-uk Kim              * may be bogus also.
502*a159c266SJung-uk Kim              */
503*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
504*a159c266SJung-uk Kim         }
505*a159c266SJung-uk Kim 
506*a159c266SJung-uk Kim         /* Get the length of this descriptor */
507*a159c266SJung-uk Kim 
508*a159c266SJung-uk Kim         Length = AcpiUtGetDescriptorLength (Aml);
509*a159c266SJung-uk Kim 
510*a159c266SJung-uk Kim         /* Invoke the user function */
511*a159c266SJung-uk Kim 
512*a159c266SJung-uk Kim         if (UserFunction)
513*a159c266SJung-uk Kim         {
514*a159c266SJung-uk Kim             Status = UserFunction (Aml, Length, Offset, ResourceIndex, Context);
515*a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
516*a159c266SJung-uk Kim             {
517*a159c266SJung-uk Kim                 return_ACPI_STATUS (Status);
518*a159c266SJung-uk Kim             }
519*a159c266SJung-uk Kim         }
520*a159c266SJung-uk Kim 
521*a159c266SJung-uk Kim         /* An EndTag descriptor terminates this resource template */
522*a159c266SJung-uk Kim 
523*a159c266SJung-uk Kim         if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)
524*a159c266SJung-uk Kim         {
525*a159c266SJung-uk Kim             /*
526*a159c266SJung-uk Kim              * There must be at least one more byte in the buffer for
527*a159c266SJung-uk Kim              * the 2nd byte of the EndTag
528*a159c266SJung-uk Kim              */
529*a159c266SJung-uk Kim             if ((Aml + 1) >= EndAml)
530*a159c266SJung-uk Kim             {
531*a159c266SJung-uk Kim                 return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
532*a159c266SJung-uk Kim             }
533*a159c266SJung-uk Kim 
534*a159c266SJung-uk Kim             /* Return the pointer to the EndTag if requested */
535*a159c266SJung-uk Kim 
536*a159c266SJung-uk Kim             if (!UserFunction)
537*a159c266SJung-uk Kim             {
538*a159c266SJung-uk Kim                 *(void **) Context = Aml;
539*a159c266SJung-uk Kim             }
540*a159c266SJung-uk Kim 
541*a159c266SJung-uk Kim             /* Normal exit */
542*a159c266SJung-uk Kim 
543*a159c266SJung-uk Kim             return_ACPI_STATUS (AE_OK);
544*a159c266SJung-uk Kim         }
545*a159c266SJung-uk Kim 
546*a159c266SJung-uk Kim         Aml += Length;
547*a159c266SJung-uk Kim         Offset += Length;
548*a159c266SJung-uk Kim     }
549*a159c266SJung-uk Kim 
550*a159c266SJung-uk Kim     /* Did not find an EndTag descriptor */
551*a159c266SJung-uk Kim 
552*a159c266SJung-uk Kim     if (UserFunction)
553*a159c266SJung-uk Kim     {
554*a159c266SJung-uk Kim         /* Insert an EndTag anyway. AcpiRsGetListLength always leaves room */
555*a159c266SJung-uk Kim 
556*a159c266SJung-uk Kim         (void) AcpiUtValidateResource (EndTag, &ResourceIndex);
557*a159c266SJung-uk Kim         Status = UserFunction (EndTag, 2, Offset, ResourceIndex, Context);
558*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
559*a159c266SJung-uk Kim         {
560*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
561*a159c266SJung-uk Kim         }
562*a159c266SJung-uk Kim     }
563*a159c266SJung-uk Kim 
564*a159c266SJung-uk Kim     return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
565*a159c266SJung-uk Kim }
566*a159c266SJung-uk Kim 
567*a159c266SJung-uk Kim 
568*a159c266SJung-uk Kim /*******************************************************************************
569*a159c266SJung-uk Kim  *
570*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtValidateResource
571*a159c266SJung-uk Kim  *
572*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
573*a159c266SJung-uk Kim  *              ReturnIndex     - Where the resource index is returned. NULL
574*a159c266SJung-uk Kim  *                                if the index is not required.
575*a159c266SJung-uk Kim  *
576*a159c266SJung-uk Kim  * RETURN:      Status, and optionally the Index into the global resource tables
577*a159c266SJung-uk Kim  *
578*a159c266SJung-uk Kim  * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
579*a159c266SJung-uk Kim  *              Type and Resource Length. Returns an index into the global
580*a159c266SJung-uk Kim  *              resource information/dispatch tables for later use.
581*a159c266SJung-uk Kim  *
582*a159c266SJung-uk Kim  ******************************************************************************/
583*a159c266SJung-uk Kim 
584*a159c266SJung-uk Kim ACPI_STATUS
585*a159c266SJung-uk Kim AcpiUtValidateResource (
586*a159c266SJung-uk Kim     void                    *Aml,
587*a159c266SJung-uk Kim     UINT8                   *ReturnIndex)
588*a159c266SJung-uk Kim {
589*a159c266SJung-uk Kim     AML_RESOURCE            *AmlResource;
590*a159c266SJung-uk Kim     UINT8                   ResourceType;
591*a159c266SJung-uk Kim     UINT8                   ResourceIndex;
592*a159c266SJung-uk Kim     ACPI_RS_LENGTH          ResourceLength;
593*a159c266SJung-uk Kim     ACPI_RS_LENGTH          MinimumResourceLength;
594*a159c266SJung-uk Kim 
595*a159c266SJung-uk Kim 
596*a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
597*a159c266SJung-uk Kim 
598*a159c266SJung-uk Kim 
599*a159c266SJung-uk Kim     /*
600*a159c266SJung-uk Kim      * 1) Validate the ResourceType field (Byte 0)
601*a159c266SJung-uk Kim      */
602*a159c266SJung-uk Kim     ResourceType = ACPI_GET8 (Aml);
603*a159c266SJung-uk Kim 
604*a159c266SJung-uk Kim     /*
605*a159c266SJung-uk Kim      * Byte 0 contains the descriptor name (Resource Type)
606*a159c266SJung-uk Kim      * Examine the large/small bit in the resource header
607*a159c266SJung-uk Kim      */
608*a159c266SJung-uk Kim     if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
609*a159c266SJung-uk Kim     {
610*a159c266SJung-uk Kim         /* Verify the large resource type (name) against the max */
611*a159c266SJung-uk Kim 
612*a159c266SJung-uk Kim         if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
613*a159c266SJung-uk Kim         {
614*a159c266SJung-uk Kim             goto InvalidResource;
615*a159c266SJung-uk Kim         }
616*a159c266SJung-uk Kim 
617*a159c266SJung-uk Kim         /*
618*a159c266SJung-uk Kim          * Large Resource Type -- bits 6:0 contain the name
619*a159c266SJung-uk Kim          * Translate range 0x80-0x8B to index range 0x10-0x1B
620*a159c266SJung-uk Kim          */
621*a159c266SJung-uk Kim         ResourceIndex = (UINT8) (ResourceType - 0x70);
622*a159c266SJung-uk Kim     }
623*a159c266SJung-uk Kim     else
624*a159c266SJung-uk Kim     {
625*a159c266SJung-uk Kim         /*
626*a159c266SJung-uk Kim          * Small Resource Type -- bits 6:3 contain the name
627*a159c266SJung-uk Kim          * Shift range to index range 0x00-0x0F
628*a159c266SJung-uk Kim          */
629*a159c266SJung-uk Kim         ResourceIndex = (UINT8)
630*a159c266SJung-uk Kim             ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
631*a159c266SJung-uk Kim     }
632*a159c266SJung-uk Kim 
633*a159c266SJung-uk Kim     /*
634*a159c266SJung-uk Kim      * Check validity of the resource type, via AcpiGbl_ResourceTypes. Zero
635*a159c266SJung-uk Kim      * indicates an invalid resource.
636*a159c266SJung-uk Kim      */
637*a159c266SJung-uk Kim     if (!AcpiGbl_ResourceTypes[ResourceIndex])
638*a159c266SJung-uk Kim     {
639*a159c266SJung-uk Kim         goto InvalidResource;
640*a159c266SJung-uk Kim     }
641*a159c266SJung-uk Kim 
642*a159c266SJung-uk Kim     /*
643*a159c266SJung-uk Kim      * Validate the ResourceLength field. This ensures that the length
644*a159c266SJung-uk Kim      * is at least reasonable, and guarantees that it is non-zero.
645*a159c266SJung-uk Kim      */
646*a159c266SJung-uk Kim     ResourceLength = AcpiUtGetResourceLength (Aml);
647*a159c266SJung-uk Kim     MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
648*a159c266SJung-uk Kim 
649*a159c266SJung-uk Kim     /* Validate based upon the type of resource - fixed length or variable */
650*a159c266SJung-uk Kim 
651*a159c266SJung-uk Kim     switch (AcpiGbl_ResourceTypes[ResourceIndex])
652*a159c266SJung-uk Kim     {
653*a159c266SJung-uk Kim     case ACPI_FIXED_LENGTH:
654*a159c266SJung-uk Kim 
655*a159c266SJung-uk Kim         /* Fixed length resource, length must match exactly */
656*a159c266SJung-uk Kim 
657*a159c266SJung-uk Kim         if (ResourceLength != MinimumResourceLength)
658*a159c266SJung-uk Kim         {
659*a159c266SJung-uk Kim             goto BadResourceLength;
660*a159c266SJung-uk Kim         }
661*a159c266SJung-uk Kim         break;
662*a159c266SJung-uk Kim 
663*a159c266SJung-uk Kim     case ACPI_VARIABLE_LENGTH:
664*a159c266SJung-uk Kim 
665*a159c266SJung-uk Kim         /* Variable length resource, length must be at least the minimum */
666*a159c266SJung-uk Kim 
667*a159c266SJung-uk Kim         if (ResourceLength < MinimumResourceLength)
668*a159c266SJung-uk Kim         {
669*a159c266SJung-uk Kim             goto BadResourceLength;
670*a159c266SJung-uk Kim         }
671*a159c266SJung-uk Kim         break;
672*a159c266SJung-uk Kim 
673*a159c266SJung-uk Kim     case ACPI_SMALL_VARIABLE_LENGTH:
674*a159c266SJung-uk Kim 
675*a159c266SJung-uk Kim         /* Small variable length resource, length can be (Min) or (Min-1) */
676*a159c266SJung-uk Kim 
677*a159c266SJung-uk Kim         if ((ResourceLength > MinimumResourceLength) ||
678*a159c266SJung-uk Kim             (ResourceLength < (MinimumResourceLength - 1)))
679*a159c266SJung-uk Kim         {
680*a159c266SJung-uk Kim             goto BadResourceLength;
681*a159c266SJung-uk Kim         }
682*a159c266SJung-uk Kim         break;
683*a159c266SJung-uk Kim 
684*a159c266SJung-uk Kim     default:
685*a159c266SJung-uk Kim 
686*a159c266SJung-uk Kim         /* Shouldn't happen (because of validation earlier), but be sure */
687*a159c266SJung-uk Kim 
688*a159c266SJung-uk Kim         goto InvalidResource;
689*a159c266SJung-uk Kim     }
690*a159c266SJung-uk Kim 
691*a159c266SJung-uk Kim     AmlResource = ACPI_CAST_PTR (AML_RESOURCE, Aml);
692*a159c266SJung-uk Kim     if (ResourceType == ACPI_RESOURCE_NAME_SERIAL_BUS)
693*a159c266SJung-uk Kim     {
694*a159c266SJung-uk Kim         /* Validate the BusType field */
695*a159c266SJung-uk Kim 
696*a159c266SJung-uk Kim         if ((AmlResource->CommonSerialBus.Type == 0) ||
697*a159c266SJung-uk Kim             (AmlResource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
698*a159c266SJung-uk Kim         {
699*a159c266SJung-uk Kim             ACPI_RESOURCE_ERROR ((AE_INFO,
700*a159c266SJung-uk Kim                 "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
701*a159c266SJung-uk Kim                 AmlResource->CommonSerialBus.Type));
702*a159c266SJung-uk Kim             return (AE_AML_INVALID_RESOURCE_TYPE);
703*a159c266SJung-uk Kim         }
704*a159c266SJung-uk Kim     }
705*a159c266SJung-uk Kim 
706*a159c266SJung-uk Kim     /* Optionally return the resource table index */
707*a159c266SJung-uk Kim 
708*a159c266SJung-uk Kim     if (ReturnIndex)
709*a159c266SJung-uk Kim     {
710*a159c266SJung-uk Kim         *ReturnIndex = ResourceIndex;
711*a159c266SJung-uk Kim     }
712*a159c266SJung-uk Kim 
713*a159c266SJung-uk Kim     return (AE_OK);
714*a159c266SJung-uk Kim 
715*a159c266SJung-uk Kim 
716*a159c266SJung-uk Kim InvalidResource:
717*a159c266SJung-uk Kim 
718*a159c266SJung-uk Kim     ACPI_RESOURCE_ERROR ((AE_INFO,
719*a159c266SJung-uk Kim         "Invalid/unsupported resource descriptor: Type 0x%2.2X",
720*a159c266SJung-uk Kim         ResourceType));
721*a159c266SJung-uk Kim     return (AE_AML_INVALID_RESOURCE_TYPE);
722*a159c266SJung-uk Kim 
723*a159c266SJung-uk Kim BadResourceLength:
724*a159c266SJung-uk Kim 
725*a159c266SJung-uk Kim     ACPI_RESOURCE_ERROR ((AE_INFO,
726*a159c266SJung-uk Kim         "Invalid resource descriptor length: Type "
727*a159c266SJung-uk Kim         "0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
728*a159c266SJung-uk Kim         ResourceType, ResourceLength, MinimumResourceLength));
729*a159c266SJung-uk Kim     return (AE_AML_BAD_RESOURCE_LENGTH);
730*a159c266SJung-uk Kim }
731*a159c266SJung-uk Kim 
732*a159c266SJung-uk Kim 
733*a159c266SJung-uk Kim /*******************************************************************************
734*a159c266SJung-uk Kim  *
735*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtGetResourceType
736*a159c266SJung-uk Kim  *
737*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
738*a159c266SJung-uk Kim  *
739*a159c266SJung-uk Kim  * RETURN:      The Resource Type with no extraneous bits (except the
740*a159c266SJung-uk Kim  *              Large/Small descriptor bit -- this is left alone)
741*a159c266SJung-uk Kim  *
742*a159c266SJung-uk Kim  * DESCRIPTION: Extract the Resource Type/Name from the first byte of
743*a159c266SJung-uk Kim  *              a resource descriptor.
744*a159c266SJung-uk Kim  *
745*a159c266SJung-uk Kim  ******************************************************************************/
746*a159c266SJung-uk Kim 
747*a159c266SJung-uk Kim UINT8
748*a159c266SJung-uk Kim AcpiUtGetResourceType (
749*a159c266SJung-uk Kim     void                    *Aml)
750*a159c266SJung-uk Kim {
751*a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
752*a159c266SJung-uk Kim 
753*a159c266SJung-uk Kim 
754*a159c266SJung-uk Kim     /*
755*a159c266SJung-uk Kim      * Byte 0 contains the descriptor name (Resource Type)
756*a159c266SJung-uk Kim      * Examine the large/small bit in the resource header
757*a159c266SJung-uk Kim      */
758*a159c266SJung-uk Kim     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
759*a159c266SJung-uk Kim     {
760*a159c266SJung-uk Kim         /* Large Resource Type -- bits 6:0 contain the name */
761*a159c266SJung-uk Kim 
762*a159c266SJung-uk Kim         return (ACPI_GET8 (Aml));
763*a159c266SJung-uk Kim     }
764*a159c266SJung-uk Kim     else
765*a159c266SJung-uk Kim     {
766*a159c266SJung-uk Kim         /* Small Resource Type -- bits 6:3 contain the name */
767*a159c266SJung-uk Kim 
768*a159c266SJung-uk Kim         return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
769*a159c266SJung-uk Kim     }
770*a159c266SJung-uk Kim }
771*a159c266SJung-uk Kim 
772*a159c266SJung-uk Kim 
773*a159c266SJung-uk Kim /*******************************************************************************
774*a159c266SJung-uk Kim  *
775*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtGetResourceLength
776*a159c266SJung-uk Kim  *
777*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
778*a159c266SJung-uk Kim  *
779*a159c266SJung-uk Kim  * RETURN:      Byte Length
780*a159c266SJung-uk Kim  *
781*a159c266SJung-uk Kim  * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
782*a159c266SJung-uk Kim  *              definition, this does not include the size of the descriptor
783*a159c266SJung-uk Kim  *              header or the length field itself.
784*a159c266SJung-uk Kim  *
785*a159c266SJung-uk Kim  ******************************************************************************/
786*a159c266SJung-uk Kim 
787*a159c266SJung-uk Kim UINT16
788*a159c266SJung-uk Kim AcpiUtGetResourceLength (
789*a159c266SJung-uk Kim     void                    *Aml)
790*a159c266SJung-uk Kim {
791*a159c266SJung-uk Kim     ACPI_RS_LENGTH          ResourceLength;
792*a159c266SJung-uk Kim 
793*a159c266SJung-uk Kim 
794*a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
795*a159c266SJung-uk Kim 
796*a159c266SJung-uk Kim 
797*a159c266SJung-uk Kim     /*
798*a159c266SJung-uk Kim      * Byte 0 contains the descriptor name (Resource Type)
799*a159c266SJung-uk Kim      * Examine the large/small bit in the resource header
800*a159c266SJung-uk Kim      */
801*a159c266SJung-uk Kim     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
802*a159c266SJung-uk Kim     {
803*a159c266SJung-uk Kim         /* Large Resource type -- bytes 1-2 contain the 16-bit length */
804*a159c266SJung-uk Kim 
805*a159c266SJung-uk Kim         ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));
806*a159c266SJung-uk Kim 
807*a159c266SJung-uk Kim     }
808*a159c266SJung-uk Kim     else
809*a159c266SJung-uk Kim     {
810*a159c266SJung-uk Kim         /* Small Resource type -- bits 2:0 of byte 0 contain the length */
811*a159c266SJung-uk Kim 
812*a159c266SJung-uk Kim         ResourceLength = (UINT16) (ACPI_GET8 (Aml) &
813*a159c266SJung-uk Kim                                     ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
814*a159c266SJung-uk Kim     }
815*a159c266SJung-uk Kim 
816*a159c266SJung-uk Kim     return (ResourceLength);
817*a159c266SJung-uk Kim }
818*a159c266SJung-uk Kim 
819*a159c266SJung-uk Kim 
820*a159c266SJung-uk Kim /*******************************************************************************
821*a159c266SJung-uk Kim  *
822*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtGetResourceHeaderLength
823*a159c266SJung-uk Kim  *
824*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
825*a159c266SJung-uk Kim  *
826*a159c266SJung-uk Kim  * RETURN:      Length of the AML header (depends on large/small descriptor)
827*a159c266SJung-uk Kim  *
828*a159c266SJung-uk Kim  * DESCRIPTION: Get the length of the header for this resource.
829*a159c266SJung-uk Kim  *
830*a159c266SJung-uk Kim  ******************************************************************************/
831*a159c266SJung-uk Kim 
832*a159c266SJung-uk Kim UINT8
833*a159c266SJung-uk Kim AcpiUtGetResourceHeaderLength (
834*a159c266SJung-uk Kim     void                    *Aml)
835*a159c266SJung-uk Kim {
836*a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
837*a159c266SJung-uk Kim 
838*a159c266SJung-uk Kim 
839*a159c266SJung-uk Kim     /* Examine the large/small bit in the resource header */
840*a159c266SJung-uk Kim 
841*a159c266SJung-uk Kim     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
842*a159c266SJung-uk Kim     {
843*a159c266SJung-uk Kim         return (sizeof (AML_RESOURCE_LARGE_HEADER));
844*a159c266SJung-uk Kim     }
845*a159c266SJung-uk Kim     else
846*a159c266SJung-uk Kim     {
847*a159c266SJung-uk Kim         return (sizeof (AML_RESOURCE_SMALL_HEADER));
848*a159c266SJung-uk Kim     }
849*a159c266SJung-uk Kim }
850*a159c266SJung-uk Kim 
851*a159c266SJung-uk Kim 
852*a159c266SJung-uk Kim /*******************************************************************************
853*a159c266SJung-uk Kim  *
854*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtGetDescriptorLength
855*a159c266SJung-uk Kim  *
856*a159c266SJung-uk Kim  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
857*a159c266SJung-uk Kim  *
858*a159c266SJung-uk Kim  * RETURN:      Byte length
859*a159c266SJung-uk Kim  *
860*a159c266SJung-uk Kim  * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
861*a159c266SJung-uk Kim  *              length of the descriptor header and the length field itself.
862*a159c266SJung-uk Kim  *              Used to walk descriptor lists.
863*a159c266SJung-uk Kim  *
864*a159c266SJung-uk Kim  ******************************************************************************/
865*a159c266SJung-uk Kim 
866*a159c266SJung-uk Kim UINT32
867*a159c266SJung-uk Kim AcpiUtGetDescriptorLength (
868*a159c266SJung-uk Kim     void                    *Aml)
869*a159c266SJung-uk Kim {
870*a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
871*a159c266SJung-uk Kim 
872*a159c266SJung-uk Kim 
873*a159c266SJung-uk Kim     /*
874*a159c266SJung-uk Kim      * Get the Resource Length (does not include header length) and add
875*a159c266SJung-uk Kim      * the header length (depends on if this is a small or large resource)
876*a159c266SJung-uk Kim      */
877*a159c266SJung-uk Kim     return (AcpiUtGetResourceLength (Aml) +
878*a159c266SJung-uk Kim             AcpiUtGetResourceHeaderLength (Aml));
879*a159c266SJung-uk Kim }
880*a159c266SJung-uk Kim 
881*a159c266SJung-uk Kim 
882*a159c266SJung-uk Kim /*******************************************************************************
883*a159c266SJung-uk Kim  *
884*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtGetResourceEndTag
885*a159c266SJung-uk Kim  *
886*a159c266SJung-uk Kim  * PARAMETERS:  ObjDesc         - The resource template buffer object
887*a159c266SJung-uk Kim  *              EndTag          - Where the pointer to the EndTag is returned
888*a159c266SJung-uk Kim  *
889*a159c266SJung-uk Kim  * RETURN:      Status, pointer to the end tag
890*a159c266SJung-uk Kim  *
891*a159c266SJung-uk Kim  * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template
892*a159c266SJung-uk Kim  *              Note: allows a buffer length of zero.
893*a159c266SJung-uk Kim  *
894*a159c266SJung-uk Kim  ******************************************************************************/
895*a159c266SJung-uk Kim 
896*a159c266SJung-uk Kim ACPI_STATUS
897*a159c266SJung-uk Kim AcpiUtGetResourceEndTag (
898*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc,
899*a159c266SJung-uk Kim     UINT8                   **EndTag)
900*a159c266SJung-uk Kim {
901*a159c266SJung-uk Kim     ACPI_STATUS             Status;
902*a159c266SJung-uk Kim 
903*a159c266SJung-uk Kim 
904*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (UtGetResourceEndTag);
905*a159c266SJung-uk Kim 
906*a159c266SJung-uk Kim 
907*a159c266SJung-uk Kim     /* Allow a buffer length of zero */
908*a159c266SJung-uk Kim 
909*a159c266SJung-uk Kim     if (!ObjDesc->Buffer.Length)
910*a159c266SJung-uk Kim     {
911*a159c266SJung-uk Kim         *EndTag = ObjDesc->Buffer.Pointer;
912*a159c266SJung-uk Kim         return_ACPI_STATUS (AE_OK);
913*a159c266SJung-uk Kim     }
914*a159c266SJung-uk Kim 
915*a159c266SJung-uk Kim     /* Validate the template and get a pointer to the EndTag */
916*a159c266SJung-uk Kim 
917*a159c266SJung-uk Kim     Status = AcpiUtWalkAmlResources (ObjDesc->Buffer.Pointer,
918*a159c266SJung-uk Kim                 ObjDesc->Buffer.Length, NULL, EndTag);
919*a159c266SJung-uk Kim 
920*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
921*a159c266SJung-uk Kim }
922*a159c266SJung-uk Kim 
923*a159c266SJung-uk Kim 
924