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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: uteval - Object evaluation
  4.  *              $Revision: 31 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acnamesp.h"
  26. #include "acinterp.h"
  27. #define _COMPONENT          ACPI_UTILITIES
  28.  MODULE_NAME         ("uteval")
  29. /*******************************************************************************
  30.  *
  31.  * FUNCTION:    Acpi_ut_evaluate_numeric_object
  32.  *
  33.  * PARAMETERS:  *Object_name        - Object name to be evaluated
  34.  *              Device_node         - Node for the device
  35.  *              *Address            - Where the value is returned
  36.  *
  37.  * RETURN:      Status
  38.  *
  39.  * DESCRIPTION: evaluates a numeric namespace object for a selected device
  40.  *              and stores results in *Address.
  41.  *
  42.  *              NOTE: Internal function, no parameter validation
  43.  *
  44.  ******************************************************************************/
  45. acpi_status
  46. acpi_ut_evaluate_numeric_object (
  47. NATIVE_CHAR             *object_name,
  48. acpi_namespace_node     *device_node,
  49. acpi_integer            *address)
  50. {
  51. acpi_operand_object     *obj_desc;
  52. acpi_status             status;
  53. FUNCTION_TRACE ("Ut_evaluate_numeric_object");
  54. /* Execute the method */
  55. status = acpi_ns_evaluate_relative (device_node, object_name, NULL, &obj_desc);
  56. if (ACPI_FAILURE (status)) {
  57. if (status == AE_NOT_FOUND) {
  58. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s on %4.4s was not foundn",
  59. object_name, (char*)&device_node->name));
  60. }
  61. else {
  62. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s on %4.4s failed with status %sn",
  63. object_name, (char*)&device_node->name,
  64. acpi_format_exception (status)));
  65. }
  66. return_ACPI_STATUS (status);
  67. }
  68. /* Did we get a return object? */
  69. if (!obj_desc) {
  70. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from %sn",
  71. object_name));
  72. return_ACPI_STATUS (AE_TYPE);
  73. }
  74. /* Is the return object of the correct type? */
  75. if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
  76. status = AE_TYPE;
  77. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  78. "Type returned from %s was not a number: %X n",
  79. object_name, obj_desc->common.type));
  80. }
  81. else {
  82. /*
  83.  * Since the structure is a union, setting any field will set all
  84.  * of the variables in the union
  85.  */
  86. *address = obj_desc->integer.value;
  87. }
  88. /* On exit, we must delete the return object */
  89. acpi_ut_remove_reference (obj_desc);
  90. return_ACPI_STATUS (status);
  91. }
  92. /*******************************************************************************
  93.  *
  94.  * FUNCTION:    Acpi_ut_execute_HID
  95.  *
  96.  * PARAMETERS:  Device_node         - Node for the device
  97.  *              *Hid                - Where the HID is returned
  98.  *
  99.  * RETURN:      Status
  100.  *
  101.  * DESCRIPTION: Executes the _HID control method that returns the hardware
  102.  *              ID of the device.
  103.  *
  104.  *              NOTE: Internal function, no parameter validation
  105.  *
  106.  ******************************************************************************/
  107. acpi_status
  108. acpi_ut_execute_HID (
  109. acpi_namespace_node     *device_node,
  110. acpi_device_id          *hid)
  111. {
  112. acpi_operand_object     *obj_desc;
  113. acpi_status             status;
  114. FUNCTION_TRACE ("Ut_execute_HID");
  115. /* Execute the method */
  116. status = acpi_ns_evaluate_relative (device_node,
  117.  METHOD_NAME__HID, NULL, &obj_desc);
  118. if (ACPI_FAILURE (status)) {
  119. if (status == AE_NOT_FOUND) {
  120. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_HID on %4.4s was not foundn",
  121. (char*)&device_node->name));
  122. }
  123. else {
  124. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_HID on %4.4s failed %sn",
  125. (char*)&device_node->name, acpi_format_exception (status)));
  126. }
  127. return_ACPI_STATUS (status);
  128. }
  129. /* Did we get a return object? */
  130. if (!obj_desc) {
  131. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _HIDn"));
  132. return_ACPI_STATUS (AE_TYPE);
  133. }
  134. /*
  135.  *  A _HID can return either a Number (32 bit compressed EISA ID) or
  136.  *  a string
  137.  */
  138. if ((obj_desc->common.type != ACPI_TYPE_INTEGER) &&
  139. (obj_desc->common.type != ACPI_TYPE_STRING)) {
  140. status = AE_TYPE;
  141. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  142. "Type returned from _HID not a number or string: %s(%X) n",
  143. acpi_ut_get_type_name (obj_desc->common.type), obj_desc->common.type));
  144. }
  145. else {
  146. if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
  147. /* Convert the Numeric HID to string */
  148. acpi_ex_eisa_id_to_string ((u32) obj_desc->integer.value, hid->buffer);
  149. }
  150. else {
  151. /* Copy the String HID from the returned object */
  152. STRNCPY(hid->buffer, obj_desc->string.pointer, sizeof(hid->buffer));
  153. }
  154. }
  155. /* On exit, we must delete the return object */
  156. acpi_ut_remove_reference (obj_desc);
  157. return_ACPI_STATUS (status);
  158. }
  159. /*******************************************************************************
  160.  *
  161.  * FUNCTION:    Acpi_ut_execute_UID
  162.  *
  163.  * PARAMETERS:  Device_node         - Node for the device
  164.  *              *Uid                - Where the UID is returned
  165.  *
  166.  * RETURN:      Status
  167.  *
  168.  * DESCRIPTION: Executes the _UID control method that returns the hardware
  169.  *              ID of the device.
  170.  *
  171.  *              NOTE: Internal function, no parameter validation
  172.  *
  173.  ******************************************************************************/
  174. acpi_status
  175. acpi_ut_execute_UID (
  176. acpi_namespace_node     *device_node,
  177. acpi_device_id          *uid)
  178. {
  179. acpi_operand_object     *obj_desc;
  180. acpi_status             status;
  181. PROC_NAME ("Ut_execute_UID");
  182. /* Execute the method */
  183. status = acpi_ns_evaluate_relative (device_node,
  184.  METHOD_NAME__UID, NULL, &obj_desc);
  185. if (ACPI_FAILURE (status)) {
  186. if (status == AE_NOT_FOUND) {
  187. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_UID on %4.4s was not foundn",
  188. (char*)&device_node->name));
  189. }
  190. else {
  191. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  192. "_UID on %4.4s failed %sn",
  193. (char*)&device_node->name, acpi_format_exception (status)));
  194. }
  195. return (status);
  196. }
  197. /* Did we get a return object? */
  198. if (!obj_desc) {
  199. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _UIDn"));
  200. return (AE_TYPE);
  201. }
  202. /*
  203.  *  A _UID can return either a Number (32 bit compressed EISA ID) or
  204.  *  a string
  205.  */
  206. if ((obj_desc->common.type != ACPI_TYPE_INTEGER) &&
  207. (obj_desc->common.type != ACPI_TYPE_STRING)) {
  208. status = AE_TYPE;
  209. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  210. "Type returned from _UID was not a number or string: %X n",
  211. obj_desc->common.type));
  212. }
  213. else {
  214. if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
  215. /* Convert the Numeric UID to string */
  216. acpi_ex_unsigned_integer_to_string (obj_desc->integer.value, uid->buffer);
  217. }
  218. else {
  219. /* Copy the String UID from the returned object */
  220. STRNCPY(uid->buffer, obj_desc->string.pointer, sizeof(uid->buffer));
  221. }
  222. }
  223. /* On exit, we must delete the return object */
  224. acpi_ut_remove_reference (obj_desc);
  225. return (status);
  226. }
  227. /*******************************************************************************
  228.  *
  229.  * FUNCTION:    Acpi_ut_execute_STA
  230.  *
  231.  * PARAMETERS:  Device_node         - Node for the device
  232.  *              *Flags              - Where the status flags are returned
  233.  *
  234.  * RETURN:      Status
  235.  *
  236.  * DESCRIPTION: Executes _STA for selected device and stores results in
  237.  *              *Flags.
  238.  *
  239.  *              NOTE: Internal function, no parameter validation
  240.  *
  241.  ******************************************************************************/
  242. acpi_status
  243. acpi_ut_execute_STA (
  244. acpi_namespace_node     *device_node,
  245. u32                     *flags)
  246. {
  247. acpi_operand_object     *obj_desc;
  248. acpi_status             status;
  249. FUNCTION_TRACE ("Ut_execute_STA");
  250. /* Execute the method */
  251. status = acpi_ns_evaluate_relative (device_node,
  252.  METHOD_NAME__STA, NULL, &obj_desc);
  253. if (AE_NOT_FOUND == status) {
  254. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  255. "_STA on %4.4s was not found, assuming present.n",
  256. (char*)&device_node->name));
  257. *flags = 0x0F;
  258. status = AE_OK;
  259. }
  260. else if (ACPI_FAILURE (status)) {
  261. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_STA on %4.4s failed %sn",
  262. (char*)&device_node->name,
  263. acpi_format_exception (status)));
  264. }
  265. else /* success */ {
  266. /* Did we get a return object? */
  267. if (!obj_desc) {
  268. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _STAn"));
  269. return_ACPI_STATUS (AE_TYPE);
  270. }
  271. /* Is the return object of the correct type? */
  272. if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
  273. status = AE_TYPE;
  274. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  275. "Type returned from _STA was not a number: %X n",
  276. obj_desc->common.type));
  277. }
  278. else {
  279. /* Extract the status flags */
  280. *flags = (u32) obj_desc->integer.value;
  281. }
  282. /* On exit, we must delete the return object */
  283. acpi_ut_remove_reference (obj_desc);
  284. }
  285. return_ACPI_STATUS (status);
  286. }