xref: /minix3/minix/drivers/power/acpi/namespace/nsprepkg.c (revision 29492bb71c7148a089a5afafa0c99409161218df)
1*29492bb7SDavid van Moolenbroek /******************************************************************************
2*29492bb7SDavid van Moolenbroek  *
3*29492bb7SDavid van Moolenbroek  * Module Name: nsprepkg - Validation of package objects for predefined names
4*29492bb7SDavid van Moolenbroek  *
5*29492bb7SDavid van Moolenbroek  *****************************************************************************/
6*29492bb7SDavid van Moolenbroek 
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek  * Copyright (C) 2000 - 2014, Intel Corp.
9*29492bb7SDavid van Moolenbroek  * All rights reserved.
10*29492bb7SDavid van Moolenbroek  *
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.
25*29492bb7SDavid van Moolenbroek  *
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.
29*29492bb7SDavid van Moolenbroek  *
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  */
43*29492bb7SDavid van Moolenbroek 
44*29492bb7SDavid van Moolenbroek #include "acpi.h"
45*29492bb7SDavid van Moolenbroek #include "accommon.h"
46*29492bb7SDavid van Moolenbroek #include "acnamesp.h"
47*29492bb7SDavid van Moolenbroek #include "acpredef.h"
48*29492bb7SDavid van Moolenbroek 
49*29492bb7SDavid van Moolenbroek 
50*29492bb7SDavid van Moolenbroek #define _COMPONENT          ACPI_NAMESPACE
51*29492bb7SDavid van Moolenbroek         ACPI_MODULE_NAME    ("nsprepkg")
52*29492bb7SDavid van Moolenbroek 
53*29492bb7SDavid van Moolenbroek 
54*29492bb7SDavid van Moolenbroek /* Local prototypes */
55*29492bb7SDavid van Moolenbroek 
56*29492bb7SDavid van Moolenbroek static ACPI_STATUS
57*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageList (
58*29492bb7SDavid van Moolenbroek     ACPI_EVALUATE_INFO          *Info,
59*29492bb7SDavid van Moolenbroek     const ACPI_PREDEFINED_INFO  *Package,
60*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **Elements,
61*29492bb7SDavid van Moolenbroek     UINT32                      Count);
62*29492bb7SDavid van Moolenbroek 
63*29492bb7SDavid van Moolenbroek static ACPI_STATUS
64*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageElements (
65*29492bb7SDavid van Moolenbroek     ACPI_EVALUATE_INFO          *Info,
66*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **Elements,
67*29492bb7SDavid van Moolenbroek     UINT8                       Type1,
68*29492bb7SDavid van Moolenbroek     UINT32                      Count1,
69*29492bb7SDavid van Moolenbroek     UINT8                       Type2,
70*29492bb7SDavid van Moolenbroek     UINT32                      Count2,
71*29492bb7SDavid van Moolenbroek     UINT32                      StartIndex);
72*29492bb7SDavid van Moolenbroek 
73*29492bb7SDavid van Moolenbroek 
74*29492bb7SDavid van Moolenbroek /*******************************************************************************
75*29492bb7SDavid van Moolenbroek  *
76*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiNsCheckPackage
77*29492bb7SDavid van Moolenbroek  *
78*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Info                - Method execution information block
79*29492bb7SDavid van Moolenbroek  *              ReturnObjectPtr     - Pointer to the object returned from the
80*29492bb7SDavid van Moolenbroek  *                                    evaluation of a method or object
81*29492bb7SDavid van Moolenbroek  *
82*29492bb7SDavid van Moolenbroek  * RETURN:      Status
83*29492bb7SDavid van Moolenbroek  *
84*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Check a returned package object for the correct count and
85*29492bb7SDavid van Moolenbroek  *              correct type of all sub-objects.
86*29492bb7SDavid van Moolenbroek  *
87*29492bb7SDavid van Moolenbroek  ******************************************************************************/
88*29492bb7SDavid van Moolenbroek 
89*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiNsCheckPackage(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)90*29492bb7SDavid van Moolenbroek AcpiNsCheckPackage (
91*29492bb7SDavid van Moolenbroek     ACPI_EVALUATE_INFO          *Info,
92*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **ReturnObjectPtr)
93*29492bb7SDavid van Moolenbroek {
94*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         *ReturnObject = *ReturnObjectPtr;
95*29492bb7SDavid van Moolenbroek     const ACPI_PREDEFINED_INFO  *Package;
96*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **Elements;
97*29492bb7SDavid van Moolenbroek     ACPI_STATUS                 Status = AE_OK;
98*29492bb7SDavid van Moolenbroek     UINT32                      ExpectedCount;
99*29492bb7SDavid van Moolenbroek     UINT32                      Count;
100*29492bb7SDavid van Moolenbroek     UINT32                      i;
101*29492bb7SDavid van Moolenbroek 
102*29492bb7SDavid van Moolenbroek 
103*29492bb7SDavid van Moolenbroek     ACPI_FUNCTION_NAME (NsCheckPackage);
104*29492bb7SDavid van Moolenbroek 
105*29492bb7SDavid van Moolenbroek 
106*29492bb7SDavid van Moolenbroek     /* The package info for this name is in the next table entry */
107*29492bb7SDavid van Moolenbroek 
108*29492bb7SDavid van Moolenbroek     Package = Info->Predefined + 1;
109*29492bb7SDavid van Moolenbroek 
110*29492bb7SDavid van Moolenbroek     ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
111*29492bb7SDavid van Moolenbroek         "%s Validating return Package of Type %X, Count %X\n",
112*29492bb7SDavid van Moolenbroek         Info->FullPathname, Package->RetInfo.Type,
113*29492bb7SDavid van Moolenbroek         ReturnObject->Package.Count));
114*29492bb7SDavid van Moolenbroek 
115*29492bb7SDavid van Moolenbroek     /*
116*29492bb7SDavid van Moolenbroek      * For variable-length Packages, we can safely remove all embedded
117*29492bb7SDavid van Moolenbroek      * and trailing NULL package elements
118*29492bb7SDavid van Moolenbroek      */
119*29492bb7SDavid van Moolenbroek     AcpiNsRemoveNullElements (Info, Package->RetInfo.Type, ReturnObject);
120*29492bb7SDavid van Moolenbroek 
121*29492bb7SDavid van Moolenbroek     /* Extract package count and elements array */
122*29492bb7SDavid van Moolenbroek 
123*29492bb7SDavid van Moolenbroek     Elements = ReturnObject->Package.Elements;
124*29492bb7SDavid van Moolenbroek     Count = ReturnObject->Package.Count;
125*29492bb7SDavid van Moolenbroek 
126*29492bb7SDavid van Moolenbroek     /*
127*29492bb7SDavid van Moolenbroek      * Most packages must have at least one element. The only exception
128*29492bb7SDavid van Moolenbroek      * is the variable-length package (ACPI_PTYPE1_VAR).
129*29492bb7SDavid van Moolenbroek      */
130*29492bb7SDavid van Moolenbroek     if (!Count)
131*29492bb7SDavid van Moolenbroek     {
132*29492bb7SDavid van Moolenbroek         if (Package->RetInfo.Type == ACPI_PTYPE1_VAR)
133*29492bb7SDavid van Moolenbroek         {
134*29492bb7SDavid van Moolenbroek             return (AE_OK);
135*29492bb7SDavid van Moolenbroek         }
136*29492bb7SDavid van Moolenbroek 
137*29492bb7SDavid van Moolenbroek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
138*29492bb7SDavid van Moolenbroek             "Return Package has no elements (empty)"));
139*29492bb7SDavid van Moolenbroek 
140*29492bb7SDavid van Moolenbroek         return (AE_AML_OPERAND_VALUE);
141*29492bb7SDavid van Moolenbroek     }
142*29492bb7SDavid van Moolenbroek 
143*29492bb7SDavid van Moolenbroek     /*
144*29492bb7SDavid van Moolenbroek      * Decode the type of the expected package contents
145*29492bb7SDavid van Moolenbroek      *
146*29492bb7SDavid van Moolenbroek      * PTYPE1 packages contain no subpackages
147*29492bb7SDavid van Moolenbroek      * PTYPE2 packages contain subpackages
148*29492bb7SDavid van Moolenbroek      */
149*29492bb7SDavid van Moolenbroek     switch (Package->RetInfo.Type)
150*29492bb7SDavid van Moolenbroek     {
151*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE1_FIXED:
152*29492bb7SDavid van Moolenbroek         /*
153*29492bb7SDavid van Moolenbroek          * The package count is fixed and there are no subpackages
154*29492bb7SDavid van Moolenbroek          *
155*29492bb7SDavid van Moolenbroek          * If package is too small, exit.
156*29492bb7SDavid van Moolenbroek          * If package is larger than expected, issue warning but continue
157*29492bb7SDavid van Moolenbroek          */
158*29492bb7SDavid van Moolenbroek         ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
159*29492bb7SDavid van Moolenbroek         if (Count < ExpectedCount)
160*29492bb7SDavid van Moolenbroek         {
161*29492bb7SDavid van Moolenbroek             goto PackageTooSmall;
162*29492bb7SDavid van Moolenbroek         }
163*29492bb7SDavid van Moolenbroek         else if (Count > ExpectedCount)
164*29492bb7SDavid van Moolenbroek         {
165*29492bb7SDavid van Moolenbroek             ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
166*29492bb7SDavid van Moolenbroek                 "%s: Return Package is larger than needed - "
167*29492bb7SDavid van Moolenbroek                 "found %u, expected %u\n",
168*29492bb7SDavid van Moolenbroek                 Info->FullPathname, Count, ExpectedCount));
169*29492bb7SDavid van Moolenbroek         }
170*29492bb7SDavid van Moolenbroek 
171*29492bb7SDavid van Moolenbroek         /* Validate all elements of the returned package */
172*29492bb7SDavid van Moolenbroek 
173*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckPackageElements (Info, Elements,
174*29492bb7SDavid van Moolenbroek                     Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
175*29492bb7SDavid van Moolenbroek                     Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0);
176*29492bb7SDavid van Moolenbroek         break;
177*29492bb7SDavid van Moolenbroek 
178*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE1_VAR:
179*29492bb7SDavid van Moolenbroek         /*
180*29492bb7SDavid van Moolenbroek          * The package count is variable, there are no subpackages, and all
181*29492bb7SDavid van Moolenbroek          * elements must be of the same type
182*29492bb7SDavid van Moolenbroek          */
183*29492bb7SDavid van Moolenbroek         for (i = 0; i < Count; i++)
184*29492bb7SDavid van Moolenbroek         {
185*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckObjectType (Info, Elements,
186*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1, i);
187*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
188*29492bb7SDavid van Moolenbroek             {
189*29492bb7SDavid van Moolenbroek                 return (Status);
190*29492bb7SDavid van Moolenbroek             }
191*29492bb7SDavid van Moolenbroek             Elements++;
192*29492bb7SDavid van Moolenbroek         }
193*29492bb7SDavid van Moolenbroek         break;
194*29492bb7SDavid van Moolenbroek 
195*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE1_OPTION:
196*29492bb7SDavid van Moolenbroek         /*
197*29492bb7SDavid van Moolenbroek          * The package count is variable, there are no subpackages. There are
198*29492bb7SDavid van Moolenbroek          * a fixed number of required elements, and a variable number of
199*29492bb7SDavid van Moolenbroek          * optional elements.
200*29492bb7SDavid van Moolenbroek          *
201*29492bb7SDavid van Moolenbroek          * Check if package is at least as large as the minimum required
202*29492bb7SDavid van Moolenbroek          */
203*29492bb7SDavid van Moolenbroek         ExpectedCount = Package->RetInfo3.Count;
204*29492bb7SDavid van Moolenbroek         if (Count < ExpectedCount)
205*29492bb7SDavid van Moolenbroek         {
206*29492bb7SDavid van Moolenbroek             goto PackageTooSmall;
207*29492bb7SDavid van Moolenbroek         }
208*29492bb7SDavid van Moolenbroek 
209*29492bb7SDavid van Moolenbroek         /* Variable number of sub-objects */
210*29492bb7SDavid van Moolenbroek 
211*29492bb7SDavid van Moolenbroek         for (i = 0; i < Count; i++)
212*29492bb7SDavid van Moolenbroek         {
213*29492bb7SDavid van Moolenbroek             if (i < Package->RetInfo3.Count)
214*29492bb7SDavid van Moolenbroek             {
215*29492bb7SDavid van Moolenbroek                 /* These are the required package elements (0, 1, or 2) */
216*29492bb7SDavid van Moolenbroek 
217*29492bb7SDavid van Moolenbroek                 Status = AcpiNsCheckObjectType (Info, Elements,
218*29492bb7SDavid van Moolenbroek                             Package->RetInfo3.ObjectType[i], i);
219*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
220*29492bb7SDavid van Moolenbroek                 {
221*29492bb7SDavid van Moolenbroek                     return (Status);
222*29492bb7SDavid van Moolenbroek                 }
223*29492bb7SDavid van Moolenbroek             }
224*29492bb7SDavid van Moolenbroek             else
225*29492bb7SDavid van Moolenbroek             {
226*29492bb7SDavid van Moolenbroek                 /* These are the optional package elements */
227*29492bb7SDavid van Moolenbroek 
228*29492bb7SDavid van Moolenbroek                 Status = AcpiNsCheckObjectType (Info, Elements,
229*29492bb7SDavid van Moolenbroek                             Package->RetInfo3.TailObjectType, i);
230*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
231*29492bb7SDavid van Moolenbroek                 {
232*29492bb7SDavid van Moolenbroek                     return (Status);
233*29492bb7SDavid van Moolenbroek                 }
234*29492bb7SDavid van Moolenbroek             }
235*29492bb7SDavid van Moolenbroek             Elements++;
236*29492bb7SDavid van Moolenbroek         }
237*29492bb7SDavid van Moolenbroek         break;
238*29492bb7SDavid van Moolenbroek 
239*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_REV_FIXED:
240*29492bb7SDavid van Moolenbroek 
241*29492bb7SDavid van Moolenbroek         /* First element is the (Integer) revision */
242*29492bb7SDavid van Moolenbroek 
243*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckObjectType (Info, Elements,
244*29492bb7SDavid van Moolenbroek                     ACPI_RTYPE_INTEGER, 0);
245*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
246*29492bb7SDavid van Moolenbroek         {
247*29492bb7SDavid van Moolenbroek             return (Status);
248*29492bb7SDavid van Moolenbroek         }
249*29492bb7SDavid van Moolenbroek 
250*29492bb7SDavid van Moolenbroek         Elements++;
251*29492bb7SDavid van Moolenbroek         Count--;
252*29492bb7SDavid van Moolenbroek 
253*29492bb7SDavid van Moolenbroek         /* Examine the subpackages */
254*29492bb7SDavid van Moolenbroek 
255*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
256*29492bb7SDavid van Moolenbroek         break;
257*29492bb7SDavid van Moolenbroek 
258*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_PKG_COUNT:
259*29492bb7SDavid van Moolenbroek 
260*29492bb7SDavid van Moolenbroek         /* First element is the (Integer) count of subpackages to follow */
261*29492bb7SDavid van Moolenbroek 
262*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckObjectType (Info, Elements,
263*29492bb7SDavid van Moolenbroek                     ACPI_RTYPE_INTEGER, 0);
264*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
265*29492bb7SDavid van Moolenbroek         {
266*29492bb7SDavid van Moolenbroek             return (Status);
267*29492bb7SDavid van Moolenbroek         }
268*29492bb7SDavid van Moolenbroek 
269*29492bb7SDavid van Moolenbroek         /*
270*29492bb7SDavid van Moolenbroek          * Count cannot be larger than the parent package length, but allow it
271*29492bb7SDavid van Moolenbroek          * to be smaller. The >= accounts for the Integer above.
272*29492bb7SDavid van Moolenbroek          */
273*29492bb7SDavid van Moolenbroek         ExpectedCount = (UINT32) (*Elements)->Integer.Value;
274*29492bb7SDavid van Moolenbroek         if (ExpectedCount >= Count)
275*29492bb7SDavid van Moolenbroek         {
276*29492bb7SDavid van Moolenbroek             goto PackageTooSmall;
277*29492bb7SDavid van Moolenbroek         }
278*29492bb7SDavid van Moolenbroek 
279*29492bb7SDavid van Moolenbroek         Count = ExpectedCount;
280*29492bb7SDavid van Moolenbroek         Elements++;
281*29492bb7SDavid van Moolenbroek 
282*29492bb7SDavid van Moolenbroek         /* Examine the subpackages */
283*29492bb7SDavid van Moolenbroek 
284*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
285*29492bb7SDavid van Moolenbroek         break;
286*29492bb7SDavid van Moolenbroek 
287*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2:
288*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_FIXED:
289*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_MIN:
290*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_COUNT:
291*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_FIX_VAR:
292*29492bb7SDavid van Moolenbroek         /*
293*29492bb7SDavid van Moolenbroek          * These types all return a single Package that consists of a
294*29492bb7SDavid van Moolenbroek          * variable number of subpackages.
295*29492bb7SDavid van Moolenbroek          *
296*29492bb7SDavid van Moolenbroek          * First, ensure that the first element is a subpackage. If not,
297*29492bb7SDavid van Moolenbroek          * the BIOS may have incorrectly returned the object as a single
298*29492bb7SDavid van Moolenbroek          * package instead of a Package of Packages (a common error if
299*29492bb7SDavid van Moolenbroek          * there is only one entry). We may be able to repair this by
300*29492bb7SDavid van Moolenbroek          * wrapping the returned Package with a new outer Package.
301*29492bb7SDavid van Moolenbroek          */
302*29492bb7SDavid van Moolenbroek         if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE))
303*29492bb7SDavid van Moolenbroek         {
304*29492bb7SDavid van Moolenbroek             /* Create the new outer package and populate it */
305*29492bb7SDavid van Moolenbroek 
306*29492bb7SDavid van Moolenbroek             Status = AcpiNsWrapWithPackage (Info, ReturnObject, ReturnObjectPtr);
307*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
308*29492bb7SDavid van Moolenbroek             {
309*29492bb7SDavid van Moolenbroek                 return (Status);
310*29492bb7SDavid van Moolenbroek             }
311*29492bb7SDavid van Moolenbroek 
312*29492bb7SDavid van Moolenbroek             /* Update locals to point to the new package (of 1 element) */
313*29492bb7SDavid van Moolenbroek 
314*29492bb7SDavid van Moolenbroek             ReturnObject = *ReturnObjectPtr;
315*29492bb7SDavid van Moolenbroek             Elements = ReturnObject->Package.Elements;
316*29492bb7SDavid van Moolenbroek             Count = 1;
317*29492bb7SDavid van Moolenbroek         }
318*29492bb7SDavid van Moolenbroek 
319*29492bb7SDavid van Moolenbroek         /* Examine the subpackages */
320*29492bb7SDavid van Moolenbroek 
321*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
322*29492bb7SDavid van Moolenbroek         break;
323*29492bb7SDavid van Moolenbroek 
324*29492bb7SDavid van Moolenbroek     case ACPI_PTYPE2_UUID_PAIR:
325*29492bb7SDavid van Moolenbroek 
326*29492bb7SDavid van Moolenbroek         /* The package must contain pairs of (UUID + type) */
327*29492bb7SDavid van Moolenbroek 
328*29492bb7SDavid van Moolenbroek         if (Count & 1)
329*29492bb7SDavid van Moolenbroek         {
330*29492bb7SDavid van Moolenbroek             ExpectedCount = Count + 1;
331*29492bb7SDavid van Moolenbroek             goto PackageTooSmall;
332*29492bb7SDavid van Moolenbroek         }
333*29492bb7SDavid van Moolenbroek 
334*29492bb7SDavid van Moolenbroek         while (Count > 0)
335*29492bb7SDavid van Moolenbroek         {
336*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckObjectType(Info, Elements,
337*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1, 0);
338*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE(Status))
339*29492bb7SDavid van Moolenbroek             {
340*29492bb7SDavid van Moolenbroek                 return (Status);
341*29492bb7SDavid van Moolenbroek             }
342*29492bb7SDavid van Moolenbroek 
343*29492bb7SDavid van Moolenbroek             /* Validate length of the UUID buffer */
344*29492bb7SDavid van Moolenbroek 
345*29492bb7SDavid van Moolenbroek             if ((*Elements)->Buffer.Length != 16)
346*29492bb7SDavid van Moolenbroek             {
347*29492bb7SDavid van Moolenbroek                 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname,
348*29492bb7SDavid van Moolenbroek                     Info->NodeFlags, "Invalid length for UUID Buffer"));
349*29492bb7SDavid van Moolenbroek                 return (AE_AML_OPERAND_VALUE);
350*29492bb7SDavid van Moolenbroek             }
351*29492bb7SDavid van Moolenbroek 
352*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckObjectType(Info, Elements + 1,
353*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType2, 0);
354*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE(Status))
355*29492bb7SDavid van Moolenbroek             {
356*29492bb7SDavid van Moolenbroek                 return (Status);
357*29492bb7SDavid van Moolenbroek             }
358*29492bb7SDavid van Moolenbroek 
359*29492bb7SDavid van Moolenbroek             Elements += 2;
360*29492bb7SDavid van Moolenbroek             Count -= 2;
361*29492bb7SDavid van Moolenbroek          }
362*29492bb7SDavid van Moolenbroek          break;
363*29492bb7SDavid van Moolenbroek 
364*29492bb7SDavid van Moolenbroek     default:
365*29492bb7SDavid van Moolenbroek 
366*29492bb7SDavid van Moolenbroek         /* Should not get here if predefined info table is correct */
367*29492bb7SDavid van Moolenbroek 
368*29492bb7SDavid van Moolenbroek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
369*29492bb7SDavid van Moolenbroek             "Invalid internal return type in table entry: %X",
370*29492bb7SDavid van Moolenbroek             Package->RetInfo.Type));
371*29492bb7SDavid van Moolenbroek 
372*29492bb7SDavid van Moolenbroek         return (AE_AML_INTERNAL);
373*29492bb7SDavid van Moolenbroek     }
374*29492bb7SDavid van Moolenbroek 
375*29492bb7SDavid van Moolenbroek     return (Status);
376*29492bb7SDavid van Moolenbroek 
377*29492bb7SDavid van Moolenbroek 
378*29492bb7SDavid van Moolenbroek PackageTooSmall:
379*29492bb7SDavid van Moolenbroek 
380*29492bb7SDavid van Moolenbroek     /* Error exit for the case with an incorrect package count */
381*29492bb7SDavid van Moolenbroek 
382*29492bb7SDavid van Moolenbroek     ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
383*29492bb7SDavid van Moolenbroek         "Return Package is too small - found %u elements, expected %u",
384*29492bb7SDavid van Moolenbroek         Count, ExpectedCount));
385*29492bb7SDavid van Moolenbroek 
386*29492bb7SDavid van Moolenbroek     return (AE_AML_OPERAND_VALUE);
387*29492bb7SDavid van Moolenbroek }
388*29492bb7SDavid van Moolenbroek 
389*29492bb7SDavid van Moolenbroek 
390*29492bb7SDavid van Moolenbroek /*******************************************************************************
391*29492bb7SDavid van Moolenbroek  *
392*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiNsCheckPackageList
393*29492bb7SDavid van Moolenbroek  *
394*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Info            - Method execution information block
395*29492bb7SDavid van Moolenbroek  *              Package         - Pointer to package-specific info for method
396*29492bb7SDavid van Moolenbroek  *              Elements        - Element list of parent package. All elements
397*29492bb7SDavid van Moolenbroek  *                                of this list should be of type Package.
398*29492bb7SDavid van Moolenbroek  *              Count           - Count of subpackages
399*29492bb7SDavid van Moolenbroek  *
400*29492bb7SDavid van Moolenbroek  * RETURN:      Status
401*29492bb7SDavid van Moolenbroek  *
402*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Examine a list of subpackages
403*29492bb7SDavid van Moolenbroek  *
404*29492bb7SDavid van Moolenbroek  ******************************************************************************/
405*29492bb7SDavid van Moolenbroek 
406*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiNsCheckPackageList(ACPI_EVALUATE_INFO * Info,const ACPI_PREDEFINED_INFO * Package,ACPI_OPERAND_OBJECT ** Elements,UINT32 Count)407*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageList (
408*29492bb7SDavid van Moolenbroek     ACPI_EVALUATE_INFO          *Info,
409*29492bb7SDavid van Moolenbroek     const ACPI_PREDEFINED_INFO  *Package,
410*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **Elements,
411*29492bb7SDavid van Moolenbroek     UINT32                      Count)
412*29492bb7SDavid van Moolenbroek {
413*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         *SubPackage;
414*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **SubElements;
415*29492bb7SDavid van Moolenbroek     ACPI_STATUS                 Status;
416*29492bb7SDavid van Moolenbroek     UINT32                      ExpectedCount;
417*29492bb7SDavid van Moolenbroek     UINT32                      i;
418*29492bb7SDavid van Moolenbroek     UINT32                      j;
419*29492bb7SDavid van Moolenbroek 
420*29492bb7SDavid van Moolenbroek 
421*29492bb7SDavid van Moolenbroek     /*
422*29492bb7SDavid van Moolenbroek      * Validate each subpackage in the parent Package
423*29492bb7SDavid van Moolenbroek      *
424*29492bb7SDavid van Moolenbroek      * NOTE: assumes list of subpackages contains no NULL elements.
425*29492bb7SDavid van Moolenbroek      * Any NULL elements should have been removed by earlier call
426*29492bb7SDavid van Moolenbroek      * to AcpiNsRemoveNullElements.
427*29492bb7SDavid van Moolenbroek      */
428*29492bb7SDavid van Moolenbroek     for (i = 0; i < Count; i++)
429*29492bb7SDavid van Moolenbroek     {
430*29492bb7SDavid van Moolenbroek         SubPackage = *Elements;
431*29492bb7SDavid van Moolenbroek         SubElements = SubPackage->Package.Elements;
432*29492bb7SDavid van Moolenbroek         Info->ParentPackage = SubPackage;
433*29492bb7SDavid van Moolenbroek 
434*29492bb7SDavid van Moolenbroek         /* Each sub-object must be of type Package */
435*29492bb7SDavid van Moolenbroek 
436*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckObjectType (Info, &SubPackage,
437*29492bb7SDavid van Moolenbroek                     ACPI_RTYPE_PACKAGE, i);
438*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
439*29492bb7SDavid van Moolenbroek         {
440*29492bb7SDavid van Moolenbroek             return (Status);
441*29492bb7SDavid van Moolenbroek         }
442*29492bb7SDavid van Moolenbroek 
443*29492bb7SDavid van Moolenbroek         /* Examine the different types of expected subpackages */
444*29492bb7SDavid van Moolenbroek 
445*29492bb7SDavid van Moolenbroek         Info->ParentPackage = SubPackage;
446*29492bb7SDavid van Moolenbroek         switch (Package->RetInfo.Type)
447*29492bb7SDavid van Moolenbroek         {
448*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2:
449*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_PKG_COUNT:
450*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_REV_FIXED:
451*29492bb7SDavid van Moolenbroek 
452*29492bb7SDavid van Moolenbroek             /* Each subpackage has a fixed number of elements */
453*29492bb7SDavid van Moolenbroek 
454*29492bb7SDavid van Moolenbroek             ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
455*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < ExpectedCount)
456*29492bb7SDavid van Moolenbroek             {
457*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
458*29492bb7SDavid van Moolenbroek             }
459*29492bb7SDavid van Moolenbroek 
460*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckPackageElements (Info, SubElements,
461*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1,
462*29492bb7SDavid van Moolenbroek                         Package->RetInfo.Count1,
463*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType2,
464*29492bb7SDavid van Moolenbroek                         Package->RetInfo.Count2, 0);
465*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
466*29492bb7SDavid van Moolenbroek             {
467*29492bb7SDavid van Moolenbroek                 return (Status);
468*29492bb7SDavid van Moolenbroek             }
469*29492bb7SDavid van Moolenbroek             break;
470*29492bb7SDavid van Moolenbroek 
471*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_FIX_VAR:
472*29492bb7SDavid van Moolenbroek             /*
473*29492bb7SDavid van Moolenbroek              * Each subpackage has a fixed number of elements and an
474*29492bb7SDavid van Moolenbroek              * optional element
475*29492bb7SDavid van Moolenbroek              */
476*29492bb7SDavid van Moolenbroek             ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
477*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < ExpectedCount)
478*29492bb7SDavid van Moolenbroek             {
479*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
480*29492bb7SDavid van Moolenbroek             }
481*29492bb7SDavid van Moolenbroek 
482*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckPackageElements (Info, SubElements,
483*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1,
484*29492bb7SDavid van Moolenbroek                         Package->RetInfo.Count1,
485*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType2,
486*29492bb7SDavid van Moolenbroek                         SubPackage->Package.Count - Package->RetInfo.Count1, 0);
487*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
488*29492bb7SDavid van Moolenbroek             {
489*29492bb7SDavid van Moolenbroek                 return (Status);
490*29492bb7SDavid van Moolenbroek             }
491*29492bb7SDavid van Moolenbroek             break;
492*29492bb7SDavid van Moolenbroek 
493*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_FIXED:
494*29492bb7SDavid van Moolenbroek 
495*29492bb7SDavid van Moolenbroek             /* Each subpackage has a fixed length */
496*29492bb7SDavid van Moolenbroek 
497*29492bb7SDavid van Moolenbroek             ExpectedCount = Package->RetInfo2.Count;
498*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < ExpectedCount)
499*29492bb7SDavid van Moolenbroek             {
500*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
501*29492bb7SDavid van Moolenbroek             }
502*29492bb7SDavid van Moolenbroek 
503*29492bb7SDavid van Moolenbroek             /* Check the type of each subpackage element */
504*29492bb7SDavid van Moolenbroek 
505*29492bb7SDavid van Moolenbroek             for (j = 0; j < ExpectedCount; j++)
506*29492bb7SDavid van Moolenbroek             {
507*29492bb7SDavid van Moolenbroek                 Status = AcpiNsCheckObjectType (Info, &SubElements[j],
508*29492bb7SDavid van Moolenbroek                             Package->RetInfo2.ObjectType[j], j);
509*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
510*29492bb7SDavid van Moolenbroek                 {
511*29492bb7SDavid van Moolenbroek                     return (Status);
512*29492bb7SDavid van Moolenbroek                 }
513*29492bb7SDavid van Moolenbroek             }
514*29492bb7SDavid van Moolenbroek             break;
515*29492bb7SDavid van Moolenbroek 
516*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_MIN:
517*29492bb7SDavid van Moolenbroek 
518*29492bb7SDavid van Moolenbroek             /* Each subpackage has a variable but minimum length */
519*29492bb7SDavid van Moolenbroek 
520*29492bb7SDavid van Moolenbroek             ExpectedCount = Package->RetInfo.Count1;
521*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < ExpectedCount)
522*29492bb7SDavid van Moolenbroek             {
523*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
524*29492bb7SDavid van Moolenbroek             }
525*29492bb7SDavid van Moolenbroek 
526*29492bb7SDavid van Moolenbroek             /* Check the type of each subpackage element */
527*29492bb7SDavid van Moolenbroek 
528*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckPackageElements (Info, SubElements,
529*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1,
530*29492bb7SDavid van Moolenbroek                         SubPackage->Package.Count, 0, 0, 0);
531*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
532*29492bb7SDavid van Moolenbroek             {
533*29492bb7SDavid van Moolenbroek                 return (Status);
534*29492bb7SDavid van Moolenbroek             }
535*29492bb7SDavid van Moolenbroek             break;
536*29492bb7SDavid van Moolenbroek 
537*29492bb7SDavid van Moolenbroek         case ACPI_PTYPE2_COUNT:
538*29492bb7SDavid van Moolenbroek             /*
539*29492bb7SDavid van Moolenbroek              * First element is the (Integer) count of elements, including
540*29492bb7SDavid van Moolenbroek              * the count field (the ACPI name is NumElements)
541*29492bb7SDavid van Moolenbroek              */
542*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckObjectType (Info, SubElements,
543*29492bb7SDavid van Moolenbroek                         ACPI_RTYPE_INTEGER, 0);
544*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
545*29492bb7SDavid van Moolenbroek             {
546*29492bb7SDavid van Moolenbroek                 return (Status);
547*29492bb7SDavid van Moolenbroek             }
548*29492bb7SDavid van Moolenbroek 
549*29492bb7SDavid van Moolenbroek             /*
550*29492bb7SDavid van Moolenbroek              * Make sure package is large enough for the Count and is
551*29492bb7SDavid van Moolenbroek              * is as large as the minimum size
552*29492bb7SDavid van Moolenbroek              */
553*29492bb7SDavid van Moolenbroek             ExpectedCount = (UINT32) (*SubElements)->Integer.Value;
554*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < ExpectedCount)
555*29492bb7SDavid van Moolenbroek             {
556*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
557*29492bb7SDavid van Moolenbroek             }
558*29492bb7SDavid van Moolenbroek             if (SubPackage->Package.Count < Package->RetInfo.Count1)
559*29492bb7SDavid van Moolenbroek             {
560*29492bb7SDavid van Moolenbroek                 ExpectedCount = Package->RetInfo.Count1;
561*29492bb7SDavid van Moolenbroek                 goto PackageTooSmall;
562*29492bb7SDavid van Moolenbroek             }
563*29492bb7SDavid van Moolenbroek             if (ExpectedCount == 0)
564*29492bb7SDavid van Moolenbroek             {
565*29492bb7SDavid van Moolenbroek                 /*
566*29492bb7SDavid van Moolenbroek                  * Either the NumEntries element was originally zero or it was
567*29492bb7SDavid van Moolenbroek                  * a NULL element and repaired to an Integer of value zero.
568*29492bb7SDavid van Moolenbroek                  * In either case, repair it by setting NumEntries to be the
569*29492bb7SDavid van Moolenbroek                  * actual size of the subpackage.
570*29492bb7SDavid van Moolenbroek                  */
571*29492bb7SDavid van Moolenbroek                 ExpectedCount = SubPackage->Package.Count;
572*29492bb7SDavid van Moolenbroek                 (*SubElements)->Integer.Value = ExpectedCount;
573*29492bb7SDavid van Moolenbroek             }
574*29492bb7SDavid van Moolenbroek 
575*29492bb7SDavid van Moolenbroek             /* Check the type of each subpackage element */
576*29492bb7SDavid van Moolenbroek 
577*29492bb7SDavid van Moolenbroek             Status = AcpiNsCheckPackageElements (Info, (SubElements + 1),
578*29492bb7SDavid van Moolenbroek                         Package->RetInfo.ObjectType1,
579*29492bb7SDavid van Moolenbroek                         (ExpectedCount - 1), 0, 0, 1);
580*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
581*29492bb7SDavid van Moolenbroek             {
582*29492bb7SDavid van Moolenbroek                 return (Status);
583*29492bb7SDavid van Moolenbroek             }
584*29492bb7SDavid van Moolenbroek             break;
585*29492bb7SDavid van Moolenbroek 
586*29492bb7SDavid van Moolenbroek         default: /* Should not get here, type was validated by caller */
587*29492bb7SDavid van Moolenbroek 
588*29492bb7SDavid van Moolenbroek             return (AE_AML_INTERNAL);
589*29492bb7SDavid van Moolenbroek         }
590*29492bb7SDavid van Moolenbroek 
591*29492bb7SDavid van Moolenbroek         Elements++;
592*29492bb7SDavid van Moolenbroek     }
593*29492bb7SDavid van Moolenbroek 
594*29492bb7SDavid van Moolenbroek     return (AE_OK);
595*29492bb7SDavid van Moolenbroek 
596*29492bb7SDavid van Moolenbroek 
597*29492bb7SDavid van Moolenbroek PackageTooSmall:
598*29492bb7SDavid van Moolenbroek 
599*29492bb7SDavid van Moolenbroek     /* The subpackage count was smaller than required */
600*29492bb7SDavid van Moolenbroek 
601*29492bb7SDavid van Moolenbroek     ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
602*29492bb7SDavid van Moolenbroek         "Return SubPackage[%u] is too small - found %u elements, expected %u",
603*29492bb7SDavid van Moolenbroek         i, SubPackage->Package.Count, ExpectedCount));
604*29492bb7SDavid van Moolenbroek 
605*29492bb7SDavid van Moolenbroek     return (AE_AML_OPERAND_VALUE);
606*29492bb7SDavid van Moolenbroek }
607*29492bb7SDavid van Moolenbroek 
608*29492bb7SDavid van Moolenbroek 
609*29492bb7SDavid van Moolenbroek /*******************************************************************************
610*29492bb7SDavid van Moolenbroek  *
611*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiNsCheckPackageElements
612*29492bb7SDavid van Moolenbroek  *
613*29492bb7SDavid van Moolenbroek  * PARAMETERS:  Info            - Method execution information block
614*29492bb7SDavid van Moolenbroek  *              Elements        - Pointer to the package elements array
615*29492bb7SDavid van Moolenbroek  *              Type1           - Object type for first group
616*29492bb7SDavid van Moolenbroek  *              Count1          - Count for first group
617*29492bb7SDavid van Moolenbroek  *              Type2           - Object type for second group
618*29492bb7SDavid van Moolenbroek  *              Count2          - Count for second group
619*29492bb7SDavid van Moolenbroek  *              StartIndex      - Start of the first group of elements
620*29492bb7SDavid van Moolenbroek  *
621*29492bb7SDavid van Moolenbroek  * RETURN:      Status
622*29492bb7SDavid van Moolenbroek  *
623*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Check that all elements of a package are of the correct object
624*29492bb7SDavid van Moolenbroek  *              type. Supports up to two groups of different object types.
625*29492bb7SDavid van Moolenbroek  *
626*29492bb7SDavid van Moolenbroek  ******************************************************************************/
627*29492bb7SDavid van Moolenbroek 
628*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiNsCheckPackageElements(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** Elements,UINT8 Type1,UINT32 Count1,UINT8 Type2,UINT32 Count2,UINT32 StartIndex)629*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageElements (
630*29492bb7SDavid van Moolenbroek     ACPI_EVALUATE_INFO          *Info,
631*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **Elements,
632*29492bb7SDavid van Moolenbroek     UINT8                       Type1,
633*29492bb7SDavid van Moolenbroek     UINT32                      Count1,
634*29492bb7SDavid van Moolenbroek     UINT8                       Type2,
635*29492bb7SDavid van Moolenbroek     UINT32                      Count2,
636*29492bb7SDavid van Moolenbroek     UINT32                      StartIndex)
637*29492bb7SDavid van Moolenbroek {
638*29492bb7SDavid van Moolenbroek     ACPI_OPERAND_OBJECT         **ThisElement = Elements;
639*29492bb7SDavid van Moolenbroek     ACPI_STATUS                 Status;
640*29492bb7SDavid van Moolenbroek     UINT32                      i;
641*29492bb7SDavid van Moolenbroek 
642*29492bb7SDavid van Moolenbroek 
643*29492bb7SDavid van Moolenbroek     /*
644*29492bb7SDavid van Moolenbroek      * Up to two groups of package elements are supported by the data
645*29492bb7SDavid van Moolenbroek      * structure. All elements in each group must be of the same type.
646*29492bb7SDavid van Moolenbroek      * The second group can have a count of zero.
647*29492bb7SDavid van Moolenbroek      */
648*29492bb7SDavid van Moolenbroek     for (i = 0; i < Count1; i++)
649*29492bb7SDavid van Moolenbroek     {
650*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckObjectType (Info, ThisElement,
651*29492bb7SDavid van Moolenbroek                     Type1, i + StartIndex);
652*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
653*29492bb7SDavid van Moolenbroek         {
654*29492bb7SDavid van Moolenbroek             return (Status);
655*29492bb7SDavid van Moolenbroek         }
656*29492bb7SDavid van Moolenbroek         ThisElement++;
657*29492bb7SDavid van Moolenbroek     }
658*29492bb7SDavid van Moolenbroek 
659*29492bb7SDavid van Moolenbroek     for (i = 0; i < Count2; i++)
660*29492bb7SDavid van Moolenbroek     {
661*29492bb7SDavid van Moolenbroek         Status = AcpiNsCheckObjectType (Info, ThisElement,
662*29492bb7SDavid van Moolenbroek                     Type2, (i + Count1 + StartIndex));
663*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
664*29492bb7SDavid van Moolenbroek         {
665*29492bb7SDavid van Moolenbroek             return (Status);
666*29492bb7SDavid van Moolenbroek         }
667*29492bb7SDavid van Moolenbroek         ThisElement++;
668*29492bb7SDavid van Moolenbroek     }
669*29492bb7SDavid van Moolenbroek 
670*29492bb7SDavid van Moolenbroek     return (AE_OK);
671*29492bb7SDavid van Moolenbroek }
672