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