uteval.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. /******************************************************************************
  2. *
  3. * Module Name: uteval - Object evaluation
  4. *
  5. *****************************************************************************/
  6. /*
  7. * Copyright (C) 2000 - 2006, R. Byron Moore
  8. * All rights reserved.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions
  12. * are met:
  13. * 1. Redistributions of source code must retain the above copyright
  14. * notice, this list of conditions, and the following disclaimer,
  15. * without modification.
  16. * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  17. * substantially similar to the "NO WARRANTY" disclaimer below
  18. * ("Disclaimer") and any redistribution must be conditioned upon
  19. * including a substantially similar Disclaimer requirement for further
  20. * binary redistribution.
  21. * 3. Neither the names of the above-listed copyright holders nor the names
  22. * of any contributors may be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * Alternatively, this software may be distributed under the terms of the
  26. * GNU General Public License ("GPL") version 2 as published by the Free
  27. * Software Foundation.
  28. *
  29. * NO WARRANTY
  30. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  31. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  32. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  33. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  34. * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  35. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  36. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  37. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  38. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  39. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  40. * POSSIBILITY OF SUCH DAMAGES.
  41. */
  42. #include <acpi/acpi.h>
  43. #include <acpi/acnamesp.h>
  44. #include <acpi/acinterp.h>
  45. #define _COMPONENT ACPI_UTILITIES
  46. ACPI_MODULE_NAME("uteval")
  47. /* Local prototypes */
  48. static void
  49. acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length);
  50. static acpi_status
  51. acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
  52. struct acpi_compatible_id *one_cid);
  53. /*
  54. * Strings supported by the _OSI predefined (internal) method.
  55. */
  56. static const char *acpi_interfaces_supported[] = {
  57. /* Operating System Vendor Strings */
  58. "Linux",
  59. "Windows 2000",
  60. "Windows 2001",
  61. "Windows 2001 SP0",
  62. "Windows 2001 SP1",
  63. "Windows 2001 SP2",
  64. "Windows 2001 SP3",
  65. "Windows 2001 SP4",
  66. "Windows 2001.1",
  67. "Windows 2001.1 SP1", /* Added 03/2006 */
  68. "Windows 2006", /* Added 03/2006 */
  69. /* Feature Group Strings */
  70. "Extended Address Space Descriptor"
  71. /*
  72. * All "optional" feature group strings (features that are implemented
  73. * by the host) should be implemented in the host version of
  74. * acpi_os_validate_interface and should not be added here.
  75. */
  76. };
  77. /*******************************************************************************
  78. *
  79. * FUNCTION: acpi_ut_osi_implementation
  80. *
  81. * PARAMETERS: walk_state - Current walk state
  82. *
  83. * RETURN: Status
  84. *
  85. * DESCRIPTION: Implementation of the _OSI predefined control method
  86. *
  87. ******************************************************************************/
  88. acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
  89. {
  90. acpi_status status;
  91. union acpi_operand_object *string_desc;
  92. union acpi_operand_object *return_desc;
  93. acpi_native_uint i;
  94. ACPI_FUNCTION_TRACE(ut_osi_implementation);
  95. /* Validate the string input argument */
  96. string_desc = walk_state->arguments[0].object;
  97. if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
  98. return_ACPI_STATUS(AE_TYPE);
  99. }
  100. /* Create a return object */
  101. return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
  102. if (!return_desc) {
  103. return_ACPI_STATUS(AE_NO_MEMORY);
  104. }
  105. /* Default return value is SUPPORTED */
  106. return_desc->integer.value = ACPI_UINT32_MAX;
  107. walk_state->return_desc = return_desc;
  108. /* Compare input string to static table of supported interfaces */
  109. for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
  110. if (!ACPI_STRCMP
  111. (string_desc->string.pointer,
  112. acpi_interfaces_supported[i])) {
  113. /* The interface is supported */
  114. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  115. }
  116. }
  117. /*
  118. * Did not match the string in the static table, call the host OSL to
  119. * check for a match with one of the optional strings (such as
  120. * "Module Device", "3.0 Thermal Model", etc.)
  121. */
  122. status = acpi_os_validate_interface(string_desc->string.pointer);
  123. if (ACPI_SUCCESS(status)) {
  124. /* The interface is supported */
  125. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  126. }
  127. /* The interface is not supported */
  128. return_desc->integer.value = 0;
  129. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  130. }
  131. /*******************************************************************************
  132. *
  133. * FUNCTION: acpi_ut_evaluate_object
  134. *
  135. * PARAMETERS: prefix_node - Starting node
  136. * Path - Path to object from starting node
  137. * expected_return_types - Bitmap of allowed return types
  138. * return_desc - Where a return value is stored
  139. *
  140. * RETURN: Status
  141. *
  142. * DESCRIPTION: Evaluates a namespace object and verifies the type of the
  143. * return object. Common code that simplifies accessing objects
  144. * that have required return objects of fixed types.
  145. *
  146. * NOTE: Internal function, no parameter validation
  147. *
  148. ******************************************************************************/
  149. acpi_status
  150. acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
  151. char *path,
  152. u32 expected_return_btypes,
  153. union acpi_operand_object **return_desc)
  154. {
  155. struct acpi_parameter_info info;
  156. acpi_status status;
  157. u32 return_btype;
  158. ACPI_FUNCTION_TRACE(ut_evaluate_object);
  159. info.node = prefix_node;
  160. info.parameters = NULL;
  161. info.parameter_type = ACPI_PARAM_ARGS;
  162. /* Evaluate the object/method */
  163. status = acpi_ns_evaluate_relative(path, &info);
  164. if (ACPI_FAILURE(status)) {
  165. if (status == AE_NOT_FOUND) {
  166. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  167. "[%4.4s.%s] was not found\n",
  168. acpi_ut_get_node_name(prefix_node),
  169. path));
  170. } else {
  171. ACPI_ERROR_METHOD("Method execution failed",
  172. prefix_node, path, status);
  173. }
  174. return_ACPI_STATUS(status);
  175. }
  176. /* Did we get a return object? */
  177. if (!info.return_object) {
  178. if (expected_return_btypes) {
  179. ACPI_ERROR_METHOD("No object was returned from",
  180. prefix_node, path, AE_NOT_EXIST);
  181. return_ACPI_STATUS(AE_NOT_EXIST);
  182. }
  183. return_ACPI_STATUS(AE_OK);
  184. }
  185. /* Map the return object type to the bitmapped type */
  186. switch (ACPI_GET_OBJECT_TYPE(info.return_object)) {
  187. case ACPI_TYPE_INTEGER:
  188. return_btype = ACPI_BTYPE_INTEGER;
  189. break;
  190. case ACPI_TYPE_BUFFER:
  191. return_btype = ACPI_BTYPE_BUFFER;
  192. break;
  193. case ACPI_TYPE_STRING:
  194. return_btype = ACPI_BTYPE_STRING;
  195. break;
  196. case ACPI_TYPE_PACKAGE:
  197. return_btype = ACPI_BTYPE_PACKAGE;
  198. break;
  199. default:
  200. return_btype = 0;
  201. break;
  202. }
  203. if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
  204. /*
  205. * We received a return object, but one was not expected. This can
  206. * happen frequently if the "implicit return" feature is enabled.
  207. * Just delete the return object and return AE_OK.
  208. */
  209. acpi_ut_remove_reference(info.return_object);
  210. return_ACPI_STATUS(AE_OK);
  211. }
  212. /* Is the return object one of the expected types? */
  213. if (!(expected_return_btypes & return_btype)) {
  214. ACPI_ERROR_METHOD("Return object type is incorrect",
  215. prefix_node, path, AE_TYPE);
  216. ACPI_ERROR((AE_INFO,
  217. "Type returned from %s was incorrect: %s, expected Btypes: %X",
  218. path,
  219. acpi_ut_get_object_type_name(info.return_object),
  220. expected_return_btypes));
  221. /* On error exit, we must delete the return object */
  222. acpi_ut_remove_reference(info.return_object);
  223. return_ACPI_STATUS(AE_TYPE);
  224. }
  225. /* Object type is OK, return it */
  226. *return_desc = info.return_object;
  227. return_ACPI_STATUS(AE_OK);
  228. }
  229. /*******************************************************************************
  230. *
  231. * FUNCTION: acpi_ut_evaluate_numeric_object
  232. *
  233. * PARAMETERS: object_name - Object name to be evaluated
  234. * device_node - Node for the device
  235. * Address - Where the value is returned
  236. *
  237. * RETURN: Status
  238. *
  239. * DESCRIPTION: Evaluates a numeric namespace object for a selected device
  240. * and stores result in *Address.
  241. *
  242. * NOTE: Internal function, no parameter validation
  243. *
  244. ******************************************************************************/
  245. acpi_status
  246. acpi_ut_evaluate_numeric_object(char *object_name,
  247. struct acpi_namespace_node *device_node,
  248. acpi_integer * address)
  249. {
  250. union acpi_operand_object *obj_desc;
  251. acpi_status status;
  252. ACPI_FUNCTION_TRACE(ut_evaluate_numeric_object);
  253. status = acpi_ut_evaluate_object(device_node, object_name,
  254. ACPI_BTYPE_INTEGER, &obj_desc);
  255. if (ACPI_FAILURE(status)) {
  256. return_ACPI_STATUS(status);
  257. }
  258. /* Get the returned Integer */
  259. *address = obj_desc->integer.value;
  260. /* On exit, we must delete the return object */
  261. acpi_ut_remove_reference(obj_desc);
  262. return_ACPI_STATUS(status);
  263. }
  264. /*******************************************************************************
  265. *
  266. * FUNCTION: acpi_ut_copy_id_string
  267. *
  268. * PARAMETERS: Destination - Where to copy the string
  269. * Source - Source string
  270. * max_length - Length of the destination buffer
  271. *
  272. * RETURN: None
  273. *
  274. * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
  275. * Performs removal of a leading asterisk if present -- workaround
  276. * for a known issue on a bunch of machines.
  277. *
  278. ******************************************************************************/
  279. static void
  280. acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length)
  281. {
  282. /*
  283. * Workaround for ID strings that have a leading asterisk. This construct
  284. * is not allowed by the ACPI specification (ID strings must be
  285. * alphanumeric), but enough existing machines have this embedded in their
  286. * ID strings that the following code is useful.
  287. */
  288. if (*source == '*') {
  289. source++;
  290. }
  291. /* Do the actual copy */
  292. ACPI_STRNCPY(destination, source, max_length);
  293. }
  294. /*******************************************************************************
  295. *
  296. * FUNCTION: acpi_ut_execute_HID
  297. *
  298. * PARAMETERS: device_node - Node for the device
  299. * Hid - Where the HID is returned
  300. *
  301. * RETURN: Status
  302. *
  303. * DESCRIPTION: Executes the _HID control method that returns the hardware
  304. * ID of the device.
  305. *
  306. * NOTE: Internal function, no parameter validation
  307. *
  308. ******************************************************************************/
  309. acpi_status
  310. acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
  311. struct acpi_device_id *hid)
  312. {
  313. union acpi_operand_object *obj_desc;
  314. acpi_status status;
  315. ACPI_FUNCTION_TRACE(ut_execute_HID);
  316. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
  317. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
  318. &obj_desc);
  319. if (ACPI_FAILURE(status)) {
  320. return_ACPI_STATUS(status);
  321. }
  322. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
  323. /* Convert the Numeric HID to string */
  324. acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
  325. hid->value);
  326. } else {
  327. /* Copy the String HID from the returned object */
  328. acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer,
  329. sizeof(hid->value));
  330. }
  331. /* On exit, we must delete the return object */
  332. acpi_ut_remove_reference(obj_desc);
  333. return_ACPI_STATUS(status);
  334. }
  335. /*******************************************************************************
  336. *
  337. * FUNCTION: acpi_ut_translate_one_cid
  338. *
  339. * PARAMETERS: obj_desc - _CID object, must be integer or string
  340. * one_cid - Where the CID string is returned
  341. *
  342. * RETURN: Status
  343. *
  344. * DESCRIPTION: Return a numeric or string _CID value as a string.
  345. * (Compatible ID)
  346. *
  347. * NOTE: Assumes a maximum _CID string length of
  348. * ACPI_MAX_CID_LENGTH.
  349. *
  350. ******************************************************************************/
  351. static acpi_status
  352. acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
  353. struct acpi_compatible_id *one_cid)
  354. {
  355. switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
  356. case ACPI_TYPE_INTEGER:
  357. /* Convert the Numeric CID to string */
  358. acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
  359. one_cid->value);
  360. return (AE_OK);
  361. case ACPI_TYPE_STRING:
  362. if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
  363. return (AE_AML_STRING_LIMIT);
  364. }
  365. /* Copy the String CID from the returned object */
  366. acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer,
  367. ACPI_MAX_CID_LENGTH);
  368. return (AE_OK);
  369. default:
  370. return (AE_TYPE);
  371. }
  372. }
  373. /*******************************************************************************
  374. *
  375. * FUNCTION: acpi_ut_execute_CID
  376. *
  377. * PARAMETERS: device_node - Node for the device
  378. * return_cid_list - Where the CID list is returned
  379. *
  380. * RETURN: Status
  381. *
  382. * DESCRIPTION: Executes the _CID control method that returns one or more
  383. * compatible hardware IDs for the device.
  384. *
  385. * NOTE: Internal function, no parameter validation
  386. *
  387. ******************************************************************************/
  388. acpi_status
  389. acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
  390. struct acpi_compatible_id_list ** return_cid_list)
  391. {
  392. union acpi_operand_object *obj_desc;
  393. acpi_status status;
  394. u32 count;
  395. u32 size;
  396. struct acpi_compatible_id_list *cid_list;
  397. acpi_native_uint i;
  398. ACPI_FUNCTION_TRACE(ut_execute_CID);
  399. /* Evaluate the _CID method for this device */
  400. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
  401. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
  402. | ACPI_BTYPE_PACKAGE, &obj_desc);
  403. if (ACPI_FAILURE(status)) {
  404. return_ACPI_STATUS(status);
  405. }
  406. /* Get the number of _CIDs returned */
  407. count = 1;
  408. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
  409. count = obj_desc->package.count;
  410. }
  411. /* Allocate a worst-case buffer for the _CIDs */
  412. size = (((count - 1) * sizeof(struct acpi_compatible_id)) +
  413. sizeof(struct acpi_compatible_id_list));
  414. cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
  415. if (!cid_list) {
  416. return_ACPI_STATUS(AE_NO_MEMORY);
  417. }
  418. /* Init CID list */
  419. cid_list->count = count;
  420. cid_list->size = size;
  421. /*
  422. * A _CID can return either a single compatible ID or a package of
  423. * compatible IDs. Each compatible ID can be one of the following:
  424. * 1) Integer (32 bit compressed EISA ID) or
  425. * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
  426. */
  427. /* The _CID object can be either a single CID or a package (list) of CIDs */
  428. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
  429. /* Translate each package element */
  430. for (i = 0; i < count; i++) {
  431. status =
  432. acpi_ut_translate_one_cid(obj_desc->package.
  433. elements[i],
  434. &cid_list->id[i]);
  435. if (ACPI_FAILURE(status)) {
  436. break;
  437. }
  438. }
  439. } else {
  440. /* Only one CID, translate to a string */
  441. status = acpi_ut_translate_one_cid(obj_desc, cid_list->id);
  442. }
  443. /* Cleanup on error */
  444. if (ACPI_FAILURE(status)) {
  445. ACPI_FREE(cid_list);
  446. } else {
  447. *return_cid_list = cid_list;
  448. }
  449. /* On exit, we must delete the _CID return object */
  450. acpi_ut_remove_reference(obj_desc);
  451. return_ACPI_STATUS(status);
  452. }
  453. /*******************************************************************************
  454. *
  455. * FUNCTION: acpi_ut_execute_UID
  456. *
  457. * PARAMETERS: device_node - Node for the device
  458. * Uid - Where the UID is returned
  459. *
  460. * RETURN: Status
  461. *
  462. * DESCRIPTION: Executes the _UID control method that returns the hardware
  463. * ID of the device.
  464. *
  465. * NOTE: Internal function, no parameter validation
  466. *
  467. ******************************************************************************/
  468. acpi_status
  469. acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
  470. struct acpi_device_id *uid)
  471. {
  472. union acpi_operand_object *obj_desc;
  473. acpi_status status;
  474. ACPI_FUNCTION_TRACE(ut_execute_UID);
  475. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
  476. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
  477. &obj_desc);
  478. if (ACPI_FAILURE(status)) {
  479. return_ACPI_STATUS(status);
  480. }
  481. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
  482. /* Convert the Numeric UID to string */
  483. acpi_ex_unsigned_integer_to_string(obj_desc->integer.value,
  484. uid->value);
  485. } else {
  486. /* Copy the String UID from the returned object */
  487. acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer,
  488. sizeof(uid->value));
  489. }
  490. /* On exit, we must delete the return object */
  491. acpi_ut_remove_reference(obj_desc);
  492. return_ACPI_STATUS(status);
  493. }
  494. /*******************************************************************************
  495. *
  496. * FUNCTION: acpi_ut_execute_STA
  497. *
  498. * PARAMETERS: device_node - Node for the device
  499. * Flags - Where the status flags are returned
  500. *
  501. * RETURN: Status
  502. *
  503. * DESCRIPTION: Executes _STA for selected device and stores results in
  504. * *Flags.
  505. *
  506. * NOTE: Internal function, no parameter validation
  507. *
  508. ******************************************************************************/
  509. acpi_status
  510. acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
  511. {
  512. union acpi_operand_object *obj_desc;
  513. acpi_status status;
  514. ACPI_FUNCTION_TRACE(ut_execute_STA);
  515. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA,
  516. ACPI_BTYPE_INTEGER, &obj_desc);
  517. if (ACPI_FAILURE(status)) {
  518. if (AE_NOT_FOUND == status) {
  519. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  520. "_STA on %4.4s was not found, assuming device is present\n",
  521. acpi_ut_get_node_name(device_node)));
  522. *flags = ACPI_UINT32_MAX;
  523. status = AE_OK;
  524. }
  525. return_ACPI_STATUS(status);
  526. }
  527. /* Extract the status flags */
  528. *flags = (u32) obj_desc->integer.value;
  529. /* On exit, we must delete the return object */
  530. acpi_ut_remove_reference(obj_desc);
  531. return_ACPI_STATUS(status);
  532. }
  533. /*******************************************************************************
  534. *
  535. * FUNCTION: acpi_ut_execute_Sxds
  536. *
  537. * PARAMETERS: device_node - Node for the device
  538. * Flags - Where the status flags are returned
  539. *
  540. * RETURN: Status
  541. *
  542. * DESCRIPTION: Executes _STA for selected device and stores results in
  543. * *Flags.
  544. *
  545. * NOTE: Internal function, no parameter validation
  546. *
  547. ******************************************************************************/
  548. acpi_status
  549. acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
  550. {
  551. union acpi_operand_object *obj_desc;
  552. acpi_status status;
  553. u32 i;
  554. ACPI_FUNCTION_TRACE(ut_execute_sxds);
  555. for (i = 0; i < 4; i++) {
  556. highest[i] = 0xFF;
  557. status = acpi_ut_evaluate_object(device_node,
  558. ACPI_CAST_PTR(char,
  559. acpi_gbl_highest_dstate_names
  560. [i]),
  561. ACPI_BTYPE_INTEGER, &obj_desc);
  562. if (ACPI_FAILURE(status)) {
  563. if (status != AE_NOT_FOUND) {
  564. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  565. "%s on Device %4.4s, %s\n",
  566. ACPI_CAST_PTR(char,
  567. acpi_gbl_highest_dstate_names
  568. [i]),
  569. acpi_ut_get_node_name
  570. (device_node),
  571. acpi_format_exception
  572. (status)));
  573. return_ACPI_STATUS(status);
  574. }
  575. } else {
  576. /* Extract the Dstate value */
  577. highest[i] = (u8) obj_desc->integer.value;
  578. /* Delete the return object */
  579. acpi_ut_remove_reference(obj_desc);
  580. }
  581. }
  582. return_ACPI_STATUS(AE_OK);
  583. }