xref: /onnv-gate/usr/src/uts/intel/io/acpica/namespace/nsrepair2.c (revision 11225:eb6056029d84)
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