nsxfname.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: nsxfname - Public interfaces to the ACPI subsystem
  4.  *                         ACPI Namespace oriented interfaces
  5.  *              $Revision: 82 $
  6.  *
  7.  *****************************************************************************/
  8. /*
  9.  *  Copyright (C) 2000, 2001 R. Byron Moore
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  */
  25. #include "acpi.h"
  26. #include "acinterp.h"
  27. #include "acnamesp.h"
  28. #include "amlcode.h"
  29. #include "acparser.h"
  30. #include "acdispat.h"
  31. #include "acevents.h"
  32. #define _COMPONENT          ACPI_NAMESPACE
  33.  MODULE_NAME         ("nsxfname")
  34. /****************************************************************************
  35.  *
  36.  * FUNCTION:    Acpi_get_handle
  37.  *
  38.  * PARAMETERS:  Parent          - Object to search under (search scope).
  39.  *              Path_name       - Pointer to an asciiz string containing the
  40.  *                                  name
  41.  *              Ret_handle      - Where the return handle is placed
  42.  *
  43.  * RETURN:      Status
  44.  *
  45.  * DESCRIPTION: This routine will search for a caller specified name in the
  46.  *              name space.  The caller can restrict the search region by
  47.  *              specifying a non NULL parent.  The parent value is itself a
  48.  *              namespace handle.
  49.  *
  50.  ******************************************************************************/
  51. acpi_status
  52. acpi_get_handle (
  53. acpi_handle             parent,
  54. acpi_string             pathname,
  55. acpi_handle             *ret_handle)
  56. {
  57. acpi_status             status;
  58. acpi_namespace_node     *node = NULL;
  59. acpi_namespace_node     *prefix_node = NULL;
  60. FUNCTION_ENTRY ();
  61. /* Parameter Validation */
  62. if (!ret_handle || !pathname) {
  63. return (AE_BAD_PARAMETER);
  64. }
  65. /* Convert a parent handle to a prefix node */
  66. if (parent) {
  67. acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
  68. prefix_node = acpi_ns_map_handle_to_node (parent);
  69. if (!prefix_node) {
  70. acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  71. return (AE_BAD_PARAMETER);
  72. }
  73. acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  74. }
  75. /* Special case for root, since we can't search for it */
  76. if (STRCMP (pathname, NS_ROOT_PATH) == 0) {
  77. *ret_handle = acpi_ns_convert_entry_to_handle (acpi_gbl_root_node);
  78. return (AE_OK);
  79. }
  80. /*
  81.  *  Find the Node and convert to a handle
  82.  */
  83. status = acpi_ns_get_node (pathname, prefix_node, &node);
  84. *ret_handle = NULL;
  85. if (ACPI_SUCCESS (status)) {
  86. *ret_handle = acpi_ns_convert_entry_to_handle (node);
  87. }
  88. return (status);
  89. }
  90. /****************************************************************************
  91.  *
  92.  * FUNCTION:    Acpi_get_name
  93.  *
  94.  * PARAMETERS:  Handle          - Handle to be converted to a pathname
  95.  *              Name_type       - Full pathname or single segment
  96.  *              Ret_path_ptr    - Buffer for returned path
  97.  *
  98.  * RETURN:      Pointer to a string containing the fully qualified Name.
  99.  *
  100.  * DESCRIPTION: This routine returns the fully qualified name associated with
  101.  *              the Handle parameter.  This and the Acpi_pathname_to_handle are
  102.  *              complementary functions.
  103.  *
  104.  ******************************************************************************/
  105. acpi_status
  106. acpi_get_name (
  107. acpi_handle             handle,
  108. u32                     name_type,
  109. acpi_buffer             *ret_path_ptr)
  110. {
  111. acpi_status             status;
  112. acpi_namespace_node     *node;
  113. /* Buffer pointer must be valid always */
  114. if (!ret_path_ptr || (name_type > ACPI_NAME_TYPE_MAX)) {
  115. return (AE_BAD_PARAMETER);
  116. }
  117. /* Allow length to be zero and ignore the pointer */
  118. if ((ret_path_ptr->length) &&
  119.    (!ret_path_ptr->pointer)) {
  120. return (AE_BAD_PARAMETER);
  121. }
  122. if (name_type == ACPI_FULL_PATHNAME) {
  123. /* Get the full pathname (From the namespace root) */
  124. status = acpi_ns_handle_to_pathname (handle, &ret_path_ptr->length,
  125.    ret_path_ptr->pointer);
  126. return (status);
  127. }
  128. /*
  129.  * Wants the single segment ACPI name.
  130.  * Validate handle and convert to an Node
  131.  */
  132. acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
  133. node = acpi_ns_map_handle_to_node (handle);
  134. if (!node) {
  135. status = AE_BAD_PARAMETER;
  136. goto unlock_and_exit;
  137. }
  138. /* Check if name will fit in buffer */
  139. if (ret_path_ptr->length < PATH_SEGMENT_LENGTH) {
  140. ret_path_ptr->length = PATH_SEGMENT_LENGTH;
  141. status = AE_BUFFER_OVERFLOW;
  142. goto unlock_and_exit;
  143. }
  144. /* Just copy the ACPI name from the Node and zero terminate it */
  145. STRNCPY (ret_path_ptr->pointer, (NATIVE_CHAR *) &node->name,
  146.  ACPI_NAME_SIZE);
  147. ((NATIVE_CHAR *) ret_path_ptr->pointer) [ACPI_NAME_SIZE] = 0;
  148. status = AE_OK;
  149. unlock_and_exit:
  150. acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  151. return (status);
  152. }
  153. /****************************************************************************
  154.  *
  155.  * FUNCTION:    Acpi_get_object_info
  156.  *
  157.  * PARAMETERS:  Handle          - Object Handle
  158.  *              Info            - Where the info is returned
  159.  *
  160.  * RETURN:      Status
  161.  *
  162.  * DESCRIPTION: Returns information about an object as gleaned from the
  163.  *              namespace node and possibly by running several standard
  164.  *              control methods (Such as in the case of a device.)
  165.  *
  166.  ******************************************************************************/
  167. acpi_status
  168. acpi_get_object_info (
  169. acpi_handle             handle,
  170. acpi_device_info        *info)
  171. {
  172. acpi_device_id          hid;
  173. acpi_device_id          uid;
  174. acpi_status             status;
  175. u32                     device_status = 0;
  176. acpi_integer            address = 0;
  177. acpi_namespace_node     *node;
  178. /* Parameter validation */
  179. if (!handle || !info) {
  180. return (AE_BAD_PARAMETER);
  181. }
  182. acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
  183. node = acpi_ns_map_handle_to_node (handle);
  184. if (!node) {
  185. acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  186. return (AE_BAD_PARAMETER);
  187. }
  188. info->type      = node->type;
  189. info->name      = node->name;
  190. acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  191. /*
  192.  * If not a device, we are all done.
  193.  */
  194. if (info->type != ACPI_TYPE_DEVICE) {
  195. return (AE_OK);
  196. }
  197. /*
  198.  * Get extra info for ACPI devices only.  Run the
  199.  * _HID, _UID, _STA, and _ADR methods.  Note: none
  200.  * of these methods are required, so they may or may
  201.  * not be present.  The Info->Valid bits are used
  202.  * to indicate which methods ran successfully.
  203.  */
  204. info->valid = 0;
  205. /* Execute the _HID method and save the result */
  206. status = acpi_ut_execute_HID (node, &hid);
  207. if (ACPI_SUCCESS (status)) {
  208. STRNCPY (info->hardware_id, hid.buffer, sizeof(info->hardware_id));
  209. info->valid |= ACPI_VALID_HID;
  210. }
  211. /* Execute the _UID method and save the result */
  212. status = acpi_ut_execute_UID (node, &uid);
  213. if (ACPI_SUCCESS (status)) {
  214. STRCPY (info->unique_id, uid.buffer);
  215. info->valid |= ACPI_VALID_UID;
  216. }
  217. /*
  218.  * Execute the _STA method and save the result
  219.  * _STA is not always present
  220.  */
  221. status = acpi_ut_execute_STA (node, &device_status);
  222. if (ACPI_SUCCESS (status)) {
  223. info->current_status = device_status;
  224. info->valid |= ACPI_VALID_STA;
  225. }
  226. /*
  227.  * Execute the _ADR method and save result if successful
  228.  * _ADR is not always present
  229.  */
  230. status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR,
  231.   node, &address);
  232. if (ACPI_SUCCESS (status)) {
  233. info->address = address;
  234. info->valid |= ACPI_VALID_ADR;
  235. }
  236. return (AE_OK);
  237. }