uteval.c revision 193251
1/******************************************************************************
2 *
3 * Module Name: uteval - Object evaluation
4 *              $Revision: 1.71 $
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights.  You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code.  No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision.  In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change.  Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee.  Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution.  In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government.  In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117#define __UTEVAL_C__
118
119#include "acpi.h"
120#include "acnamesp.h"
121#include "acinterp.h"
122
123
124#define _COMPONENT          ACPI_UTILITIES
125        ACPI_MODULE_NAME    ("uteval")
126
127/* Local prototypes */
128
129static void
130AcpiUtCopyIdString (
131    char                    *Destination,
132    char                    *Source,
133    ACPI_SIZE               MaxLength);
134
135static ACPI_STATUS
136AcpiUtTranslateOneCid (
137    ACPI_OPERAND_OBJECT     *ObjDesc,
138    ACPI_COMPATIBLE_ID      *OneCid);
139
140
141/*
142 * Strings supported by the _OSI predefined (internal) method.
143 */
144static const char               *AcpiInterfacesSupported[] =
145{
146    /* Operating System Vendor Strings */
147
148    "Linux",
149    "Windows 2000",
150    "Windows 2001",
151    "Windows 2001 SP0",
152    "Windows 2001 SP1",
153    "Windows 2001 SP2",
154    "Windows 2001 SP3",
155    "Windows 2001 SP4",
156    "Windows 2001.1",
157    "Windows 2001.1 SP1",   /* Added 03/2006 */
158    "Windows 2006",         /* Added 03/2006 */
159
160    /* Feature Group Strings */
161
162    "Extended Address Space Descriptor"
163
164    /*
165     * All "optional" feature group strings (features that are implemented
166     * by the host) should be implemented in the host version of
167     * AcpiOsValidateInterface and should not be added here.
168     */
169};
170
171
172/*******************************************************************************
173 *
174 * FUNCTION:    AcpiUtOsiImplementation
175 *
176 * PARAMETERS:  WalkState           - Current walk state
177 *
178 * RETURN:      Status
179 *
180 * DESCRIPTION: Implementation of the _OSI predefined control method
181 *
182 ******************************************************************************/
183
184ACPI_STATUS
185AcpiUtOsiImplementation (
186    ACPI_WALK_STATE         *WalkState)
187{
188    ACPI_STATUS             Status;
189    ACPI_OPERAND_OBJECT     *StringDesc;
190    ACPI_OPERAND_OBJECT     *ReturnDesc;
191    ACPI_NATIVE_UINT        i;
192
193
194    ACPI_FUNCTION_TRACE (UtOsiImplementation);
195
196
197    /* Validate the string input argument */
198
199    StringDesc = WalkState->Arguments[0].Object;
200    if (!StringDesc || (StringDesc->Common.Type != ACPI_TYPE_STRING))
201    {
202        return_ACPI_STATUS (AE_TYPE);
203    }
204
205    /* Create a return object */
206
207    ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
208    if (!ReturnDesc)
209    {
210        return_ACPI_STATUS (AE_NO_MEMORY);
211    }
212
213    /* Default return value is SUPPORTED */
214
215    ReturnDesc->Integer.Value = ACPI_UINT32_MAX;
216    WalkState->ReturnDesc = ReturnDesc;
217
218    /* Compare input string to static table of supported interfaces */
219
220    for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiInterfacesSupported); i++)
221    {
222        if (!ACPI_STRCMP (StringDesc->String.Pointer, AcpiInterfacesSupported[i]))
223        {
224            /* The interface is supported */
225
226            return_ACPI_STATUS (AE_CTRL_TERMINATE);
227        }
228    }
229
230    /*
231     * Did not match the string in the static table, call the host OSL to
232     * check for a match with one of the optional strings (such as
233     * "Module Device", "3.0 Thermal Model", etc.)
234     */
235    Status = AcpiOsValidateInterface (StringDesc->String.Pointer);
236    if (ACPI_SUCCESS (Status))
237    {
238        /* The interface is supported */
239
240        return_ACPI_STATUS (AE_CTRL_TERMINATE);
241    }
242
243    /* The interface is not supported */
244
245    ReturnDesc->Integer.Value = 0;
246    return_ACPI_STATUS (AE_CTRL_TERMINATE);
247}
248
249
250/*******************************************************************************
251 *
252 * FUNCTION:    AcpiUtEvaluateObject
253 *
254 * PARAMETERS:  PrefixNode          - Starting node
255 *              Path                - Path to object from starting node
256 *              ExpectedReturnTypes - Bitmap of allowed return types
257 *              ReturnDesc          - Where a return value is stored
258 *
259 * RETURN:      Status
260 *
261 * DESCRIPTION: Evaluates a namespace object and verifies the type of the
262 *              return object.  Common code that simplifies accessing objects
263 *              that have required return objects of fixed types.
264 *
265 *              NOTE: Internal function, no parameter validation
266 *
267 ******************************************************************************/
268
269ACPI_STATUS
270AcpiUtEvaluateObject (
271    ACPI_NAMESPACE_NODE     *PrefixNode,
272    char                    *Path,
273    UINT32                  ExpectedReturnBtypes,
274    ACPI_OPERAND_OBJECT     **ReturnDesc)
275{
276    ACPI_EVALUATE_INFO      *Info;
277    ACPI_STATUS             Status;
278    UINT32                  ReturnBtype;
279
280
281    ACPI_FUNCTION_TRACE (UtEvaluateObject);
282
283
284    /* Allocate the evaluation information block */
285
286    Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
287    if (!Info)
288    {
289        return_ACPI_STATUS (AE_NO_MEMORY);
290    }
291
292    Info->PrefixNode = PrefixNode;
293    Info->Pathname = Path;
294    Info->ParameterType = ACPI_PARAM_ARGS;
295
296    /* Evaluate the object/method */
297
298    Status = AcpiNsEvaluate (Info);
299    if (ACPI_FAILURE (Status))
300    {
301        if (Status == AE_NOT_FOUND)
302        {
303            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s.%s] was not found\n",
304                AcpiUtGetNodeName (PrefixNode), Path));
305        }
306        else
307        {
308            ACPI_ERROR_METHOD ("Method execution failed",
309                PrefixNode, Path, Status);
310        }
311
312        goto Cleanup;
313    }
314
315    /* Did we get a return object? */
316
317    if (!Info->ReturnObject)
318    {
319        if (ExpectedReturnBtypes)
320        {
321            ACPI_ERROR_METHOD ("No object was returned from",
322                PrefixNode, Path, AE_NOT_EXIST);
323
324            Status = AE_NOT_EXIST;
325        }
326
327        goto Cleanup;
328    }
329
330    /* Map the return object type to the bitmapped type */
331
332    switch (ACPI_GET_OBJECT_TYPE (Info->ReturnObject))
333    {
334    case ACPI_TYPE_INTEGER:
335        ReturnBtype = ACPI_BTYPE_INTEGER;
336        break;
337
338    case ACPI_TYPE_BUFFER:
339        ReturnBtype = ACPI_BTYPE_BUFFER;
340        break;
341
342    case ACPI_TYPE_STRING:
343        ReturnBtype = ACPI_BTYPE_STRING;
344        break;
345
346    case ACPI_TYPE_PACKAGE:
347        ReturnBtype = ACPI_BTYPE_PACKAGE;
348        break;
349
350    default:
351        ReturnBtype = 0;
352        break;
353    }
354
355    if ((AcpiGbl_EnableInterpreterSlack) &&
356        (!ExpectedReturnBtypes))
357    {
358        /*
359         * We received a return object, but one was not expected.  This can
360         * happen frequently if the "implicit return" feature is enabled.
361         * Just delete the return object and return AE_OK.
362         */
363        AcpiUtRemoveReference (Info->ReturnObject);
364        goto Cleanup;
365    }
366
367    /* Is the return object one of the expected types? */
368
369    if (!(ExpectedReturnBtypes & ReturnBtype))
370    {
371        ACPI_ERROR_METHOD ("Return object type is incorrect",
372            PrefixNode, Path, AE_TYPE);
373
374        ACPI_ERROR ((AE_INFO,
375            "Type returned from %s was incorrect: %s, expected Btypes: %X",
376            Path, AcpiUtGetObjectTypeName (Info->ReturnObject),
377            ExpectedReturnBtypes));
378
379        /* On error exit, we must delete the return object */
380
381        AcpiUtRemoveReference (Info->ReturnObject);
382        Status = AE_TYPE;
383        goto Cleanup;
384    }
385
386    /* Object type is OK, return it */
387
388    *ReturnDesc = Info->ReturnObject;
389
390Cleanup:
391    ACPI_FREE (Info);
392    return_ACPI_STATUS (Status);
393}
394
395
396/*******************************************************************************
397 *
398 * FUNCTION:    AcpiUtEvaluateNumericObject
399 *
400 * PARAMETERS:  ObjectName          - Object name to be evaluated
401 *              DeviceNode          - Node for the device
402 *              Address             - Where the value is returned
403 *
404 * RETURN:      Status
405 *
406 * DESCRIPTION: Evaluates a numeric namespace object for a selected device
407 *              and stores result in *Address.
408 *
409 *              NOTE: Internal function, no parameter validation
410 *
411 ******************************************************************************/
412
413ACPI_STATUS
414AcpiUtEvaluateNumericObject (
415    char                    *ObjectName,
416    ACPI_NAMESPACE_NODE     *DeviceNode,
417    ACPI_INTEGER            *Address)
418{
419    ACPI_OPERAND_OBJECT     *ObjDesc;
420    ACPI_STATUS             Status;
421
422
423    ACPI_FUNCTION_TRACE (UtEvaluateNumericObject);
424
425
426    Status = AcpiUtEvaluateObject (DeviceNode, ObjectName,
427                ACPI_BTYPE_INTEGER, &ObjDesc);
428    if (ACPI_FAILURE (Status))
429    {
430        return_ACPI_STATUS (Status);
431    }
432
433    /* Get the returned Integer */
434
435    *Address = ObjDesc->Integer.Value;
436
437    /* On exit, we must delete the return object */
438
439    AcpiUtRemoveReference (ObjDesc);
440    return_ACPI_STATUS (Status);
441}
442
443
444/*******************************************************************************
445 *
446 * FUNCTION:    AcpiUtCopyIdString
447 *
448 * PARAMETERS:  Destination         - Where to copy the string
449 *              Source              - Source string
450 *              MaxLength           - Length of the destination buffer
451 *
452 * RETURN:      None
453 *
454 * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
455 *              Performs removal of a leading asterisk if present -- workaround
456 *              for a known issue on a bunch of machines.
457 *
458 ******************************************************************************/
459
460static void
461AcpiUtCopyIdString (
462    char                    *Destination,
463    char                    *Source,
464    ACPI_SIZE               MaxLength)
465{
466
467    /*
468     * Workaround for ID strings that have a leading asterisk. This construct
469     * is not allowed by the ACPI specification  (ID strings must be
470     * alphanumeric), but enough existing machines have this embedded in their
471     * ID strings that the following code is useful.
472     */
473    if (*Source == '*')
474    {
475        Source++;
476    }
477
478    /* Do the actual copy */
479
480    ACPI_STRNCPY (Destination, Source, MaxLength);
481}
482
483
484/*******************************************************************************
485 *
486 * FUNCTION:    AcpiUtExecute_HID
487 *
488 * PARAMETERS:  DeviceNode          - Node for the device
489 *              Hid                 - Where the HID is returned
490 *
491 * RETURN:      Status
492 *
493 * DESCRIPTION: Executes the _HID control method that returns the hardware
494 *              ID of the device.
495 *
496 *              NOTE: Internal function, no parameter validation
497 *
498 ******************************************************************************/
499
500ACPI_STATUS
501AcpiUtExecute_HID (
502    ACPI_NAMESPACE_NODE     *DeviceNode,
503    ACPI_DEVICE_ID          *Hid)
504{
505    ACPI_OPERAND_OBJECT     *ObjDesc;
506    ACPI_STATUS             Status;
507
508
509    ACPI_FUNCTION_TRACE (UtExecute_HID);
510
511
512    Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__HID,
513                ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc);
514    if (ACPI_FAILURE (Status))
515    {
516        return_ACPI_STATUS (Status);
517    }
518
519    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
520    {
521        /* Convert the Numeric HID to string */
522
523        AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, Hid->Value);
524    }
525    else
526    {
527        /* Copy the String HID from the returned object */
528
529        AcpiUtCopyIdString (Hid->Value, ObjDesc->String.Pointer,
530                sizeof (Hid->Value));
531    }
532
533    /* On exit, we must delete the return object */
534
535    AcpiUtRemoveReference (ObjDesc);
536    return_ACPI_STATUS (Status);
537}
538
539
540/*******************************************************************************
541 *
542 * FUNCTION:    AcpiUtTranslateOneCid
543 *
544 * PARAMETERS:  ObjDesc             - _CID object, must be integer or string
545 *              OneCid              - Where the CID string is returned
546 *
547 * RETURN:      Status
548 *
549 * DESCRIPTION: Return a numeric or string _CID value as a string.
550 *              (Compatible ID)
551 *
552 *              NOTE:  Assumes a maximum _CID string length of
553 *                     ACPI_MAX_CID_LENGTH.
554 *
555 ******************************************************************************/
556
557static ACPI_STATUS
558AcpiUtTranslateOneCid (
559    ACPI_OPERAND_OBJECT     *ObjDesc,
560    ACPI_COMPATIBLE_ID      *OneCid)
561{
562
563
564    switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
565    {
566    case ACPI_TYPE_INTEGER:
567
568        /* Convert the Numeric CID to string */
569
570        AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, OneCid->Value);
571        return (AE_OK);
572
573    case ACPI_TYPE_STRING:
574
575        if (ObjDesc->String.Length > ACPI_MAX_CID_LENGTH)
576        {
577            return (AE_AML_STRING_LIMIT);
578        }
579
580        /* Copy the String CID from the returned object */
581
582        AcpiUtCopyIdString (OneCid->Value, ObjDesc->String.Pointer,
583                ACPI_MAX_CID_LENGTH);
584        return (AE_OK);
585
586    default:
587
588        return (AE_TYPE);
589    }
590}
591
592
593/*******************************************************************************
594 *
595 * FUNCTION:    AcpiUtExecute_CID
596 *
597 * PARAMETERS:  DeviceNode          - Node for the device
598 *              ReturnCidList       - Where the CID list is returned
599 *
600 * RETURN:      Status
601 *
602 * DESCRIPTION: Executes the _CID control method that returns one or more
603 *              compatible hardware IDs for the device.
604 *
605 *              NOTE: Internal function, no parameter validation
606 *
607 ******************************************************************************/
608
609ACPI_STATUS
610AcpiUtExecute_CID (
611    ACPI_NAMESPACE_NODE     *DeviceNode,
612    ACPI_COMPATIBLE_ID_LIST **ReturnCidList)
613{
614    ACPI_OPERAND_OBJECT     *ObjDesc;
615    ACPI_STATUS             Status;
616    UINT32                  Count;
617    UINT32                  Size;
618    ACPI_COMPATIBLE_ID_LIST *CidList;
619    ACPI_NATIVE_UINT        i;
620
621
622    ACPI_FUNCTION_TRACE (UtExecute_CID);
623
624
625    /* Evaluate the _CID method for this device */
626
627    Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__CID,
628                ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE,
629                &ObjDesc);
630    if (ACPI_FAILURE (Status))
631    {
632        return_ACPI_STATUS (Status);
633    }
634
635    /* Get the number of _CIDs returned */
636
637    Count = 1;
638    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_PACKAGE)
639    {
640        Count = ObjDesc->Package.Count;
641    }
642
643    /* Allocate a worst-case buffer for the _CIDs */
644
645    Size = (((Count - 1) * sizeof (ACPI_COMPATIBLE_ID)) +
646                           sizeof (ACPI_COMPATIBLE_ID_LIST));
647
648    CidList = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) Size);
649    if (!CidList)
650    {
651        return_ACPI_STATUS (AE_NO_MEMORY);
652    }
653
654    /* Init CID list */
655
656    CidList->Count = Count;
657    CidList->Size  = Size;
658
659    /*
660     *  A _CID can return either a single compatible ID or a package of
661     *  compatible IDs.  Each compatible ID can be one of the following:
662     *  1) Integer (32 bit compressed EISA ID) or
663     *  2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
664     */
665
666    /* The _CID object can be either a single CID or a package (list) of CIDs */
667
668    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_PACKAGE)
669    {
670        /* Translate each package element */
671
672        for (i = 0; i < Count; i++)
673        {
674            Status = AcpiUtTranslateOneCid (ObjDesc->Package.Elements[i],
675                            &CidList->Id[i]);
676            if (ACPI_FAILURE (Status))
677            {
678                break;
679            }
680        }
681    }
682    else
683    {
684        /* Only one CID, translate to a string */
685
686        Status = AcpiUtTranslateOneCid (ObjDesc, CidList->Id);
687    }
688
689    /* Cleanup on error */
690
691    if (ACPI_FAILURE (Status))
692    {
693        ACPI_FREE (CidList);
694    }
695    else
696    {
697        *ReturnCidList = CidList;
698    }
699
700    /* On exit, we must delete the _CID return object */
701
702    AcpiUtRemoveReference (ObjDesc);
703    return_ACPI_STATUS (Status);
704}
705
706
707/*******************************************************************************
708 *
709 * FUNCTION:    AcpiUtExecute_UID
710 *
711 * PARAMETERS:  DeviceNode          - Node for the device
712 *              Uid                 - Where the UID is returned
713 *
714 * RETURN:      Status
715 *
716 * DESCRIPTION: Executes the _UID control method that returns the hardware
717 *              ID of the device.
718 *
719 *              NOTE: Internal function, no parameter validation
720 *
721 ******************************************************************************/
722
723ACPI_STATUS
724AcpiUtExecute_UID (
725    ACPI_NAMESPACE_NODE     *DeviceNode,
726    ACPI_DEVICE_ID          *Uid)
727{
728    ACPI_OPERAND_OBJECT     *ObjDesc;
729    ACPI_STATUS             Status;
730
731
732    ACPI_FUNCTION_TRACE (UtExecute_UID);
733
734
735    Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__UID,
736                ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc);
737    if (ACPI_FAILURE (Status))
738    {
739        return_ACPI_STATUS (Status);
740    }
741
742    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
743    {
744        /* Convert the Numeric UID to string */
745
746        AcpiExUnsignedIntegerToString (ObjDesc->Integer.Value, Uid->Value);
747    }
748    else
749    {
750        /* Copy the String UID from the returned object */
751
752        AcpiUtCopyIdString (Uid->Value, ObjDesc->String.Pointer,
753                sizeof (Uid->Value));
754    }
755
756    /* On exit, we must delete the return object */
757
758    AcpiUtRemoveReference (ObjDesc);
759    return_ACPI_STATUS (Status);
760}
761
762
763/*******************************************************************************
764 *
765 * FUNCTION:    AcpiUtExecute_STA
766 *
767 * PARAMETERS:  DeviceNode          - Node for the device
768 *              Flags               - Where the status flags are returned
769 *
770 * RETURN:      Status
771 *
772 * DESCRIPTION: Executes _STA for selected device and stores results in
773 *              *Flags.
774 *
775 *              NOTE: Internal function, no parameter validation
776 *
777 ******************************************************************************/
778
779ACPI_STATUS
780AcpiUtExecute_STA (
781    ACPI_NAMESPACE_NODE     *DeviceNode,
782    UINT32                  *Flags)
783{
784    ACPI_OPERAND_OBJECT     *ObjDesc;
785    ACPI_STATUS             Status;
786
787
788    ACPI_FUNCTION_TRACE (UtExecute_STA);
789
790
791    Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__STA,
792                ACPI_BTYPE_INTEGER, &ObjDesc);
793    if (ACPI_FAILURE (Status))
794    {
795        if (AE_NOT_FOUND == Status)
796        {
797            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
798                "_STA on %4.4s was not found, assuming device is present\n",
799                AcpiUtGetNodeName (DeviceNode)));
800
801            *Flags = ACPI_UINT32_MAX;
802            Status = AE_OK;
803        }
804
805        return_ACPI_STATUS (Status);
806    }
807
808    /* Extract the status flags */
809
810    *Flags = (UINT32) ObjDesc->Integer.Value;
811
812    /* On exit, we must delete the return object */
813
814    AcpiUtRemoveReference (ObjDesc);
815    return_ACPI_STATUS (Status);
816}
817
818
819/*******************************************************************************
820 *
821 * FUNCTION:    AcpiUtExecute_Sxds
822 *
823 * PARAMETERS:  DeviceNode          - Node for the device
824 *              Flags               - Where the status flags are returned
825 *
826 * RETURN:      Status
827 *
828 * DESCRIPTION: Executes _STA for selected device and stores results in
829 *              *Flags.
830 *
831 *              NOTE: Internal function, no parameter validation
832 *
833 ******************************************************************************/
834
835ACPI_STATUS
836AcpiUtExecute_Sxds (
837    ACPI_NAMESPACE_NODE     *DeviceNode,
838    UINT8                   *Highest)
839{
840    ACPI_OPERAND_OBJECT     *ObjDesc;
841    ACPI_STATUS             Status;
842    UINT32                  i;
843
844
845    ACPI_FUNCTION_TRACE (UtExecute_Sxds);
846
847
848    for (i = 0; i < 4; i++)
849    {
850        Highest[i] = 0xFF;
851        Status = AcpiUtEvaluateObject (DeviceNode,
852                    ACPI_CAST_PTR (char, AcpiGbl_HighestDstateNames[i]),
853                    ACPI_BTYPE_INTEGER, &ObjDesc);
854        if (ACPI_FAILURE (Status))
855        {
856            if (Status != AE_NOT_FOUND)
857            {
858                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
859                    "%s on Device %4.4s, %s\n",
860                    ACPI_CAST_PTR (char, AcpiGbl_HighestDstateNames[i]),
861                    AcpiUtGetNodeName (DeviceNode),
862                    AcpiFormatException (Status)));
863
864                return_ACPI_STATUS (Status);
865            }
866        }
867        else
868        {
869            /* Extract the Dstate value */
870
871            Highest[i] = (UINT8) ObjDesc->Integer.Value;
872
873            /* Delete the return object */
874
875            AcpiUtRemoveReference (ObjDesc);
876        }
877    }
878
879    return_ACPI_STATUS (AE_OK);
880}
881