xref: /illumos-gate/usr/src/common/acpica/utilities/utresrc.c (revision 35786f6866ae52207d0f1a25fe7ca5f652f32ce0)
1bc36eafdSMike Gerdts /*******************************************************************************
2bc36eafdSMike Gerdts  *
3bc36eafdSMike Gerdts  * Module Name: utresrc - Resource management utilities
4bc36eafdSMike Gerdts  *
5bc36eafdSMike Gerdts  ******************************************************************************/
6bc36eafdSMike Gerdts 
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi  *
9*35786f68SRobert Mustacchi  * 1. Copyright Notice
10*35786f68SRobert Mustacchi  *
11*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
12bc36eafdSMike Gerdts  * All rights reserved.
13bc36eafdSMike Gerdts  *
14*35786f68SRobert Mustacchi  * 2. License
15*35786f68SRobert Mustacchi  *
16*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi  * property rights.
20*35786f68SRobert Mustacchi  *
21*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi  *
28*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi  *
37*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi  * conditions are met:
39*35786f68SRobert Mustacchi  *
40*35786f68SRobert Mustacchi  * 3. Conditions
41*35786f68SRobert Mustacchi  *
42*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi  *
54*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi  * make.
65*35786f68SRobert Mustacchi  *
66*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi  * distribution.
71*35786f68SRobert Mustacchi  *
72*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi  * Intel Code.
74*35786f68SRobert Mustacchi  *
75*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi  *
80*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi  *
82*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi  *
90*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi  * LIMITED REMEDY.
98*35786f68SRobert Mustacchi  *
99*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi  * such license, approval or letter.
113*35786f68SRobert Mustacchi  *
114*35786f68SRobert Mustacchi  *****************************************************************************
115*35786f68SRobert Mustacchi  *
116*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi  * following license:
118*35786f68SRobert Mustacchi  *
119bc36eafdSMike Gerdts  * Redistribution and use in source and binary forms, with or without
120bc36eafdSMike Gerdts  * modification, are permitted provided that the following conditions
121bc36eafdSMike Gerdts  * are met:
122bc36eafdSMike Gerdts  * 1. Redistributions of source code must retain the above copyright
123bc36eafdSMike Gerdts  *    notice, this list of conditions, and the following disclaimer,
124bc36eafdSMike Gerdts  *    without modification.
125bc36eafdSMike Gerdts  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126bc36eafdSMike Gerdts  *    substantially similar to the "NO WARRANTY" disclaimer below
127bc36eafdSMike Gerdts  *    ("Disclaimer") and any redistribution must be conditioned upon
128bc36eafdSMike Gerdts  *    including a substantially similar Disclaimer requirement for further
129bc36eafdSMike Gerdts  *    binary redistribution.
130bc36eafdSMike Gerdts  * 3. Neither the names of the above-listed copyright holders nor the names
131bc36eafdSMike Gerdts  *    of any contributors may be used to endorse or promote products derived
132bc36eafdSMike Gerdts  *    from this software without specific prior written permission.
133bc36eafdSMike Gerdts  *
134*35786f68SRobert Mustacchi  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*35786f68SRobert Mustacchi  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*35786f68SRobert Mustacchi  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi  *
146*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
147bc36eafdSMike Gerdts  * GNU General Public License ("GPL") version 2 as published by the Free
148bc36eafdSMike Gerdts  * Software Foundation.
149bc36eafdSMike Gerdts  *
150*35786f68SRobert Mustacchi  *****************************************************************************/
151bc36eafdSMike Gerdts 
152bc36eafdSMike Gerdts #include "acpi.h"
153bc36eafdSMike Gerdts #include "accommon.h"
154bc36eafdSMike Gerdts #include "acresrc.h"
155bc36eafdSMike Gerdts 
156bc36eafdSMike Gerdts 
157bc36eafdSMike Gerdts #define _COMPONENT          ACPI_UTILITIES
158bc36eafdSMike Gerdts         ACPI_MODULE_NAME    ("utresrc")
159bc36eafdSMike Gerdts 
160bc36eafdSMike Gerdts 
161bc36eafdSMike Gerdts /*
162bc36eafdSMike Gerdts  * Base sizes of the raw AML resource descriptors, indexed by resource type.
163bc36eafdSMike Gerdts  * Zero indicates a reserved (and therefore invalid) resource type.
164bc36eafdSMike Gerdts  */
165bc36eafdSMike Gerdts const UINT8                 AcpiGbl_ResourceAmlSizes[] =
166bc36eafdSMike Gerdts {
167bc36eafdSMike Gerdts     /* Small descriptors */
168bc36eafdSMike Gerdts 
169bc36eafdSMike Gerdts     0,
170bc36eafdSMike Gerdts     0,
171bc36eafdSMike Gerdts     0,
172bc36eafdSMike Gerdts     0,
173bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IRQ),
174bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_DMA),
175bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_START_DEPENDENT),
176bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_DEPENDENT),
177bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_IO),
178bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_IO),
179bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_DMA),
180bc36eafdSMike Gerdts     0,
181bc36eafdSMike Gerdts     0,
182bc36eafdSMike Gerdts     0,
183bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_VENDOR_SMALL),
184bc36eafdSMike Gerdts     ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_TAG),
185bc36eafdSMike Gerdts 
186bc36eafdSMike Gerdts     /* Large descriptors */
187bc36eafdSMike Gerdts 
188bc36eafdSMike Gerdts     0,
189bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY24),
190bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GENERIC_REGISTER),
191bc36eafdSMike Gerdts     0,
192bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_VENDOR_LARGE),
193bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY32),
194bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_FIXED_MEMORY32),
195bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS32),
196bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS16),
197bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_IRQ),
198bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
199bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
200bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
201*35786f68SRobert Mustacchi     ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_FUNCTION),
202bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
203*35786f68SRobert Mustacchi     ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_CONFIG),
204*35786f68SRobert Mustacchi     ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP),
205*35786f68SRobert Mustacchi     ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_FUNCTION),
206*35786f68SRobert Mustacchi     ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_CONFIG),
207bc36eafdSMike Gerdts };
208bc36eafdSMike Gerdts 
209bc36eafdSMike Gerdts const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
210bc36eafdSMike Gerdts {
211bc36eafdSMike Gerdts     0,
212bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
213bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
214bc36eafdSMike Gerdts     ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
215bc36eafdSMike Gerdts };
216bc36eafdSMike Gerdts 
217bc36eafdSMike Gerdts 
218bc36eafdSMike Gerdts /*
219bc36eafdSMike Gerdts  * Resource types, used to validate the resource length field.
220bc36eafdSMike Gerdts  * The length of fixed-length types must match exactly, variable
221bc36eafdSMike Gerdts  * lengths must meet the minimum required length, etc.
222bc36eafdSMike Gerdts  * Zero indicates a reserved (and therefore invalid) resource type.
223bc36eafdSMike Gerdts  */
224bc36eafdSMike Gerdts static const UINT8          AcpiGbl_ResourceTypes[] =
225bc36eafdSMike Gerdts {
226bc36eafdSMike Gerdts     /* Small descriptors */
227bc36eafdSMike Gerdts 
228bc36eafdSMike Gerdts     0,
229bc36eafdSMike Gerdts     0,
230bc36eafdSMike Gerdts     0,
231bc36eafdSMike Gerdts     0,
232bc36eafdSMike Gerdts     ACPI_SMALL_VARIABLE_LENGTH,     /* 04 IRQ */
233bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 05 DMA */
234bc36eafdSMike Gerdts     ACPI_SMALL_VARIABLE_LENGTH,     /* 06 StartDependentFunctions */
235bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 07 EndDependentFunctions */
236bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 08 IO */
237bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 09 FixedIO */
238bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 0A FixedDMA */
239bc36eafdSMike Gerdts     0,
240bc36eafdSMike Gerdts     0,
241bc36eafdSMike Gerdts     0,
242bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 0E VendorShort */
243bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 0F EndTag */
244bc36eafdSMike Gerdts 
245bc36eafdSMike Gerdts     /* Large descriptors */
246bc36eafdSMike Gerdts 
247bc36eafdSMike Gerdts     0,
248bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 01 Memory24 */
249bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 02 GenericRegister */
250bc36eafdSMike Gerdts     0,
251bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 04 VendorLong */
252bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 05 Memory32 */
253bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 06 Memory32Fixed */
254bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 07 Dword* address */
255bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 08 Word* address */
256bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 09 ExtendedIRQ */
257bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
258bc36eafdSMike Gerdts     ACPI_FIXED_LENGTH,              /* 0B Extended* address */
259bc36eafdSMike Gerdts     ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
260*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 0D PinFunction */
261*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 0E *SerialBus */
262*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 0F PinConfig */
263*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 10 PinGroup */
264*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 11 PinGroupFunction */
265*35786f68SRobert Mustacchi     ACPI_VARIABLE_LENGTH,           /* 12 PinGroupConfig */
266bc36eafdSMike Gerdts };
267bc36eafdSMike Gerdts 
268bc36eafdSMike Gerdts 
269bc36eafdSMike Gerdts /*******************************************************************************
270bc36eafdSMike Gerdts  *
271bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtWalkAmlResources
272bc36eafdSMike Gerdts  *
273bc36eafdSMike Gerdts  * PARAMETERS:  WalkState           - Current walk info
274bc36eafdSMike Gerdts  * PARAMETERS:  Aml                 - Pointer to the raw AML resource template
275bc36eafdSMike Gerdts  *              AmlLength           - Length of the entire template
276bc36eafdSMike Gerdts  *              UserFunction        - Called once for each descriptor found. If
277bc36eafdSMike Gerdts  *                                    NULL, a pointer to the EndTag is returned
278bc36eafdSMike Gerdts  *              Context             - Passed to UserFunction
279bc36eafdSMike Gerdts  *
280bc36eafdSMike Gerdts  * RETURN:      Status
281bc36eafdSMike Gerdts  *
282bc36eafdSMike Gerdts  * DESCRIPTION: Walk a raw AML resource list(buffer). User function called
283bc36eafdSMike Gerdts  *              once for each resource found.
284bc36eafdSMike Gerdts  *
285bc36eafdSMike Gerdts  ******************************************************************************/
286bc36eafdSMike Gerdts 
287bc36eafdSMike Gerdts ACPI_STATUS
AcpiUtWalkAmlResources(ACPI_WALK_STATE * WalkState,UINT8 * Aml,ACPI_SIZE AmlLength,ACPI_WALK_AML_CALLBACK UserFunction,void ** Context)288bc36eafdSMike Gerdts AcpiUtWalkAmlResources (
289bc36eafdSMike Gerdts     ACPI_WALK_STATE         *WalkState,
290bc36eafdSMike Gerdts     UINT8                   *Aml,
291bc36eafdSMike Gerdts     ACPI_SIZE               AmlLength,
292bc36eafdSMike Gerdts     ACPI_WALK_AML_CALLBACK  UserFunction,
293bc36eafdSMike Gerdts     void                    **Context)
294bc36eafdSMike Gerdts {
295bc36eafdSMike Gerdts     ACPI_STATUS             Status;
296bc36eafdSMike Gerdts     UINT8                   *EndAml;
297bc36eafdSMike Gerdts     UINT8                   ResourceIndex;
298bc36eafdSMike Gerdts     UINT32                  Length;
299bc36eafdSMike Gerdts     UINT32                  Offset = 0;
300bc36eafdSMike Gerdts     UINT8                   EndTag[2] = {0x79, 0x00};
301bc36eafdSMike Gerdts 
302bc36eafdSMike Gerdts 
303bc36eafdSMike Gerdts     ACPI_FUNCTION_TRACE (UtWalkAmlResources);
304bc36eafdSMike Gerdts 
305bc36eafdSMike Gerdts 
306bc36eafdSMike Gerdts     /* The absolute minimum resource template is one EndTag descriptor */
307bc36eafdSMike Gerdts 
308bc36eafdSMike Gerdts     if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
309bc36eafdSMike Gerdts     {
310bc36eafdSMike Gerdts         return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
311bc36eafdSMike Gerdts     }
312bc36eafdSMike Gerdts 
313bc36eafdSMike Gerdts     /* Point to the end of the resource template buffer */
314bc36eafdSMike Gerdts 
315bc36eafdSMike Gerdts     EndAml = Aml + AmlLength;
316bc36eafdSMike Gerdts 
317bc36eafdSMike Gerdts     /* Walk the byte list, abort on any invalid descriptor type or length */
318bc36eafdSMike Gerdts 
319bc36eafdSMike Gerdts     while (Aml < EndAml)
320bc36eafdSMike Gerdts     {
321bc36eafdSMike Gerdts         /* Validate the Resource Type and Resource Length */
322bc36eafdSMike Gerdts 
323bc36eafdSMike Gerdts         Status = AcpiUtValidateResource (WalkState, Aml, &ResourceIndex);
324bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
325bc36eafdSMike Gerdts         {
326bc36eafdSMike Gerdts             /*
327bc36eafdSMike Gerdts              * Exit on failure. Cannot continue because the descriptor
328bc36eafdSMike Gerdts              * length may be bogus also.
329bc36eafdSMike Gerdts              */
330bc36eafdSMike Gerdts             return_ACPI_STATUS (Status);
331bc36eafdSMike Gerdts         }
332bc36eafdSMike Gerdts 
333bc36eafdSMike Gerdts         /* Get the length of this descriptor */
334bc36eafdSMike Gerdts 
335bc36eafdSMike Gerdts         Length = AcpiUtGetDescriptorLength (Aml);
336bc36eafdSMike Gerdts 
337bc36eafdSMike Gerdts         /* Invoke the user function */
338bc36eafdSMike Gerdts 
339bc36eafdSMike Gerdts         if (UserFunction)
340bc36eafdSMike Gerdts         {
341bc36eafdSMike Gerdts             Status = UserFunction (
342bc36eafdSMike Gerdts                 Aml, Length, Offset, ResourceIndex, Context);
343bc36eafdSMike Gerdts             if (ACPI_FAILURE (Status))
344bc36eafdSMike Gerdts             {
345bc36eafdSMike Gerdts                 return_ACPI_STATUS (Status);
346bc36eafdSMike Gerdts             }
347bc36eafdSMike Gerdts         }
348bc36eafdSMike Gerdts 
349bc36eafdSMike Gerdts         /* An EndTag descriptor terminates this resource template */
350bc36eafdSMike Gerdts 
351bc36eafdSMike Gerdts         if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)
352bc36eafdSMike Gerdts         {
353bc36eafdSMike Gerdts             /*
354bc36eafdSMike Gerdts              * There must be at least one more byte in the buffer for
355bc36eafdSMike Gerdts              * the 2nd byte of the EndTag
356bc36eafdSMike Gerdts              */
357bc36eafdSMike Gerdts             if ((Aml + 1) >= EndAml)
358bc36eafdSMike Gerdts             {
359bc36eafdSMike Gerdts                 return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
360bc36eafdSMike Gerdts             }
361bc36eafdSMike Gerdts 
362*35786f68SRobert Mustacchi             /*
363*35786f68SRobert Mustacchi              * Don't attempt to perform any validation on the 2nd byte.
364*35786f68SRobert Mustacchi              * Although all known ASL compilers insert a zero for the 2nd
365*35786f68SRobert Mustacchi              * byte, it can also be a checksum (as per the ACPI spec),
366*35786f68SRobert Mustacchi              * and this is occasionally seen in the field. July 2017.
367*35786f68SRobert Mustacchi              */
368*35786f68SRobert Mustacchi 
369bc36eafdSMike Gerdts             /* Return the pointer to the EndTag if requested */
370bc36eafdSMike Gerdts 
371bc36eafdSMike Gerdts             if (!UserFunction)
372bc36eafdSMike Gerdts             {
373bc36eafdSMike Gerdts                 *Context = Aml;
374bc36eafdSMike Gerdts             }
375bc36eafdSMike Gerdts 
376bc36eafdSMike Gerdts             /* Normal exit */
377bc36eafdSMike Gerdts 
378bc36eafdSMike Gerdts             return_ACPI_STATUS (AE_OK);
379bc36eafdSMike Gerdts         }
380bc36eafdSMike Gerdts 
381bc36eafdSMike Gerdts         Aml += Length;
382bc36eafdSMike Gerdts         Offset += Length;
383bc36eafdSMike Gerdts     }
384bc36eafdSMike Gerdts 
385bc36eafdSMike Gerdts     /* Did not find an EndTag descriptor */
386bc36eafdSMike Gerdts 
387bc36eafdSMike Gerdts     if (UserFunction)
388bc36eafdSMike Gerdts     {
389bc36eafdSMike Gerdts         /* Insert an EndTag anyway. AcpiRsGetListLength always leaves room */
390bc36eafdSMike Gerdts 
391bc36eafdSMike Gerdts         (void) AcpiUtValidateResource (WalkState, EndTag, &ResourceIndex);
392bc36eafdSMike Gerdts         Status = UserFunction (EndTag, 2, Offset, ResourceIndex, Context);
393bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
394bc36eafdSMike Gerdts         {
395bc36eafdSMike Gerdts             return_ACPI_STATUS (Status);
396bc36eafdSMike Gerdts         }
397bc36eafdSMike Gerdts     }
398bc36eafdSMike Gerdts 
399bc36eafdSMike Gerdts     return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
400bc36eafdSMike Gerdts }
401bc36eafdSMike Gerdts 
402bc36eafdSMike Gerdts 
403bc36eafdSMike Gerdts /*******************************************************************************
404bc36eafdSMike Gerdts  *
405bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtValidateResource
406bc36eafdSMike Gerdts  *
407bc36eafdSMike Gerdts  * PARAMETERS:  WalkState           - Current walk info
408bc36eafdSMike Gerdts  *              Aml                 - Pointer to the raw AML resource descriptor
409bc36eafdSMike Gerdts  *              ReturnIndex         - Where the resource index is returned. NULL
410bc36eafdSMike Gerdts  *                                    if the index is not required.
411bc36eafdSMike Gerdts  *
412bc36eafdSMike Gerdts  * RETURN:      Status, and optionally the Index into the global resource tables
413bc36eafdSMike Gerdts  *
414bc36eafdSMike Gerdts  * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
415bc36eafdSMike Gerdts  *              Type and Resource Length. Returns an index into the global
416bc36eafdSMike Gerdts  *              resource information/dispatch tables for later use.
417bc36eafdSMike Gerdts  *
418bc36eafdSMike Gerdts  ******************************************************************************/
419bc36eafdSMike Gerdts 
420bc36eafdSMike Gerdts ACPI_STATUS
AcpiUtValidateResource(ACPI_WALK_STATE * WalkState,void * Aml,UINT8 * ReturnIndex)421bc36eafdSMike Gerdts AcpiUtValidateResource (
422bc36eafdSMike Gerdts     ACPI_WALK_STATE         *WalkState,
423bc36eafdSMike Gerdts     void                    *Aml,
424bc36eafdSMike Gerdts     UINT8                   *ReturnIndex)
425bc36eafdSMike Gerdts {
426bc36eafdSMike Gerdts     AML_RESOURCE            *AmlResource;
427bc36eafdSMike Gerdts     UINT8                   ResourceType;
428bc36eafdSMike Gerdts     UINT8                   ResourceIndex;
429bc36eafdSMike Gerdts     ACPI_RS_LENGTH          ResourceLength;
430bc36eafdSMike Gerdts     ACPI_RS_LENGTH          MinimumResourceLength;
431bc36eafdSMike Gerdts 
432bc36eafdSMike Gerdts 
433bc36eafdSMike Gerdts     ACPI_FUNCTION_ENTRY ();
434bc36eafdSMike Gerdts 
435bc36eafdSMike Gerdts 
436bc36eafdSMike Gerdts     /*
437bc36eafdSMike Gerdts      * 1) Validate the ResourceType field (Byte 0)
438bc36eafdSMike Gerdts      */
439bc36eafdSMike Gerdts     ResourceType = ACPI_GET8 (Aml);
440bc36eafdSMike Gerdts 
441bc36eafdSMike Gerdts     /*
442bc36eafdSMike Gerdts      * Byte 0 contains the descriptor name (Resource Type)
443bc36eafdSMike Gerdts      * Examine the large/small bit in the resource header
444bc36eafdSMike Gerdts      */
445bc36eafdSMike Gerdts     if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
446bc36eafdSMike Gerdts     {
447bc36eafdSMike Gerdts         /* Verify the large resource type (name) against the max */
448bc36eafdSMike Gerdts 
449bc36eafdSMike Gerdts         if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
450bc36eafdSMike Gerdts         {
451bc36eafdSMike Gerdts             goto InvalidResource;
452bc36eafdSMike Gerdts         }
453bc36eafdSMike Gerdts 
454bc36eafdSMike Gerdts         /*
455bc36eafdSMike Gerdts          * Large Resource Type -- bits 6:0 contain the name
456bc36eafdSMike Gerdts          * Translate range 0x80-0x8B to index range 0x10-0x1B
457bc36eafdSMike Gerdts          */
458bc36eafdSMike Gerdts         ResourceIndex = (UINT8) (ResourceType - 0x70);
459bc36eafdSMike Gerdts     }
460bc36eafdSMike Gerdts     else
461bc36eafdSMike Gerdts     {
462bc36eafdSMike Gerdts         /*
463bc36eafdSMike Gerdts          * Small Resource Type -- bits 6:3 contain the name
464bc36eafdSMike Gerdts          * Shift range to index range 0x00-0x0F
465bc36eafdSMike Gerdts          */
466bc36eafdSMike Gerdts         ResourceIndex = (UINT8)
467bc36eafdSMike Gerdts             ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
468bc36eafdSMike Gerdts     }
469bc36eafdSMike Gerdts 
470bc36eafdSMike Gerdts     /*
471bc36eafdSMike Gerdts      * Check validity of the resource type, via AcpiGbl_ResourceTypes.
472bc36eafdSMike Gerdts      * Zero indicates an invalid resource.
473bc36eafdSMike Gerdts      */
474bc36eafdSMike Gerdts     if (!AcpiGbl_ResourceTypes[ResourceIndex])
475bc36eafdSMike Gerdts     {
476bc36eafdSMike Gerdts         goto InvalidResource;
477bc36eafdSMike Gerdts     }
478bc36eafdSMike Gerdts 
479bc36eafdSMike Gerdts     /*
480bc36eafdSMike Gerdts      * Validate the ResourceLength field. This ensures that the length
481bc36eafdSMike Gerdts      * is at least reasonable, and guarantees that it is non-zero.
482bc36eafdSMike Gerdts      */
483bc36eafdSMike Gerdts     ResourceLength = AcpiUtGetResourceLength (Aml);
484bc36eafdSMike Gerdts     MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
485bc36eafdSMike Gerdts 
486bc36eafdSMike Gerdts     /* Validate based upon the type of resource - fixed length or variable */
487bc36eafdSMike Gerdts 
488bc36eafdSMike Gerdts     switch (AcpiGbl_ResourceTypes[ResourceIndex])
489bc36eafdSMike Gerdts     {
490bc36eafdSMike Gerdts     case ACPI_FIXED_LENGTH:
491bc36eafdSMike Gerdts 
492bc36eafdSMike Gerdts         /* Fixed length resource, length must match exactly */
493bc36eafdSMike Gerdts 
494bc36eafdSMike Gerdts         if (ResourceLength != MinimumResourceLength)
495bc36eafdSMike Gerdts         {
496bc36eafdSMike Gerdts             goto BadResourceLength;
497bc36eafdSMike Gerdts         }
498bc36eafdSMike Gerdts         break;
499bc36eafdSMike Gerdts 
500bc36eafdSMike Gerdts     case ACPI_VARIABLE_LENGTH:
501bc36eafdSMike Gerdts 
502bc36eafdSMike Gerdts         /* Variable length resource, length must be at least the minimum */
503bc36eafdSMike Gerdts 
504bc36eafdSMike Gerdts         if (ResourceLength < MinimumResourceLength)
505bc36eafdSMike Gerdts         {
506bc36eafdSMike Gerdts             goto BadResourceLength;
507bc36eafdSMike Gerdts         }
508bc36eafdSMike Gerdts         break;
509bc36eafdSMike Gerdts 
510bc36eafdSMike Gerdts     case ACPI_SMALL_VARIABLE_LENGTH:
511bc36eafdSMike Gerdts 
512bc36eafdSMike Gerdts         /* Small variable length resource, length can be (Min) or (Min-1) */
513bc36eafdSMike Gerdts 
514bc36eafdSMike Gerdts         if ((ResourceLength > MinimumResourceLength) ||
515bc36eafdSMike Gerdts             (ResourceLength < (MinimumResourceLength - 1)))
516bc36eafdSMike Gerdts         {
517bc36eafdSMike Gerdts             goto BadResourceLength;
518bc36eafdSMike Gerdts         }
519bc36eafdSMike Gerdts         break;
520bc36eafdSMike Gerdts 
521bc36eafdSMike Gerdts     default:
522bc36eafdSMike Gerdts 
523bc36eafdSMike Gerdts         /* Shouldn't happen (because of validation earlier), but be sure */
524bc36eafdSMike Gerdts 
525bc36eafdSMike Gerdts         goto InvalidResource;
526bc36eafdSMike Gerdts     }
527bc36eafdSMike Gerdts 
528bc36eafdSMike Gerdts     AmlResource = ACPI_CAST_PTR (AML_RESOURCE, Aml);
529bc36eafdSMike Gerdts     if (ResourceType == ACPI_RESOURCE_NAME_SERIAL_BUS)
530bc36eafdSMike Gerdts     {
531bc36eafdSMike Gerdts         /* Validate the BusType field */
532bc36eafdSMike Gerdts 
533bc36eafdSMike Gerdts         if ((AmlResource->CommonSerialBus.Type == 0) ||
534bc36eafdSMike Gerdts             (AmlResource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
535bc36eafdSMike Gerdts         {
536bc36eafdSMike Gerdts             if (WalkState)
537bc36eafdSMike Gerdts             {
538bc36eafdSMike Gerdts                 ACPI_ERROR ((AE_INFO,
539bc36eafdSMike Gerdts                     "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
540bc36eafdSMike Gerdts                     AmlResource->CommonSerialBus.Type));
541bc36eafdSMike Gerdts             }
542bc36eafdSMike Gerdts             return (AE_AML_INVALID_RESOURCE_TYPE);
543bc36eafdSMike Gerdts         }
544bc36eafdSMike Gerdts     }
545bc36eafdSMike Gerdts 
546bc36eafdSMike Gerdts     /* Optionally return the resource table index */
547bc36eafdSMike Gerdts 
548bc36eafdSMike Gerdts     if (ReturnIndex)
549bc36eafdSMike Gerdts     {
550bc36eafdSMike Gerdts         *ReturnIndex = ResourceIndex;
551bc36eafdSMike Gerdts     }
552bc36eafdSMike Gerdts 
553bc36eafdSMike Gerdts     return (AE_OK);
554bc36eafdSMike Gerdts 
555bc36eafdSMike Gerdts 
556bc36eafdSMike Gerdts InvalidResource:
557bc36eafdSMike Gerdts 
558bc36eafdSMike Gerdts     if (WalkState)
559bc36eafdSMike Gerdts     {
560bc36eafdSMike Gerdts         ACPI_ERROR ((AE_INFO,
561bc36eafdSMike Gerdts             "Invalid/unsupported resource descriptor: Type 0x%2.2X",
562bc36eafdSMike Gerdts             ResourceType));
563bc36eafdSMike Gerdts     }
564bc36eafdSMike Gerdts     return (AE_AML_INVALID_RESOURCE_TYPE);
565bc36eafdSMike Gerdts 
566bc36eafdSMike Gerdts BadResourceLength:
567bc36eafdSMike Gerdts 
568bc36eafdSMike Gerdts     if (WalkState)
569bc36eafdSMike Gerdts     {
570bc36eafdSMike Gerdts         ACPI_ERROR ((AE_INFO,
571bc36eafdSMike Gerdts             "Invalid resource descriptor length: Type "
572bc36eafdSMike Gerdts             "0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
573bc36eafdSMike Gerdts             ResourceType, ResourceLength, MinimumResourceLength));
574bc36eafdSMike Gerdts     }
575bc36eafdSMike Gerdts     return (AE_AML_BAD_RESOURCE_LENGTH);
576bc36eafdSMike Gerdts }
577bc36eafdSMike Gerdts 
578bc36eafdSMike Gerdts 
579bc36eafdSMike Gerdts /*******************************************************************************
580bc36eafdSMike Gerdts  *
581bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtGetResourceType
582bc36eafdSMike Gerdts  *
583bc36eafdSMike Gerdts  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
584bc36eafdSMike Gerdts  *
585bc36eafdSMike Gerdts  * RETURN:      The Resource Type with no extraneous bits (except the
586bc36eafdSMike Gerdts  *              Large/Small descriptor bit -- this is left alone)
587bc36eafdSMike Gerdts  *
588bc36eafdSMike Gerdts  * DESCRIPTION: Extract the Resource Type/Name from the first byte of
589bc36eafdSMike Gerdts  *              a resource descriptor.
590bc36eafdSMike Gerdts  *
591bc36eafdSMike Gerdts  ******************************************************************************/
592bc36eafdSMike Gerdts 
593bc36eafdSMike Gerdts UINT8
AcpiUtGetResourceType(void * Aml)594bc36eafdSMike Gerdts AcpiUtGetResourceType (
595bc36eafdSMike Gerdts     void                    *Aml)
596bc36eafdSMike Gerdts {
597bc36eafdSMike Gerdts     ACPI_FUNCTION_ENTRY ();
598bc36eafdSMike Gerdts 
599bc36eafdSMike Gerdts 
600bc36eafdSMike Gerdts     /*
601bc36eafdSMike Gerdts      * Byte 0 contains the descriptor name (Resource Type)
602bc36eafdSMike Gerdts      * Examine the large/small bit in the resource header
603bc36eafdSMike Gerdts      */
604bc36eafdSMike Gerdts     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
605bc36eafdSMike Gerdts     {
606bc36eafdSMike Gerdts         /* Large Resource Type -- bits 6:0 contain the name */
607bc36eafdSMike Gerdts 
608bc36eafdSMike Gerdts         return (ACPI_GET8 (Aml));
609bc36eafdSMike Gerdts     }
610bc36eafdSMike Gerdts     else
611bc36eafdSMike Gerdts     {
612bc36eafdSMike Gerdts         /* Small Resource Type -- bits 6:3 contain the name */
613bc36eafdSMike Gerdts 
614bc36eafdSMike Gerdts         return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
615bc36eafdSMike Gerdts     }
616bc36eafdSMike Gerdts }
617bc36eafdSMike Gerdts 
618bc36eafdSMike Gerdts 
619bc36eafdSMike Gerdts /*******************************************************************************
620bc36eafdSMike Gerdts  *
621bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtGetResourceLength
622bc36eafdSMike Gerdts  *
623bc36eafdSMike Gerdts  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
624bc36eafdSMike Gerdts  *
625bc36eafdSMike Gerdts  * RETURN:      Byte Length
626bc36eafdSMike Gerdts  *
627bc36eafdSMike Gerdts  * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
628bc36eafdSMike Gerdts  *              definition, this does not include the size of the descriptor
629bc36eafdSMike Gerdts  *              header or the length field itself.
630bc36eafdSMike Gerdts  *
631bc36eafdSMike Gerdts  ******************************************************************************/
632bc36eafdSMike Gerdts 
633bc36eafdSMike Gerdts UINT16
AcpiUtGetResourceLength(void * Aml)634bc36eafdSMike Gerdts AcpiUtGetResourceLength (
635bc36eafdSMike Gerdts     void                    *Aml)
636bc36eafdSMike Gerdts {
637bc36eafdSMike Gerdts     ACPI_RS_LENGTH          ResourceLength;
638bc36eafdSMike Gerdts 
639bc36eafdSMike Gerdts 
640bc36eafdSMike Gerdts     ACPI_FUNCTION_ENTRY ();
641bc36eafdSMike Gerdts 
642bc36eafdSMike Gerdts 
643bc36eafdSMike Gerdts     /*
644bc36eafdSMike Gerdts      * Byte 0 contains the descriptor name (Resource Type)
645bc36eafdSMike Gerdts      * Examine the large/small bit in the resource header
646bc36eafdSMike Gerdts      */
647bc36eafdSMike Gerdts     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
648bc36eafdSMike Gerdts     {
649bc36eafdSMike Gerdts         /* Large Resource type -- bytes 1-2 contain the 16-bit length */
650bc36eafdSMike Gerdts 
651bc36eafdSMike Gerdts         ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));
652bc36eafdSMike Gerdts 
653bc36eafdSMike Gerdts     }
654bc36eafdSMike Gerdts     else
655bc36eafdSMike Gerdts     {
656bc36eafdSMike Gerdts         /* Small Resource type -- bits 2:0 of byte 0 contain the length */
657bc36eafdSMike Gerdts 
658bc36eafdSMike Gerdts         ResourceLength = (UINT16) (ACPI_GET8 (Aml) &
659bc36eafdSMike Gerdts             ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
660bc36eafdSMike Gerdts     }
661bc36eafdSMike Gerdts 
662bc36eafdSMike Gerdts     return (ResourceLength);
663bc36eafdSMike Gerdts }
664bc36eafdSMike Gerdts 
665bc36eafdSMike Gerdts 
666bc36eafdSMike Gerdts /*******************************************************************************
667bc36eafdSMike Gerdts  *
668bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtGetResourceHeaderLength
669bc36eafdSMike Gerdts  *
670bc36eafdSMike Gerdts  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
671bc36eafdSMike Gerdts  *
672bc36eafdSMike Gerdts  * RETURN:      Length of the AML header (depends on large/small descriptor)
673bc36eafdSMike Gerdts  *
674bc36eafdSMike Gerdts  * DESCRIPTION: Get the length of the header for this resource.
675bc36eafdSMike Gerdts  *
676bc36eafdSMike Gerdts  ******************************************************************************/
677bc36eafdSMike Gerdts 
678bc36eafdSMike Gerdts UINT8
AcpiUtGetResourceHeaderLength(void * Aml)679bc36eafdSMike Gerdts AcpiUtGetResourceHeaderLength (
680bc36eafdSMike Gerdts     void                    *Aml)
681bc36eafdSMike Gerdts {
682bc36eafdSMike Gerdts     ACPI_FUNCTION_ENTRY ();
683bc36eafdSMike Gerdts 
684bc36eafdSMike Gerdts 
685bc36eafdSMike Gerdts     /* Examine the large/small bit in the resource header */
686bc36eafdSMike Gerdts 
687bc36eafdSMike Gerdts     if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
688bc36eafdSMike Gerdts     {
689bc36eafdSMike Gerdts         return (sizeof (AML_RESOURCE_LARGE_HEADER));
690bc36eafdSMike Gerdts     }
691bc36eafdSMike Gerdts     else
692bc36eafdSMike Gerdts     {
693bc36eafdSMike Gerdts         return (sizeof (AML_RESOURCE_SMALL_HEADER));
694bc36eafdSMike Gerdts     }
695bc36eafdSMike Gerdts }
696bc36eafdSMike Gerdts 
697bc36eafdSMike Gerdts 
698bc36eafdSMike Gerdts /*******************************************************************************
699bc36eafdSMike Gerdts  *
700bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtGetDescriptorLength
701bc36eafdSMike Gerdts  *
702bc36eafdSMike Gerdts  * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
703bc36eafdSMike Gerdts  *
704bc36eafdSMike Gerdts  * RETURN:      Byte length
705bc36eafdSMike Gerdts  *
706bc36eafdSMike Gerdts  * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
707bc36eafdSMike Gerdts  *              length of the descriptor header and the length field itself.
708bc36eafdSMike Gerdts  *              Used to walk descriptor lists.
709bc36eafdSMike Gerdts  *
710bc36eafdSMike Gerdts  ******************************************************************************/
711bc36eafdSMike Gerdts 
712bc36eafdSMike Gerdts UINT32
AcpiUtGetDescriptorLength(void * Aml)713bc36eafdSMike Gerdts AcpiUtGetDescriptorLength (
714bc36eafdSMike Gerdts     void                    *Aml)
715bc36eafdSMike Gerdts {
716bc36eafdSMike Gerdts     ACPI_FUNCTION_ENTRY ();
717bc36eafdSMike Gerdts 
718bc36eafdSMike Gerdts 
719bc36eafdSMike Gerdts     /*
720bc36eafdSMike Gerdts      * Get the Resource Length (does not include header length) and add
721bc36eafdSMike Gerdts      * the header length (depends on if this is a small or large resource)
722bc36eafdSMike Gerdts      */
723bc36eafdSMike Gerdts     return (AcpiUtGetResourceLength (Aml) +
724bc36eafdSMike Gerdts         AcpiUtGetResourceHeaderLength (Aml));
725bc36eafdSMike Gerdts }
726bc36eafdSMike Gerdts 
727bc36eafdSMike Gerdts 
728bc36eafdSMike Gerdts /*******************************************************************************
729bc36eafdSMike Gerdts  *
730bc36eafdSMike Gerdts  * FUNCTION:    AcpiUtGetResourceEndTag
731bc36eafdSMike Gerdts  *
732bc36eafdSMike Gerdts  * PARAMETERS:  ObjDesc         - The resource template buffer object
733bc36eafdSMike Gerdts  *              EndTag          - Where the pointer to the EndTag is returned
734bc36eafdSMike Gerdts  *
735bc36eafdSMike Gerdts  * RETURN:      Status, pointer to the end tag
736bc36eafdSMike Gerdts  *
737bc36eafdSMike Gerdts  * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template
738bc36eafdSMike Gerdts  *              Note: allows a buffer length of zero.
739bc36eafdSMike Gerdts  *
740bc36eafdSMike Gerdts  ******************************************************************************/
741bc36eafdSMike Gerdts 
742bc36eafdSMike Gerdts ACPI_STATUS
AcpiUtGetResourceEndTag(ACPI_OPERAND_OBJECT * ObjDesc,UINT8 ** EndTag)743bc36eafdSMike Gerdts AcpiUtGetResourceEndTag (
744bc36eafdSMike Gerdts     ACPI_OPERAND_OBJECT     *ObjDesc,
745bc36eafdSMike Gerdts     UINT8                   **EndTag)
746bc36eafdSMike Gerdts {
747bc36eafdSMike Gerdts     ACPI_STATUS             Status;
748bc36eafdSMike Gerdts 
749bc36eafdSMike Gerdts 
750bc36eafdSMike Gerdts     ACPI_FUNCTION_TRACE (UtGetResourceEndTag);
751bc36eafdSMike Gerdts 
752bc36eafdSMike Gerdts 
753bc36eafdSMike Gerdts     /* Allow a buffer length of zero */
754bc36eafdSMike Gerdts 
755bc36eafdSMike Gerdts     if (!ObjDesc->Buffer.Length)
756bc36eafdSMike Gerdts     {
757bc36eafdSMike Gerdts         *EndTag = ObjDesc->Buffer.Pointer;
758bc36eafdSMike Gerdts         return_ACPI_STATUS (AE_OK);
759bc36eafdSMike Gerdts     }
760bc36eafdSMike Gerdts 
761bc36eafdSMike Gerdts     /* Validate the template and get a pointer to the EndTag */
762bc36eafdSMike Gerdts 
763bc36eafdSMike Gerdts     Status = AcpiUtWalkAmlResources (NULL, ObjDesc->Buffer.Pointer,
764bc36eafdSMike Gerdts         ObjDesc->Buffer.Length, NULL, (void **) EndTag);
765bc36eafdSMike Gerdts 
766bc36eafdSMike Gerdts     return_ACPI_STATUS (Status);
767bc36eafdSMike Gerdts }
768