Home | History | Annotate | Line # | Download | only in namespace
nsxfname.c revision 1.13
      1   1.1    jruoho /******************************************************************************
      2   1.1    jruoho  *
      3   1.1    jruoho  * Module Name: nsxfname - Public interfaces to the ACPI subsystem
      4   1.1    jruoho  *                         ACPI Namespace oriented interfaces
      5   1.1    jruoho  *
      6   1.1    jruoho  *****************************************************************************/
      7   1.1    jruoho 
      8   1.3    jruoho /*
      9  1.13  christos  * Copyright (C) 2000 - 2020, Intel Corp.
     10   1.1    jruoho  * All rights reserved.
     11   1.1    jruoho  *
     12   1.3    jruoho  * Redistribution and use in source and binary forms, with or without
     13   1.3    jruoho  * modification, are permitted provided that the following conditions
     14   1.3    jruoho  * are met:
     15   1.3    jruoho  * 1. Redistributions of source code must retain the above copyright
     16   1.3    jruoho  *    notice, this list of conditions, and the following disclaimer,
     17   1.3    jruoho  *    without modification.
     18   1.3    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19   1.3    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     20   1.3    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     21   1.3    jruoho  *    including a substantially similar Disclaimer requirement for further
     22   1.3    jruoho  *    binary redistribution.
     23   1.3    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     24   1.3    jruoho  *    of any contributors may be used to endorse or promote products derived
     25   1.3    jruoho  *    from this software without specific prior written permission.
     26   1.3    jruoho  *
     27   1.3    jruoho  * Alternatively, this software may be distributed under the terms of the
     28   1.3    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     29   1.3    jruoho  * Software Foundation.
     30   1.3    jruoho  *
     31   1.3    jruoho  * NO WARRANTY
     32   1.3    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33   1.3    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34   1.3    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35   1.3    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36   1.3    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37   1.3    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38   1.3    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39   1.3    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40   1.3    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41   1.3    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42   1.3    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     43   1.3    jruoho  */
     44   1.1    jruoho 
     45   1.4  christos #define EXPORT_ACPI_INTERFACES
     46   1.1    jruoho 
     47   1.1    jruoho #include "acpi.h"
     48   1.1    jruoho #include "accommon.h"
     49   1.1    jruoho #include "acnamesp.h"
     50   1.1    jruoho #include "acparser.h"
     51   1.1    jruoho #include "amlcode.h"
     52   1.1    jruoho 
     53   1.1    jruoho 
     54   1.1    jruoho #define _COMPONENT          ACPI_NAMESPACE
     55   1.1    jruoho         ACPI_MODULE_NAME    ("nsxfname")
     56   1.1    jruoho 
     57   1.1    jruoho /* Local prototypes */
     58   1.1    jruoho 
     59   1.1    jruoho static char *
     60   1.1    jruoho AcpiNsCopyDeviceId (
     61   1.4  christos     ACPI_PNP_DEVICE_ID      *Dest,
     62   1.4  christos     ACPI_PNP_DEVICE_ID      *Source,
     63   1.1    jruoho     char                    *StringArea);
     64   1.1    jruoho 
     65   1.1    jruoho 
     66   1.1    jruoho /******************************************************************************
     67   1.1    jruoho  *
     68   1.1    jruoho  * FUNCTION:    AcpiGetHandle
     69   1.1    jruoho  *
     70   1.1    jruoho  * PARAMETERS:  Parent          - Object to search under (search scope).
     71   1.1    jruoho  *              Pathname        - Pointer to an asciiz string containing the
     72   1.1    jruoho  *                                name
     73   1.1    jruoho  *              RetHandle       - Where the return handle is returned
     74   1.1    jruoho  *
     75   1.1    jruoho  * RETURN:      Status
     76   1.1    jruoho  *
     77   1.1    jruoho  * DESCRIPTION: This routine will search for a caller specified name in the
     78   1.4  christos  *              name space. The caller can restrict the search region by
     79   1.4  christos  *              specifying a non NULL parent. The parent value is itself a
     80   1.1    jruoho  *              namespace handle.
     81   1.1    jruoho  *
     82   1.1    jruoho  ******************************************************************************/
     83   1.1    jruoho 
     84   1.1    jruoho ACPI_STATUS
     85   1.1    jruoho AcpiGetHandle (
     86   1.1    jruoho     ACPI_HANDLE             Parent,
     87   1.2    jruoho     ACPI_CONST_STRING       Pathname,
     88   1.1    jruoho     ACPI_HANDLE             *RetHandle)
     89   1.1    jruoho {
     90   1.1    jruoho     ACPI_STATUS             Status;
     91   1.1    jruoho     ACPI_NAMESPACE_NODE     *Node = NULL;
     92   1.1    jruoho     ACPI_NAMESPACE_NODE     *PrefixNode = NULL;
     93   1.2    jruoho     ACPI_STRING             UPathname = __UNCONST(Pathname);
     94   1.1    jruoho 
     95   1.1    jruoho 
     96   1.1    jruoho     ACPI_FUNCTION_ENTRY ();
     97   1.1    jruoho 
     98   1.1    jruoho 
     99   1.1    jruoho     /* Parameter Validation */
    100   1.1    jruoho 
    101   1.1    jruoho     if (!RetHandle || !Pathname)
    102   1.1    jruoho     {
    103   1.1    jruoho         return (AE_BAD_PARAMETER);
    104   1.1    jruoho     }
    105   1.1    jruoho 
    106   1.1    jruoho     /* Convert a parent handle to a prefix node */
    107   1.1    jruoho 
    108   1.1    jruoho     if (Parent)
    109   1.1    jruoho     {
    110   1.1    jruoho         PrefixNode = AcpiNsValidateHandle (Parent);
    111   1.1    jruoho         if (!PrefixNode)
    112   1.1    jruoho         {
    113   1.1    jruoho             return (AE_BAD_PARAMETER);
    114   1.1    jruoho         }
    115   1.1    jruoho     }
    116   1.1    jruoho 
    117   1.1    jruoho     /*
    118   1.1    jruoho      * Valid cases are:
    119   1.1    jruoho      * 1) Fully qualified pathname
    120   1.1    jruoho      * 2) Parent + Relative pathname
    121   1.1    jruoho      *
    122   1.1    jruoho      * Error for <null Parent + relative path>
    123   1.1    jruoho      */
    124   1.4  christos     if (ACPI_IS_ROOT_PREFIX (Pathname[0]))
    125   1.1    jruoho     {
    126   1.1    jruoho         /* Pathname is fully qualified (starts with '\') */
    127   1.1    jruoho 
    128   1.1    jruoho         /* Special case for root-only, since we can't search for it */
    129   1.1    jruoho 
    130   1.7  christos         if (!strcmp (Pathname, ACPI_NS_ROOT_PATH))
    131   1.1    jruoho         {
    132   1.1    jruoho             *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, AcpiGbl_RootNode);
    133   1.1    jruoho             return (AE_OK);
    134   1.1    jruoho         }
    135   1.1    jruoho     }
    136   1.1    jruoho     else if (!PrefixNode)
    137   1.1    jruoho     {
    138   1.1    jruoho         /* Relative path with null prefix is disallowed */
    139   1.1    jruoho 
    140   1.1    jruoho         return (AE_BAD_PARAMETER);
    141   1.1    jruoho     }
    142   1.1    jruoho 
    143   1.1    jruoho     /* Find the Node and convert to a handle */
    144   1.1    jruoho 
    145   1.2    jruoho     Status = AcpiNsGetNode (PrefixNode, UPathname, ACPI_NS_NO_UPSEARCH, &Node);
    146   1.1    jruoho     if (ACPI_SUCCESS (Status))
    147   1.1    jruoho     {
    148   1.1    jruoho         *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
    149   1.1    jruoho     }
    150   1.1    jruoho 
    151   1.1    jruoho     return (Status);
    152   1.1    jruoho }
    153   1.1    jruoho 
    154   1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiGetHandle)
    155   1.1    jruoho 
    156   1.1    jruoho 
    157   1.1    jruoho /******************************************************************************
    158   1.1    jruoho  *
    159   1.1    jruoho  * FUNCTION:    AcpiGetName
    160   1.1    jruoho  *
    161   1.1    jruoho  * PARAMETERS:  Handle          - Handle to be converted to a pathname
    162   1.1    jruoho  *              NameType        - Full pathname or single segment
    163   1.1    jruoho  *              Buffer          - Buffer for returned path
    164   1.1    jruoho  *
    165   1.1    jruoho  * RETURN:      Pointer to a string containing the fully qualified Name.
    166   1.1    jruoho  *
    167   1.1    jruoho  * DESCRIPTION: This routine returns the fully qualified name associated with
    168   1.4  christos  *              the Handle parameter. This and the AcpiPathnameToHandle are
    169   1.1    jruoho  *              complementary functions.
    170   1.1    jruoho  *
    171   1.1    jruoho  ******************************************************************************/
    172   1.1    jruoho 
    173   1.1    jruoho ACPI_STATUS
    174   1.1    jruoho AcpiGetName (
    175   1.1    jruoho     ACPI_HANDLE             Handle,
    176   1.1    jruoho     UINT32                  NameType,
    177   1.1    jruoho     ACPI_BUFFER             *Buffer)
    178   1.1    jruoho {
    179   1.1    jruoho     ACPI_STATUS             Status;
    180   1.1    jruoho 
    181   1.1    jruoho 
    182   1.1    jruoho     /* Parameter validation */
    183   1.1    jruoho 
    184   1.1    jruoho     if (NameType > ACPI_NAME_TYPE_MAX)
    185   1.1    jruoho     {
    186   1.1    jruoho         return (AE_BAD_PARAMETER);
    187   1.1    jruoho     }
    188   1.1    jruoho 
    189   1.1    jruoho     Status = AcpiUtValidateBuffer (Buffer);
    190   1.1    jruoho     if (ACPI_FAILURE (Status))
    191   1.1    jruoho     {
    192   1.1    jruoho         return (Status);
    193   1.1    jruoho     }
    194   1.1    jruoho 
    195   1.1    jruoho     /*
    196   1.1    jruoho      * Wants the single segment ACPI name.
    197   1.1    jruoho      * Validate handle and convert to a namespace Node
    198   1.1    jruoho      */
    199   1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
    200   1.1    jruoho     if (ACPI_FAILURE (Status))
    201   1.1    jruoho     {
    202   1.1    jruoho         return (Status);
    203   1.1    jruoho     }
    204   1.1    jruoho 
    205   1.9  christos     if (NameType == ACPI_FULL_PATHNAME ||
    206   1.9  christos         NameType == ACPI_FULL_PATHNAME_NO_TRAILING)
    207   1.1    jruoho     {
    208   1.9  christos         /* Get the full pathname (From the namespace root) */
    209   1.9  christos 
    210   1.9  christos         Status = AcpiNsHandleToPathname (Handle, Buffer,
    211   1.9  christos             NameType == ACPI_FULL_PATHNAME ? FALSE : TRUE);
    212   1.1    jruoho     }
    213   1.9  christos     else
    214   1.9  christos     {
    215   1.9  christos         /* Get the single name */
    216   1.1    jruoho 
    217   1.9  christos         Status = AcpiNsHandleToName (Handle, Buffer);
    218   1.1    jruoho     }
    219   1.1    jruoho 
    220   1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
    221   1.1    jruoho     return (Status);
    222   1.1    jruoho }
    223   1.1    jruoho 
    224   1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiGetName)
    225   1.1    jruoho 
    226   1.1    jruoho 
    227   1.1    jruoho /******************************************************************************
    228   1.1    jruoho  *
    229   1.1    jruoho  * FUNCTION:    AcpiNsCopyDeviceId
    230   1.1    jruoho  *
    231   1.4  christos  * PARAMETERS:  Dest                - Pointer to the destination PNP_DEVICE_ID
    232   1.4  christos  *              Source              - Pointer to the source PNP_DEVICE_ID
    233   1.1    jruoho  *              StringArea          - Pointer to where to copy the dest string
    234   1.1    jruoho  *
    235   1.1    jruoho  * RETURN:      Pointer to the next string area
    236   1.1    jruoho  *
    237   1.4  christos  * DESCRIPTION: Copy a single PNP_DEVICE_ID, including the string data.
    238   1.1    jruoho  *
    239   1.1    jruoho  ******************************************************************************/
    240   1.1    jruoho 
    241   1.1    jruoho static char *
    242   1.1    jruoho AcpiNsCopyDeviceId (
    243   1.4  christos     ACPI_PNP_DEVICE_ID      *Dest,
    244   1.4  christos     ACPI_PNP_DEVICE_ID      *Source,
    245   1.1    jruoho     char                    *StringArea)
    246   1.1    jruoho {
    247   1.4  christos     /* Create the destination PNP_DEVICE_ID */
    248   1.1    jruoho 
    249   1.1    jruoho     Dest->String = StringArea;
    250   1.1    jruoho     Dest->Length = Source->Length;
    251   1.1    jruoho 
    252   1.1    jruoho     /* Copy actual string and return a pointer to the next string area */
    253   1.1    jruoho 
    254   1.7  christos     memcpy (StringArea, Source->String, Source->Length);
    255   1.1    jruoho     return (StringArea + Source->Length);
    256   1.1    jruoho }
    257   1.1    jruoho 
    258   1.1    jruoho 
    259   1.1    jruoho /******************************************************************************
    260   1.1    jruoho  *
    261   1.1    jruoho  * FUNCTION:    AcpiGetObjectInfo
    262   1.1    jruoho  *
    263   1.1    jruoho  * PARAMETERS:  Handle              - Object Handle
    264   1.1    jruoho  *              ReturnBuffer        - Where the info is returned
    265   1.1    jruoho  *
    266   1.1    jruoho  * RETURN:      Status
    267   1.1    jruoho  *
    268   1.1    jruoho  * DESCRIPTION: Returns information about an object as gleaned from the
    269   1.1    jruoho  *              namespace node and possibly by running several standard
    270   1.1    jruoho  *              control methods (Such as in the case of a device.)
    271   1.1    jruoho  *
    272  1.10  christos  * For Device and Processor objects, run the Device _HID, _UID, _CID,
    273   1.8  christos  * _CLS, _ADR, _SxW, and _SxD methods.
    274   1.1    jruoho  *
    275   1.1    jruoho  * Note: Allocates the return buffer, must be freed by the caller.
    276   1.1    jruoho  *
    277   1.8  christos  * Note: This interface is intended to be used during the initial device
    278   1.8  christos  * discovery namespace traversal. Therefore, no complex methods can be
    279   1.8  christos  * executed, especially those that access operation regions. Therefore, do
    280   1.8  christos  * not add any additional methods that could cause problems in this area.
    281  1.10  christos  * Because of this reason support for the following methods has been removed:
    282  1.10  christos  * 1) _SUB method was removed (11/2015)
    283  1.10  christos  * 2) _STA method was removed (02/2018)
    284   1.8  christos  *
    285   1.1    jruoho  ******************************************************************************/
    286   1.1    jruoho 
    287   1.1    jruoho ACPI_STATUS
    288   1.1    jruoho AcpiGetObjectInfo (
    289   1.1    jruoho     ACPI_HANDLE             Handle,
    290   1.1    jruoho     ACPI_DEVICE_INFO        **ReturnBuffer)
    291   1.1    jruoho {
    292   1.1    jruoho     ACPI_NAMESPACE_NODE     *Node;
    293   1.1    jruoho     ACPI_DEVICE_INFO        *Info;
    294   1.4  christos     ACPI_PNP_DEVICE_ID_LIST *CidList = NULL;
    295   1.4  christos     ACPI_PNP_DEVICE_ID      *Hid = NULL;
    296   1.4  christos     ACPI_PNP_DEVICE_ID      *Uid = NULL;
    297   1.7  christos     ACPI_PNP_DEVICE_ID      *Cls = NULL;
    298   1.1    jruoho     char                    *NextIdString;
    299   1.1    jruoho     ACPI_OBJECT_TYPE        Type;
    300   1.1    jruoho     ACPI_NAME               Name;
    301   1.1    jruoho     UINT8                   ParamCount= 0;
    302   1.7  christos     UINT16                  Valid = 0;
    303   1.1    jruoho     UINT32                  InfoSize;
    304   1.1    jruoho     UINT32                  i;
    305   1.1    jruoho     ACPI_STATUS             Status;
    306   1.1    jruoho 
    307   1.1    jruoho 
    308   1.1    jruoho     /* Parameter validation */
    309   1.1    jruoho 
    310   1.1    jruoho     if (!Handle || !ReturnBuffer)
    311   1.1    jruoho     {
    312   1.1    jruoho         return (AE_BAD_PARAMETER);
    313   1.1    jruoho     }
    314   1.1    jruoho 
    315   1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
    316   1.1    jruoho     if (ACPI_FAILURE (Status))
    317   1.1    jruoho     {
    318   1.4  christos         return (Status);
    319   1.1    jruoho     }
    320   1.1    jruoho 
    321   1.1    jruoho     Node = AcpiNsValidateHandle (Handle);
    322   1.1    jruoho     if (!Node)
    323   1.1    jruoho     {
    324   1.1    jruoho         (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
    325   1.1    jruoho         return (AE_BAD_PARAMETER);
    326   1.1    jruoho     }
    327   1.1    jruoho 
    328   1.1    jruoho     /* Get the namespace node data while the namespace is locked */
    329   1.1    jruoho 
    330   1.1    jruoho     InfoSize = sizeof (ACPI_DEVICE_INFO);
    331   1.1    jruoho     Type = Node->Type;
    332   1.1    jruoho     Name = Node->Name.Integer;
    333   1.1    jruoho 
    334   1.1    jruoho     if (Node->Type == ACPI_TYPE_METHOD)
    335   1.1    jruoho     {
    336   1.1    jruoho         ParamCount = Node->Object->Method.ParamCount;
    337   1.1    jruoho     }
    338   1.1    jruoho 
    339   1.1    jruoho     Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
    340   1.1    jruoho     if (ACPI_FAILURE (Status))
    341   1.1    jruoho     {
    342   1.1    jruoho         return (Status);
    343   1.1    jruoho     }
    344   1.1    jruoho 
    345   1.1    jruoho     if ((Type == ACPI_TYPE_DEVICE) ||
    346   1.1    jruoho         (Type == ACPI_TYPE_PROCESSOR))
    347   1.1    jruoho     {
    348   1.1    jruoho         /*
    349   1.1    jruoho          * Get extra info for ACPI Device/Processor objects only:
    350   1.8  christos          * Run the Device _HID, _UID, _CLS, and _CID methods.
    351   1.1    jruoho          *
    352   1.1    jruoho          * Note: none of these methods are required, so they may or may
    353   1.1    jruoho          * not be present for this device. The Info->Valid bitfield is used
    354   1.1    jruoho          * to indicate which methods were found and run successfully.
    355   1.1    jruoho          */
    356   1.1    jruoho 
    357   1.1    jruoho         /* Execute the Device._HID method */
    358   1.1    jruoho 
    359   1.1    jruoho         Status = AcpiUtExecute_HID (Node, &Hid);
    360   1.1    jruoho         if (ACPI_SUCCESS (Status))
    361   1.1    jruoho         {
    362   1.1    jruoho             InfoSize += Hid->Length;
    363   1.1    jruoho             Valid |= ACPI_VALID_HID;
    364   1.1    jruoho         }
    365   1.1    jruoho 
    366   1.1    jruoho         /* Execute the Device._UID method */
    367   1.1    jruoho 
    368   1.1    jruoho         Status = AcpiUtExecute_UID (Node, &Uid);
    369   1.1    jruoho         if (ACPI_SUCCESS (Status))
    370   1.1    jruoho         {
    371   1.1    jruoho             InfoSize += Uid->Length;
    372   1.1    jruoho             Valid |= ACPI_VALID_UID;
    373   1.1    jruoho         }
    374   1.1    jruoho 
    375   1.1    jruoho         /* Execute the Device._CID method */
    376   1.1    jruoho 
    377   1.1    jruoho         Status = AcpiUtExecute_CID (Node, &CidList);
    378   1.1    jruoho         if (ACPI_SUCCESS (Status))
    379   1.1    jruoho         {
    380   1.1    jruoho             /* Add size of CID strings and CID pointer array */
    381   1.1    jruoho 
    382   1.4  christos             InfoSize += (CidList->ListSize - sizeof (ACPI_PNP_DEVICE_ID_LIST));
    383   1.1    jruoho             Valid |= ACPI_VALID_CID;
    384   1.1    jruoho         }
    385   1.7  christos 
    386   1.7  christos         /* Execute the Device._CLS method */
    387   1.7  christos 
    388   1.7  christos         Status = AcpiUtExecute_CLS (Node, &Cls);
    389   1.7  christos         if (ACPI_SUCCESS (Status))
    390   1.7  christos         {
    391   1.7  christos             InfoSize += Cls->Length;
    392   1.7  christos             Valid |= ACPI_VALID_CLS;
    393   1.7  christos         }
    394   1.1    jruoho     }
    395   1.1    jruoho 
    396   1.1    jruoho     /*
    397   1.1    jruoho      * Now that we have the variable-length data, we can allocate the
    398   1.1    jruoho      * return buffer
    399   1.1    jruoho      */
    400   1.1    jruoho     Info = ACPI_ALLOCATE_ZEROED (InfoSize);
    401   1.1    jruoho     if (!Info)
    402   1.1    jruoho     {
    403   1.1    jruoho         Status = AE_NO_MEMORY;
    404   1.1    jruoho         goto Cleanup;
    405   1.1    jruoho     }
    406   1.1    jruoho 
    407   1.1    jruoho     /* Get the fixed-length data */
    408   1.1    jruoho 
    409   1.1    jruoho     if ((Type == ACPI_TYPE_DEVICE) ||
    410   1.1    jruoho         (Type == ACPI_TYPE_PROCESSOR))
    411   1.1    jruoho     {
    412   1.1    jruoho         /*
    413   1.1    jruoho          * Get extra info for ACPI Device/Processor objects only:
    414  1.10  christos          * Run the _ADR and, SxW, and _SxD methods.
    415   1.1    jruoho          *
    416   1.4  christos          * Notes: none of these methods are required, so they may or may
    417   1.1    jruoho          * not be present for this device. The Info->Valid bitfield is used
    418   1.1    jruoho          * to indicate which methods were found and run successfully.
    419   1.1    jruoho          */
    420   1.1    jruoho 
    421   1.1    jruoho         /* Execute the Device._ADR method */
    422   1.1    jruoho 
    423   1.1    jruoho         Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node,
    424   1.8  christos             &Info->Address);
    425   1.1    jruoho         if (ACPI_SUCCESS (Status))
    426   1.1    jruoho         {
    427   1.1    jruoho             Valid |= ACPI_VALID_ADR;
    428   1.1    jruoho         }
    429   1.1    jruoho 
    430   1.1    jruoho         /* Execute the Device._SxW methods */
    431   1.1    jruoho 
    432   1.1    jruoho         Status = AcpiUtExecutePowerMethods (Node,
    433   1.8  christos             AcpiGbl_LowestDstateNames, ACPI_NUM_SxW_METHODS,
    434   1.8  christos             Info->LowestDstates);
    435   1.1    jruoho         if (ACPI_SUCCESS (Status))
    436   1.1    jruoho         {
    437   1.1    jruoho             Valid |= ACPI_VALID_SXWS;
    438   1.1    jruoho         }
    439   1.1    jruoho 
    440   1.1    jruoho         /* Execute the Device._SxD methods */
    441   1.1    jruoho 
    442   1.1    jruoho         Status = AcpiUtExecutePowerMethods (Node,
    443   1.8  christos             AcpiGbl_HighestDstateNames, ACPI_NUM_SxD_METHODS,
    444   1.8  christos             Info->HighestDstates);
    445   1.1    jruoho         if (ACPI_SUCCESS (Status))
    446   1.1    jruoho         {
    447   1.1    jruoho             Valid |= ACPI_VALID_SXDS;
    448   1.1    jruoho         }
    449   1.1    jruoho     }
    450   1.1    jruoho 
    451   1.1    jruoho     /*
    452   1.1    jruoho      * Create a pointer to the string area of the return buffer.
    453   1.1    jruoho      * Point to the end of the base ACPI_DEVICE_INFO structure.
    454   1.1    jruoho      */
    455   1.1    jruoho     NextIdString = ACPI_CAST_PTR (char, Info->CompatibleIdList.Ids);
    456   1.1    jruoho     if (CidList)
    457   1.1    jruoho     {
    458   1.4  christos         /* Point past the CID PNP_DEVICE_ID array */
    459   1.1    jruoho 
    460   1.4  christos         NextIdString += ((ACPI_SIZE) CidList->Count * sizeof (ACPI_PNP_DEVICE_ID));
    461   1.1    jruoho     }
    462   1.1    jruoho 
    463   1.1    jruoho     /*
    464   1.8  christos      * Copy the HID, UID, and CIDs to the return buffer. The variable-length
    465   1.8  christos      * strings are copied to the reserved area at the end of the buffer.
    466   1.1    jruoho      *
    467   1.1    jruoho      * For HID and CID, check if the ID is a PCI Root Bridge.
    468   1.1    jruoho      */
    469   1.1    jruoho     if (Hid)
    470   1.1    jruoho     {
    471   1.1    jruoho         NextIdString = AcpiNsCopyDeviceId (&Info->HardwareId,
    472   1.1    jruoho             Hid, NextIdString);
    473   1.1    jruoho 
    474   1.1    jruoho         if (AcpiUtIsPciRootBridge (Hid->String))
    475   1.1    jruoho         {
    476   1.1    jruoho             Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
    477   1.1    jruoho         }
    478   1.1    jruoho     }
    479   1.1    jruoho 
    480   1.1    jruoho     if (Uid)
    481   1.1    jruoho     {
    482   1.1    jruoho         NextIdString = AcpiNsCopyDeviceId (&Info->UniqueId,
    483   1.1    jruoho             Uid, NextIdString);
    484   1.1    jruoho     }
    485   1.1    jruoho 
    486   1.1    jruoho     if (CidList)
    487   1.1    jruoho     {
    488   1.1    jruoho         Info->CompatibleIdList.Count = CidList->Count;
    489   1.1    jruoho         Info->CompatibleIdList.ListSize = CidList->ListSize;
    490   1.1    jruoho 
    491   1.1    jruoho         /* Copy each CID */
    492   1.1    jruoho 
    493   1.1    jruoho         for (i = 0; i < CidList->Count; i++)
    494   1.1    jruoho         {
    495   1.1    jruoho             NextIdString = AcpiNsCopyDeviceId (&Info->CompatibleIdList.Ids[i],
    496   1.1    jruoho                 &CidList->Ids[i], NextIdString);
    497   1.1    jruoho 
    498   1.1    jruoho             if (AcpiUtIsPciRootBridge (CidList->Ids[i].String))
    499   1.1    jruoho             {
    500   1.1    jruoho                 Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
    501   1.1    jruoho             }
    502   1.1    jruoho         }
    503   1.1    jruoho     }
    504   1.1    jruoho 
    505   1.7  christos     if (Cls)
    506   1.7  christos     {
    507  1.12  christos        (void) AcpiNsCopyDeviceId (&Info->ClassCode,
    508   1.7  christos             Cls, NextIdString);
    509   1.7  christos     }
    510   1.7  christos 
    511   1.1    jruoho     /* Copy the fixed-length data */
    512   1.1    jruoho 
    513   1.1    jruoho     Info->InfoSize = InfoSize;
    514   1.1    jruoho     Info->Type = Type;
    515   1.1    jruoho     Info->Name = Name;
    516   1.1    jruoho     Info->ParamCount = ParamCount;
    517   1.1    jruoho     Info->Valid = Valid;
    518   1.1    jruoho 
    519   1.1    jruoho     *ReturnBuffer = Info;
    520   1.1    jruoho     Status = AE_OK;
    521   1.1    jruoho 
    522   1.1    jruoho 
    523   1.1    jruoho Cleanup:
    524   1.1    jruoho     if (Hid)
    525   1.1    jruoho     {
    526   1.1    jruoho         ACPI_FREE (Hid);
    527   1.1    jruoho     }
    528   1.1    jruoho     if (Uid)
    529   1.1    jruoho     {
    530   1.1    jruoho         ACPI_FREE (Uid);
    531   1.1    jruoho     }
    532   1.1    jruoho     if (CidList)
    533   1.1    jruoho     {
    534   1.1    jruoho         ACPI_FREE (CidList);
    535   1.1    jruoho     }
    536   1.7  christos     if (Cls)
    537   1.7  christos     {
    538   1.7  christos         ACPI_FREE (Cls);
    539   1.7  christos     }
    540   1.1    jruoho     return (Status);
    541   1.1    jruoho }
    542   1.1    jruoho 
    543   1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiGetObjectInfo)
    544   1.1    jruoho 
    545   1.1    jruoho 
    546   1.1    jruoho /******************************************************************************
    547   1.1    jruoho  *
    548   1.1    jruoho  * FUNCTION:    AcpiInstallMethod
    549   1.1    jruoho  *
    550   1.1    jruoho  * PARAMETERS:  Buffer         - An ACPI table containing one control method
    551   1.1    jruoho  *
    552   1.1    jruoho  * RETURN:      Status
    553   1.1    jruoho  *
    554   1.1    jruoho  * DESCRIPTION: Install a control method into the namespace. If the method
    555   1.1    jruoho  *              name already exists in the namespace, it is overwritten. The
    556   1.1    jruoho  *              input buffer must contain a valid DSDT or SSDT containing a
    557   1.1    jruoho  *              single control method.
    558   1.1    jruoho  *
    559   1.1    jruoho  ******************************************************************************/
    560   1.1    jruoho 
    561   1.1    jruoho ACPI_STATUS
    562   1.1    jruoho AcpiInstallMethod (
    563   1.1    jruoho     UINT8                   *Buffer)
    564   1.1    jruoho {
    565   1.1    jruoho     ACPI_TABLE_HEADER       *Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Buffer);
    566   1.1    jruoho     UINT8                   *AmlBuffer;
    567   1.1    jruoho     UINT8                   *AmlStart;
    568   1.1    jruoho     char                    *Path;
    569   1.1    jruoho     ACPI_NAMESPACE_NODE     *Node;
    570   1.1    jruoho     ACPI_OPERAND_OBJECT     *MethodObj;
    571   1.1    jruoho     ACPI_PARSE_STATE        ParserState;
    572   1.1    jruoho     UINT32                  AmlLength;
    573   1.1    jruoho     UINT16                  Opcode;
    574   1.1    jruoho     UINT8                   MethodFlags;
    575   1.1    jruoho     ACPI_STATUS             Status;
    576   1.1    jruoho 
    577   1.1    jruoho 
    578   1.1    jruoho     /* Parameter validation */
    579   1.1    jruoho 
    580   1.1    jruoho     if (!Buffer)
    581   1.1    jruoho     {
    582   1.1    jruoho         return (AE_BAD_PARAMETER);
    583   1.1    jruoho     }
    584   1.1    jruoho 
    585   1.1    jruoho     /* Table must be a DSDT or SSDT */
    586   1.1    jruoho 
    587  1.11  christos     if (!ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_DSDT) &&
    588  1.11  christos         !ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_SSDT))
    589   1.1    jruoho     {
    590   1.1    jruoho         return (AE_BAD_HEADER);
    591   1.1    jruoho     }
    592   1.1    jruoho 
    593   1.1    jruoho     /* First AML opcode in the table must be a control method */
    594   1.1    jruoho 
    595   1.1    jruoho     ParserState.Aml = Buffer + sizeof (ACPI_TABLE_HEADER);
    596   1.1    jruoho     Opcode = AcpiPsPeekOpcode (&ParserState);
    597   1.1    jruoho     if (Opcode != AML_METHOD_OP)
    598   1.1    jruoho     {
    599   1.1    jruoho         return (AE_BAD_PARAMETER);
    600   1.1    jruoho     }
    601   1.1    jruoho 
    602   1.1    jruoho     /* Extract method information from the raw AML */
    603   1.1    jruoho 
    604   1.1    jruoho     ParserState.Aml += AcpiPsGetOpcodeSize (Opcode);
    605   1.1    jruoho     ParserState.PkgEnd = AcpiPsGetNextPackageEnd (&ParserState);
    606   1.1    jruoho     Path = AcpiPsGetNextNamestring (&ParserState);
    607   1.8  christos 
    608   1.1    jruoho     MethodFlags = *ParserState.Aml++;
    609   1.1    jruoho     AmlStart = ParserState.Aml;
    610  1.13  christos     AmlLength = (UINT32) ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
    611   1.1    jruoho 
    612   1.1    jruoho     /*
    613   1.1    jruoho      * Allocate resources up-front. We don't want to have to delete a new
    614   1.1    jruoho      * node from the namespace if we cannot allocate memory.
    615   1.1    jruoho      */
    616   1.1    jruoho     AmlBuffer = ACPI_ALLOCATE (AmlLength);
    617   1.1    jruoho     if (!AmlBuffer)
    618   1.1    jruoho     {
    619   1.1    jruoho         return (AE_NO_MEMORY);
    620   1.1    jruoho     }
    621   1.1    jruoho 
    622   1.1    jruoho     MethodObj = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
    623   1.1    jruoho     if (!MethodObj)
    624   1.1    jruoho     {
    625   1.1    jruoho         ACPI_FREE (AmlBuffer);
    626   1.1    jruoho         return (AE_NO_MEMORY);
    627   1.1    jruoho     }
    628   1.1    jruoho 
    629   1.1    jruoho     /* Lock namespace for AcpiNsLookup, we may be creating a new node */
    630   1.1    jruoho 
    631   1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
    632   1.1    jruoho     if (ACPI_FAILURE (Status))
    633   1.1    jruoho     {
    634   1.1    jruoho         goto ErrorExit;
    635   1.1    jruoho     }
    636   1.1    jruoho 
    637   1.1    jruoho     /* The lookup either returns an existing node or creates a new one */
    638   1.1    jruoho 
    639   1.1    jruoho     Status = AcpiNsLookup (NULL, Path, ACPI_TYPE_METHOD, ACPI_IMODE_LOAD_PASS1,
    640   1.8  christos         ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND, NULL, &Node);
    641   1.1    jruoho 
    642   1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
    643   1.1    jruoho 
    644   1.1    jruoho     if (ACPI_FAILURE (Status)) /* NsLookup */
    645   1.1    jruoho     {
    646   1.1    jruoho         if (Status != AE_ALREADY_EXISTS)
    647   1.1    jruoho         {
    648   1.1    jruoho             goto ErrorExit;
    649   1.1    jruoho         }
    650   1.1    jruoho 
    651   1.1    jruoho         /* Node existed previously, make sure it is a method node */
    652   1.1    jruoho 
    653   1.1    jruoho         if (Node->Type != ACPI_TYPE_METHOD)
    654   1.1    jruoho         {
    655   1.1    jruoho             Status = AE_TYPE;
    656   1.1    jruoho             goto ErrorExit;
    657   1.1    jruoho         }
    658   1.1    jruoho     }
    659   1.1    jruoho 
    660   1.1    jruoho     /* Copy the method AML to the local buffer */
    661   1.1    jruoho 
    662   1.7  christos     memcpy (AmlBuffer, AmlStart, AmlLength);
    663   1.1    jruoho 
    664   1.1    jruoho     /* Initialize the method object with the new method's information */
    665   1.1    jruoho 
    666   1.1    jruoho     MethodObj->Method.AmlStart = AmlBuffer;
    667   1.1    jruoho     MethodObj->Method.AmlLength = AmlLength;
    668   1.1    jruoho 
    669   1.1    jruoho     MethodObj->Method.ParamCount = (UINT8)
    670   1.1    jruoho         (MethodFlags & AML_METHOD_ARG_COUNT);
    671   1.1    jruoho 
    672   1.1    jruoho     if (MethodFlags & AML_METHOD_SERIALIZED)
    673   1.1    jruoho     {
    674   1.3    jruoho         MethodObj->Method.InfoFlags = ACPI_METHOD_SERIALIZED;
    675   1.3    jruoho 
    676   1.1    jruoho         MethodObj->Method.SyncLevel = (UINT8)
    677   1.1    jruoho             ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4);
    678   1.1    jruoho     }
    679   1.1    jruoho 
    680   1.1    jruoho     /*
    681   1.1    jruoho      * Now that it is complete, we can attach the new method object to
    682   1.1    jruoho      * the method Node (detaches/deletes any existing object)
    683   1.1    jruoho      */
    684   1.3    jruoho     Status = AcpiNsAttachObject (Node, MethodObj, ACPI_TYPE_METHOD);
    685   1.1    jruoho 
    686   1.1    jruoho     /*
    687   1.1    jruoho      * Flag indicates AML buffer is dynamic, must be deleted later.
    688   1.1    jruoho      * Must be set only after attach above.
    689   1.1    jruoho      */
    690   1.1    jruoho     Node->Flags |= ANOBJ_ALLOCATED_BUFFER;
    691   1.1    jruoho 
    692   1.1    jruoho     /* Remove local reference to the method object */
    693   1.1    jruoho 
    694   1.1    jruoho     AcpiUtRemoveReference (MethodObj);
    695   1.1    jruoho     return (Status);
    696   1.1    jruoho 
    697   1.1    jruoho 
    698   1.1    jruoho ErrorExit:
    699   1.1    jruoho 
    700   1.1    jruoho     ACPI_FREE (AmlBuffer);
    701   1.1    jruoho     ACPI_FREE (MethodObj);
    702   1.1    jruoho     return (Status);
    703   1.1    jruoho }
    704   1.1    jruoho 
    705   1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiInstallMethod)
    706