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