157190917SDana Myers /******************************************************************************
257190917SDana Myers  *
357190917SDana Myers  * Module Name: nsrepair2 - Repair for objects returned by specific
457190917SDana Myers  *                          predefined methods
557190917SDana Myers  *
657190917SDana Myers  *****************************************************************************/
757190917SDana Myers 
8*35786f68SRobert Mustacchi /******************************************************************************
9*35786f68SRobert Mustacchi  *
10*35786f68SRobert Mustacchi  * 1. Copyright Notice
11*35786f68SRobert Mustacchi  *
12*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
1357190917SDana Myers  * All rights reserved.
1457190917SDana Myers  *
15*35786f68SRobert Mustacchi  * 2. License
16*35786f68SRobert Mustacchi  *
17*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
18*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
19*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
20*35786f68SRobert Mustacchi  * property rights.
21*35786f68SRobert Mustacchi  *
22*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
24*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
26*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
27*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
28*35786f68SRobert Mustacchi  *
29*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
31*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
32*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
33*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
34*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
35*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
36*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
37*35786f68SRobert Mustacchi  *
38*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
39*35786f68SRobert Mustacchi  * conditions are met:
40*35786f68SRobert Mustacchi  *
41*35786f68SRobert Mustacchi  * 3. Conditions
42*35786f68SRobert Mustacchi  *
43*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
45*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
46*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
47*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
48*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
49*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
50*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
51*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
52*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
53*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
54*35786f68SRobert Mustacchi  *
55*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
57*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
58*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
59*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
60*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
61*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
62*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
63*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
64*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
65*35786f68SRobert Mustacchi  * make.
66*35786f68SRobert Mustacchi  *
67*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
69*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
70*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
71*35786f68SRobert Mustacchi  * distribution.
72*35786f68SRobert Mustacchi  *
73*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
74*35786f68SRobert Mustacchi  * Intel Code.
75*35786f68SRobert Mustacchi  *
76*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
78*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
79*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
80*35786f68SRobert Mustacchi  *
81*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
82*35786f68SRobert Mustacchi  *
83*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
90*35786f68SRobert Mustacchi  *
91*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*35786f68SRobert Mustacchi  * LIMITED REMEDY.
99*35786f68SRobert Mustacchi  *
100*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
102*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
103*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
104*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
105*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
106*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
107*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
108*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
110*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
111*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
112*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
113*35786f68SRobert Mustacchi  * such license, approval or letter.
114*35786f68SRobert Mustacchi  *
115*35786f68SRobert Mustacchi  *****************************************************************************
116*35786f68SRobert Mustacchi  *
117*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
118*35786f68SRobert Mustacchi  * following license:
119*35786f68SRobert Mustacchi  *
12026f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
12126f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
12226f3cdf0SGordon Ross  * are met:
12326f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
12426f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
12526f3cdf0SGordon Ross  *    without modification.
12626f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12726f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
12826f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
12926f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
13026f3cdf0SGordon Ross  *    binary redistribution.
13126f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
13226f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
13326f3cdf0SGordon Ross  *    from this software without specific prior written permission.
13426f3cdf0SGordon Ross  *
13526f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13626f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13826f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146*35786f68SRobert Mustacchi  *
147*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
148*35786f68SRobert Mustacchi  * GNU General Public License ("GPL") version 2 as published by the Free
149*35786f68SRobert Mustacchi  * Software Foundation.
150*35786f68SRobert Mustacchi  *
151*35786f68SRobert Mustacchi  *****************************************************************************/
15257190917SDana Myers 
15357190917SDana Myers #include "acpi.h"
15457190917SDana Myers #include "accommon.h"
15557190917SDana Myers #include "acnamesp.h"
15657190917SDana Myers 
15757190917SDana Myers #define _COMPONENT          ACPI_NAMESPACE
15857190917SDana Myers         ACPI_MODULE_NAME    ("nsrepair2")
15957190917SDana Myers 
16057190917SDana Myers 
16157190917SDana Myers /*
16257190917SDana Myers  * Information structure and handler for ACPI predefined names that can
16357190917SDana Myers  * be repaired on a per-name basis.
16457190917SDana Myers  */
16557190917SDana Myers typedef
16657190917SDana Myers ACPI_STATUS (*ACPI_REPAIR_FUNCTION) (
1677b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
16857190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
16957190917SDana Myers 
17057190917SDana Myers typedef struct acpi_repair_info
17157190917SDana Myers {
17257190917SDana Myers     char                    Name[ACPI_NAME_SIZE];
17357190917SDana Myers     ACPI_REPAIR_FUNCTION    RepairFunction;
17457190917SDana Myers 
17557190917SDana Myers } ACPI_REPAIR_INFO;
17657190917SDana Myers 
17757190917SDana Myers 
17857190917SDana Myers /* Local prototypes */
17957190917SDana Myers 
18057190917SDana Myers static const ACPI_REPAIR_INFO *
1817b1019a6SJerry Jelinek AcpiNsMatchComplexRepair (
18257190917SDana Myers     ACPI_NAMESPACE_NODE     *Node);
18357190917SDana Myers 
18457190917SDana Myers static ACPI_STATUS
18557190917SDana Myers AcpiNsRepair_ALR (
1867b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
18757190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
18857190917SDana Myers 
18926f3cdf0SGordon Ross static ACPI_STATUS
19026f3cdf0SGordon Ross AcpiNsRepair_CID (
1917b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
1927b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
1937b1019a6SJerry Jelinek 
1947b1019a6SJerry Jelinek static ACPI_STATUS
1957b1019a6SJerry Jelinek AcpiNsRepair_CST (
1967b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
19726f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
19826f3cdf0SGordon Ross 
19926f3cdf0SGordon Ross static ACPI_STATUS
20026f3cdf0SGordon Ross AcpiNsRepair_FDE (
2017b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
20226f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
20326f3cdf0SGordon Ross 
20426f3cdf0SGordon Ross static ACPI_STATUS
20526f3cdf0SGordon Ross AcpiNsRepair_HID (
2067b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
2077b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
2087b1019a6SJerry Jelinek 
2097b1019a6SJerry Jelinek static ACPI_STATUS
2107b1019a6SJerry Jelinek AcpiNsRepair_PRT (
2117b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
21226f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
21326f3cdf0SGordon Ross 
21457190917SDana Myers static ACPI_STATUS
21557190917SDana Myers AcpiNsRepair_PSS (
2167b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
21757190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
21857190917SDana Myers 
21957190917SDana Myers static ACPI_STATUS
22057190917SDana Myers AcpiNsRepair_TSS (
2217b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
22257190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr);
22357190917SDana Myers 
22457190917SDana Myers static ACPI_STATUS
22557190917SDana Myers AcpiNsCheckSortedList (
2267b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
22757190917SDana Myers     ACPI_OPERAND_OBJECT     *ReturnObject,
2287b1019a6SJerry Jelinek     UINT32                  StartIndex,
22957190917SDana Myers     UINT32                  ExpectedCount,
23057190917SDana Myers     UINT32                  SortIndex,
23157190917SDana Myers     UINT8                   SortDirection,
23257190917SDana Myers     char                    *SortKeyName);
23357190917SDana Myers 
2347b1019a6SJerry Jelinek /* Values for SortDirection above */
2357b1019a6SJerry Jelinek 
2367b1019a6SJerry Jelinek #define ACPI_SORT_ASCENDING     0
2377b1019a6SJerry Jelinek #define ACPI_SORT_DESCENDING    1
2387b1019a6SJerry Jelinek 
2397b1019a6SJerry Jelinek static void
2407b1019a6SJerry Jelinek AcpiNsRemoveElement (
2417b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ObjDesc,
2427b1019a6SJerry Jelinek     UINT32                  Index);
2437b1019a6SJerry Jelinek 
24426f3cdf0SGordon Ross static void
24557190917SDana Myers AcpiNsSortList (
24657190917SDana Myers     ACPI_OPERAND_OBJECT     **Elements,
24757190917SDana Myers     UINT32                  Count,
24857190917SDana Myers     UINT32                  Index,
24957190917SDana Myers     UINT8                   SortDirection);
25057190917SDana Myers 
25157190917SDana Myers 
25257190917SDana Myers /*
25357190917SDana Myers  * This table contains the names of the predefined methods for which we can
25457190917SDana Myers  * perform more complex repairs.
25557190917SDana Myers  *
25626f3cdf0SGordon Ross  * As necessary:
25726f3cdf0SGordon Ross  *
25826f3cdf0SGordon Ross  * _ALR: Sort the list ascending by AmbientIlluminance
25926f3cdf0SGordon Ross  * _CID: Strings: uppercase all, remove any leading asterisk
2607b1019a6SJerry Jelinek  * _CST: Sort the list ascending by C state type
26126f3cdf0SGordon Ross  * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs
26226f3cdf0SGordon Ross  * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs
26326f3cdf0SGordon Ross  * _HID: Strings: uppercase all, remove any leading asterisk
2647b1019a6SJerry Jelinek  * _PRT: Fix reversed SourceName and SourceIndex
26526f3cdf0SGordon Ross  * _PSS: Sort the list descending by Power
26626f3cdf0SGordon Ross  * _TSS: Sort the list descending by Power
26726f3cdf0SGordon Ross  *
26826f3cdf0SGordon Ross  * Names that must be packages, but cannot be sorted:
26926f3cdf0SGordon Ross  *
27026f3cdf0SGordon Ross  * _BCL: Values are tied to the Package index where they appear, and cannot
27126f3cdf0SGordon Ross  * be moved or sorted. These index values are used for _BQC and _BCM.
27226f3cdf0SGordon Ross  * However, we can fix the case where a buffer is returned, by converting
27326f3cdf0SGordon Ross  * it to a Package of integers.
27457190917SDana Myers  */
27557190917SDana Myers static const ACPI_REPAIR_INFO       AcpiNsRepairableNames[] =
27657190917SDana Myers {
27757190917SDana Myers     {"_ALR", AcpiNsRepair_ALR},
27826f3cdf0SGordon Ross     {"_CID", AcpiNsRepair_CID},
2797b1019a6SJerry Jelinek     {"_CST", AcpiNsRepair_CST},
28026f3cdf0SGordon Ross     {"_FDE", AcpiNsRepair_FDE},
28126f3cdf0SGordon Ross     {"_GTM", AcpiNsRepair_FDE},     /* _GTM has same repair as _FDE */
28226f3cdf0SGordon Ross     {"_HID", AcpiNsRepair_HID},
2837b1019a6SJerry Jelinek     {"_PRT", AcpiNsRepair_PRT},
28457190917SDana Myers     {"_PSS", AcpiNsRepair_PSS},
28557190917SDana Myers     {"_TSS", AcpiNsRepair_TSS},
28626f3cdf0SGordon Ross     {{0,0,0,0}, NULL}               /* Table terminator */
28757190917SDana Myers };
28857190917SDana Myers 
28957190917SDana Myers 
29026f3cdf0SGordon Ross #define ACPI_FDE_FIELD_COUNT        5
29126f3cdf0SGordon Ross #define ACPI_FDE_BYTE_BUFFER_SIZE   5
29226f3cdf0SGordon Ross #define ACPI_FDE_DWORD_BUFFER_SIZE  (ACPI_FDE_FIELD_COUNT * sizeof (UINT32))
29326f3cdf0SGordon Ross 
29426f3cdf0SGordon Ross 
29557190917SDana Myers /******************************************************************************
29657190917SDana Myers  *
29757190917SDana Myers  * FUNCTION:    AcpiNsComplexRepairs
29857190917SDana Myers  *
2997b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
30057190917SDana Myers  *              Node                - Namespace node for the method/object
30157190917SDana Myers  *              ValidateStatus      - Original status of earlier validation
30257190917SDana Myers  *              ReturnObjectPtr     - Pointer to the object returned from the
30357190917SDana Myers  *                                    evaluation of a method or object
30457190917SDana Myers  *
30526f3cdf0SGordon Ross  * RETURN:      Status. AE_OK if repair was successful. If name is not
30657190917SDana Myers  *              matched, ValidateStatus is returned.
30757190917SDana Myers  *
30857190917SDana Myers  * DESCRIPTION: Attempt to repair/convert a return object of a type that was
30957190917SDana Myers  *              not expected.
31057190917SDana Myers  *
31157190917SDana Myers  *****************************************************************************/
31257190917SDana Myers 
31357190917SDana Myers ACPI_STATUS
AcpiNsComplexRepairs(ACPI_EVALUATE_INFO * Info,ACPI_NAMESPACE_NODE * Node,ACPI_STATUS ValidateStatus,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)31457190917SDana Myers AcpiNsComplexRepairs (
3157b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
31657190917SDana Myers     ACPI_NAMESPACE_NODE     *Node,
31757190917SDana Myers     ACPI_STATUS             ValidateStatus,
31857190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
31957190917SDana Myers {
32057190917SDana Myers     const ACPI_REPAIR_INFO  *Predefined;
32157190917SDana Myers     ACPI_STATUS             Status;
32257190917SDana Myers 
32357190917SDana Myers 
32457190917SDana Myers     /* Check if this name is in the list of repairable names */
32557190917SDana Myers 
3267b1019a6SJerry Jelinek     Predefined = AcpiNsMatchComplexRepair (Node);
32757190917SDana Myers     if (!Predefined)
32857190917SDana Myers     {
32957190917SDana Myers         return (ValidateStatus);
33057190917SDana Myers     }
33157190917SDana Myers 
3327b1019a6SJerry Jelinek     Status = Predefined->RepairFunction (Info, ReturnObjectPtr);
33357190917SDana Myers     return (Status);
33457190917SDana Myers }
33557190917SDana Myers 
33657190917SDana Myers 
33757190917SDana Myers /******************************************************************************
33857190917SDana Myers  *
3397b1019a6SJerry Jelinek  * FUNCTION:    AcpiNsMatchComplexRepair
34057190917SDana Myers  *
34157190917SDana Myers  * PARAMETERS:  Node                - Namespace node for the method/object
34257190917SDana Myers  *
34357190917SDana Myers  * RETURN:      Pointer to entry in repair table. NULL indicates not found.
34457190917SDana Myers  *
34557190917SDana Myers  * DESCRIPTION: Check an object name against the repairable object list.
34657190917SDana Myers  *
34757190917SDana Myers  *****************************************************************************/
34857190917SDana Myers 
34957190917SDana Myers static const ACPI_REPAIR_INFO *
AcpiNsMatchComplexRepair(ACPI_NAMESPACE_NODE * Node)3507b1019a6SJerry Jelinek AcpiNsMatchComplexRepair (
35157190917SDana Myers     ACPI_NAMESPACE_NODE     *Node)
35257190917SDana Myers {
35357190917SDana Myers     const ACPI_REPAIR_INFO  *ThisName;
35457190917SDana Myers 
35557190917SDana Myers 
35657190917SDana Myers     /* Search info table for a repairable predefined method/object name */
35757190917SDana Myers 
35857190917SDana Myers     ThisName = AcpiNsRepairableNames;
35957190917SDana Myers     while (ThisName->RepairFunction)
36057190917SDana Myers     {
36157190917SDana Myers         if (ACPI_COMPARE_NAME (Node->Name.Ascii, ThisName->Name))
36257190917SDana Myers         {
36357190917SDana Myers             return (ThisName);
36457190917SDana Myers         }
3657b1019a6SJerry Jelinek 
36657190917SDana Myers         ThisName++;
36757190917SDana Myers     }
36857190917SDana Myers 
36957190917SDana Myers     return (NULL); /* Not found */
37057190917SDana Myers }
37157190917SDana Myers 
37257190917SDana Myers 
37357190917SDana Myers /******************************************************************************
37457190917SDana Myers  *
37557190917SDana Myers  * FUNCTION:    AcpiNsRepair_ALR
37657190917SDana Myers  *
3777b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
37857190917SDana Myers  *              ReturnObjectPtr     - Pointer to the object returned from the
37957190917SDana Myers  *                                    evaluation of a method or object
38057190917SDana Myers  *
38157190917SDana Myers  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
38257190917SDana Myers  *
38357190917SDana Myers  * DESCRIPTION: Repair for the _ALR object. If necessary, sort the object list
38457190917SDana Myers  *              ascending by the ambient illuminance values.
38557190917SDana Myers  *
38657190917SDana Myers  *****************************************************************************/
38757190917SDana Myers 
38857190917SDana Myers static ACPI_STATUS
AcpiNsRepair_ALR(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)38957190917SDana Myers AcpiNsRepair_ALR (
3907b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
39157190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
39257190917SDana Myers {
39357190917SDana Myers     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
39457190917SDana Myers     ACPI_STATUS             Status;
39557190917SDana Myers 
39657190917SDana Myers 
3977b1019a6SJerry Jelinek     Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 2, 1,
3987b1019a6SJerry Jelinek         ACPI_SORT_ASCENDING, "AmbientIlluminance");
39957190917SDana Myers 
40057190917SDana Myers     return (Status);
40157190917SDana Myers }
40257190917SDana Myers 
40357190917SDana Myers 
40426f3cdf0SGordon Ross /******************************************************************************
40526f3cdf0SGordon Ross  *
40626f3cdf0SGordon Ross  * FUNCTION:    AcpiNsRepair_FDE
40726f3cdf0SGordon Ross  *
4087b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
40926f3cdf0SGordon Ross  *              ReturnObjectPtr     - Pointer to the object returned from the
41026f3cdf0SGordon Ross  *                                    evaluation of a method or object
41126f3cdf0SGordon Ross  *
41226f3cdf0SGordon Ross  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
41326f3cdf0SGordon Ross  *
41426f3cdf0SGordon Ross  * DESCRIPTION: Repair for the _FDE and _GTM objects. The expected return
41526f3cdf0SGordon Ross  *              value is a Buffer of 5 DWORDs. This function repairs a common
41626f3cdf0SGordon Ross  *              problem where the return value is a Buffer of BYTEs, not
41726f3cdf0SGordon Ross  *              DWORDs.
41826f3cdf0SGordon Ross  *
41926f3cdf0SGordon Ross  *****************************************************************************/
42026f3cdf0SGordon Ross 
42126f3cdf0SGordon Ross static ACPI_STATUS
AcpiNsRepair_FDE(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)42226f3cdf0SGordon Ross AcpiNsRepair_FDE (
4237b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
42426f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
42526f3cdf0SGordon Ross {
42626f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
42726f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *BufferObject;
42826f3cdf0SGordon Ross     UINT8                   *ByteBuffer;
42926f3cdf0SGordon Ross     UINT32                  *DwordBuffer;
43026f3cdf0SGordon Ross     UINT32                  i;
43126f3cdf0SGordon Ross 
43226f3cdf0SGordon Ross 
43326f3cdf0SGordon Ross     ACPI_FUNCTION_NAME (NsRepair_FDE);
43426f3cdf0SGordon Ross 
43526f3cdf0SGordon Ross 
43626f3cdf0SGordon Ross     switch (ReturnObject->Common.Type)
43726f3cdf0SGordon Ross     {
43826f3cdf0SGordon Ross     case ACPI_TYPE_BUFFER:
43926f3cdf0SGordon Ross 
44026f3cdf0SGordon Ross         /* This is the expected type. Length should be (at least) 5 DWORDs */
44126f3cdf0SGordon Ross 
44226f3cdf0SGordon Ross         if (ReturnObject->Buffer.Length >= ACPI_FDE_DWORD_BUFFER_SIZE)
44326f3cdf0SGordon Ross         {
44426f3cdf0SGordon Ross             return (AE_OK);
44526f3cdf0SGordon Ross         }
44626f3cdf0SGordon Ross 
44726f3cdf0SGordon Ross         /* We can only repair if we have exactly 5 BYTEs */
44826f3cdf0SGordon Ross 
44926f3cdf0SGordon Ross         if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE)
45026f3cdf0SGordon Ross         {
4517b1019a6SJerry Jelinek             ACPI_WARN_PREDEFINED ((AE_INFO,
4527b1019a6SJerry Jelinek                 Info->FullPathname, Info->NodeFlags,
45326f3cdf0SGordon Ross                 "Incorrect return buffer length %u, expected %u",
45426f3cdf0SGordon Ross                 ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE));
45526f3cdf0SGordon Ross 
45626f3cdf0SGordon Ross             return (AE_AML_OPERAND_TYPE);
45726f3cdf0SGordon Ross         }
45826f3cdf0SGordon Ross 
45926f3cdf0SGordon Ross         /* Create the new (larger) buffer object */
46026f3cdf0SGordon Ross 
4617b1019a6SJerry Jelinek         BufferObject = AcpiUtCreateBufferObject (
4627b1019a6SJerry Jelinek             ACPI_FDE_DWORD_BUFFER_SIZE);
46326f3cdf0SGordon Ross         if (!BufferObject)
46426f3cdf0SGordon Ross         {
46526f3cdf0SGordon Ross             return (AE_NO_MEMORY);
46626f3cdf0SGordon Ross         }
46726f3cdf0SGordon Ross 
46826f3cdf0SGordon Ross         /* Expand each byte to a DWORD */
46926f3cdf0SGordon Ross 
47026f3cdf0SGordon Ross         ByteBuffer = ReturnObject->Buffer.Pointer;
4717b1019a6SJerry Jelinek         DwordBuffer = ACPI_CAST_PTR (UINT32,
4727b1019a6SJerry Jelinek             BufferObject->Buffer.Pointer);
47326f3cdf0SGordon Ross 
47426f3cdf0SGordon Ross         for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++)
47526f3cdf0SGordon Ross         {
47626f3cdf0SGordon Ross             *DwordBuffer = (UINT32) *ByteBuffer;
47726f3cdf0SGordon Ross             DwordBuffer++;
47826f3cdf0SGordon Ross             ByteBuffer++;
47926f3cdf0SGordon Ross         }
48026f3cdf0SGordon Ross 
48126f3cdf0SGordon Ross         ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
48226f3cdf0SGordon Ross             "%s Expanded Byte Buffer to expected DWord Buffer\n",
4837b1019a6SJerry Jelinek             Info->FullPathname));
48426f3cdf0SGordon Ross         break;
48526f3cdf0SGordon Ross 
48626f3cdf0SGordon Ross     default:
4877b1019a6SJerry Jelinek 
48826f3cdf0SGordon Ross         return (AE_AML_OPERAND_TYPE);
48926f3cdf0SGordon Ross     }
49026f3cdf0SGordon Ross 
49126f3cdf0SGordon Ross     /* Delete the original return object, return the new buffer object */
49226f3cdf0SGordon Ross 
49326f3cdf0SGordon Ross     AcpiUtRemoveReference (ReturnObject);
49426f3cdf0SGordon Ross     *ReturnObjectPtr = BufferObject;
49526f3cdf0SGordon Ross 
4967b1019a6SJerry Jelinek     Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
49726f3cdf0SGordon Ross     return (AE_OK);
49826f3cdf0SGordon Ross }
49926f3cdf0SGordon Ross 
50026f3cdf0SGordon Ross 
50126f3cdf0SGordon Ross /******************************************************************************
50226f3cdf0SGordon Ross  *
50326f3cdf0SGordon Ross  * FUNCTION:    AcpiNsRepair_CID
50426f3cdf0SGordon Ross  *
5057b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
50626f3cdf0SGordon Ross  *              ReturnObjectPtr     - Pointer to the object returned from the
50726f3cdf0SGordon Ross  *                                    evaluation of a method or object
50826f3cdf0SGordon Ross  *
50926f3cdf0SGordon Ross  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
51026f3cdf0SGordon Ross  *
51126f3cdf0SGordon Ross  * DESCRIPTION: Repair for the _CID object. If a string, ensure that all
51226f3cdf0SGordon Ross  *              letters are uppercase and that there is no leading asterisk.
51326f3cdf0SGordon Ross  *              If a Package, ensure same for all string elements.
51426f3cdf0SGordon Ross  *
51526f3cdf0SGordon Ross  *****************************************************************************/
51626f3cdf0SGordon Ross 
51726f3cdf0SGordon Ross static ACPI_STATUS
AcpiNsRepair_CID(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)51826f3cdf0SGordon Ross AcpiNsRepair_CID (
5197b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
52026f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
52126f3cdf0SGordon Ross {
52226f3cdf0SGordon Ross     ACPI_STATUS             Status;
52326f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
52426f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ElementPtr;
52526f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *OriginalElement;
52626f3cdf0SGordon Ross     UINT16                  OriginalRefCount;
52726f3cdf0SGordon Ross     UINT32                  i;
52826f3cdf0SGordon Ross 
52926f3cdf0SGordon Ross 
53026f3cdf0SGordon Ross     /* Check for _CID as a simple string */
53126f3cdf0SGordon Ross 
53226f3cdf0SGordon Ross     if (ReturnObject->Common.Type == ACPI_TYPE_STRING)
53326f3cdf0SGordon Ross     {
5347b1019a6SJerry Jelinek         Status = AcpiNsRepair_HID (Info, ReturnObjectPtr);
53526f3cdf0SGordon Ross         return (Status);
53626f3cdf0SGordon Ross     }
53726f3cdf0SGordon Ross 
53826f3cdf0SGordon Ross     /* Exit if not a Package */
53926f3cdf0SGordon Ross 
54026f3cdf0SGordon Ross     if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
54126f3cdf0SGordon Ross     {
54226f3cdf0SGordon Ross         return (AE_OK);
54326f3cdf0SGordon Ross     }
54426f3cdf0SGordon Ross 
54526f3cdf0SGordon Ross     /* Examine each element of the _CID package */
54626f3cdf0SGordon Ross 
54726f3cdf0SGordon Ross     ElementPtr = ReturnObject->Package.Elements;
54826f3cdf0SGordon Ross     for (i = 0; i < ReturnObject->Package.Count; i++)
54926f3cdf0SGordon Ross     {
55026f3cdf0SGordon Ross         OriginalElement = *ElementPtr;
55126f3cdf0SGordon Ross         OriginalRefCount = OriginalElement->Common.ReferenceCount;
55226f3cdf0SGordon Ross 
5537b1019a6SJerry Jelinek         Status = AcpiNsRepair_HID (Info, ElementPtr);
55426f3cdf0SGordon Ross         if (ACPI_FAILURE (Status))
55526f3cdf0SGordon Ross         {
55626f3cdf0SGordon Ross             return (Status);
55726f3cdf0SGordon Ross         }
55826f3cdf0SGordon Ross 
55926f3cdf0SGordon Ross         if (OriginalElement != *ElementPtr)
56026f3cdf0SGordon Ross         {
561*35786f68SRobert Mustacchi             /* Update reference count of new object */
56226f3cdf0SGordon Ross 
56326f3cdf0SGordon Ross             (*ElementPtr)->Common.ReferenceCount =
56426f3cdf0SGordon Ross                 OriginalRefCount;
56526f3cdf0SGordon Ross         }
56626f3cdf0SGordon Ross 
56726f3cdf0SGordon Ross         ElementPtr++;
56826f3cdf0SGordon Ross     }
56926f3cdf0SGordon Ross 
57026f3cdf0SGordon Ross     return (AE_OK);
57126f3cdf0SGordon Ross }
57226f3cdf0SGordon Ross 
57326f3cdf0SGordon Ross 
5747b1019a6SJerry Jelinek /******************************************************************************
5757b1019a6SJerry Jelinek  *
5767b1019a6SJerry Jelinek  * FUNCTION:    AcpiNsRepair_CST
5777b1019a6SJerry Jelinek  *
5787b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
5797b1019a6SJerry Jelinek  *              ReturnObjectPtr     - Pointer to the object returned from the
5807b1019a6SJerry Jelinek  *                                    evaluation of a method or object
5817b1019a6SJerry Jelinek  *
5827b1019a6SJerry Jelinek  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
5837b1019a6SJerry Jelinek  *
5847b1019a6SJerry Jelinek  * DESCRIPTION: Repair for the _CST object:
5857b1019a6SJerry Jelinek  *              1. Sort the list ascending by C state type
5867b1019a6SJerry Jelinek  *              2. Ensure type cannot be zero
5877b1019a6SJerry Jelinek  *              3. A subpackage count of zero means _CST is meaningless
5887b1019a6SJerry Jelinek  *              4. Count must match the number of C state subpackages
5897b1019a6SJerry Jelinek  *
5907b1019a6SJerry Jelinek  *****************************************************************************/
5917b1019a6SJerry Jelinek 
5927b1019a6SJerry Jelinek static ACPI_STATUS
AcpiNsRepair_CST(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)5937b1019a6SJerry Jelinek AcpiNsRepair_CST (
5947b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
5957b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
5967b1019a6SJerry Jelinek {
5977b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
5987b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **OuterElements;
5997b1019a6SJerry Jelinek     UINT32                  OuterElementCount;
6007b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ObjDesc;
6017b1019a6SJerry Jelinek     ACPI_STATUS             Status;
6027b1019a6SJerry Jelinek     BOOLEAN                 Removing;
6037b1019a6SJerry Jelinek     UINT32                  i;
6047b1019a6SJerry Jelinek 
6057b1019a6SJerry Jelinek 
6067b1019a6SJerry Jelinek     ACPI_FUNCTION_NAME (NsRepair_CST);
6077b1019a6SJerry Jelinek 
6087b1019a6SJerry Jelinek 
6097b1019a6SJerry Jelinek     /*
6107b1019a6SJerry Jelinek      * Check if the C-state type values are proportional.
6117b1019a6SJerry Jelinek      */
6127b1019a6SJerry Jelinek     OuterElementCount = ReturnObject->Package.Count - 1;
6137b1019a6SJerry Jelinek     i = 0;
6147b1019a6SJerry Jelinek     while (i < OuterElementCount)
6157b1019a6SJerry Jelinek     {
6167b1019a6SJerry Jelinek         OuterElements = &ReturnObject->Package.Elements[i + 1];
6177b1019a6SJerry Jelinek         Removing = FALSE;
6187b1019a6SJerry Jelinek 
6197b1019a6SJerry Jelinek         if ((*OuterElements)->Package.Count == 0)
6207b1019a6SJerry Jelinek         {
6217b1019a6SJerry Jelinek             ACPI_WARN_PREDEFINED ((AE_INFO,
6227b1019a6SJerry Jelinek                 Info->FullPathname, Info->NodeFlags,
6237b1019a6SJerry Jelinek                 "SubPackage[%u] - removing entry due to zero count", i));
6247b1019a6SJerry Jelinek             Removing = TRUE;
6257b1019a6SJerry Jelinek             goto RemoveElement;
6267b1019a6SJerry Jelinek         }
6277b1019a6SJerry Jelinek 
6287b1019a6SJerry Jelinek         ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */
6297b1019a6SJerry Jelinek         if ((UINT32) ObjDesc->Integer.Value == 0)
6307b1019a6SJerry Jelinek         {
6317b1019a6SJerry Jelinek             ACPI_WARN_PREDEFINED ((AE_INFO,
6327b1019a6SJerry Jelinek                 Info->FullPathname, Info->NodeFlags,
6337b1019a6SJerry Jelinek                 "SubPackage[%u] - removing entry due to invalid Type(0)", i));
6347b1019a6SJerry Jelinek             Removing = TRUE;
6357b1019a6SJerry Jelinek         }
6367b1019a6SJerry Jelinek 
6377b1019a6SJerry Jelinek RemoveElement:
6387b1019a6SJerry Jelinek         if (Removing)
6397b1019a6SJerry Jelinek         {
6407b1019a6SJerry Jelinek             AcpiNsRemoveElement (ReturnObject, i + 1);
6417b1019a6SJerry Jelinek             OuterElementCount--;
6427b1019a6SJerry Jelinek         }
6437b1019a6SJerry Jelinek         else
6447b1019a6SJerry Jelinek         {
6457b1019a6SJerry Jelinek             i++;
6467b1019a6SJerry Jelinek         }
6477b1019a6SJerry Jelinek     }
6487b1019a6SJerry Jelinek 
6497b1019a6SJerry Jelinek     /* Update top-level package count, Type "Integer" checked elsewhere */
6507b1019a6SJerry Jelinek 
6517b1019a6SJerry Jelinek     ObjDesc = ReturnObject->Package.Elements[0];
6527b1019a6SJerry Jelinek     ObjDesc->Integer.Value = OuterElementCount;
6537b1019a6SJerry Jelinek 
6547b1019a6SJerry Jelinek     /*
6557b1019a6SJerry Jelinek      * Entries (subpackages) in the _CST Package must be sorted by the
6567b1019a6SJerry Jelinek      * C-state type, in ascending order.
6577b1019a6SJerry Jelinek      */
6587b1019a6SJerry Jelinek     Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1,
6597b1019a6SJerry Jelinek         ACPI_SORT_ASCENDING, "C-State Type");
6607b1019a6SJerry Jelinek     if (ACPI_FAILURE (Status))
6617b1019a6SJerry Jelinek     {
6627b1019a6SJerry Jelinek         return (Status);
6637b1019a6SJerry Jelinek     }
6647b1019a6SJerry Jelinek 
6657b1019a6SJerry Jelinek     return (AE_OK);
6667b1019a6SJerry Jelinek }
6677b1019a6SJerry Jelinek 
6687b1019a6SJerry Jelinek 
66926f3cdf0SGordon Ross /******************************************************************************
67026f3cdf0SGordon Ross  *
67126f3cdf0SGordon Ross  * FUNCTION:    AcpiNsRepair_HID
67226f3cdf0SGordon Ross  *
6737b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
67426f3cdf0SGordon Ross  *              ReturnObjectPtr     - Pointer to the object returned from the
67526f3cdf0SGordon Ross  *                                    evaluation of a method or object
67626f3cdf0SGordon Ross  *
67726f3cdf0SGordon Ross  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
67826f3cdf0SGordon Ross  *
67926f3cdf0SGordon Ross  * DESCRIPTION: Repair for the _HID object. If a string, ensure that all
68026f3cdf0SGordon Ross  *              letters are uppercase and that there is no leading asterisk.
68126f3cdf0SGordon Ross  *
68226f3cdf0SGordon Ross  *****************************************************************************/
68326f3cdf0SGordon Ross 
68426f3cdf0SGordon Ross static ACPI_STATUS
AcpiNsRepair_HID(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)68526f3cdf0SGordon Ross AcpiNsRepair_HID (
6867b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
68726f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
68826f3cdf0SGordon Ross {
68926f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
69026f3cdf0SGordon Ross     ACPI_OPERAND_OBJECT     *NewString;
69126f3cdf0SGordon Ross     char                    *Source;
69226f3cdf0SGordon Ross     char                    *Dest;
69326f3cdf0SGordon Ross 
69426f3cdf0SGordon Ross 
69526f3cdf0SGordon Ross     ACPI_FUNCTION_NAME (NsRepair_HID);
69626f3cdf0SGordon Ross 
69726f3cdf0SGordon Ross 
69826f3cdf0SGordon Ross     /* We only care about string _HID objects (not integers) */
69926f3cdf0SGordon Ross 
70026f3cdf0SGordon Ross     if (ReturnObject->Common.Type != ACPI_TYPE_STRING)
70126f3cdf0SGordon Ross     {
70226f3cdf0SGordon Ross         return (AE_OK);
70326f3cdf0SGordon Ross     }
70426f3cdf0SGordon Ross 
70526f3cdf0SGordon Ross     if (ReturnObject->String.Length == 0)
70626f3cdf0SGordon Ross     {
7077b1019a6SJerry Jelinek         ACPI_WARN_PREDEFINED ((AE_INFO,
7087b1019a6SJerry Jelinek             Info->FullPathname, Info->NodeFlags,
70926f3cdf0SGordon Ross             "Invalid zero-length _HID or _CID string"));
71026f3cdf0SGordon Ross 
71126f3cdf0SGordon Ross         /* Return AE_OK anyway, let driver handle it */
71226f3cdf0SGordon Ross 
7137b1019a6SJerry Jelinek         Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
71426f3cdf0SGordon Ross         return (AE_OK);
71526f3cdf0SGordon Ross     }
71626f3cdf0SGordon Ross 
71726f3cdf0SGordon Ross     /* It is simplest to always create a new string object */
71826f3cdf0SGordon Ross 
71926f3cdf0SGordon Ross     NewString = AcpiUtCreateStringObject (ReturnObject->String.Length);
72026f3cdf0SGordon Ross     if (!NewString)
72126f3cdf0SGordon Ross     {
72226f3cdf0SGordon Ross         return (AE_NO_MEMORY);
72326f3cdf0SGordon Ross     }
72426f3cdf0SGordon Ross 
72526f3cdf0SGordon Ross     /*
72626f3cdf0SGordon Ross      * Remove a leading asterisk if present. For some unknown reason, there
72726f3cdf0SGordon Ross      * are many machines in the field that contains IDs like this.
72826f3cdf0SGordon Ross      *
72926f3cdf0SGordon Ross      * Examples: "*PNP0C03", "*ACPI0003"
73026f3cdf0SGordon Ross      */
73126f3cdf0SGordon Ross     Source = ReturnObject->String.Pointer;
73226f3cdf0SGordon Ross     if (*Source == '*')
73326f3cdf0SGordon Ross     {
73426f3cdf0SGordon Ross         Source++;
73526f3cdf0SGordon Ross         NewString->String.Length--;
73626f3cdf0SGordon Ross 
73726f3cdf0SGordon Ross         ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
7387b1019a6SJerry Jelinek             "%s: Removed invalid leading asterisk\n", Info->FullPathname));
73926f3cdf0SGordon Ross     }
74026f3cdf0SGordon Ross 
74126f3cdf0SGordon Ross     /*
7427b1019a6SJerry Jelinek      * Copy and uppercase the string. From the ACPI 5.0 specification:
74326f3cdf0SGordon Ross      *
74426f3cdf0SGordon Ross      * A valid PNP ID must be of the form "AAA####" where A is an uppercase
74526f3cdf0SGordon Ross      * letter and # is a hex digit. A valid ACPI ID must be of the form
7467b1019a6SJerry Jelinek      * "NNNN####" where N is an uppercase letter or decimal digit, and
7477b1019a6SJerry Jelinek      * # is a hex digit.
74826f3cdf0SGordon Ross      */
74926f3cdf0SGordon Ross     for (Dest = NewString->String.Pointer; *Source; Dest++, Source++)
75026f3cdf0SGordon Ross     {
7517b1019a6SJerry Jelinek         *Dest = (char) toupper ((int) *Source);
75226f3cdf0SGordon Ross     }
75326f3cdf0SGordon Ross 
75426f3cdf0SGordon Ross     AcpiUtRemoveReference (ReturnObject);
75526f3cdf0SGordon Ross     *ReturnObjectPtr = NewString;
75626f3cdf0SGordon Ross     return (AE_OK);
75726f3cdf0SGordon Ross }
75826f3cdf0SGordon Ross 
75926f3cdf0SGordon Ross 
76057190917SDana Myers /******************************************************************************
76157190917SDana Myers  *
7627b1019a6SJerry Jelinek  * FUNCTION:    AcpiNsRepair_PRT
76357190917SDana Myers  *
7647b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
76557190917SDana Myers  *              ReturnObjectPtr     - Pointer to the object returned from the
76657190917SDana Myers  *                                    evaluation of a method or object
76757190917SDana Myers  *
76857190917SDana Myers  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
76957190917SDana Myers  *
7707b1019a6SJerry Jelinek  * DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed
7717b1019a6SJerry Jelinek  *              SourceName and SourceIndex field, a common BIOS bug.
77257190917SDana Myers  *
77357190917SDana Myers  *****************************************************************************/
77457190917SDana Myers 
77557190917SDana Myers static ACPI_STATUS
AcpiNsRepair_PRT(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)7767b1019a6SJerry Jelinek AcpiNsRepair_PRT (
7777b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
77857190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
77957190917SDana Myers {
7807b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *PackageObject = *ReturnObjectPtr;
7817b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **TopObjectList;
7827b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **SubObjectList;
7837b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ObjDesc;
7847b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *SubPackage;
7857b1019a6SJerry Jelinek     UINT32                  ElementCount;
7867b1019a6SJerry Jelinek     UINT32                  Index;
78757190917SDana Myers 
78857190917SDana Myers 
7897b1019a6SJerry Jelinek     /* Each element in the _PRT package is a subpackage */
79057190917SDana Myers 
7917b1019a6SJerry Jelinek     TopObjectList = PackageObject->Package.Elements;
7927b1019a6SJerry Jelinek     ElementCount = PackageObject->Package.Count;
7937b1019a6SJerry Jelinek 
7947b1019a6SJerry Jelinek     /* Examine each subpackage */
7957b1019a6SJerry Jelinek 
7967b1019a6SJerry Jelinek     for (Index = 0; Index < ElementCount; Index++, TopObjectList++)
7977b1019a6SJerry Jelinek     {
7987b1019a6SJerry Jelinek         SubPackage = *TopObjectList;
7997b1019a6SJerry Jelinek         SubObjectList = SubPackage->Package.Elements;
8007b1019a6SJerry Jelinek 
8017b1019a6SJerry Jelinek         /* Check for minimum required element count */
8027b1019a6SJerry Jelinek 
8037b1019a6SJerry Jelinek         if (SubPackage->Package.Count < 4)
8047b1019a6SJerry Jelinek         {
8057b1019a6SJerry Jelinek             continue;
8067b1019a6SJerry Jelinek         }
8077b1019a6SJerry Jelinek 
8087b1019a6SJerry Jelinek         /*
8097b1019a6SJerry Jelinek          * If the BIOS has erroneously reversed the _PRT SourceName (index 2)
8107b1019a6SJerry Jelinek          * and the SourceIndex (index 3), fix it. _PRT is important enough to
8117b1019a6SJerry Jelinek          * workaround this BIOS error. This also provides compatibility with
8127b1019a6SJerry Jelinek          * other ACPI implementations.
8137b1019a6SJerry Jelinek          */
8147b1019a6SJerry Jelinek         ObjDesc = SubObjectList[3];
8157b1019a6SJerry Jelinek         if (!ObjDesc || (ObjDesc->Common.Type != ACPI_TYPE_INTEGER))
8167b1019a6SJerry Jelinek         {
8177b1019a6SJerry Jelinek             SubObjectList[3] = SubObjectList[2];
8187b1019a6SJerry Jelinek             SubObjectList[2] = ObjDesc;
8197b1019a6SJerry Jelinek             Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
8207b1019a6SJerry Jelinek 
8217b1019a6SJerry Jelinek             ACPI_WARN_PREDEFINED ((AE_INFO,
8227b1019a6SJerry Jelinek                 Info->FullPathname, Info->NodeFlags,
8237b1019a6SJerry Jelinek                 "PRT[%X]: Fixed reversed SourceName and SourceIndex",
8247b1019a6SJerry Jelinek                 Index));
8257b1019a6SJerry Jelinek         }
8267b1019a6SJerry Jelinek     }
8277b1019a6SJerry Jelinek 
8287b1019a6SJerry Jelinek     return (AE_OK);
82957190917SDana Myers }
83057190917SDana Myers 
83157190917SDana Myers 
83257190917SDana Myers /******************************************************************************
83357190917SDana Myers  *
83457190917SDana Myers  * FUNCTION:    AcpiNsRepair_PSS
83557190917SDana Myers  *
8367b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
83757190917SDana Myers  *              ReturnObjectPtr     - Pointer to the object returned from the
83857190917SDana Myers  *                                    evaluation of a method or object
83957190917SDana Myers  *
84057190917SDana Myers  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
84157190917SDana Myers  *
84257190917SDana Myers  * DESCRIPTION: Repair for the _PSS object. If necessary, sort the object list
84357190917SDana Myers  *              by the CPU frequencies. Check that the power dissipation values
84457190917SDana Myers  *              are all proportional to CPU frequency (i.e., sorting by
84557190917SDana Myers  *              frequency should be the same as sorting by power.)
84657190917SDana Myers  *
84757190917SDana Myers  *****************************************************************************/
84857190917SDana Myers 
84957190917SDana Myers static ACPI_STATUS
AcpiNsRepair_PSS(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)85057190917SDana Myers AcpiNsRepair_PSS (
8517b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
85257190917SDana Myers     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
85357190917SDana Myers {
85457190917SDana Myers     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
85557190917SDana Myers     ACPI_OPERAND_OBJECT     **OuterElements;
85657190917SDana Myers     UINT32                  OuterElementCount;
85757190917SDana Myers     ACPI_OPERAND_OBJECT     **Elements;
85857190917SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc;
85957190917SDana Myers     UINT32                  PreviousValue;
86057190917SDana Myers     ACPI_STATUS             Status;
86157190917SDana Myers     UINT32                  i;
86257190917SDana Myers 
86357190917SDana Myers 
86457190917SDana Myers     /*
8657b1019a6SJerry Jelinek      * Entries (subpackages) in the _PSS Package must be sorted by power
86657190917SDana Myers      * dissipation, in descending order. If it appears that the list is
86757190917SDana Myers      * incorrectly sorted, sort it. We sort by CpuFrequency, since this
86857190917SDana Myers      * should be proportional to the power.
86957190917SDana Myers      */
8707b1019a6SJerry Jelinek     Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0,
8717b1019a6SJerry Jelinek         ACPI_SORT_DESCENDING, "CpuFrequency");
87257190917SDana Myers     if (ACPI_FAILURE (Status))
87357190917SDana Myers     {
87457190917SDana Myers         return (Status);
87557190917SDana Myers     }
87657190917SDana Myers 
87757190917SDana Myers     /*
87857190917SDana Myers      * We now know the list is correctly sorted by CPU frequency. Check if
87957190917SDana Myers      * the power dissipation values are proportional.
88057190917SDana Myers      */
88157190917SDana Myers     PreviousValue = ACPI_UINT32_MAX;
88257190917SDana Myers     OuterElements = ReturnObject->Package.Elements;
88357190917SDana Myers     OuterElementCount = ReturnObject->Package.Count;
88457190917SDana Myers 
88557190917SDana Myers     for (i = 0; i < OuterElementCount; i++)
88657190917SDana Myers     {
88757190917SDana Myers         Elements = (*OuterElements)->Package.Elements;
88857190917SDana Myers         ObjDesc = Elements[1]; /* Index1 = PowerDissipation */
88957190917SDana Myers 
89057190917SDana Myers         if ((UINT32) ObjDesc->Integer.Value > PreviousValue)
89157190917SDana Myers         {
8927b1019a6SJerry Jelinek             ACPI_WARN_PREDEFINED ((AE_INFO,
8937b1019a6SJerry Jelinek                 Info->FullPathname, Info->NodeFlags,
89457190917SDana Myers                 "SubPackage[%u,%u] - suspicious power dissipation values",
89557190917SDana Myers                 i-1, i));
89657190917SDana Myers         }
89757190917SDana Myers 
89857190917SDana Myers         PreviousValue = (UINT32) ObjDesc->Integer.Value;
89957190917SDana Myers         OuterElements++;
90057190917SDana Myers     }
90157190917SDana Myers 
90257190917SDana Myers     return (AE_OK);
90357190917SDana Myers }
90457190917SDana Myers 
90557190917SDana Myers 
9067b1019a6SJerry Jelinek /******************************************************************************
9077b1019a6SJerry Jelinek  *
9087b1019a6SJerry Jelinek  * FUNCTION:    AcpiNsRepair_TSS
9097b1019a6SJerry Jelinek  *
9107b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
9117b1019a6SJerry Jelinek  *              ReturnObjectPtr     - Pointer to the object returned from the
9127b1019a6SJerry Jelinek  *                                    evaluation of a method or object
9137b1019a6SJerry Jelinek  *
9147b1019a6SJerry Jelinek  * RETURN:      Status. AE_OK if object is OK or was repaired successfully
9157b1019a6SJerry Jelinek  *
9167b1019a6SJerry Jelinek  * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
9177b1019a6SJerry Jelinek  *              descending by the power dissipation values.
9187b1019a6SJerry Jelinek  *
9197b1019a6SJerry Jelinek  *****************************************************************************/
9207b1019a6SJerry Jelinek 
9217b1019a6SJerry Jelinek static ACPI_STATUS
AcpiNsRepair_TSS(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)9227b1019a6SJerry Jelinek AcpiNsRepair_TSS (
9237b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
9247b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
9257b1019a6SJerry Jelinek {
9267b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
9277b1019a6SJerry Jelinek     ACPI_STATUS             Status;
9287b1019a6SJerry Jelinek     ACPI_NAMESPACE_NODE     *Node;
9297b1019a6SJerry Jelinek 
9307b1019a6SJerry Jelinek 
9317b1019a6SJerry Jelinek     /*
9327b1019a6SJerry Jelinek      * We can only sort the _TSS return package if there is no _PSS in the
9337b1019a6SJerry Jelinek      * same scope. This is because if _PSS is present, the ACPI specification
9347b1019a6SJerry Jelinek      * dictates that the _TSS Power Dissipation field is to be ignored, and
9357b1019a6SJerry Jelinek      * therefore some BIOSs leave garbage values in the _TSS Power field(s).
9367b1019a6SJerry Jelinek      * In this case, it is best to just return the _TSS package as-is.
9377b1019a6SJerry Jelinek      * (May, 2011)
9387b1019a6SJerry Jelinek      */
9397b1019a6SJerry Jelinek     Status = AcpiNsGetNode (Info->Node, "^_PSS",
9407b1019a6SJerry Jelinek         ACPI_NS_NO_UPSEARCH, &Node);
9417b1019a6SJerry Jelinek     if (ACPI_SUCCESS (Status))
9427b1019a6SJerry Jelinek     {
9437b1019a6SJerry Jelinek         return (AE_OK);
9447b1019a6SJerry Jelinek     }
9457b1019a6SJerry Jelinek 
9467b1019a6SJerry Jelinek     Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 5, 1,
9477b1019a6SJerry Jelinek         ACPI_SORT_DESCENDING, "PowerDissipation");
9487b1019a6SJerry Jelinek 
9497b1019a6SJerry Jelinek     return (Status);
9507b1019a6SJerry Jelinek }
9517b1019a6SJerry Jelinek 
9527b1019a6SJerry Jelinek 
95357190917SDana Myers /******************************************************************************
95457190917SDana Myers  *
95557190917SDana Myers  * FUNCTION:    AcpiNsCheckSortedList
95657190917SDana Myers  *
9577b1019a6SJerry Jelinek  * PARAMETERS:  Info                - Method execution information block
95857190917SDana Myers  *              ReturnObject        - Pointer to the top-level returned object
9597b1019a6SJerry Jelinek  *              StartIndex          - Index of the first subpackage
9607b1019a6SJerry Jelinek  *              ExpectedCount       - Minimum length of each subpackage
9617b1019a6SJerry Jelinek  *              SortIndex           - Subpackage entry to sort on
96257190917SDana Myers  *              SortDirection       - Ascending or descending
96357190917SDana Myers  *              SortKeyName         - Name of the SortIndex field
96457190917SDana Myers  *
96557190917SDana Myers  * RETURN:      Status. AE_OK if the list is valid and is sorted correctly or
96657190917SDana Myers  *              has been repaired by sorting the list.
96757190917SDana Myers  *
96857190917SDana Myers  * DESCRIPTION: Check if the package list is valid and sorted correctly by the
96957190917SDana Myers  *              SortIndex. If not, then sort the list.
97057190917SDana Myers  *
97157190917SDana Myers  *****************************************************************************/
97257190917SDana Myers 
97357190917SDana Myers static ACPI_STATUS
AcpiNsCheckSortedList(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT * ReturnObject,UINT32 StartIndex,UINT32 ExpectedCount,UINT32 SortIndex,UINT8 SortDirection,char * SortKeyName)97457190917SDana Myers AcpiNsCheckSortedList (
9757b1019a6SJerry Jelinek     ACPI_EVALUATE_INFO      *Info,
97657190917SDana Myers     ACPI_OPERAND_OBJECT     *ReturnObject,
9777b1019a6SJerry Jelinek     UINT32                  StartIndex,
97857190917SDana Myers     UINT32                  ExpectedCount,
97957190917SDana Myers     UINT32                  SortIndex,
98057190917SDana Myers     UINT8                   SortDirection,
98157190917SDana Myers     char                    *SortKeyName)
98257190917SDana Myers {
98357190917SDana Myers     UINT32                  OuterElementCount;
98457190917SDana Myers     ACPI_OPERAND_OBJECT     **OuterElements;
98557190917SDana Myers     ACPI_OPERAND_OBJECT     **Elements;
98657190917SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc;
98757190917SDana Myers     UINT32                  i;
98857190917SDana Myers     UINT32                  PreviousValue;
98926f3cdf0SGordon Ross 
99026f3cdf0SGordon Ross 
99126f3cdf0SGordon Ross     ACPI_FUNCTION_NAME (NsCheckSortedList);
99257190917SDana Myers 
99357190917SDana Myers 
99457190917SDana Myers     /* The top-level object must be a package */
99557190917SDana Myers 
99657190917SDana Myers     if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
99757190917SDana Myers     {
99857190917SDana Myers         return (AE_AML_OPERAND_TYPE);
99957190917SDana Myers     }
100057190917SDana Myers 
100157190917SDana Myers     /*
10027b1019a6SJerry Jelinek      * NOTE: assumes list of subpackages contains no NULL elements.
100326f3cdf0SGordon Ross      * Any NULL elements should have been removed by earlier call
100426f3cdf0SGordon Ross      * to AcpiNsRemoveNullElements.
100557190917SDana Myers      */
100657190917SDana Myers     OuterElementCount = ReturnObject->Package.Count;
10077b1019a6SJerry Jelinek     if (!OuterElementCount || StartIndex >= OuterElementCount)
100857190917SDana Myers     {
100957190917SDana Myers         return (AE_AML_PACKAGE_LIMIT);
101057190917SDana Myers     }
101157190917SDana Myers 
10127b1019a6SJerry Jelinek     OuterElements = &ReturnObject->Package.Elements[StartIndex];
10137b1019a6SJerry Jelinek     OuterElementCount -= StartIndex;
10147b1019a6SJerry Jelinek 
101557190917SDana Myers     PreviousValue = 0;
101657190917SDana Myers     if (SortDirection == ACPI_SORT_DESCENDING)
101757190917SDana Myers     {
101857190917SDana Myers         PreviousValue = ACPI_UINT32_MAX;
101957190917SDana Myers     }
102057190917SDana Myers 
102157190917SDana Myers     /* Examine each subpackage */
102257190917SDana Myers 
102357190917SDana Myers     for (i = 0; i < OuterElementCount; i++)
102457190917SDana Myers     {
102557190917SDana Myers         /* Each element of the top-level package must also be a package */
102657190917SDana Myers 
102757190917SDana Myers         if ((*OuterElements)->Common.Type != ACPI_TYPE_PACKAGE)
102857190917SDana Myers         {
102957190917SDana Myers             return (AE_AML_OPERAND_TYPE);
103057190917SDana Myers         }
103157190917SDana Myers 
10327b1019a6SJerry Jelinek         /* Each subpackage must have the minimum length */
103357190917SDana Myers 
103457190917SDana Myers         if ((*OuterElements)->Package.Count < ExpectedCount)
103557190917SDana Myers         {
103657190917SDana Myers             return (AE_AML_PACKAGE_LIMIT);
103757190917SDana Myers         }
103857190917SDana Myers 
103957190917SDana Myers         Elements = (*OuterElements)->Package.Elements;
104057190917SDana Myers         ObjDesc = Elements[SortIndex];
104157190917SDana Myers 
104257190917SDana Myers         if (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)
104357190917SDana Myers         {
104457190917SDana Myers             return (AE_AML_OPERAND_TYPE);
104557190917SDana Myers         }
104657190917SDana Myers 
104757190917SDana Myers         /*
104857190917SDana Myers          * The list must be sorted in the specified order. If we detect a
104926f3cdf0SGordon Ross          * discrepancy, sort the entire list.
105057190917SDana Myers          */
105157190917SDana Myers         if (((SortDirection == ACPI_SORT_ASCENDING) &&
105257190917SDana Myers                 (ObjDesc->Integer.Value < PreviousValue)) ||
105357190917SDana Myers             ((SortDirection == ACPI_SORT_DESCENDING) &&
105457190917SDana Myers                 (ObjDesc->Integer.Value > PreviousValue)))
105557190917SDana Myers         {
10567b1019a6SJerry Jelinek             AcpiNsSortList (&ReturnObject->Package.Elements[StartIndex],
105726f3cdf0SGordon Ross                 OuterElementCount, SortIndex, SortDirection);
105857190917SDana Myers 
10597b1019a6SJerry Jelinek             Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
106057190917SDana Myers 
106126f3cdf0SGordon Ross             ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
106226f3cdf0SGordon Ross                 "%s: Repaired unsorted list - now sorted by %s\n",
10637b1019a6SJerry Jelinek                 Info->FullPathname, SortKeyName));
106457190917SDana Myers             return (AE_OK);
106557190917SDana Myers         }
106657190917SDana Myers 
106757190917SDana Myers         PreviousValue = (UINT32) ObjDesc->Integer.Value;
106857190917SDana Myers         OuterElements++;
106957190917SDana Myers     }
107057190917SDana Myers 
107157190917SDana Myers     return (AE_OK);
107257190917SDana Myers }
107357190917SDana Myers 
107457190917SDana Myers 
107557190917SDana Myers /******************************************************************************
107657190917SDana Myers  *
107757190917SDana Myers  * FUNCTION:    AcpiNsSortList
107857190917SDana Myers  *
107957190917SDana Myers  * PARAMETERS:  Elements            - Package object element list
108057190917SDana Myers  *              Count               - Element count for above
108157190917SDana Myers  *              Index               - Sort by which package element
108257190917SDana Myers  *              SortDirection       - Ascending or Descending sort
108357190917SDana Myers  *
108426f3cdf0SGordon Ross  * RETURN:      None
108557190917SDana Myers  *
108657190917SDana Myers  * DESCRIPTION: Sort the objects that are in a package element list.
108757190917SDana Myers  *
108826f3cdf0SGordon Ross  * NOTE: Assumes that all NULL elements have been removed from the package,
108926f3cdf0SGordon Ross  *       and that all elements have been verified to be of type Integer.
109057190917SDana Myers  *
109157190917SDana Myers  *****************************************************************************/
109257190917SDana Myers 
109326f3cdf0SGordon Ross static void
AcpiNsSortList(ACPI_OPERAND_OBJECT ** Elements,UINT32 Count,UINT32 Index,UINT8 SortDirection)109457190917SDana Myers AcpiNsSortList (
109557190917SDana Myers     ACPI_OPERAND_OBJECT     **Elements,
109657190917SDana Myers     UINT32                  Count,
109757190917SDana Myers     UINT32                  Index,
109857190917SDana Myers     UINT8                   SortDirection)
109957190917SDana Myers {
110057190917SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc1;
110157190917SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc2;
110257190917SDana Myers     ACPI_OPERAND_OBJECT     *TempObj;
110357190917SDana Myers     UINT32                  i;
110457190917SDana Myers     UINT32                  j;
110557190917SDana Myers 
110657190917SDana Myers 
110757190917SDana Myers     /* Simple bubble sort */
110857190917SDana Myers 
110957190917SDana Myers     for (i = 1; i < Count; i++)
111057190917SDana Myers     {
111157190917SDana Myers         for (j = (Count - 1); j >= i; j--)
111257190917SDana Myers         {
111357190917SDana Myers             ObjDesc1 = Elements[j-1]->Package.Elements[Index];
111457190917SDana Myers             ObjDesc2 = Elements[j]->Package.Elements[Index];
111557190917SDana Myers 
111657190917SDana Myers             if (((SortDirection == ACPI_SORT_ASCENDING) &&
111757190917SDana Myers                     (ObjDesc1->Integer.Value > ObjDesc2->Integer.Value)) ||
111857190917SDana Myers 
111957190917SDana Myers                 ((SortDirection == ACPI_SORT_DESCENDING) &&
112057190917SDana Myers                     (ObjDesc1->Integer.Value < ObjDesc2->Integer.Value)))
112157190917SDana Myers             {
112257190917SDana Myers                 TempObj = Elements[j-1];
112357190917SDana Myers                 Elements[j-1] = Elements[j];
112457190917SDana Myers                 Elements[j] = TempObj;
112557190917SDana Myers             }
112657190917SDana Myers         }
112757190917SDana Myers     }
112857190917SDana Myers }
11297b1019a6SJerry Jelinek 
11307b1019a6SJerry Jelinek 
11317b1019a6SJerry Jelinek /******************************************************************************
11327b1019a6SJerry Jelinek  *
11337b1019a6SJerry Jelinek  * FUNCTION:    AcpiNsRemoveElement
11347b1019a6SJerry Jelinek  *
11357b1019a6SJerry Jelinek  * PARAMETERS:  ObjDesc             - Package object element list
11367b1019a6SJerry Jelinek  *              Index               - Index of element to remove
11377b1019a6SJerry Jelinek  *
11387b1019a6SJerry Jelinek  * RETURN:      None
11397b1019a6SJerry Jelinek  *
11407b1019a6SJerry Jelinek  * DESCRIPTION: Remove the requested element of a package and delete it.
11417b1019a6SJerry Jelinek  *
11427b1019a6SJerry Jelinek  *****************************************************************************/
11437b1019a6SJerry Jelinek 
11447b1019a6SJerry Jelinek static void
AcpiNsRemoveElement(ACPI_OPERAND_OBJECT * ObjDesc,UINT32 Index)11457b1019a6SJerry Jelinek AcpiNsRemoveElement (
11467b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *ObjDesc,
11477b1019a6SJerry Jelinek     UINT32                  Index)
11487b1019a6SJerry Jelinek {
11497b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **Source;
11507b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **Dest;
11517b1019a6SJerry Jelinek     UINT32                  Count;
11527b1019a6SJerry Jelinek     UINT32                  NewCount;
11537b1019a6SJerry Jelinek     UINT32                  i;
11547b1019a6SJerry Jelinek 
11557b1019a6SJerry Jelinek 
11567b1019a6SJerry Jelinek     ACPI_FUNCTION_NAME (NsRemoveElement);
11577b1019a6SJerry Jelinek 
11587b1019a6SJerry Jelinek 
11597b1019a6SJerry Jelinek     Count = ObjDesc->Package.Count;
11607b1019a6SJerry Jelinek     NewCount = Count - 1;
11617b1019a6SJerry Jelinek 
11627b1019a6SJerry Jelinek     Source = ObjDesc->Package.Elements;
11637b1019a6SJerry Jelinek     Dest = Source;
11647b1019a6SJerry Jelinek 
11657b1019a6SJerry Jelinek     /* Examine all elements of the package object, remove matched index */
11667b1019a6SJerry Jelinek 
11677b1019a6SJerry Jelinek     for (i = 0; i < Count; i++)
11687b1019a6SJerry Jelinek     {
11697b1019a6SJerry Jelinek         if (i == Index)
11707b1019a6SJerry Jelinek         {
11717b1019a6SJerry Jelinek             AcpiUtRemoveReference (*Source); /* Remove one ref for being in pkg */
11727b1019a6SJerry Jelinek             AcpiUtRemoveReference (*Source);
11737b1019a6SJerry Jelinek         }
11747b1019a6SJerry Jelinek         else
11757b1019a6SJerry Jelinek         {
11767b1019a6SJerry Jelinek             *Dest = *Source;
11777b1019a6SJerry Jelinek             Dest++;
11787b1019a6SJerry Jelinek         }
11797b1019a6SJerry Jelinek 
11807b1019a6SJerry Jelinek         Source++;
11817b1019a6SJerry Jelinek     }
11827b1019a6SJerry Jelinek 
11837b1019a6SJerry Jelinek     /* NULL terminate list and update the package count */
11847b1019a6SJerry Jelinek 
11857b1019a6SJerry Jelinek     *Dest = NULL;
11867b1019a6SJerry Jelinek     ObjDesc->Package.Count = NewCount;
11877b1019a6SJerry Jelinek }
1188