17c478bd9Sstevel@tonic-gate /******************************************************************************
27c478bd9Sstevel@tonic-gate *
37c478bd9Sstevel@tonic-gate * Module Name: nsxfname - Public interfaces to the ACPI subsystem
47c478bd9Sstevel@tonic-gate * ACPI Namespace oriented interfaces
57c478bd9Sstevel@tonic-gate *
67c478bd9Sstevel@tonic-gate *****************************************************************************/
77c478bd9Sstevel@tonic-gate
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.
137c478bd9Sstevel@tonic-gate * All rights reserved.
147c478bd9Sstevel@tonic-gate *
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 *****************************************************************************/
1527c478bd9Sstevel@tonic-gate
1537b1019a6SJerry Jelinek #define EXPORT_ACPI_INTERFACES
1547c478bd9Sstevel@tonic-gate
1557c478bd9Sstevel@tonic-gate #include "acpi.h"
156aa2aa9a6SDana Myers #include "accommon.h"
1577c478bd9Sstevel@tonic-gate #include "acnamesp.h"
158aa2aa9a6SDana Myers #include "acparser.h"
159aa2aa9a6SDana Myers #include "amlcode.h"
1607c478bd9Sstevel@tonic-gate
1617c478bd9Sstevel@tonic-gate
1627c478bd9Sstevel@tonic-gate #define _COMPONENT ACPI_NAMESPACE
1637c478bd9Sstevel@tonic-gate ACPI_MODULE_NAME ("nsxfname")
1647c478bd9Sstevel@tonic-gate
16557190917SDana Myers /* Local prototypes */
16657190917SDana Myers
16757190917SDana Myers static char *
16857190917SDana Myers AcpiNsCopyDeviceId (
1697b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Dest,
1707b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Source,
17157190917SDana Myers char *StringArea);
17257190917SDana Myers
1737c478bd9Sstevel@tonic-gate
1747c478bd9Sstevel@tonic-gate /******************************************************************************
1757c478bd9Sstevel@tonic-gate *
1767c478bd9Sstevel@tonic-gate * FUNCTION: AcpiGetHandle
1777c478bd9Sstevel@tonic-gate *
1787c478bd9Sstevel@tonic-gate * PARAMETERS: Parent - Object to search under (search scope).
1797c478bd9Sstevel@tonic-gate * Pathname - Pointer to an asciiz string containing the
1807c478bd9Sstevel@tonic-gate * name
1817c478bd9Sstevel@tonic-gate * RetHandle - Where the return handle is returned
1827c478bd9Sstevel@tonic-gate *
1837c478bd9Sstevel@tonic-gate * RETURN: Status
1847c478bd9Sstevel@tonic-gate *
1857c478bd9Sstevel@tonic-gate * DESCRIPTION: This routine will search for a caller specified name in the
1867b1019a6SJerry Jelinek * name space. The caller can restrict the search region by
1877b1019a6SJerry Jelinek * specifying a non NULL parent. The parent value is itself a
1887c478bd9Sstevel@tonic-gate * namespace handle.
1897c478bd9Sstevel@tonic-gate *
1907c478bd9Sstevel@tonic-gate ******************************************************************************/
1917c478bd9Sstevel@tonic-gate
1927c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiGetHandle(ACPI_HANDLE Parent,ACPI_STRING Pathname,ACPI_HANDLE * RetHandle)1937c478bd9Sstevel@tonic-gate AcpiGetHandle (
1947c478bd9Sstevel@tonic-gate ACPI_HANDLE Parent,
1957c478bd9Sstevel@tonic-gate ACPI_STRING Pathname,
1967c478bd9Sstevel@tonic-gate ACPI_HANDLE *RetHandle)
1977c478bd9Sstevel@tonic-gate {
1987c478bd9Sstevel@tonic-gate ACPI_STATUS Status;
1997c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *Node = NULL;
2007c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *PrefixNode = NULL;
2017c478bd9Sstevel@tonic-gate
2027c478bd9Sstevel@tonic-gate
2037c478bd9Sstevel@tonic-gate ACPI_FUNCTION_ENTRY ();
2047c478bd9Sstevel@tonic-gate
2057c478bd9Sstevel@tonic-gate
2067c478bd9Sstevel@tonic-gate /* Parameter Validation */
2077c478bd9Sstevel@tonic-gate
2087c478bd9Sstevel@tonic-gate if (!RetHandle || !Pathname)
2097c478bd9Sstevel@tonic-gate {
2107c478bd9Sstevel@tonic-gate return (AE_BAD_PARAMETER);
2117c478bd9Sstevel@tonic-gate }
2127c478bd9Sstevel@tonic-gate
2137c478bd9Sstevel@tonic-gate /* Convert a parent handle to a prefix node */
2147c478bd9Sstevel@tonic-gate
2157c478bd9Sstevel@tonic-gate if (Parent)
2167c478bd9Sstevel@tonic-gate {
21726f3cdf0SGordon Ross PrefixNode = AcpiNsValidateHandle (Parent);
2187c478bd9Sstevel@tonic-gate if (!PrefixNode)
2197c478bd9Sstevel@tonic-gate {
2207c478bd9Sstevel@tonic-gate return (AE_BAD_PARAMETER);
2217c478bd9Sstevel@tonic-gate }
222db2bae30SDana Myers }
223db2bae30SDana Myers
224db2bae30SDana Myers /*
225db2bae30SDana Myers * Valid cases are:
226db2bae30SDana Myers * 1) Fully qualified pathname
227db2bae30SDana Myers * 2) Parent + Relative pathname
228db2bae30SDana Myers *
229db2bae30SDana Myers * Error for <null Parent + relative path>
230db2bae30SDana Myers */
2317b1019a6SJerry Jelinek if (ACPI_IS_ROOT_PREFIX (Pathname[0]))
232db2bae30SDana Myers {
233db2bae30SDana Myers /* Pathname is fully qualified (starts with '\') */
2347c478bd9Sstevel@tonic-gate
235db2bae30SDana Myers /* Special case for root-only, since we can't search for it */
236db2bae30SDana Myers
2377b1019a6SJerry Jelinek if (!strcmp (Pathname, ACPI_NS_ROOT_PATH))
2387c478bd9Sstevel@tonic-gate {
23926f3cdf0SGordon Ross *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, AcpiGbl_RootNode);
240db2bae30SDana Myers return (AE_OK);
2417c478bd9Sstevel@tonic-gate }
2427c478bd9Sstevel@tonic-gate }
243db2bae30SDana Myers else if (!PrefixNode)
2447c478bd9Sstevel@tonic-gate {
245db2bae30SDana Myers /* Relative path with null prefix is disallowed */
246db2bae30SDana Myers
247db2bae30SDana Myers return (AE_BAD_PARAMETER);
2487c478bd9Sstevel@tonic-gate }
2497c478bd9Sstevel@tonic-gate
250db2bae30SDana Myers /* Find the Node and convert to a handle */
2517c478bd9Sstevel@tonic-gate
252db2bae30SDana Myers Status = AcpiNsGetNode (PrefixNode, Pathname, ACPI_NS_NO_UPSEARCH, &Node);
2537c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
2547c478bd9Sstevel@tonic-gate {
25526f3cdf0SGordon Ross *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
2567c478bd9Sstevel@tonic-gate }
2577c478bd9Sstevel@tonic-gate
2587c478bd9Sstevel@tonic-gate return (Status);
2597c478bd9Sstevel@tonic-gate }
2607c478bd9Sstevel@tonic-gate
ACPI_EXPORT_SYMBOL(AcpiGetHandle)26127f7c583Smyers ACPI_EXPORT_SYMBOL (AcpiGetHandle)
26227f7c583Smyers
2637c478bd9Sstevel@tonic-gate
2647c478bd9Sstevel@tonic-gate /******************************************************************************
2657c478bd9Sstevel@tonic-gate *
2667c478bd9Sstevel@tonic-gate * FUNCTION: AcpiGetName
2677c478bd9Sstevel@tonic-gate *
2687c478bd9Sstevel@tonic-gate * PARAMETERS: Handle - Handle to be converted to a pathname
2697c478bd9Sstevel@tonic-gate * NameType - Full pathname or single segment
2707c478bd9Sstevel@tonic-gate * Buffer - Buffer for returned path
2717c478bd9Sstevel@tonic-gate *
2727c478bd9Sstevel@tonic-gate * RETURN: Pointer to a string containing the fully qualified Name.
2737c478bd9Sstevel@tonic-gate *
2747c478bd9Sstevel@tonic-gate * DESCRIPTION: This routine returns the fully qualified name associated with
2757b1019a6SJerry Jelinek * the Handle parameter. This and the AcpiPathnameToHandle are
2767c478bd9Sstevel@tonic-gate * complementary functions.
2777c478bd9Sstevel@tonic-gate *
2787c478bd9Sstevel@tonic-gate ******************************************************************************/
2797c478bd9Sstevel@tonic-gate
2807c478bd9Sstevel@tonic-gate ACPI_STATUS
2817c478bd9Sstevel@tonic-gate AcpiGetName (
2827c478bd9Sstevel@tonic-gate ACPI_HANDLE Handle,
2837c478bd9Sstevel@tonic-gate UINT32 NameType,
2847c478bd9Sstevel@tonic-gate ACPI_BUFFER *Buffer)
2857c478bd9Sstevel@tonic-gate {
2867c478bd9Sstevel@tonic-gate ACPI_STATUS Status;
2877c478bd9Sstevel@tonic-gate
2887c478bd9Sstevel@tonic-gate
2897c478bd9Sstevel@tonic-gate /* Parameter validation */
2907c478bd9Sstevel@tonic-gate
2917c478bd9Sstevel@tonic-gate if (NameType > ACPI_NAME_TYPE_MAX)
2927c478bd9Sstevel@tonic-gate {
2937c478bd9Sstevel@tonic-gate return (AE_BAD_PARAMETER);
2947c478bd9Sstevel@tonic-gate }
2957c478bd9Sstevel@tonic-gate
2967c478bd9Sstevel@tonic-gate Status = AcpiUtValidateBuffer (Buffer);
2977c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
2987c478bd9Sstevel@tonic-gate {
2997c478bd9Sstevel@tonic-gate return (Status);
3007c478bd9Sstevel@tonic-gate }
3017c478bd9Sstevel@tonic-gate
3027c478bd9Sstevel@tonic-gate /*
3037c478bd9Sstevel@tonic-gate * Wants the single segment ACPI name.
3047c478bd9Sstevel@tonic-gate * Validate handle and convert to a namespace Node
3057c478bd9Sstevel@tonic-gate */
3067c478bd9Sstevel@tonic-gate Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
3077c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
3087c478bd9Sstevel@tonic-gate {
3097c478bd9Sstevel@tonic-gate return (Status);
3107c478bd9Sstevel@tonic-gate }
3117c478bd9Sstevel@tonic-gate
312*35786f68SRobert Mustacchi if (NameType == ACPI_FULL_PATHNAME ||
313*35786f68SRobert Mustacchi NameType == ACPI_FULL_PATHNAME_NO_TRAILING)
3147c478bd9Sstevel@tonic-gate {
315*35786f68SRobert Mustacchi /* Get the full pathname (From the namespace root) */
3167c478bd9Sstevel@tonic-gate
317*35786f68SRobert Mustacchi Status = AcpiNsHandleToPathname (Handle, Buffer,
318*35786f68SRobert Mustacchi NameType == ACPI_FULL_PATHNAME ? FALSE : TRUE);
3197c478bd9Sstevel@tonic-gate }
320*35786f68SRobert Mustacchi else
321*35786f68SRobert Mustacchi {
322*35786f68SRobert Mustacchi /* Get the single name */
3237c478bd9Sstevel@tonic-gate
324*35786f68SRobert Mustacchi Status = AcpiNsHandleToName (Handle, Buffer);
325*35786f68SRobert Mustacchi }
3267c478bd9Sstevel@tonic-gate
3277c478bd9Sstevel@tonic-gate (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
3287c478bd9Sstevel@tonic-gate return (Status);
3297c478bd9Sstevel@tonic-gate }
3307c478bd9Sstevel@tonic-gate
ACPI_EXPORT_SYMBOL(AcpiGetName)33127f7c583Smyers ACPI_EXPORT_SYMBOL (AcpiGetName)
33227f7c583Smyers
3337c478bd9Sstevel@tonic-gate
33457190917SDana Myers /******************************************************************************
33557190917SDana Myers *
33657190917SDana Myers * FUNCTION: AcpiNsCopyDeviceId
33757190917SDana Myers *
3387b1019a6SJerry Jelinek * PARAMETERS: Dest - Pointer to the destination PNP_DEVICE_ID
3397b1019a6SJerry Jelinek * Source - Pointer to the source PNP_DEVICE_ID
34057190917SDana Myers * StringArea - Pointer to where to copy the dest string
34157190917SDana Myers *
34257190917SDana Myers * RETURN: Pointer to the next string area
34357190917SDana Myers *
3447b1019a6SJerry Jelinek * DESCRIPTION: Copy a single PNP_DEVICE_ID, including the string data.
34557190917SDana Myers *
34657190917SDana Myers ******************************************************************************/
34757190917SDana Myers
34857190917SDana Myers static char *
34957190917SDana Myers AcpiNsCopyDeviceId (
3507b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Dest,
3517b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Source,
35257190917SDana Myers char *StringArea)
35357190917SDana Myers {
3547b1019a6SJerry Jelinek /* Create the destination PNP_DEVICE_ID */
35557190917SDana Myers
35657190917SDana Myers Dest->String = StringArea;
35757190917SDana Myers Dest->Length = Source->Length;
35857190917SDana Myers
35957190917SDana Myers /* Copy actual string and return a pointer to the next string area */
36057190917SDana Myers
3617b1019a6SJerry Jelinek memcpy (StringArea, Source->String, Source->Length);
36257190917SDana Myers return (StringArea + Source->Length);
36357190917SDana Myers }
36457190917SDana Myers
36557190917SDana Myers
3667c478bd9Sstevel@tonic-gate /******************************************************************************
3677c478bd9Sstevel@tonic-gate *
3687c478bd9Sstevel@tonic-gate * FUNCTION: AcpiGetObjectInfo
3697c478bd9Sstevel@tonic-gate *
37057190917SDana Myers * PARAMETERS: Handle - Object Handle
37157190917SDana Myers * ReturnBuffer - Where the info is returned
3727c478bd9Sstevel@tonic-gate *
3737c478bd9Sstevel@tonic-gate * RETURN: Status
3747c478bd9Sstevel@tonic-gate *
3757c478bd9Sstevel@tonic-gate * DESCRIPTION: Returns information about an object as gleaned from the
3767c478bd9Sstevel@tonic-gate * namespace node and possibly by running several standard
3777c478bd9Sstevel@tonic-gate * control methods (Such as in the case of a device.)
3787c478bd9Sstevel@tonic-gate *
379*35786f68SRobert Mustacchi * For Device and Processor objects, run the Device _HID, _UID, _CID,
3807b1019a6SJerry Jelinek * _CLS, _ADR, _SxW, and _SxD methods.
38157190917SDana Myers *
38257190917SDana Myers * Note: Allocates the return buffer, must be freed by the caller.
38357190917SDana Myers *
3847b1019a6SJerry Jelinek * Note: This interface is intended to be used during the initial device
3857b1019a6SJerry Jelinek * discovery namespace traversal. Therefore, no complex methods can be
3867b1019a6SJerry Jelinek * executed, especially those that access operation regions. Therefore, do
3877b1019a6SJerry Jelinek * not add any additional methods that could cause problems in this area.
388*35786f68SRobert Mustacchi * Because of this reason support for the following methods has been removed:
389*35786f68SRobert Mustacchi * 1) _SUB method was removed (11/2015)
390*35786f68SRobert Mustacchi * 2) _STA method was removed (02/2018)
3917b1019a6SJerry Jelinek *
3927c478bd9Sstevel@tonic-gate ******************************************************************************/
3937c478bd9Sstevel@tonic-gate
3947c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiGetObjectInfo(ACPI_HANDLE Handle,ACPI_DEVICE_INFO ** ReturnBuffer)3957c478bd9Sstevel@tonic-gate AcpiGetObjectInfo (
3967c478bd9Sstevel@tonic-gate ACPI_HANDLE Handle,
39757190917SDana Myers ACPI_DEVICE_INFO **ReturnBuffer)
3987c478bd9Sstevel@tonic-gate {
3997c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *Node;
4007c478bd9Sstevel@tonic-gate ACPI_DEVICE_INFO *Info;
4017b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID_LIST *CidList = NULL;
4027b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Hid = NULL;
4037b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Uid = NULL;
4047b1019a6SJerry Jelinek ACPI_PNP_DEVICE_ID *Cls = NULL;
40557190917SDana Myers char *NextIdString;
40657190917SDana Myers ACPI_OBJECT_TYPE Type;
40757190917SDana Myers ACPI_NAME Name;
40857190917SDana Myers UINT8 ParamCount= 0;
4097b1019a6SJerry Jelinek UINT16 Valid = 0;
41057190917SDana Myers UINT32 InfoSize;
41157190917SDana Myers UINT32 i;
41257190917SDana Myers ACPI_STATUS Status;
4137c478bd9Sstevel@tonic-gate
4147c478bd9Sstevel@tonic-gate
4157c478bd9Sstevel@tonic-gate /* Parameter validation */
4167c478bd9Sstevel@tonic-gate
41757190917SDana Myers if (!Handle || !ReturnBuffer)
4187c478bd9Sstevel@tonic-gate {
4197c478bd9Sstevel@tonic-gate return (AE_BAD_PARAMETER);
4207c478bd9Sstevel@tonic-gate }
4217c478bd9Sstevel@tonic-gate
4227c478bd9Sstevel@tonic-gate Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
4237c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
4247c478bd9Sstevel@tonic-gate {
4257b1019a6SJerry Jelinek return (Status);
4267c478bd9Sstevel@tonic-gate }
4277c478bd9Sstevel@tonic-gate
42826f3cdf0SGordon Ross Node = AcpiNsValidateHandle (Handle);
4297c478bd9Sstevel@tonic-gate if (!Node)
4307c478bd9Sstevel@tonic-gate {
4317c478bd9Sstevel@tonic-gate (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
43257190917SDana Myers return (AE_BAD_PARAMETER);
4337c478bd9Sstevel@tonic-gate }
4347c478bd9Sstevel@tonic-gate
43557190917SDana Myers /* Get the namespace node data while the namespace is locked */
4367c478bd9Sstevel@tonic-gate
43757190917SDana Myers InfoSize = sizeof (ACPI_DEVICE_INFO);
43857190917SDana Myers Type = Node->Type;
43957190917SDana Myers Name = Node->Name.Integer;
4407c478bd9Sstevel@tonic-gate
441db2bae30SDana Myers if (Node->Type == ACPI_TYPE_METHOD)
442db2bae30SDana Myers {
44357190917SDana Myers ParamCount = Node->Object->Method.ParamCount;
444db2bae30SDana Myers }
445db2bae30SDana Myers
4467c478bd9Sstevel@tonic-gate Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
4477c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
4487c478bd9Sstevel@tonic-gate {
44957190917SDana Myers return (Status);
4507c478bd9Sstevel@tonic-gate }
4517c478bd9Sstevel@tonic-gate
45257190917SDana Myers if ((Type == ACPI_TYPE_DEVICE) ||
45357190917SDana Myers (Type == ACPI_TYPE_PROCESSOR))
4547c478bd9Sstevel@tonic-gate {
4557c478bd9Sstevel@tonic-gate /*
45657190917SDana Myers * Get extra info for ACPI Device/Processor objects only:
4577b1019a6SJerry Jelinek * Run the Device _HID, _UID, _CLS, and _CID methods.
4587c478bd9Sstevel@tonic-gate *
4597c478bd9Sstevel@tonic-gate * Note: none of these methods are required, so they may or may
46057190917SDana Myers * not be present for this device. The Info->Valid bitfield is used
46157190917SDana Myers * to indicate which methods were found and run successfully.
4627c478bd9Sstevel@tonic-gate */
4637c478bd9Sstevel@tonic-gate
4647c478bd9Sstevel@tonic-gate /* Execute the Device._HID method */
4657c478bd9Sstevel@tonic-gate
46657190917SDana Myers Status = AcpiUtExecute_HID (Node, &Hid);
4677c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
4687c478bd9Sstevel@tonic-gate {
46957190917SDana Myers InfoSize += Hid->Length;
47057190917SDana Myers Valid |= ACPI_VALID_HID;
4717c478bd9Sstevel@tonic-gate }
4727c478bd9Sstevel@tonic-gate
4737c478bd9Sstevel@tonic-gate /* Execute the Device._UID method */
4747c478bd9Sstevel@tonic-gate
47557190917SDana Myers Status = AcpiUtExecute_UID (Node, &Uid);
4767c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
4777c478bd9Sstevel@tonic-gate {
47857190917SDana Myers InfoSize += Uid->Length;
47957190917SDana Myers Valid |= ACPI_VALID_UID;
4807c478bd9Sstevel@tonic-gate }
4817c478bd9Sstevel@tonic-gate
4827c478bd9Sstevel@tonic-gate /* Execute the Device._CID method */
4837c478bd9Sstevel@tonic-gate
4847c478bd9Sstevel@tonic-gate Status = AcpiUtExecute_CID (Node, &CidList);
4857c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
4867c478bd9Sstevel@tonic-gate {
48757190917SDana Myers /* Add size of CID strings and CID pointer array */
48857190917SDana Myers
4897b1019a6SJerry Jelinek InfoSize += (CidList->ListSize - sizeof (ACPI_PNP_DEVICE_ID_LIST));
49057190917SDana Myers Valid |= ACPI_VALID_CID;
4917c478bd9Sstevel@tonic-gate }
4927b1019a6SJerry Jelinek
4937b1019a6SJerry Jelinek /* Execute the Device._CLS method */
4947b1019a6SJerry Jelinek
4957b1019a6SJerry Jelinek Status = AcpiUtExecute_CLS (Node, &Cls);
4967b1019a6SJerry Jelinek if (ACPI_SUCCESS (Status))
4977b1019a6SJerry Jelinek {
4987b1019a6SJerry Jelinek InfoSize += Cls->Length;
4997b1019a6SJerry Jelinek Valid |= ACPI_VALID_CLS;
5007b1019a6SJerry Jelinek }
50157190917SDana Myers }
50257190917SDana Myers
50357190917SDana Myers /*
50457190917SDana Myers * Now that we have the variable-length data, we can allocate the
50557190917SDana Myers * return buffer
50657190917SDana Myers */
50757190917SDana Myers Info = ACPI_ALLOCATE_ZEROED (InfoSize);
50857190917SDana Myers if (!Info)
50957190917SDana Myers {
51057190917SDana Myers Status = AE_NO_MEMORY;
51157190917SDana Myers goto Cleanup;
51257190917SDana Myers }
51357190917SDana Myers
51457190917SDana Myers /* Get the fixed-length data */
51557190917SDana Myers
51657190917SDana Myers if ((Type == ACPI_TYPE_DEVICE) ||
51757190917SDana Myers (Type == ACPI_TYPE_PROCESSOR))
51857190917SDana Myers {
51957190917SDana Myers /*
52057190917SDana Myers * Get extra info for ACPI Device/Processor objects only:
521*35786f68SRobert Mustacchi * Run the _ADR and, SxW, and _SxD methods.
52257190917SDana Myers *
5237b1019a6SJerry Jelinek * Notes: none of these methods are required, so they may or may
52457190917SDana Myers * not be present for this device. The Info->Valid bitfield is used
52557190917SDana Myers * to indicate which methods were found and run successfully.
52657190917SDana Myers */
5277c478bd9Sstevel@tonic-gate
5287c478bd9Sstevel@tonic-gate /* Execute the Device._ADR method */
5297c478bd9Sstevel@tonic-gate
5307c478bd9Sstevel@tonic-gate Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node,
5317b1019a6SJerry Jelinek &Info->Address);
5327c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
5337c478bd9Sstevel@tonic-gate {
53457190917SDana Myers Valid |= ACPI_VALID_ADR;
53557190917SDana Myers }
53657190917SDana Myers
53757190917SDana Myers /* Execute the Device._SxW methods */
53857190917SDana Myers
53957190917SDana Myers Status = AcpiUtExecutePowerMethods (Node,
5407b1019a6SJerry Jelinek AcpiGbl_LowestDstateNames, ACPI_NUM_SxW_METHODS,
5417b1019a6SJerry Jelinek Info->LowestDstates);
54257190917SDana Myers if (ACPI_SUCCESS (Status))
54357190917SDana Myers {
54457190917SDana Myers Valid |= ACPI_VALID_SXWS;
5457c478bd9Sstevel@tonic-gate }
5467c478bd9Sstevel@tonic-gate
5477c478bd9Sstevel@tonic-gate /* Execute the Device._SxD methods */
5487c478bd9Sstevel@tonic-gate
54957190917SDana Myers Status = AcpiUtExecutePowerMethods (Node,
5507b1019a6SJerry Jelinek AcpiGbl_HighestDstateNames, ACPI_NUM_SxD_METHODS,
5517b1019a6SJerry Jelinek Info->HighestDstates);
5527c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
5537c478bd9Sstevel@tonic-gate {
55457190917SDana Myers Valid |= ACPI_VALID_SXDS;
5557c478bd9Sstevel@tonic-gate }
5567c478bd9Sstevel@tonic-gate }
5577c478bd9Sstevel@tonic-gate
55857190917SDana Myers /*
55957190917SDana Myers * Create a pointer to the string area of the return buffer.
56057190917SDana Myers * Point to the end of the base ACPI_DEVICE_INFO structure.
56157190917SDana Myers */
56257190917SDana Myers NextIdString = ACPI_CAST_PTR (char, Info->CompatibleIdList.Ids);
56357190917SDana Myers if (CidList)
5647c478bd9Sstevel@tonic-gate {
5657b1019a6SJerry Jelinek /* Point past the CID PNP_DEVICE_ID array */
56657190917SDana Myers
5677b1019a6SJerry Jelinek NextIdString += ((ACPI_SIZE) CidList->Count * sizeof (ACPI_PNP_DEVICE_ID));
5687c478bd9Sstevel@tonic-gate }
5697c478bd9Sstevel@tonic-gate
57057190917SDana Myers /*
57157190917SDana Myers * Copy the HID, UID, and CIDs to the return buffer. The variable-length
57257190917SDana Myers * strings are copied to the reserved area at the end of the buffer.
57357190917SDana Myers *
57457190917SDana Myers * For HID and CID, check if the ID is a PCI Root Bridge.
57557190917SDana Myers */
57657190917SDana Myers if (Hid)
57757190917SDana Myers {
57857190917SDana Myers NextIdString = AcpiNsCopyDeviceId (&Info->HardwareId,
57957190917SDana Myers Hid, NextIdString);
5807c478bd9Sstevel@tonic-gate
58157190917SDana Myers if (AcpiUtIsPciRootBridge (Hid->String))
58257190917SDana Myers {
58357190917SDana Myers Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
58457190917SDana Myers }
58557190917SDana Myers }
58657190917SDana Myers
58757190917SDana Myers if (Uid)
58857190917SDana Myers {
58957190917SDana Myers NextIdString = AcpiNsCopyDeviceId (&Info->UniqueId,
59057190917SDana Myers Uid, NextIdString);
59157190917SDana Myers }
5927c478bd9Sstevel@tonic-gate
5937c478bd9Sstevel@tonic-gate if (CidList)
5947c478bd9Sstevel@tonic-gate {
59557190917SDana Myers Info->CompatibleIdList.Count = CidList->Count;
59657190917SDana Myers Info->CompatibleIdList.ListSize = CidList->ListSize;
59757190917SDana Myers
59857190917SDana Myers /* Copy each CID */
59957190917SDana Myers
60057190917SDana Myers for (i = 0; i < CidList->Count; i++)
60157190917SDana Myers {
60257190917SDana Myers NextIdString = AcpiNsCopyDeviceId (&Info->CompatibleIdList.Ids[i],
60357190917SDana Myers &CidList->Ids[i], NextIdString);
60457190917SDana Myers
60557190917SDana Myers if (AcpiUtIsPciRootBridge (CidList->Ids[i].String))
60657190917SDana Myers {
60757190917SDana Myers Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
60857190917SDana Myers }
60957190917SDana Myers }
6107c478bd9Sstevel@tonic-gate }
6117c478bd9Sstevel@tonic-gate
6127b1019a6SJerry Jelinek if (Cls)
6137b1019a6SJerry Jelinek {
6147b1019a6SJerry Jelinek NextIdString = AcpiNsCopyDeviceId (&Info->ClassCode,
6157b1019a6SJerry Jelinek Cls, NextIdString);
6167b1019a6SJerry Jelinek }
6177b1019a6SJerry Jelinek
61857190917SDana Myers /* Copy the fixed-length data */
61957190917SDana Myers
62057190917SDana Myers Info->InfoSize = InfoSize;
62157190917SDana Myers Info->Type = Type;
62257190917SDana Myers Info->Name = Name;
62357190917SDana Myers Info->ParamCount = ParamCount;
62457190917SDana Myers Info->Valid = Valid;
62557190917SDana Myers
62657190917SDana Myers *ReturnBuffer = Info;
62757190917SDana Myers Status = AE_OK;
62857190917SDana Myers
6297c478bd9Sstevel@tonic-gate
6307c478bd9Sstevel@tonic-gate Cleanup:
63157190917SDana Myers if (Hid)
63257190917SDana Myers {
63357190917SDana Myers ACPI_FREE (Hid);
63457190917SDana Myers }
63557190917SDana Myers if (Uid)
63657190917SDana Myers {
63757190917SDana Myers ACPI_FREE (Uid);
63857190917SDana Myers }
6397c478bd9Sstevel@tonic-gate if (CidList)
6407c478bd9Sstevel@tonic-gate {
64127f7c583Smyers ACPI_FREE (CidList);
6427c478bd9Sstevel@tonic-gate }
6437b1019a6SJerry Jelinek if (Cls)
6447b1019a6SJerry Jelinek {
6457b1019a6SJerry Jelinek ACPI_FREE (Cls);
6467b1019a6SJerry Jelinek }
6477c478bd9Sstevel@tonic-gate return (Status);
6487c478bd9Sstevel@tonic-gate }
6497c478bd9Sstevel@tonic-gate
ACPI_EXPORT_SYMBOL(AcpiGetObjectInfo)65027f7c583Smyers ACPI_EXPORT_SYMBOL (AcpiGetObjectInfo)
65127f7c583Smyers
652aa2aa9a6SDana Myers
653aa2aa9a6SDana Myers /******************************************************************************
654aa2aa9a6SDana Myers *
655aa2aa9a6SDana Myers * FUNCTION: AcpiInstallMethod
656aa2aa9a6SDana Myers *
657aa2aa9a6SDana Myers * PARAMETERS: Buffer - An ACPI table containing one control method
658aa2aa9a6SDana Myers *
659aa2aa9a6SDana Myers * RETURN: Status
660aa2aa9a6SDana Myers *
661aa2aa9a6SDana Myers * DESCRIPTION: Install a control method into the namespace. If the method
662aa2aa9a6SDana Myers * name already exists in the namespace, it is overwritten. The
663aa2aa9a6SDana Myers * input buffer must contain a valid DSDT or SSDT containing a
664aa2aa9a6SDana Myers * single control method.
665aa2aa9a6SDana Myers *
666aa2aa9a6SDana Myers ******************************************************************************/
667aa2aa9a6SDana Myers
668aa2aa9a6SDana Myers ACPI_STATUS
669aa2aa9a6SDana Myers AcpiInstallMethod (
670aa2aa9a6SDana Myers UINT8 *Buffer)
671aa2aa9a6SDana Myers {
672aa2aa9a6SDana Myers ACPI_TABLE_HEADER *Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Buffer);
673aa2aa9a6SDana Myers UINT8 *AmlBuffer;
674aa2aa9a6SDana Myers UINT8 *AmlStart;
675aa2aa9a6SDana Myers char *Path;
676aa2aa9a6SDana Myers ACPI_NAMESPACE_NODE *Node;
677aa2aa9a6SDana Myers ACPI_OPERAND_OBJECT *MethodObj;
678aa2aa9a6SDana Myers ACPI_PARSE_STATE ParserState;
679aa2aa9a6SDana Myers UINT32 AmlLength;
680aa2aa9a6SDana Myers UINT16 Opcode;
681aa2aa9a6SDana Myers UINT8 MethodFlags;
682aa2aa9a6SDana Myers ACPI_STATUS Status;
683aa2aa9a6SDana Myers
684aa2aa9a6SDana Myers
685aa2aa9a6SDana Myers /* Parameter validation */
686aa2aa9a6SDana Myers
687aa2aa9a6SDana Myers if (!Buffer)
688aa2aa9a6SDana Myers {
689aa2aa9a6SDana Myers return (AE_BAD_PARAMETER);
690aa2aa9a6SDana Myers }
691aa2aa9a6SDana Myers
692aa2aa9a6SDana Myers /* Table must be a DSDT or SSDT */
693aa2aa9a6SDana Myers
694aa2aa9a6SDana Myers if (!ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) &&
695aa2aa9a6SDana Myers !ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT))
696aa2aa9a6SDana Myers {
697aa2aa9a6SDana Myers return (AE_BAD_HEADER);
698aa2aa9a6SDana Myers }
699aa2aa9a6SDana Myers
700aa2aa9a6SDana Myers /* First AML opcode in the table must be a control method */
701aa2aa9a6SDana Myers
702aa2aa9a6SDana Myers ParserState.Aml = Buffer + sizeof (ACPI_TABLE_HEADER);
703aa2aa9a6SDana Myers Opcode = AcpiPsPeekOpcode (&ParserState);
704aa2aa9a6SDana Myers if (Opcode != AML_METHOD_OP)
705aa2aa9a6SDana Myers {
706aa2aa9a6SDana Myers return (AE_BAD_PARAMETER);
707aa2aa9a6SDana Myers }
708aa2aa9a6SDana Myers
709aa2aa9a6SDana Myers /* Extract method information from the raw AML */
710aa2aa9a6SDana Myers
711aa2aa9a6SDana Myers ParserState.Aml += AcpiPsGetOpcodeSize (Opcode);
712aa2aa9a6SDana Myers ParserState.PkgEnd = AcpiPsGetNextPackageEnd (&ParserState);
713aa2aa9a6SDana Myers Path = AcpiPsGetNextNamestring (&ParserState);
7147b1019a6SJerry Jelinek
715aa2aa9a6SDana Myers MethodFlags = *ParserState.Aml++;
716aa2aa9a6SDana Myers AmlStart = ParserState.Aml;
717aa2aa9a6SDana Myers AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
718aa2aa9a6SDana Myers
719aa2aa9a6SDana Myers /*
720aa2aa9a6SDana Myers * Allocate resources up-front. We don't want to have to delete a new
721aa2aa9a6SDana Myers * node from the namespace if we cannot allocate memory.
722aa2aa9a6SDana Myers */
723aa2aa9a6SDana Myers AmlBuffer = ACPI_ALLOCATE (AmlLength);
724aa2aa9a6SDana Myers if (!AmlBuffer)
725aa2aa9a6SDana Myers {
726aa2aa9a6SDana Myers return (AE_NO_MEMORY);
727aa2aa9a6SDana Myers }
728aa2aa9a6SDana Myers
729aa2aa9a6SDana Myers MethodObj = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
730aa2aa9a6SDana Myers if (!MethodObj)
731aa2aa9a6SDana Myers {
732aa2aa9a6SDana Myers ACPI_FREE (AmlBuffer);
733aa2aa9a6SDana Myers return (AE_NO_MEMORY);
734aa2aa9a6SDana Myers }
735aa2aa9a6SDana Myers
736aa2aa9a6SDana Myers /* Lock namespace for AcpiNsLookup, we may be creating a new node */
737aa2aa9a6SDana Myers
738aa2aa9a6SDana Myers Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
739aa2aa9a6SDana Myers if (ACPI_FAILURE (Status))
740aa2aa9a6SDana Myers {
741aa2aa9a6SDana Myers goto ErrorExit;
742aa2aa9a6SDana Myers }
743aa2aa9a6SDana Myers
744aa2aa9a6SDana Myers /* The lookup either returns an existing node or creates a new one */
745aa2aa9a6SDana Myers
746aa2aa9a6SDana Myers Status = AcpiNsLookup (NULL, Path, ACPI_TYPE_METHOD, ACPI_IMODE_LOAD_PASS1,
7477b1019a6SJerry Jelinek ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND, NULL, &Node);
748aa2aa9a6SDana Myers
749aa2aa9a6SDana Myers (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
750aa2aa9a6SDana Myers
751aa2aa9a6SDana Myers if (ACPI_FAILURE (Status)) /* NsLookup */
752aa2aa9a6SDana Myers {
753aa2aa9a6SDana Myers if (Status != AE_ALREADY_EXISTS)
754aa2aa9a6SDana Myers {
755aa2aa9a6SDana Myers goto ErrorExit;
756aa2aa9a6SDana Myers }
757aa2aa9a6SDana Myers
758aa2aa9a6SDana Myers /* Node existed previously, make sure it is a method node */
759aa2aa9a6SDana Myers
760aa2aa9a6SDana Myers if (Node->Type != ACPI_TYPE_METHOD)
761aa2aa9a6SDana Myers {
762aa2aa9a6SDana Myers Status = AE_TYPE;
763aa2aa9a6SDana Myers goto ErrorExit;
764aa2aa9a6SDana Myers }
765aa2aa9a6SDana Myers }
766aa2aa9a6SDana Myers
767aa2aa9a6SDana Myers /* Copy the method AML to the local buffer */
768aa2aa9a6SDana Myers
7697b1019a6SJerry Jelinek memcpy (AmlBuffer, AmlStart, AmlLength);
770aa2aa9a6SDana Myers
771aa2aa9a6SDana Myers /* Initialize the method object with the new method's information */
772aa2aa9a6SDana Myers
773aa2aa9a6SDana Myers MethodObj->Method.AmlStart = AmlBuffer;
774aa2aa9a6SDana Myers MethodObj->Method.AmlLength = AmlLength;
775aa2aa9a6SDana Myers
776aa2aa9a6SDana Myers MethodObj->Method.ParamCount = (UINT8)
777aa2aa9a6SDana Myers (MethodFlags & AML_METHOD_ARG_COUNT);
778aa2aa9a6SDana Myers
779aa2aa9a6SDana Myers if (MethodFlags & AML_METHOD_SERIALIZED)
780aa2aa9a6SDana Myers {
78126f3cdf0SGordon Ross MethodObj->Method.InfoFlags = ACPI_METHOD_SERIALIZED;
78226f3cdf0SGordon Ross
783aa2aa9a6SDana Myers MethodObj->Method.SyncLevel = (UINT8)
784aa2aa9a6SDana Myers ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4);
785aa2aa9a6SDana Myers }
786aa2aa9a6SDana Myers
787aa2aa9a6SDana Myers /*
788aa2aa9a6SDana Myers * Now that it is complete, we can attach the new method object to
789aa2aa9a6SDana Myers * the method Node (detaches/deletes any existing object)
790aa2aa9a6SDana Myers */
79126f3cdf0SGordon Ross Status = AcpiNsAttachObject (Node, MethodObj, ACPI_TYPE_METHOD);
792aa2aa9a6SDana Myers
793aa2aa9a6SDana Myers /*
794aa2aa9a6SDana Myers * Flag indicates AML buffer is dynamic, must be deleted later.
795aa2aa9a6SDana Myers * Must be set only after attach above.
796aa2aa9a6SDana Myers */
797aa2aa9a6SDana Myers Node->Flags |= ANOBJ_ALLOCATED_BUFFER;
798aa2aa9a6SDana Myers
799aa2aa9a6SDana Myers /* Remove local reference to the method object */
800aa2aa9a6SDana Myers
801aa2aa9a6SDana Myers AcpiUtRemoveReference (MethodObj);
802aa2aa9a6SDana Myers return (Status);
803aa2aa9a6SDana Myers
804aa2aa9a6SDana Myers
805aa2aa9a6SDana Myers ErrorExit:
806aa2aa9a6SDana Myers
807aa2aa9a6SDana Myers ACPI_FREE (AmlBuffer);
808aa2aa9a6SDana Myers ACPI_FREE (MethodObj);
809aa2aa9a6SDana Myers return (Status);
810aa2aa9a6SDana Myers }
811aa2aa9a6SDana Myers
812aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiInstallMethod)
813