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