xref: /titanic_52/usr/src/uts/intel/io/acpica/namespace/nspredef.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1aa2aa9a6SDana Myers /******************************************************************************
2aa2aa9a6SDana Myers  *
3aa2aa9a6SDana Myers  * Module Name: nspredef - Validation of ACPI predefined methods and objects
4aa2aa9a6SDana Myers  *
5aa2aa9a6SDana Myers  *****************************************************************************/
6aa2aa9a6SDana Myers 
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9aa2aa9a6SDana Myers  * All rights reserved.
10aa2aa9a6SDana Myers  *
1126f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross  * are met:
1426f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross  *    without modification.
1726f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross  *    binary redistribution.
2226f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross  *    from this software without specific prior written permission.
25aa2aa9a6SDana Myers  *
2626f3cdf0SGordon Ross  * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross  * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross  * Software Foundation.
29aa2aa9a6SDana Myers  *
3026f3cdf0SGordon Ross  * NO WARRANTY
3126f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross  * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross  */
43aa2aa9a6SDana Myers 
4457190917SDana Myers #define ACPI_CREATE_PREDEFINED_TABLE
45aa2aa9a6SDana Myers 
46aa2aa9a6SDana Myers #include "acpi.h"
47aa2aa9a6SDana Myers #include "accommon.h"
48aa2aa9a6SDana Myers #include "acnamesp.h"
49aa2aa9a6SDana Myers #include "acpredef.h"
50aa2aa9a6SDana Myers 
51aa2aa9a6SDana Myers 
52aa2aa9a6SDana Myers #define _COMPONENT          ACPI_NAMESPACE
53aa2aa9a6SDana Myers         ACPI_MODULE_NAME    ("nspredef")
54aa2aa9a6SDana Myers 
55aa2aa9a6SDana Myers 
56aa2aa9a6SDana Myers /*******************************************************************************
57aa2aa9a6SDana Myers  *
58aa2aa9a6SDana Myers  * This module validates predefined ACPI objects that appear in the namespace,
59aa2aa9a6SDana Myers  * at the time they are evaluated (via AcpiEvaluateObject). The purpose of this
60aa2aa9a6SDana Myers  * validation is to detect problems with BIOS-exposed predefined ACPI objects
61aa2aa9a6SDana Myers  * before the results are returned to the ACPI-related drivers.
62aa2aa9a6SDana Myers  *
63aa2aa9a6SDana Myers  * There are several areas that are validated:
64aa2aa9a6SDana Myers  *
65aa2aa9a6SDana Myers  *  1) The number of input arguments as defined by the method/object in the
66aa2aa9a6SDana Myers  *     ASL is validated against the ACPI specification.
67aa2aa9a6SDana Myers  *  2) The type of the return object (if any) is validated against the ACPI
68aa2aa9a6SDana Myers  *     specification.
69aa2aa9a6SDana Myers  *  3) For returned package objects, the count of package elements is
70aa2aa9a6SDana Myers  *     validated, as well as the type of each package element. Nested
71aa2aa9a6SDana Myers  *     packages are supported.
72aa2aa9a6SDana Myers  *
73aa2aa9a6SDana Myers  * For any problems found, a warning message is issued.
74aa2aa9a6SDana Myers  *
75aa2aa9a6SDana Myers  ******************************************************************************/
76aa2aa9a6SDana Myers 
7757190917SDana Myers 
78aa2aa9a6SDana Myers /* Local prototypes */
79aa2aa9a6SDana Myers 
80aa2aa9a6SDana Myers static ACPI_STATUS
81aa2aa9a6SDana Myers AcpiNsCheckReference (
82*385cc6b4SJerry Jelinek     ACPI_EVALUATE_INFO          *Info,
83aa2aa9a6SDana Myers     ACPI_OPERAND_OBJECT         *ReturnObject);
84aa2aa9a6SDana Myers 
85*385cc6b4SJerry Jelinek static UINT32
86*385cc6b4SJerry Jelinek AcpiNsGetBitmappedType (
87*385cc6b4SJerry Jelinek     ACPI_OPERAND_OBJECT         *ReturnObject);
88aa2aa9a6SDana Myers 
89aa2aa9a6SDana Myers 
90aa2aa9a6SDana Myers /*******************************************************************************
91aa2aa9a6SDana Myers  *
92*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiNsCheckReturnValue
93aa2aa9a6SDana Myers  *
94aa2aa9a6SDana Myers  * PARAMETERS:  Node            - Namespace node for the method/object
95*385cc6b4SJerry Jelinek  *              Info            - Method execution information block
9657190917SDana Myers  *              UserParamCount  - Number of parameters actually passed
9757190917SDana Myers  *              ReturnStatus    - Status from the object evaluation
98aa2aa9a6SDana Myers  *              ReturnObjectPtr - Pointer to the object returned from the
99aa2aa9a6SDana Myers  *                                evaluation of a method or object
100aa2aa9a6SDana Myers  *
101aa2aa9a6SDana Myers  * RETURN:      Status
102aa2aa9a6SDana Myers  *
103*385cc6b4SJerry Jelinek  * DESCRIPTION: Check the value returned from a predefined name.
104aa2aa9a6SDana Myers  *
105aa2aa9a6SDana Myers  ******************************************************************************/
106aa2aa9a6SDana Myers 
107aa2aa9a6SDana Myers ACPI_STATUS
108*385cc6b4SJerry Jelinek AcpiNsCheckReturnValue (
109aa2aa9a6SDana Myers     ACPI_NAMESPACE_NODE         *Node,
110*385cc6b4SJerry Jelinek     ACPI_EVALUATE_INFO          *Info,
111aa2aa9a6SDana Myers     UINT32                      UserParamCount,
112aa2aa9a6SDana Myers     ACPI_STATUS                 ReturnStatus,
113aa2aa9a6SDana Myers     ACPI_OPERAND_OBJECT         **ReturnObjectPtr)
114aa2aa9a6SDana Myers {
115*385cc6b4SJerry Jelinek     ACPI_STATUS                 Status;
116aa2aa9a6SDana Myers     const ACPI_PREDEFINED_INFO  *Predefined;
117aa2aa9a6SDana Myers 
118aa2aa9a6SDana Myers 
119aa2aa9a6SDana Myers     /* If not a predefined name, we cannot validate the return object */
120aa2aa9a6SDana Myers 
121*385cc6b4SJerry Jelinek     Predefined = Info->Predefined;
122aa2aa9a6SDana Myers     if (!Predefined)
123aa2aa9a6SDana Myers     {
124*385cc6b4SJerry Jelinek         return (AE_OK);
125aa2aa9a6SDana Myers     }
126aa2aa9a6SDana Myers 
127aa2aa9a6SDana Myers     /*
12857190917SDana Myers      * If the method failed or did not actually return an object, we cannot
12957190917SDana Myers      * validate the return object
130aa2aa9a6SDana Myers      */
131*385cc6b4SJerry Jelinek     if ((ReturnStatus != AE_OK) &&
132*385cc6b4SJerry Jelinek         (ReturnStatus != AE_CTRL_RETURN_VALUE))
133aa2aa9a6SDana Myers     {
134*385cc6b4SJerry Jelinek         return (AE_OK);
135aa2aa9a6SDana Myers     }
136aa2aa9a6SDana Myers 
137aa2aa9a6SDana Myers     /*
138*385cc6b4SJerry Jelinek      * Return value validation and possible repair.
139aa2aa9a6SDana Myers      *
140*385cc6b4SJerry Jelinek      * 1) Don't perform return value validation/repair if this feature
141*385cc6b4SJerry Jelinek      * has been disabled via a global option.
142aa2aa9a6SDana Myers      *
143*385cc6b4SJerry Jelinek      * 2) We have a return value, but if one wasn't expected, just exit,
144*385cc6b4SJerry Jelinek      * this is not a problem. For example, if the "Implicit Return"
145*385cc6b4SJerry Jelinek      * feature is enabled, methods will always return a value.
146*385cc6b4SJerry Jelinek      *
147*385cc6b4SJerry Jelinek      * 3) If the return value can be of any type, then we cannot perform
148*385cc6b4SJerry Jelinek      * any validation, just exit.
149aa2aa9a6SDana Myers      */
150*385cc6b4SJerry Jelinek     if (AcpiGbl_DisableAutoRepair ||
151*385cc6b4SJerry Jelinek         (!Predefined->Info.ExpectedBtypes) ||
15257190917SDana Myers         (Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL))
153aa2aa9a6SDana Myers     {
154*385cc6b4SJerry Jelinek         return (AE_OK);
155aa2aa9a6SDana Myers     }
156aa2aa9a6SDana Myers 
157aa2aa9a6SDana Myers     /*
15826f3cdf0SGordon Ross      * Check that the type of the main return object is what is expected
15926f3cdf0SGordon Ross      * for this predefined name
160aa2aa9a6SDana Myers      */
161*385cc6b4SJerry Jelinek     Status = AcpiNsCheckObjectType (Info, ReturnObjectPtr,
16257190917SDana Myers         Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
163aa2aa9a6SDana Myers     if (ACPI_FAILURE (Status))
164aa2aa9a6SDana Myers     {
16526f3cdf0SGordon Ross         goto Exit;
166aa2aa9a6SDana Myers     }
167aa2aa9a6SDana Myers 
16857190917SDana Myers     /*
169*385cc6b4SJerry Jelinek      *
170*385cc6b4SJerry Jelinek      * 4) If there is no return value and it is optional, just return
171*385cc6b4SJerry Jelinek      * AE_OK (_WAK).
172*385cc6b4SJerry Jelinek      */
173*385cc6b4SJerry Jelinek     if (!(*ReturnObjectPtr))
174*385cc6b4SJerry Jelinek     {
175*385cc6b4SJerry Jelinek         goto Exit;
176*385cc6b4SJerry Jelinek     }
177*385cc6b4SJerry Jelinek 
178*385cc6b4SJerry Jelinek     /*
17926f3cdf0SGordon Ross      * For returned Package objects, check the type of all sub-objects.
18026f3cdf0SGordon Ross      * Note: Package may have been newly created by call above.
18126f3cdf0SGordon Ross      */
18226f3cdf0SGordon Ross     if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE)
18326f3cdf0SGordon Ross     {
184*385cc6b4SJerry Jelinek         Info->ParentPackage = *ReturnObjectPtr;
185*385cc6b4SJerry Jelinek         Status = AcpiNsCheckPackage (Info, ReturnObjectPtr);
18626f3cdf0SGordon Ross         if (ACPI_FAILURE (Status))
18726f3cdf0SGordon Ross         {
188*385cc6b4SJerry Jelinek             /* We might be able to fix some errors */
189*385cc6b4SJerry Jelinek 
190*385cc6b4SJerry Jelinek             if ((Status != AE_AML_OPERAND_TYPE) &&
191*385cc6b4SJerry Jelinek                 (Status != AE_AML_OPERAND_VALUE))
192*385cc6b4SJerry Jelinek             {
19326f3cdf0SGordon Ross                 goto Exit;
19426f3cdf0SGordon Ross             }
19526f3cdf0SGordon Ross         }
196*385cc6b4SJerry Jelinek     }
19726f3cdf0SGordon Ross 
19826f3cdf0SGordon Ross     /*
19926f3cdf0SGordon Ross      * The return object was OK, or it was successfully repaired above.
20026f3cdf0SGordon Ross      * Now make some additional checks such as verifying that package
20126f3cdf0SGordon Ross      * objects are sorted correctly (if required) or buffer objects have
20226f3cdf0SGordon Ross      * the correct data width (bytes vs. dwords). These repairs are
20326f3cdf0SGordon Ross      * performed on a per-name basis, i.e., the code is specific to
20426f3cdf0SGordon Ross      * particular predefined names.
20557190917SDana Myers      */
206*385cc6b4SJerry Jelinek     Status = AcpiNsComplexRepairs (Info, Node, Status, ReturnObjectPtr);
20757190917SDana Myers 
20826f3cdf0SGordon Ross Exit:
20957190917SDana Myers     /*
21057190917SDana Myers      * If the object validation failed or if we successfully repaired one
21157190917SDana Myers      * or more objects, mark the parent node to suppress further warning
21257190917SDana Myers      * messages during the next evaluation of the same method/object.
21357190917SDana Myers      */
214*385cc6b4SJerry Jelinek     if (ACPI_FAILURE (Status) ||
215*385cc6b4SJerry Jelinek        (Info->ReturnFlags & ACPI_OBJECT_REPAIRED))
21657190917SDana Myers     {
21757190917SDana Myers         Node->Flags |= ANOBJ_EVALUATED;
21857190917SDana Myers     }
21957190917SDana Myers 
22057190917SDana Myers     return (Status);
221aa2aa9a6SDana Myers }
222aa2aa9a6SDana Myers 
223aa2aa9a6SDana Myers 
224aa2aa9a6SDana Myers /*******************************************************************************
225aa2aa9a6SDana Myers  *
226aa2aa9a6SDana Myers  * FUNCTION:    AcpiNsCheckObjectType
227aa2aa9a6SDana Myers  *
228*385cc6b4SJerry Jelinek  * PARAMETERS:  Info            - Method execution information block
229aa2aa9a6SDana Myers  *              ReturnObjectPtr - Pointer to the object returned from the
230aa2aa9a6SDana Myers  *                                evaluation of a method or object
231aa2aa9a6SDana Myers  *              ExpectedBtypes  - Bitmap of expected return type(s)
232aa2aa9a6SDana Myers  *              PackageIndex    - Index of object within parent package (if
23357190917SDana Myers  *                                applicable - ACPI_NOT_PACKAGE_ELEMENT
23457190917SDana Myers  *                                otherwise)
235aa2aa9a6SDana Myers  *
236aa2aa9a6SDana Myers  * RETURN:      Status
237aa2aa9a6SDana Myers  *
238aa2aa9a6SDana Myers  * DESCRIPTION: Check the type of the return object against the expected object
239aa2aa9a6SDana Myers  *              type(s). Use of Btype allows multiple expected object types.
240aa2aa9a6SDana Myers  *
241aa2aa9a6SDana Myers  ******************************************************************************/
242aa2aa9a6SDana Myers 
243*385cc6b4SJerry Jelinek ACPI_STATUS
244aa2aa9a6SDana Myers AcpiNsCheckObjectType (
245*385cc6b4SJerry Jelinek     ACPI_EVALUATE_INFO          *Info,
246aa2aa9a6SDana Myers     ACPI_OPERAND_OBJECT         **ReturnObjectPtr,
247aa2aa9a6SDana Myers     UINT32                      ExpectedBtypes,
248aa2aa9a6SDana Myers     UINT32                      PackageIndex)
249aa2aa9a6SDana Myers {
250aa2aa9a6SDana Myers     ACPI_OPERAND_OBJECT         *ReturnObject = *ReturnObjectPtr;
251aa2aa9a6SDana Myers     ACPI_STATUS                 Status = AE_OK;
252*385cc6b4SJerry Jelinek     char                        TypeBuffer[96]; /* Room for 10 types */
253aa2aa9a6SDana Myers 
254aa2aa9a6SDana Myers 
255aa2aa9a6SDana Myers     /* A Namespace node should not get here, but make sure */
256aa2aa9a6SDana Myers 
257*385cc6b4SJerry Jelinek     if (ReturnObject &&
258*385cc6b4SJerry Jelinek         ACPI_GET_DESCRIPTOR_TYPE (ReturnObject) == ACPI_DESC_TYPE_NAMED)
259aa2aa9a6SDana Myers     {
260*385cc6b4SJerry Jelinek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
26157190917SDana Myers             "Invalid return type - Found a Namespace node [%4.4s] type %s",
26257190917SDana Myers             ReturnObject->Node.Name.Ascii,
263aa2aa9a6SDana Myers             AcpiUtGetTypeName (ReturnObject->Node.Type)));
264aa2aa9a6SDana Myers         return (AE_AML_OPERAND_TYPE);
265aa2aa9a6SDana Myers     }
266aa2aa9a6SDana Myers 
267aa2aa9a6SDana Myers     /*
268aa2aa9a6SDana Myers      * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type.
269aa2aa9a6SDana Myers      * The bitmapped type allows multiple possible return types.
270aa2aa9a6SDana Myers      *
271aa2aa9a6SDana Myers      * Note, the cases below must handle all of the possible types returned
272aa2aa9a6SDana Myers      * from all of the predefined names (including elements of returned
273aa2aa9a6SDana Myers      * packages)
274aa2aa9a6SDana Myers      */
275*385cc6b4SJerry Jelinek     Info->ReturnBtype = AcpiNsGetBitmappedType (ReturnObject);
276*385cc6b4SJerry Jelinek     if (Info->ReturnBtype == ACPI_RTYPE_ANY)
277aa2aa9a6SDana Myers     {
278aa2aa9a6SDana Myers         /* Not one of the supported objects, must be incorrect */
279aa2aa9a6SDana Myers         goto TypeErrorExit;
280aa2aa9a6SDana Myers     }
281aa2aa9a6SDana Myers 
282aa2aa9a6SDana Myers     /* For reference objects, check that the reference type is correct */
283aa2aa9a6SDana Myers 
284*385cc6b4SJerry Jelinek     if ((Info->ReturnBtype & ExpectedBtypes) == ACPI_RTYPE_REFERENCE)
285aa2aa9a6SDana Myers     {
286*385cc6b4SJerry Jelinek         Status = AcpiNsCheckReference (Info, ReturnObject);
287aa2aa9a6SDana Myers         return (Status);
28826f3cdf0SGordon Ross     }
28926f3cdf0SGordon Ross 
290*385cc6b4SJerry Jelinek     /* Attempt simple repair of the returned object if necessary */
29126f3cdf0SGordon Ross 
292*385cc6b4SJerry Jelinek     Status = AcpiNsSimpleRepair (Info, ExpectedBtypes,
29326f3cdf0SGordon Ross         PackageIndex, ReturnObjectPtr);
29426f3cdf0SGordon Ross     if (ACPI_SUCCESS (Status))
29526f3cdf0SGordon Ross     {
296*385cc6b4SJerry Jelinek         return (AE_OK); /* Successful repair */
29726f3cdf0SGordon Ross     }
298aa2aa9a6SDana Myers 
299aa2aa9a6SDana Myers 
300aa2aa9a6SDana Myers TypeErrorExit:
301aa2aa9a6SDana Myers 
302aa2aa9a6SDana Myers     /* Create a string with all expected types for this predefined object */
303aa2aa9a6SDana Myers 
304*385cc6b4SJerry Jelinek     AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
305aa2aa9a6SDana Myers 
306*385cc6b4SJerry Jelinek     if (!ReturnObject)
307aa2aa9a6SDana Myers     {
308*385cc6b4SJerry Jelinek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
309*385cc6b4SJerry Jelinek             "Expected return object of type %s",
310*385cc6b4SJerry Jelinek             TypeBuffer));
311*385cc6b4SJerry Jelinek     }
312*385cc6b4SJerry Jelinek     else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
313*385cc6b4SJerry Jelinek     {
314*385cc6b4SJerry Jelinek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
31557190917SDana Myers             "Return type mismatch - found %s, expected %s",
31657190917SDana Myers             AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer));
317aa2aa9a6SDana Myers     }
318aa2aa9a6SDana Myers     else
319aa2aa9a6SDana Myers     {
320*385cc6b4SJerry Jelinek         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
32157190917SDana Myers             "Return Package type mismatch at index %u - "
32257190917SDana Myers             "found %s, expected %s", PackageIndex,
323aa2aa9a6SDana Myers             AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer));
324aa2aa9a6SDana Myers     }
325aa2aa9a6SDana Myers 
326aa2aa9a6SDana Myers     return (AE_AML_OPERAND_TYPE);
327aa2aa9a6SDana Myers }
328aa2aa9a6SDana Myers 
329aa2aa9a6SDana Myers 
330aa2aa9a6SDana Myers /*******************************************************************************
331aa2aa9a6SDana Myers  *
332aa2aa9a6SDana Myers  * FUNCTION:    AcpiNsCheckReference
333aa2aa9a6SDana Myers  *
334*385cc6b4SJerry Jelinek  * PARAMETERS:  Info            - Method execution information block
335aa2aa9a6SDana Myers  *              ReturnObject    - Object returned from the evaluation of a
336aa2aa9a6SDana Myers  *                                method or object
337aa2aa9a6SDana Myers  *
338aa2aa9a6SDana Myers  * RETURN:      Status
339aa2aa9a6SDana Myers  *
340aa2aa9a6SDana Myers  * DESCRIPTION: Check a returned reference object for the correct reference
341aa2aa9a6SDana Myers  *              type. The only reference type that can be returned from a
342aa2aa9a6SDana Myers  *              predefined method is a named reference. All others are invalid.
343aa2aa9a6SDana Myers  *
344aa2aa9a6SDana Myers  ******************************************************************************/
345aa2aa9a6SDana Myers 
346aa2aa9a6SDana Myers static ACPI_STATUS
347aa2aa9a6SDana Myers AcpiNsCheckReference (
348*385cc6b4SJerry Jelinek     ACPI_EVALUATE_INFO          *Info,
349aa2aa9a6SDana Myers     ACPI_OPERAND_OBJECT         *ReturnObject)
350aa2aa9a6SDana Myers {
351aa2aa9a6SDana Myers 
352aa2aa9a6SDana Myers     /*
353aa2aa9a6SDana Myers      * Check the reference object for the correct reference type (opcode).
354aa2aa9a6SDana Myers      * The only type of reference that can be converted to an ACPI_OBJECT is
355aa2aa9a6SDana Myers      * a reference to a named object (reference class: NAME)
356aa2aa9a6SDana Myers      */
357aa2aa9a6SDana Myers     if (ReturnObject->Reference.Class == ACPI_REFCLASS_NAME)
358aa2aa9a6SDana Myers     {
359aa2aa9a6SDana Myers         return (AE_OK);
360aa2aa9a6SDana Myers     }
361aa2aa9a6SDana Myers 
362*385cc6b4SJerry Jelinek     ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
36357190917SDana Myers         "Return type mismatch - unexpected reference object type [%s] %2.2X",
36457190917SDana Myers         AcpiUtGetReferenceName (ReturnObject),
365aa2aa9a6SDana Myers         ReturnObject->Reference.Class));
366aa2aa9a6SDana Myers 
367aa2aa9a6SDana Myers     return (AE_AML_OPERAND_TYPE);
368aa2aa9a6SDana Myers }
369aa2aa9a6SDana Myers 
370aa2aa9a6SDana Myers 
371aa2aa9a6SDana Myers /*******************************************************************************
372aa2aa9a6SDana Myers  *
373*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiNsGetBitmappedType
374aa2aa9a6SDana Myers  *
375*385cc6b4SJerry Jelinek  * PARAMETERS:  ReturnObject    - Object returned from method/obj evaluation
376aa2aa9a6SDana Myers  *
377*385cc6b4SJerry Jelinek  * RETURN:      Object return type. ACPI_RTYPE_ANY indicates that the object
378*385cc6b4SJerry Jelinek  *              type is not supported. ACPI_RTYPE_NONE indicates that no
379*385cc6b4SJerry Jelinek  *              object was returned (ReturnObject is NULL).
380aa2aa9a6SDana Myers  *
381*385cc6b4SJerry Jelinek  * DESCRIPTION: Convert object type into a bitmapped object return type.
382aa2aa9a6SDana Myers  *
383aa2aa9a6SDana Myers  ******************************************************************************/
384aa2aa9a6SDana Myers 
385*385cc6b4SJerry Jelinek static UINT32
386*385cc6b4SJerry Jelinek AcpiNsGetBitmappedType (
387*385cc6b4SJerry Jelinek     ACPI_OPERAND_OBJECT         *ReturnObject)
388aa2aa9a6SDana Myers {
389*385cc6b4SJerry Jelinek     UINT32                      ReturnBtype;
390aa2aa9a6SDana Myers 
391aa2aa9a6SDana Myers 
392*385cc6b4SJerry Jelinek     if (!ReturnObject)
393aa2aa9a6SDana Myers     {
394*385cc6b4SJerry Jelinek         return (ACPI_RTYPE_NONE);
395aa2aa9a6SDana Myers     }
396*385cc6b4SJerry Jelinek 
397*385cc6b4SJerry Jelinek     /* Map ACPI_OBJECT_TYPE to internal bitmapped type */
398*385cc6b4SJerry Jelinek 
399*385cc6b4SJerry Jelinek     switch (ReturnObject->Common.Type)
400*385cc6b4SJerry Jelinek     {
401*385cc6b4SJerry Jelinek     case ACPI_TYPE_INTEGER:
402*385cc6b4SJerry Jelinek 
403*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_INTEGER;
404*385cc6b4SJerry Jelinek         break;
405*385cc6b4SJerry Jelinek 
406*385cc6b4SJerry Jelinek     case ACPI_TYPE_BUFFER:
407*385cc6b4SJerry Jelinek 
408*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_BUFFER;
409*385cc6b4SJerry Jelinek         break;
410*385cc6b4SJerry Jelinek 
411*385cc6b4SJerry Jelinek     case ACPI_TYPE_STRING:
412*385cc6b4SJerry Jelinek 
413*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_STRING;
414*385cc6b4SJerry Jelinek         break;
415*385cc6b4SJerry Jelinek 
416*385cc6b4SJerry Jelinek     case ACPI_TYPE_PACKAGE:
417*385cc6b4SJerry Jelinek 
418*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_PACKAGE;
419*385cc6b4SJerry Jelinek         break;
420*385cc6b4SJerry Jelinek 
421*385cc6b4SJerry Jelinek     case ACPI_TYPE_LOCAL_REFERENCE:
422*385cc6b4SJerry Jelinek 
423*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_REFERENCE;
424*385cc6b4SJerry Jelinek         break;
425*385cc6b4SJerry Jelinek 
426*385cc6b4SJerry Jelinek     default:
427*385cc6b4SJerry Jelinek 
428*385cc6b4SJerry Jelinek         /* Not one of the supported objects, must be incorrect */
429*385cc6b4SJerry Jelinek 
430*385cc6b4SJerry Jelinek         ReturnBtype = ACPI_RTYPE_ANY;
431*385cc6b4SJerry Jelinek         break;
432aa2aa9a6SDana Myers     }
433*385cc6b4SJerry Jelinek 
434*385cc6b4SJerry Jelinek     return (ReturnBtype);
435aa2aa9a6SDana Myers }
436