uteval.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. /******************************************************************************
  2. *
  3. * Module Name: uteval - Object evaluation
  4. *
  5. *****************************************************************************/
  6. /*
  7. * Copyright (C) 2000 - 2007, 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 char *acpi_interfaces_supported[] = {
  57. /* Operating System Vendor Strings */
  58. "Windows 2000",
  59. "Windows 2001",
  60. "Windows 2001 SP0",
  61. "Windows 2001 SP1",
  62. "Windows 2001 SP2",
  63. "Windows 2001 SP3",
  64. "Windows 2001 SP4",
  65. "Windows 2001.1",
  66. "Windows 2001.1 SP1", /* Added 03/2006 */
  67. "Windows 2006", /* Added 03/2006 */
  68. /* Feature Group Strings */
  69. "Extended Address Space Descriptor"
  70. /*
  71. * All "optional" feature group strings (features that are implemented
  72. * by the host) should be implemented in the host version of
  73. * acpi_os_validate_interface and should not be added here.
  74. */
  75. };
  76. /*******************************************************************************
  77. *
  78. * FUNCTION: acpi_ut_osi_implementation
  79. *
  80. * PARAMETERS: walk_state - Current walk state
  81. *
  82. * RETURN: Status
  83. *
  84. * DESCRIPTION: Implementation of the _OSI predefined control method
  85. *
  86. ******************************************************************************/
  87. acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
  88. {
  89. acpi_status status;
  90. union acpi_operand_object *string_desc;
  91. union acpi_operand_object *return_desc;
  92. acpi_native_uint i;
  93. ACPI_FUNCTION_TRACE(ut_osi_implementation);
  94. /* Validate the string input argument */
  95. string_desc = walk_state->arguments[0].object;
  96. if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
  97. return_ACPI_STATUS(AE_TYPE);
  98. }
  99. /* Create a return object */
  100. return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
  101. if (!return_desc) {
  102. return_ACPI_STATUS(AE_NO_MEMORY);
  103. }
  104. /* Default return value is SUPPORTED */
  105. return_desc->integer.value = ACPI_UINT32_MAX;
  106. walk_state->return_desc = return_desc;
  107. /* Compare input string to static table of supported interfaces */
  108. for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
  109. if (!ACPI_STRCMP
  110. (string_desc->string.pointer,
  111. acpi_interfaces_supported[i])) {
  112. /* The interface is supported */
  113. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  114. }
  115. }
  116. /*
  117. * Did not match the string in the static table, call the host OSL to
  118. * check for a match with one of the optional strings (such as
  119. * "Module Device", "3.0 Thermal Model", etc.)
  120. */
  121. status = acpi_os_validate_interface(string_desc->string.pointer);
  122. if (ACPI_SUCCESS(status)) {
  123. /* The interface is supported */
  124. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  125. }
  126. /* The interface is not supported */
  127. return_desc->integer.value = 0;
  128. return_ACPI_STATUS(AE_CTRL_TERMINATE);
  129. }
  130. /*******************************************************************************
  131. *
  132. * FUNCTION: acpi_osi_invalidate
  133. *
  134. * PARAMETERS: interface_string
  135. *
  136. * RETURN: Status
  137. *
  138. * DESCRIPTION: invalidate string in pre-defiend _OSI string list
  139. *
  140. ******************************************************************************/
  141. acpi_status acpi_osi_invalidate(char *interface)
  142. {
  143. int i;
  144. for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
  145. if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i])) {
  146. *acpi_interfaces_supported[i] = '\0';
  147. return AE_OK;
  148. }
  149. }
  150. return AE_NOT_FOUND;
  151. }
  152. /*******************************************************************************
  153. *
  154. * FUNCTION: acpi_ut_evaluate_object
  155. *
  156. * PARAMETERS: prefix_node - Starting node
  157. * Path - Path to object from starting node
  158. * expected_return_types - Bitmap of allowed return types
  159. * return_desc - Where a return value is stored
  160. *
  161. * RETURN: Status
  162. *
  163. * DESCRIPTION: Evaluates a namespace object and verifies the type of the
  164. * return object. Common code that simplifies accessing objects
  165. * that have required return objects of fixed types.
  166. *
  167. * NOTE: Internal function, no parameter validation
  168. *
  169. ******************************************************************************/
  170. acpi_status
  171. acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
  172. char *path,
  173. u32 expected_return_btypes,
  174. union acpi_operand_object **return_desc)
  175. {
  176. struct acpi_evaluate_info *info;
  177. acpi_status status;
  178. u32 return_btype;
  179. ACPI_FUNCTION_TRACE(ut_evaluate_object);
  180. /* Allocate the evaluation information block */
  181. info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
  182. if (!info) {
  183. return_ACPI_STATUS(AE_NO_MEMORY);
  184. }
  185. info->prefix_node = prefix_node;
  186. info->pathname = path;
  187. info->parameter_type = ACPI_PARAM_ARGS;
  188. /* Evaluate the object/method */
  189. status = acpi_ns_evaluate(info);
  190. if (ACPI_FAILURE(status)) {
  191. if (status == AE_NOT_FOUND) {
  192. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  193. "[%4.4s.%s] was not found\n",
  194. acpi_ut_get_node_name(prefix_node),
  195. path));
  196. } else {
  197. ACPI_ERROR_METHOD("Method execution failed",
  198. prefix_node, path, status);
  199. }
  200. goto cleanup;
  201. }
  202. /* Did we get a return object? */
  203. if (!info->return_object) {
  204. if (expected_return_btypes) {
  205. ACPI_ERROR_METHOD("No object was returned from",
  206. prefix_node, path, AE_NOT_EXIST);
  207. status = AE_NOT_EXIST;
  208. }
  209. goto cleanup;
  210. }
  211. /* Map the return object type to the bitmapped type */
  212. switch (ACPI_GET_OBJECT_TYPE(info->return_object)) {
  213. case ACPI_TYPE_INTEGER:
  214. return_btype = ACPI_BTYPE_INTEGER;
  215. break;
  216. case ACPI_TYPE_BUFFER:
  217. return_btype = ACPI_BTYPE_BUFFER;
  218. break;
  219. case ACPI_TYPE_STRING:
  220. return_btype = ACPI_BTYPE_STRING;
  221. break;
  222. case ACPI_TYPE_PACKAGE:
  223. return_btype = ACPI_BTYPE_PACKAGE;
  224. break;
  225. default:
  226. return_btype = 0;
  227. break;
  228. }
  229. if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
  230. /*
  231. * We received a return object, but one was not expected. This can
  232. * happen frequently if the "implicit return" feature is enabled.
  233. * Just delete the return object and return AE_OK.
  234. */
  235. acpi_ut_remove_reference(info->return_object);
  236. goto cleanup;
  237. }
  238. /* Is the return object one of the expected types? */
  239. if (!(expected_return_btypes & return_btype)) {
  240. ACPI_ERROR_METHOD("Return object type is incorrect",
  241. prefix_node, path, AE_TYPE);
  242. ACPI_ERROR((AE_INFO,
  243. "Type returned from %s was incorrect: %s, expected Btypes: %X",
  244. path,
  245. acpi_ut_get_object_type_name(info->return_object),
  246. expected_return_btypes));
  247. /* On error exit, we must delete the return object */
  248. acpi_ut_remove_reference(info->return_object);
  249. status = AE_TYPE;
  250. goto cleanup;
  251. }
  252. /* Object type is OK, return it */
  253. *return_desc = info->return_object;
  254. cleanup:
  255. ACPI_FREE(info);
  256. return_ACPI_STATUS(status);
  257. }
  258. /*******************************************************************************
  259. *
  260. * FUNCTION: acpi_ut_evaluate_numeric_object
  261. *
  262. * PARAMETERS: object_name - Object name to be evaluated
  263. * device_node - Node for the device
  264. * Address - Where the value is returned
  265. *
  266. * RETURN: Status
  267. *
  268. * DESCRIPTION: Evaluates a numeric namespace object for a selected device
  269. * and stores result in *Address.
  270. *
  271. * NOTE: Internal function, no parameter validation
  272. *
  273. ******************************************************************************/
  274. acpi_status
  275. acpi_ut_evaluate_numeric_object(char *object_name,
  276. struct acpi_namespace_node *device_node,
  277. acpi_integer * address)
  278. {
  279. union acpi_operand_object *obj_desc;
  280. acpi_status status;
  281. ACPI_FUNCTION_TRACE(ut_evaluate_numeric_object);
  282. status = acpi_ut_evaluate_object(device_node, object_name,
  283. ACPI_BTYPE_INTEGER, &obj_desc);
  284. if (ACPI_FAILURE(status)) {
  285. return_ACPI_STATUS(status);
  286. }
  287. /* Get the returned Integer */
  288. *address = obj_desc->integer.value;
  289. /* On exit, we must delete the return object */
  290. acpi_ut_remove_reference(obj_desc);
  291. return_ACPI_STATUS(status);
  292. }
  293. /*******************************************************************************
  294. *
  295. * FUNCTION: acpi_ut_copy_id_string
  296. *
  297. * PARAMETERS: Destination - Where to copy the string
  298. * Source - Source string
  299. * max_length - Length of the destination buffer
  300. *
  301. * RETURN: None
  302. *
  303. * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
  304. * Performs removal of a leading asterisk if present -- workaround
  305. * for a known issue on a bunch of machines.
  306. *
  307. ******************************************************************************/
  308. static void
  309. acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length)
  310. {
  311. /*
  312. * Workaround for ID strings that have a leading asterisk. This construct
  313. * is not allowed by the ACPI specification (ID strings must be
  314. * alphanumeric), but enough existing machines have this embedded in their
  315. * ID strings that the following code is useful.
  316. */
  317. if (*source == '*') {
  318. source++;
  319. }
  320. /* Do the actual copy */
  321. ACPI_STRNCPY(destination, source, max_length);
  322. }
  323. /*******************************************************************************
  324. *
  325. * FUNCTION: acpi_ut_execute_HID
  326. *
  327. * PARAMETERS: device_node - Node for the device
  328. * Hid - Where the HID is returned
  329. *
  330. * RETURN: Status
  331. *
  332. * DESCRIPTION: Executes the _HID control method that returns the hardware
  333. * ID of the device.
  334. *
  335. * NOTE: Internal function, no parameter validation
  336. *
  337. ******************************************************************************/
  338. acpi_status
  339. acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
  340. struct acpi_device_id *hid)
  341. {
  342. union acpi_operand_object *obj_desc;
  343. acpi_status status;
  344. ACPI_FUNCTION_TRACE(ut_execute_HID);
  345. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
  346. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
  347. &obj_desc);
  348. if (ACPI_FAILURE(status)) {
  349. return_ACPI_STATUS(status);
  350. }
  351. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
  352. /* Convert the Numeric HID to string */
  353. acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
  354. hid->value);
  355. } else {
  356. /* Copy the String HID from the returned object */
  357. acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer,
  358. sizeof(hid->value));
  359. }
  360. /* On exit, we must delete the return object */
  361. acpi_ut_remove_reference(obj_desc);
  362. return_ACPI_STATUS(status);
  363. }
  364. /*******************************************************************************
  365. *
  366. * FUNCTION: acpi_ut_translate_one_cid
  367. *
  368. * PARAMETERS: obj_desc - _CID object, must be integer or string
  369. * one_cid - Where the CID string is returned
  370. *
  371. * RETURN: Status
  372. *
  373. * DESCRIPTION: Return a numeric or string _CID value as a string.
  374. * (Compatible ID)
  375. *
  376. * NOTE: Assumes a maximum _CID string length of
  377. * ACPI_MAX_CID_LENGTH.
  378. *
  379. ******************************************************************************/
  380. static acpi_status
  381. acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
  382. struct acpi_compatible_id *one_cid)
  383. {
  384. switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
  385. case ACPI_TYPE_INTEGER:
  386. /* Convert the Numeric CID to string */
  387. acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
  388. one_cid->value);
  389. return (AE_OK);
  390. case ACPI_TYPE_STRING:
  391. if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
  392. return (AE_AML_STRING_LIMIT);
  393. }
  394. /* Copy the String CID from the returned object */
  395. acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer,
  396. ACPI_MAX_CID_LENGTH);
  397. return (AE_OK);
  398. default:
  399. return (AE_TYPE);
  400. }
  401. }
  402. /*******************************************************************************
  403. *
  404. * FUNCTION: acpi_ut_execute_CID
  405. *
  406. * PARAMETERS: device_node - Node for the device
  407. * return_cid_list - Where the CID list is returned
  408. *
  409. * RETURN: Status
  410. *
  411. * DESCRIPTION: Executes the _CID control method that returns one or more
  412. * compatible hardware IDs for the device.
  413. *
  414. * NOTE: Internal function, no parameter validation
  415. *
  416. ******************************************************************************/
  417. acpi_status
  418. acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
  419. struct acpi_compatible_id_list ** return_cid_list)
  420. {
  421. union acpi_operand_object *obj_desc;
  422. acpi_status status;
  423. u32 count;
  424. u32 size;
  425. struct acpi_compatible_id_list *cid_list;
  426. acpi_native_uint i;
  427. ACPI_FUNCTION_TRACE(ut_execute_CID);
  428. /* Evaluate the _CID method for this device */
  429. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
  430. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
  431. | ACPI_BTYPE_PACKAGE, &obj_desc);
  432. if (ACPI_FAILURE(status)) {
  433. return_ACPI_STATUS(status);
  434. }
  435. /* Get the number of _CIDs returned */
  436. count = 1;
  437. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
  438. count = obj_desc->package.count;
  439. }
  440. /* Allocate a worst-case buffer for the _CIDs */
  441. size = (((count - 1) * sizeof(struct acpi_compatible_id)) +
  442. sizeof(struct acpi_compatible_id_list));
  443. cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
  444. if (!cid_list) {
  445. return_ACPI_STATUS(AE_NO_MEMORY);
  446. }
  447. /* Init CID list */
  448. cid_list->count = count;
  449. cid_list->size = size;
  450. /*
  451. * A _CID can return either a single compatible ID or a package of
  452. * compatible IDs. Each compatible ID can be one of the following:
  453. * 1) Integer (32 bit compressed EISA ID) or
  454. * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
  455. */
  456. /* The _CID object can be either a single CID or a package (list) of CIDs */
  457. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
  458. /* Translate each package element */
  459. for (i = 0; i < count; i++) {
  460. status =
  461. acpi_ut_translate_one_cid(obj_desc->package.
  462. elements[i],
  463. &cid_list->id[i]);
  464. if (ACPI_FAILURE(status)) {
  465. break;
  466. }
  467. }
  468. } else {
  469. /* Only one CID, translate to a string */
  470. status = acpi_ut_translate_one_cid(obj_desc, cid_list->id);
  471. }
  472. /* Cleanup on error */
  473. if (ACPI_FAILURE(status)) {
  474. ACPI_FREE(cid_list);
  475. } else {
  476. *return_cid_list = cid_list;
  477. }
  478. /* On exit, we must delete the _CID return object */
  479. acpi_ut_remove_reference(obj_desc);
  480. return_ACPI_STATUS(status);
  481. }
  482. /*******************************************************************************
  483. *
  484. * FUNCTION: acpi_ut_execute_UID
  485. *
  486. * PARAMETERS: device_node - Node for the device
  487. * Uid - Where the UID is returned
  488. *
  489. * RETURN: Status
  490. *
  491. * DESCRIPTION: Executes the _UID control method that returns the hardware
  492. * ID of the device.
  493. *
  494. * NOTE: Internal function, no parameter validation
  495. *
  496. ******************************************************************************/
  497. acpi_status
  498. acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
  499. struct acpi_device_id *uid)
  500. {
  501. union acpi_operand_object *obj_desc;
  502. acpi_status status;
  503. ACPI_FUNCTION_TRACE(ut_execute_UID);
  504. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
  505. ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
  506. &obj_desc);
  507. if (ACPI_FAILURE(status)) {
  508. return_ACPI_STATUS(status);
  509. }
  510. if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
  511. /* Convert the Numeric UID to string */
  512. acpi_ex_unsigned_integer_to_string(obj_desc->integer.value,
  513. uid->value);
  514. } else {
  515. /* Copy the String UID from the returned object */
  516. acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer,
  517. sizeof(uid->value));
  518. }
  519. /* On exit, we must delete the return object */
  520. acpi_ut_remove_reference(obj_desc);
  521. return_ACPI_STATUS(status);
  522. }
  523. /*******************************************************************************
  524. *
  525. * FUNCTION: acpi_ut_execute_STA
  526. *
  527. * PARAMETERS: device_node - Node for the device
  528. * Flags - Where the status flags are returned
  529. *
  530. * RETURN: Status
  531. *
  532. * DESCRIPTION: Executes _STA for selected device and stores results in
  533. * *Flags.
  534. *
  535. * NOTE: Internal function, no parameter validation
  536. *
  537. ******************************************************************************/
  538. acpi_status
  539. acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
  540. {
  541. union acpi_operand_object *obj_desc;
  542. acpi_status status;
  543. ACPI_FUNCTION_TRACE(ut_execute_STA);
  544. status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA,
  545. ACPI_BTYPE_INTEGER, &obj_desc);
  546. if (ACPI_FAILURE(status)) {
  547. if (AE_NOT_FOUND == status) {
  548. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  549. "_STA on %4.4s was not found, assuming device is present\n",
  550. acpi_ut_get_node_name(device_node)));
  551. *flags = ACPI_UINT32_MAX;
  552. status = AE_OK;
  553. }
  554. return_ACPI_STATUS(status);
  555. }
  556. /* Extract the status flags */
  557. *flags = (u32) obj_desc->integer.value;
  558. /* On exit, we must delete the return object */
  559. acpi_ut_remove_reference(obj_desc);
  560. return_ACPI_STATUS(status);
  561. }
  562. /*******************************************************************************
  563. *
  564. * FUNCTION: acpi_ut_execute_Sxds
  565. *
  566. * PARAMETERS: device_node - Node for the device
  567. * Flags - Where the status flags are returned
  568. *
  569. * RETURN: Status
  570. *
  571. * DESCRIPTION: Executes _STA for selected device and stores results in
  572. * *Flags.
  573. *
  574. * NOTE: Internal function, no parameter validation
  575. *
  576. ******************************************************************************/
  577. acpi_status
  578. acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
  579. {
  580. union acpi_operand_object *obj_desc;
  581. acpi_status status;
  582. u32 i;
  583. ACPI_FUNCTION_TRACE(ut_execute_sxds);
  584. for (i = 0; i < 4; i++) {
  585. highest[i] = 0xFF;
  586. status = acpi_ut_evaluate_object(device_node,
  587. ACPI_CAST_PTR(char,
  588. acpi_gbl_highest_dstate_names
  589. [i]),
  590. ACPI_BTYPE_INTEGER, &obj_desc);
  591. if (ACPI_FAILURE(status)) {
  592. if (status != AE_NOT_FOUND) {
  593. ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  594. "%s on Device %4.4s, %s\n",
  595. ACPI_CAST_PTR(char,
  596. acpi_gbl_highest_dstate_names
  597. [i]),
  598. acpi_ut_get_node_name
  599. (device_node),
  600. acpi_format_exception
  601. (status)));
  602. return_ACPI_STATUS(status);
  603. }
  604. } else {
  605. /* Extract the Dstate value */
  606. highest[i] = (u8) obj_desc->integer.value;
  607. /* Delete the return object */
  608. acpi_ut_remove_reference(obj_desc);
  609. }
  610. }
  611. return_ACPI_STATUS(AE_OK);
  612. }