1*11225SDana.Myers@Sun.COM /******************************************************************************
2*11225SDana.Myers@Sun.COM *
3*11225SDana.Myers@Sun.COM * Module Name: nsrepair2 - Repair for objects returned by specific
4*11225SDana.Myers@Sun.COM * predefined methods
5*11225SDana.Myers@Sun.COM *
6*11225SDana.Myers@Sun.COM *****************************************************************************/
7*11225SDana.Myers@Sun.COM
8*11225SDana.Myers@Sun.COM /******************************************************************************
9*11225SDana.Myers@Sun.COM *
10*11225SDana.Myers@Sun.COM * 1. Copyright Notice
11*11225SDana.Myers@Sun.COM *
12*11225SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
13*11225SDana.Myers@Sun.COM * All rights reserved.
14*11225SDana.Myers@Sun.COM *
15*11225SDana.Myers@Sun.COM * 2. License
16*11225SDana.Myers@Sun.COM *
17*11225SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property
18*11225SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided
19*11225SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual
20*11225SDana.Myers@Sun.COM * property rights.
21*11225SDana.Myers@Sun.COM *
22*11225SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*11225SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an
24*11225SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*11225SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy,
26*11225SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered
27*11225SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and
28*11225SDana.Myers@Sun.COM *
29*11225SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*11225SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel
31*11225SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell,
32*11225SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof
33*11225SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright
34*11225SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions
35*11225SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right
36*11225SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise;
37*11225SDana.Myers@Sun.COM *
38*11225SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following
39*11225SDana.Myers@Sun.COM * conditions are met:
40*11225SDana.Myers@Sun.COM *
41*11225SDana.Myers@Sun.COM * 3. Conditions
42*11225SDana.Myers@Sun.COM *
43*11225SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*11225SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered
45*11225SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include
46*11225SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions,
47*11225SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition,
48*11225SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to
49*11225SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered
50*11225SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the
51*11225SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee
52*11225SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived,
53*11225SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code.
54*11225SDana.Myers@Sun.COM *
55*11225SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*11225SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered
57*11225SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must
58*11225SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the
59*11225SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In
60*11225SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any
61*11225SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the
62*11225SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual
63*11225SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and
64*11225SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may
65*11225SDana.Myers@Sun.COM * make.
66*11225SDana.Myers@Sun.COM *
67*11225SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*11225SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the
69*11225SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance
70*11225SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the
71*11225SDana.Myers@Sun.COM * distribution.
72*11225SDana.Myers@Sun.COM *
73*11225SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original
74*11225SDana.Myers@Sun.COM * Intel Code.
75*11225SDana.Myers@Sun.COM *
76*11225SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*11225SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or
78*11225SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code
79*11225SDana.Myers@Sun.COM * without prior written authorization from Intel.
80*11225SDana.Myers@Sun.COM *
81*11225SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance
82*11225SDana.Myers@Sun.COM *
83*11225SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*11225SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*11225SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86*11225SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87*11225SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88*11225SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*11225SDana.Myers@Sun.COM * PARTICULAR PURPOSE.
90*11225SDana.Myers@Sun.COM *
91*11225SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*11225SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*11225SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*11225SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*11225SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*11225SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97*11225SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*11225SDana.Myers@Sun.COM * LIMITED REMEDY.
99*11225SDana.Myers@Sun.COM *
100*11225SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*11225SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any
102*11225SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or
103*11225SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the
104*11225SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or
105*11225SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall
106*11225SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in
107*11225SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the
108*11225SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*11225SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process,
110*11225SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the
111*11225SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license,
112*11225SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining
113*11225SDana.Myers@Sun.COM * such license, approval or letter.
114*11225SDana.Myers@Sun.COM *
115*11225SDana.Myers@Sun.COM *****************************************************************************/
116*11225SDana.Myers@Sun.COM
117*11225SDana.Myers@Sun.COM #define __NSREPAIR2_C__
118*11225SDana.Myers@Sun.COM
119*11225SDana.Myers@Sun.COM #include "acpi.h"
120*11225SDana.Myers@Sun.COM #include "accommon.h"
121*11225SDana.Myers@Sun.COM #include "acnamesp.h"
122*11225SDana.Myers@Sun.COM
123*11225SDana.Myers@Sun.COM #define _COMPONENT ACPI_NAMESPACE
124*11225SDana.Myers@Sun.COM ACPI_MODULE_NAME ("nsrepair2")
125*11225SDana.Myers@Sun.COM
126*11225SDana.Myers@Sun.COM
127*11225SDana.Myers@Sun.COM /*
128*11225SDana.Myers@Sun.COM * Information structure and handler for ACPI predefined names that can
129*11225SDana.Myers@Sun.COM * be repaired on a per-name basis.
130*11225SDana.Myers@Sun.COM */
131*11225SDana.Myers@Sun.COM typedef
132*11225SDana.Myers@Sun.COM ACPI_STATUS (*ACPI_REPAIR_FUNCTION) (
133*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
134*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr);
135*11225SDana.Myers@Sun.COM
136*11225SDana.Myers@Sun.COM typedef struct acpi_repair_info
137*11225SDana.Myers@Sun.COM {
138*11225SDana.Myers@Sun.COM char Name[ACPI_NAME_SIZE];
139*11225SDana.Myers@Sun.COM ACPI_REPAIR_FUNCTION RepairFunction;
140*11225SDana.Myers@Sun.COM
141*11225SDana.Myers@Sun.COM } ACPI_REPAIR_INFO;
142*11225SDana.Myers@Sun.COM
143*11225SDana.Myers@Sun.COM
144*11225SDana.Myers@Sun.COM /* Local prototypes */
145*11225SDana.Myers@Sun.COM
146*11225SDana.Myers@Sun.COM static const ACPI_REPAIR_INFO *
147*11225SDana.Myers@Sun.COM AcpiNsMatchRepairableName (
148*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node);
149*11225SDana.Myers@Sun.COM
150*11225SDana.Myers@Sun.COM static ACPI_STATUS
151*11225SDana.Myers@Sun.COM AcpiNsRepair_ALR (
152*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
153*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr);
154*11225SDana.Myers@Sun.COM
155*11225SDana.Myers@Sun.COM static ACPI_STATUS
156*11225SDana.Myers@Sun.COM AcpiNsRepair_PSS (
157*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
158*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr);
159*11225SDana.Myers@Sun.COM
160*11225SDana.Myers@Sun.COM static ACPI_STATUS
161*11225SDana.Myers@Sun.COM AcpiNsRepair_TSS (
162*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
163*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr);
164*11225SDana.Myers@Sun.COM
165*11225SDana.Myers@Sun.COM static ACPI_STATUS
166*11225SDana.Myers@Sun.COM AcpiNsCheckSortedList (
167*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
168*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject,
169*11225SDana.Myers@Sun.COM UINT32 ExpectedCount,
170*11225SDana.Myers@Sun.COM UINT32 SortIndex,
171*11225SDana.Myers@Sun.COM UINT8 SortDirection,
172*11225SDana.Myers@Sun.COM char *SortKeyName);
173*11225SDana.Myers@Sun.COM
174*11225SDana.Myers@Sun.COM static ACPI_STATUS
175*11225SDana.Myers@Sun.COM AcpiNsRemoveNullElements (
176*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *Package);
177*11225SDana.Myers@Sun.COM
178*11225SDana.Myers@Sun.COM static ACPI_STATUS
179*11225SDana.Myers@Sun.COM AcpiNsSortList (
180*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements,
181*11225SDana.Myers@Sun.COM UINT32 Count,
182*11225SDana.Myers@Sun.COM UINT32 Index,
183*11225SDana.Myers@Sun.COM UINT8 SortDirection);
184*11225SDana.Myers@Sun.COM
185*11225SDana.Myers@Sun.COM /* Values for SortDirection above */
186*11225SDana.Myers@Sun.COM
187*11225SDana.Myers@Sun.COM #define ACPI_SORT_ASCENDING 0
188*11225SDana.Myers@Sun.COM #define ACPI_SORT_DESCENDING 1
189*11225SDana.Myers@Sun.COM
190*11225SDana.Myers@Sun.COM
191*11225SDana.Myers@Sun.COM /*
192*11225SDana.Myers@Sun.COM * This table contains the names of the predefined methods for which we can
193*11225SDana.Myers@Sun.COM * perform more complex repairs.
194*11225SDana.Myers@Sun.COM *
195*11225SDana.Myers@Sun.COM * _ALR: Sort the list ascending by AmbientIlluminance if necessary
196*11225SDana.Myers@Sun.COM * _PSS: Sort the list descending by Power if necessary
197*11225SDana.Myers@Sun.COM * _TSS: Sort the list descending by Power if necessary
198*11225SDana.Myers@Sun.COM */
199*11225SDana.Myers@Sun.COM static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] =
200*11225SDana.Myers@Sun.COM {
201*11225SDana.Myers@Sun.COM {"_ALR", AcpiNsRepair_ALR},
202*11225SDana.Myers@Sun.COM {"_PSS", AcpiNsRepair_PSS},
203*11225SDana.Myers@Sun.COM {"_TSS", AcpiNsRepair_TSS},
204*11225SDana.Myers@Sun.COM {{0,0,0,0}, NULL} /* Table terminator */
205*11225SDana.Myers@Sun.COM };
206*11225SDana.Myers@Sun.COM
207*11225SDana.Myers@Sun.COM
208*11225SDana.Myers@Sun.COM /******************************************************************************
209*11225SDana.Myers@Sun.COM *
210*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsComplexRepairs
211*11225SDana.Myers@Sun.COM *
212*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure
213*11225SDana.Myers@Sun.COM * Node - Namespace node for the method/object
214*11225SDana.Myers@Sun.COM * ValidateStatus - Original status of earlier validation
215*11225SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the
216*11225SDana.Myers@Sun.COM * evaluation of a method or object
217*11225SDana.Myers@Sun.COM *
218*11225SDana.Myers@Sun.COM * RETURN: Status. AE_OK if repair was successful. If name is not
219*11225SDana.Myers@Sun.COM * matched, ValidateStatus is returned.
220*11225SDana.Myers@Sun.COM *
221*11225SDana.Myers@Sun.COM * DESCRIPTION: Attempt to repair/convert a return object of a type that was
222*11225SDana.Myers@Sun.COM * not expected.
223*11225SDana.Myers@Sun.COM *
224*11225SDana.Myers@Sun.COM *****************************************************************************/
225*11225SDana.Myers@Sun.COM
226*11225SDana.Myers@Sun.COM ACPI_STATUS
AcpiNsComplexRepairs(ACPI_PREDEFINED_DATA * Data,ACPI_NAMESPACE_NODE * Node,ACPI_STATUS ValidateStatus,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)227*11225SDana.Myers@Sun.COM AcpiNsComplexRepairs (
228*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
229*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node,
230*11225SDana.Myers@Sun.COM ACPI_STATUS ValidateStatus,
231*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr)
232*11225SDana.Myers@Sun.COM {
233*11225SDana.Myers@Sun.COM const ACPI_REPAIR_INFO *Predefined;
234*11225SDana.Myers@Sun.COM ACPI_STATUS Status;
235*11225SDana.Myers@Sun.COM
236*11225SDana.Myers@Sun.COM
237*11225SDana.Myers@Sun.COM /* Check if this name is in the list of repairable names */
238*11225SDana.Myers@Sun.COM
239*11225SDana.Myers@Sun.COM Predefined = AcpiNsMatchRepairableName (Node);
240*11225SDana.Myers@Sun.COM if (!Predefined)
241*11225SDana.Myers@Sun.COM {
242*11225SDana.Myers@Sun.COM return (ValidateStatus);
243*11225SDana.Myers@Sun.COM }
244*11225SDana.Myers@Sun.COM
245*11225SDana.Myers@Sun.COM Status = Predefined->RepairFunction (Data, ReturnObjectPtr);
246*11225SDana.Myers@Sun.COM return (Status);
247*11225SDana.Myers@Sun.COM }
248*11225SDana.Myers@Sun.COM
249*11225SDana.Myers@Sun.COM
250*11225SDana.Myers@Sun.COM /******************************************************************************
251*11225SDana.Myers@Sun.COM *
252*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsMatchRepairableName
253*11225SDana.Myers@Sun.COM *
254*11225SDana.Myers@Sun.COM * PARAMETERS: Node - Namespace node for the method/object
255*11225SDana.Myers@Sun.COM *
256*11225SDana.Myers@Sun.COM * RETURN: Pointer to entry in repair table. NULL indicates not found.
257*11225SDana.Myers@Sun.COM *
258*11225SDana.Myers@Sun.COM * DESCRIPTION: Check an object name against the repairable object list.
259*11225SDana.Myers@Sun.COM *
260*11225SDana.Myers@Sun.COM *****************************************************************************/
261*11225SDana.Myers@Sun.COM
262*11225SDana.Myers@Sun.COM static const ACPI_REPAIR_INFO *
AcpiNsMatchRepairableName(ACPI_NAMESPACE_NODE * Node)263*11225SDana.Myers@Sun.COM AcpiNsMatchRepairableName (
264*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node)
265*11225SDana.Myers@Sun.COM {
266*11225SDana.Myers@Sun.COM const ACPI_REPAIR_INFO *ThisName;
267*11225SDana.Myers@Sun.COM
268*11225SDana.Myers@Sun.COM
269*11225SDana.Myers@Sun.COM /* Search info table for a repairable predefined method/object name */
270*11225SDana.Myers@Sun.COM
271*11225SDana.Myers@Sun.COM ThisName = AcpiNsRepairableNames;
272*11225SDana.Myers@Sun.COM while (ThisName->RepairFunction)
273*11225SDana.Myers@Sun.COM {
274*11225SDana.Myers@Sun.COM if (ACPI_COMPARE_NAME (Node->Name.Ascii, ThisName->Name))
275*11225SDana.Myers@Sun.COM {
276*11225SDana.Myers@Sun.COM return (ThisName);
277*11225SDana.Myers@Sun.COM }
278*11225SDana.Myers@Sun.COM ThisName++;
279*11225SDana.Myers@Sun.COM }
280*11225SDana.Myers@Sun.COM
281*11225SDana.Myers@Sun.COM return (NULL); /* Not found */
282*11225SDana.Myers@Sun.COM }
283*11225SDana.Myers@Sun.COM
284*11225SDana.Myers@Sun.COM
285*11225SDana.Myers@Sun.COM /******************************************************************************
286*11225SDana.Myers@Sun.COM *
287*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsRepair_ALR
288*11225SDana.Myers@Sun.COM *
289*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure
290*11225SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the
291*11225SDana.Myers@Sun.COM * evaluation of a method or object
292*11225SDana.Myers@Sun.COM *
293*11225SDana.Myers@Sun.COM * RETURN: Status. AE_OK if object is OK or was repaired successfully
294*11225SDana.Myers@Sun.COM *
295*11225SDana.Myers@Sun.COM * DESCRIPTION: Repair for the _ALR object. If necessary, sort the object list
296*11225SDana.Myers@Sun.COM * ascending by the ambient illuminance values.
297*11225SDana.Myers@Sun.COM *
298*11225SDana.Myers@Sun.COM *****************************************************************************/
299*11225SDana.Myers@Sun.COM
300*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsRepair_ALR(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)301*11225SDana.Myers@Sun.COM AcpiNsRepair_ALR (
302*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
303*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr)
304*11225SDana.Myers@Sun.COM {
305*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
306*11225SDana.Myers@Sun.COM ACPI_STATUS Status;
307*11225SDana.Myers@Sun.COM
308*11225SDana.Myers@Sun.COM
309*11225SDana.Myers@Sun.COM Status = AcpiNsCheckSortedList (Data, ReturnObject, 2, 1,
310*11225SDana.Myers@Sun.COM ACPI_SORT_ASCENDING, "AmbientIlluminance");
311*11225SDana.Myers@Sun.COM
312*11225SDana.Myers@Sun.COM return (Status);
313*11225SDana.Myers@Sun.COM }
314*11225SDana.Myers@Sun.COM
315*11225SDana.Myers@Sun.COM
316*11225SDana.Myers@Sun.COM /******************************************************************************
317*11225SDana.Myers@Sun.COM *
318*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsRepair_TSS
319*11225SDana.Myers@Sun.COM *
320*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure
321*11225SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the
322*11225SDana.Myers@Sun.COM * evaluation of a method or object
323*11225SDana.Myers@Sun.COM *
324*11225SDana.Myers@Sun.COM * RETURN: Status. AE_OK if object is OK or was repaired successfully
325*11225SDana.Myers@Sun.COM *
326*11225SDana.Myers@Sun.COM * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
327*11225SDana.Myers@Sun.COM * descending by the power dissipation values.
328*11225SDana.Myers@Sun.COM *
329*11225SDana.Myers@Sun.COM *****************************************************************************/
330*11225SDana.Myers@Sun.COM
331*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsRepair_TSS(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)332*11225SDana.Myers@Sun.COM AcpiNsRepair_TSS (
333*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
334*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr)
335*11225SDana.Myers@Sun.COM {
336*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
337*11225SDana.Myers@Sun.COM ACPI_STATUS Status;
338*11225SDana.Myers@Sun.COM
339*11225SDana.Myers@Sun.COM
340*11225SDana.Myers@Sun.COM Status = AcpiNsCheckSortedList (Data, ReturnObject, 5, 1,
341*11225SDana.Myers@Sun.COM ACPI_SORT_DESCENDING, "PowerDissipation");
342*11225SDana.Myers@Sun.COM
343*11225SDana.Myers@Sun.COM return (Status);
344*11225SDana.Myers@Sun.COM }
345*11225SDana.Myers@Sun.COM
346*11225SDana.Myers@Sun.COM
347*11225SDana.Myers@Sun.COM /******************************************************************************
348*11225SDana.Myers@Sun.COM *
349*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsRepair_PSS
350*11225SDana.Myers@Sun.COM *
351*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure
352*11225SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the
353*11225SDana.Myers@Sun.COM * evaluation of a method or object
354*11225SDana.Myers@Sun.COM *
355*11225SDana.Myers@Sun.COM * RETURN: Status. AE_OK if object is OK or was repaired successfully
356*11225SDana.Myers@Sun.COM *
357*11225SDana.Myers@Sun.COM * DESCRIPTION: Repair for the _PSS object. If necessary, sort the object list
358*11225SDana.Myers@Sun.COM * by the CPU frequencies. Check that the power dissipation values
359*11225SDana.Myers@Sun.COM * are all proportional to CPU frequency (i.e., sorting by
360*11225SDana.Myers@Sun.COM * frequency should be the same as sorting by power.)
361*11225SDana.Myers@Sun.COM *
362*11225SDana.Myers@Sun.COM *****************************************************************************/
363*11225SDana.Myers@Sun.COM
364*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsRepair_PSS(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)365*11225SDana.Myers@Sun.COM AcpiNsRepair_PSS (
366*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
367*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr)
368*11225SDana.Myers@Sun.COM {
369*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
370*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **OuterElements;
371*11225SDana.Myers@Sun.COM UINT32 OuterElementCount;
372*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements;
373*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc;
374*11225SDana.Myers@Sun.COM UINT32 PreviousValue;
375*11225SDana.Myers@Sun.COM ACPI_STATUS Status;
376*11225SDana.Myers@Sun.COM UINT32 i;
377*11225SDana.Myers@Sun.COM
378*11225SDana.Myers@Sun.COM
379*11225SDana.Myers@Sun.COM /*
380*11225SDana.Myers@Sun.COM * Entries (sub-packages) in the _PSS Package must be sorted by power
381*11225SDana.Myers@Sun.COM * dissipation, in descending order. If it appears that the list is
382*11225SDana.Myers@Sun.COM * incorrectly sorted, sort it. We sort by CpuFrequency, since this
383*11225SDana.Myers@Sun.COM * should be proportional to the power.
384*11225SDana.Myers@Sun.COM */
385*11225SDana.Myers@Sun.COM Status =AcpiNsCheckSortedList (Data, ReturnObject, 6, 0,
386*11225SDana.Myers@Sun.COM ACPI_SORT_DESCENDING, "CpuFrequency");
387*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status))
388*11225SDana.Myers@Sun.COM {
389*11225SDana.Myers@Sun.COM return (Status);
390*11225SDana.Myers@Sun.COM }
391*11225SDana.Myers@Sun.COM
392*11225SDana.Myers@Sun.COM /*
393*11225SDana.Myers@Sun.COM * We now know the list is correctly sorted by CPU frequency. Check if
394*11225SDana.Myers@Sun.COM * the power dissipation values are proportional.
395*11225SDana.Myers@Sun.COM */
396*11225SDana.Myers@Sun.COM PreviousValue = ACPI_UINT32_MAX;
397*11225SDana.Myers@Sun.COM OuterElements = ReturnObject->Package.Elements;
398*11225SDana.Myers@Sun.COM OuterElementCount = ReturnObject->Package.Count;
399*11225SDana.Myers@Sun.COM
400*11225SDana.Myers@Sun.COM for (i = 0; i < OuterElementCount; i++)
401*11225SDana.Myers@Sun.COM {
402*11225SDana.Myers@Sun.COM Elements = (*OuterElements)->Package.Elements;
403*11225SDana.Myers@Sun.COM ObjDesc = Elements[1]; /* Index1 = PowerDissipation */
404*11225SDana.Myers@Sun.COM
405*11225SDana.Myers@Sun.COM if ((UINT32) ObjDesc->Integer.Value > PreviousValue)
406*11225SDana.Myers@Sun.COM {
407*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
408*11225SDana.Myers@Sun.COM "SubPackage[%u,%u] - suspicious power dissipation values",
409*11225SDana.Myers@Sun.COM i-1, i));
410*11225SDana.Myers@Sun.COM }
411*11225SDana.Myers@Sun.COM
412*11225SDana.Myers@Sun.COM PreviousValue = (UINT32) ObjDesc->Integer.Value;
413*11225SDana.Myers@Sun.COM OuterElements++;
414*11225SDana.Myers@Sun.COM }
415*11225SDana.Myers@Sun.COM
416*11225SDana.Myers@Sun.COM return (AE_OK);
417*11225SDana.Myers@Sun.COM }
418*11225SDana.Myers@Sun.COM
419*11225SDana.Myers@Sun.COM
420*11225SDana.Myers@Sun.COM /******************************************************************************
421*11225SDana.Myers@Sun.COM *
422*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckSortedList
423*11225SDana.Myers@Sun.COM *
424*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure
425*11225SDana.Myers@Sun.COM * ReturnObject - Pointer to the top-level returned object
426*11225SDana.Myers@Sun.COM * ExpectedCount - Minimum length of each sub-package
427*11225SDana.Myers@Sun.COM * SortIndex - Sub-package entry to sort on
428*11225SDana.Myers@Sun.COM * SortDirection - Ascending or descending
429*11225SDana.Myers@Sun.COM * SortKeyName - Name of the SortIndex field
430*11225SDana.Myers@Sun.COM *
431*11225SDana.Myers@Sun.COM * RETURN: Status. AE_OK if the list is valid and is sorted correctly or
432*11225SDana.Myers@Sun.COM * has been repaired by sorting the list.
433*11225SDana.Myers@Sun.COM *
434*11225SDana.Myers@Sun.COM * DESCRIPTION: Check if the package list is valid and sorted correctly by the
435*11225SDana.Myers@Sun.COM * SortIndex. If not, then sort the list.
436*11225SDana.Myers@Sun.COM *
437*11225SDana.Myers@Sun.COM *****************************************************************************/
438*11225SDana.Myers@Sun.COM
439*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsCheckSortedList(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT * ReturnObject,UINT32 ExpectedCount,UINT32 SortIndex,UINT8 SortDirection,char * SortKeyName)440*11225SDana.Myers@Sun.COM AcpiNsCheckSortedList (
441*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data,
442*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject,
443*11225SDana.Myers@Sun.COM UINT32 ExpectedCount,
444*11225SDana.Myers@Sun.COM UINT32 SortIndex,
445*11225SDana.Myers@Sun.COM UINT8 SortDirection,
446*11225SDana.Myers@Sun.COM char *SortKeyName)
447*11225SDana.Myers@Sun.COM {
448*11225SDana.Myers@Sun.COM UINT32 OuterElementCount;
449*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **OuterElements;
450*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements;
451*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc;
452*11225SDana.Myers@Sun.COM UINT32 i;
453*11225SDana.Myers@Sun.COM UINT32 PreviousValue;
454*11225SDana.Myers@Sun.COM ACPI_STATUS Status;
455*11225SDana.Myers@Sun.COM
456*11225SDana.Myers@Sun.COM
457*11225SDana.Myers@Sun.COM /* The top-level object must be a package */
458*11225SDana.Myers@Sun.COM
459*11225SDana.Myers@Sun.COM if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
460*11225SDana.Myers@Sun.COM {
461*11225SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE);
462*11225SDana.Myers@Sun.COM }
463*11225SDana.Myers@Sun.COM
464*11225SDana.Myers@Sun.COM /*
465*11225SDana.Myers@Sun.COM * Detect any NULL package elements and remove them from the
466*11225SDana.Myers@Sun.COM * package.
467*11225SDana.Myers@Sun.COM *
468*11225SDana.Myers@Sun.COM * TBD: We may want to do this for all predefined names that
469*11225SDana.Myers@Sun.COM * return a variable-length package of packages.
470*11225SDana.Myers@Sun.COM */
471*11225SDana.Myers@Sun.COM Status = AcpiNsRemoveNullElements (ReturnObject);
472*11225SDana.Myers@Sun.COM if (Status == AE_NULL_ENTRY)
473*11225SDana.Myers@Sun.COM {
474*11225SDana.Myers@Sun.COM ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
475*11225SDana.Myers@Sun.COM "NULL elements removed from package"));
476*11225SDana.Myers@Sun.COM
477*11225SDana.Myers@Sun.COM /* Exit if package is now zero length */
478*11225SDana.Myers@Sun.COM
479*11225SDana.Myers@Sun.COM if (!ReturnObject->Package.Count)
480*11225SDana.Myers@Sun.COM {
481*11225SDana.Myers@Sun.COM return (AE_NULL_ENTRY);
482*11225SDana.Myers@Sun.COM }
483*11225SDana.Myers@Sun.COM }
484*11225SDana.Myers@Sun.COM
485*11225SDana.Myers@Sun.COM OuterElements = ReturnObject->Package.Elements;
486*11225SDana.Myers@Sun.COM OuterElementCount = ReturnObject->Package.Count;
487*11225SDana.Myers@Sun.COM if (!OuterElementCount)
488*11225SDana.Myers@Sun.COM {
489*11225SDana.Myers@Sun.COM return (AE_AML_PACKAGE_LIMIT);
490*11225SDana.Myers@Sun.COM }
491*11225SDana.Myers@Sun.COM
492*11225SDana.Myers@Sun.COM PreviousValue = 0;
493*11225SDana.Myers@Sun.COM if (SortDirection == ACPI_SORT_DESCENDING)
494*11225SDana.Myers@Sun.COM {
495*11225SDana.Myers@Sun.COM PreviousValue = ACPI_UINT32_MAX;
496*11225SDana.Myers@Sun.COM }
497*11225SDana.Myers@Sun.COM
498*11225SDana.Myers@Sun.COM /* Examine each subpackage */
499*11225SDana.Myers@Sun.COM
500*11225SDana.Myers@Sun.COM for (i = 0; i < OuterElementCount; i++)
501*11225SDana.Myers@Sun.COM {
502*11225SDana.Myers@Sun.COM /* Each element of the top-level package must also be a package */
503*11225SDana.Myers@Sun.COM
504*11225SDana.Myers@Sun.COM if ((*OuterElements)->Common.Type != ACPI_TYPE_PACKAGE)
505*11225SDana.Myers@Sun.COM {
506*11225SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE);
507*11225SDana.Myers@Sun.COM }
508*11225SDana.Myers@Sun.COM
509*11225SDana.Myers@Sun.COM /* Each sub-package must have the minimum length */
510*11225SDana.Myers@Sun.COM
511*11225SDana.Myers@Sun.COM if ((*OuterElements)->Package.Count < ExpectedCount)
512*11225SDana.Myers@Sun.COM {
513*11225SDana.Myers@Sun.COM return (AE_AML_PACKAGE_LIMIT);
514*11225SDana.Myers@Sun.COM }
515*11225SDana.Myers@Sun.COM
516*11225SDana.Myers@Sun.COM Elements = (*OuterElements)->Package.Elements;
517*11225SDana.Myers@Sun.COM ObjDesc = Elements[SortIndex];
518*11225SDana.Myers@Sun.COM
519*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)
520*11225SDana.Myers@Sun.COM {
521*11225SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE);
522*11225SDana.Myers@Sun.COM }
523*11225SDana.Myers@Sun.COM
524*11225SDana.Myers@Sun.COM /*
525*11225SDana.Myers@Sun.COM * The list must be sorted in the specified order. If we detect a
526*11225SDana.Myers@Sun.COM * discrepancy, issue a warning and sort the entire list
527*11225SDana.Myers@Sun.COM */
528*11225SDana.Myers@Sun.COM if (((SortDirection == ACPI_SORT_ASCENDING) &&
529*11225SDana.Myers@Sun.COM (ObjDesc->Integer.Value < PreviousValue)) ||
530*11225SDana.Myers@Sun.COM ((SortDirection == ACPI_SORT_DESCENDING) &&
531*11225SDana.Myers@Sun.COM (ObjDesc->Integer.Value > PreviousValue)))
532*11225SDana.Myers@Sun.COM {
533*11225SDana.Myers@Sun.COM Status = AcpiNsSortList (ReturnObject->Package.Elements,
534*11225SDana.Myers@Sun.COM OuterElementCount, SortIndex, SortDirection);
535*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status))
536*11225SDana.Myers@Sun.COM {
537*11225SDana.Myers@Sun.COM return (Status);
538*11225SDana.Myers@Sun.COM }
539*11225SDana.Myers@Sun.COM
540*11225SDana.Myers@Sun.COM Data->Flags |= ACPI_OBJECT_REPAIRED;
541*11225SDana.Myers@Sun.COM
542*11225SDana.Myers@Sun.COM ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
543*11225SDana.Myers@Sun.COM "Repaired unsorted list - now sorted by %s", SortKeyName));
544*11225SDana.Myers@Sun.COM return (AE_OK);
545*11225SDana.Myers@Sun.COM }
546*11225SDana.Myers@Sun.COM
547*11225SDana.Myers@Sun.COM PreviousValue = (UINT32) ObjDesc->Integer.Value;
548*11225SDana.Myers@Sun.COM OuterElements++;
549*11225SDana.Myers@Sun.COM }
550*11225SDana.Myers@Sun.COM
551*11225SDana.Myers@Sun.COM return (AE_OK);
552*11225SDana.Myers@Sun.COM }
553*11225SDana.Myers@Sun.COM
554*11225SDana.Myers@Sun.COM
555*11225SDana.Myers@Sun.COM /******************************************************************************
556*11225SDana.Myers@Sun.COM *
557*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsRemoveNullElements
558*11225SDana.Myers@Sun.COM *
559*11225SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - A Package object
560*11225SDana.Myers@Sun.COM *
561*11225SDana.Myers@Sun.COM * RETURN: Status. AE_NULL_ENTRY means that one or more elements were
562*11225SDana.Myers@Sun.COM * removed.
563*11225SDana.Myers@Sun.COM *
564*11225SDana.Myers@Sun.COM * DESCRIPTION: Remove all NULL package elements and update the package count.
565*11225SDana.Myers@Sun.COM *
566*11225SDana.Myers@Sun.COM *****************************************************************************/
567*11225SDana.Myers@Sun.COM
568*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsRemoveNullElements(ACPI_OPERAND_OBJECT * ObjDesc)569*11225SDana.Myers@Sun.COM AcpiNsRemoveNullElements (
570*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc)
571*11225SDana.Myers@Sun.COM {
572*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Source;
573*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Dest;
574*11225SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK;
575*11225SDana.Myers@Sun.COM UINT32 Count;
576*11225SDana.Myers@Sun.COM UINT32 NewCount;
577*11225SDana.Myers@Sun.COM UINT32 i;
578*11225SDana.Myers@Sun.COM
579*11225SDana.Myers@Sun.COM
580*11225SDana.Myers@Sun.COM Count = ObjDesc->Package.Count;
581*11225SDana.Myers@Sun.COM NewCount = Count;
582*11225SDana.Myers@Sun.COM
583*11225SDana.Myers@Sun.COM Source = ObjDesc->Package.Elements;
584*11225SDana.Myers@Sun.COM Dest = Source;
585*11225SDana.Myers@Sun.COM
586*11225SDana.Myers@Sun.COM /* Examine all elements of the package object */
587*11225SDana.Myers@Sun.COM
588*11225SDana.Myers@Sun.COM for (i = 0; i < Count; i++)
589*11225SDana.Myers@Sun.COM {
590*11225SDana.Myers@Sun.COM if (!*Source)
591*11225SDana.Myers@Sun.COM {
592*11225SDana.Myers@Sun.COM Status = AE_NULL_ENTRY;
593*11225SDana.Myers@Sun.COM NewCount--;
594*11225SDana.Myers@Sun.COM }
595*11225SDana.Myers@Sun.COM else
596*11225SDana.Myers@Sun.COM {
597*11225SDana.Myers@Sun.COM *Dest = *Source;
598*11225SDana.Myers@Sun.COM Dest++;
599*11225SDana.Myers@Sun.COM }
600*11225SDana.Myers@Sun.COM Source++;
601*11225SDana.Myers@Sun.COM }
602*11225SDana.Myers@Sun.COM
603*11225SDana.Myers@Sun.COM if (Status == AE_NULL_ENTRY)
604*11225SDana.Myers@Sun.COM {
605*11225SDana.Myers@Sun.COM /* NULL terminate list and update the package count */
606*11225SDana.Myers@Sun.COM
607*11225SDana.Myers@Sun.COM *Dest = NULL;
608*11225SDana.Myers@Sun.COM ObjDesc->Package.Count = NewCount;
609*11225SDana.Myers@Sun.COM }
610*11225SDana.Myers@Sun.COM
611*11225SDana.Myers@Sun.COM return (Status);
612*11225SDana.Myers@Sun.COM }
613*11225SDana.Myers@Sun.COM
614*11225SDana.Myers@Sun.COM
615*11225SDana.Myers@Sun.COM /******************************************************************************
616*11225SDana.Myers@Sun.COM *
617*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsSortList
618*11225SDana.Myers@Sun.COM *
619*11225SDana.Myers@Sun.COM * PARAMETERS: Elements - Package object element list
620*11225SDana.Myers@Sun.COM * Count - Element count for above
621*11225SDana.Myers@Sun.COM * Index - Sort by which package element
622*11225SDana.Myers@Sun.COM * SortDirection - Ascending or Descending sort
623*11225SDana.Myers@Sun.COM *
624*11225SDana.Myers@Sun.COM * RETURN: Status
625*11225SDana.Myers@Sun.COM *
626*11225SDana.Myers@Sun.COM * DESCRIPTION: Sort the objects that are in a package element list.
627*11225SDana.Myers@Sun.COM *
628*11225SDana.Myers@Sun.COM * NOTE: Assumes that all NULL elements have been removed from the package.
629*11225SDana.Myers@Sun.COM *
630*11225SDana.Myers@Sun.COM *****************************************************************************/
631*11225SDana.Myers@Sun.COM
632*11225SDana.Myers@Sun.COM static ACPI_STATUS
AcpiNsSortList(ACPI_OPERAND_OBJECT ** Elements,UINT32 Count,UINT32 Index,UINT8 SortDirection)633*11225SDana.Myers@Sun.COM AcpiNsSortList (
634*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements,
635*11225SDana.Myers@Sun.COM UINT32 Count,
636*11225SDana.Myers@Sun.COM UINT32 Index,
637*11225SDana.Myers@Sun.COM UINT8 SortDirection)
638*11225SDana.Myers@Sun.COM {
639*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc1;
640*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc2;
641*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *TempObj;
642*11225SDana.Myers@Sun.COM UINT32 i;
643*11225SDana.Myers@Sun.COM UINT32 j;
644*11225SDana.Myers@Sun.COM
645*11225SDana.Myers@Sun.COM
646*11225SDana.Myers@Sun.COM /* Simple bubble sort */
647*11225SDana.Myers@Sun.COM
648*11225SDana.Myers@Sun.COM for (i = 1; i < Count; i++)
649*11225SDana.Myers@Sun.COM {
650*11225SDana.Myers@Sun.COM for (j = (Count - 1); j >= i; j--)
651*11225SDana.Myers@Sun.COM {
652*11225SDana.Myers@Sun.COM ObjDesc1 = Elements[j-1]->Package.Elements[Index];
653*11225SDana.Myers@Sun.COM ObjDesc2 = Elements[j]->Package.Elements[Index];
654*11225SDana.Myers@Sun.COM
655*11225SDana.Myers@Sun.COM if (((SortDirection == ACPI_SORT_ASCENDING) &&
656*11225SDana.Myers@Sun.COM (ObjDesc1->Integer.Value > ObjDesc2->Integer.Value)) ||
657*11225SDana.Myers@Sun.COM
658*11225SDana.Myers@Sun.COM ((SortDirection == ACPI_SORT_DESCENDING) &&
659*11225SDana.Myers@Sun.COM (ObjDesc1->Integer.Value < ObjDesc2->Integer.Value)))
660*11225SDana.Myers@Sun.COM {
661*11225SDana.Myers@Sun.COM TempObj = Elements[j-1];
662*11225SDana.Myers@Sun.COM Elements[j-1] = Elements[j];
663*11225SDana.Myers@Sun.COM Elements[j] = TempObj;
664*11225SDana.Myers@Sun.COM }
665*11225SDana.Myers@Sun.COM }
666*11225SDana.Myers@Sun.COM }
667*11225SDana.Myers@Sun.COM
668*11225SDana.Myers@Sun.COM return (AE_OK);
669*11225SDana.Myers@Sun.COM }
670