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
AcpiNsCheckReturnValue(ACPI_NAMESPACE_NODE * Node,ACPI_EVALUATE_INFO * Info,UINT32 UserParamCount,ACPI_STATUS ReturnStatus,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)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
AcpiNsCheckObjectType(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr,UINT32 ExpectedBtypes,UINT32 PackageIndex)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
AcpiNsCheckReference(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT * ReturnObject)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
AcpiNsGetBitmappedType(ACPI_OPERAND_OBJECT * ReturnObject)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