1*11225SDana.Myers@Sun.COM /****************************************************************************** 2*11225SDana.Myers@Sun.COM * 3*11225SDana.Myers@Sun.COM * Module Name: utids - support for device IDs - HID, UID, CID 4*11225SDana.Myers@Sun.COM * 5*11225SDana.Myers@Sun.COM *****************************************************************************/ 6*11225SDana.Myers@Sun.COM 7*11225SDana.Myers@Sun.COM /****************************************************************************** 8*11225SDana.Myers@Sun.COM * 9*11225SDana.Myers@Sun.COM * 1. Copyright Notice 10*11225SDana.Myers@Sun.COM * 11*11225SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 12*11225SDana.Myers@Sun.COM * All rights reserved. 13*11225SDana.Myers@Sun.COM * 14*11225SDana.Myers@Sun.COM * 2. License 15*11225SDana.Myers@Sun.COM * 16*11225SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 17*11225SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 18*11225SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 19*11225SDana.Myers@Sun.COM * property rights. 20*11225SDana.Myers@Sun.COM * 21*11225SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*11225SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 23*11225SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*11225SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 25*11225SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 26*11225SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 27*11225SDana.Myers@Sun.COM * 28*11225SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*11225SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 30*11225SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 31*11225SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 32*11225SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 33*11225SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 34*11225SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 35*11225SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 36*11225SDana.Myers@Sun.COM * 37*11225SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 38*11225SDana.Myers@Sun.COM * conditions are met: 39*11225SDana.Myers@Sun.COM * 40*11225SDana.Myers@Sun.COM * 3. Conditions 41*11225SDana.Myers@Sun.COM * 42*11225SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*11225SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 44*11225SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 45*11225SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 46*11225SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 47*11225SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 48*11225SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 49*11225SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 50*11225SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 51*11225SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 52*11225SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 53*11225SDana.Myers@Sun.COM * 54*11225SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*11225SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 56*11225SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 57*11225SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 58*11225SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 59*11225SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 60*11225SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 61*11225SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 62*11225SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 63*11225SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 64*11225SDana.Myers@Sun.COM * make. 65*11225SDana.Myers@Sun.COM * 66*11225SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*11225SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 68*11225SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 69*11225SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 70*11225SDana.Myers@Sun.COM * distribution. 71*11225SDana.Myers@Sun.COM * 72*11225SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 73*11225SDana.Myers@Sun.COM * Intel Code. 74*11225SDana.Myers@Sun.COM * 75*11225SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*11225SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 77*11225SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 78*11225SDana.Myers@Sun.COM * without prior written authorization from Intel. 79*11225SDana.Myers@Sun.COM * 80*11225SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 81*11225SDana.Myers@Sun.COM * 82*11225SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*11225SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*11225SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*11225SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*11225SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*11225SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*11225SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 89*11225SDana.Myers@Sun.COM * 90*11225SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*11225SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*11225SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*11225SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*11225SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*11225SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*11225SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*11225SDana.Myers@Sun.COM * LIMITED REMEDY. 98*11225SDana.Myers@Sun.COM * 99*11225SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*11225SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 101*11225SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 102*11225SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 103*11225SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 104*11225SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 105*11225SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 106*11225SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 107*11225SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*11225SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 109*11225SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 110*11225SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 111*11225SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 112*11225SDana.Myers@Sun.COM * such license, approval or letter. 113*11225SDana.Myers@Sun.COM * 114*11225SDana.Myers@Sun.COM *****************************************************************************/ 115*11225SDana.Myers@Sun.COM 116*11225SDana.Myers@Sun.COM #define __UTIDS_C__ 117*11225SDana.Myers@Sun.COM 118*11225SDana.Myers@Sun.COM #include "acpi.h" 119*11225SDana.Myers@Sun.COM #include "accommon.h" 120*11225SDana.Myers@Sun.COM #include "acinterp.h" 121*11225SDana.Myers@Sun.COM 122*11225SDana.Myers@Sun.COM 123*11225SDana.Myers@Sun.COM #define _COMPONENT ACPI_UTILITIES 124*11225SDana.Myers@Sun.COM ACPI_MODULE_NAME ("utids") 125*11225SDana.Myers@Sun.COM 126*11225SDana.Myers@Sun.COM /* Local prototypes */ 127*11225SDana.Myers@Sun.COM 128*11225SDana.Myers@Sun.COM static void 129*11225SDana.Myers@Sun.COM AcpiUtCopyIdString ( 130*11225SDana.Myers@Sun.COM char *Destination, 131*11225SDana.Myers@Sun.COM char *Source); 132*11225SDana.Myers@Sun.COM 133*11225SDana.Myers@Sun.COM 134*11225SDana.Myers@Sun.COM /******************************************************************************* 135*11225SDana.Myers@Sun.COM * 136*11225SDana.Myers@Sun.COM * FUNCTION: AcpiUtCopyIdString 137*11225SDana.Myers@Sun.COM * 138*11225SDana.Myers@Sun.COM * PARAMETERS: Destination - Where to copy the string 139*11225SDana.Myers@Sun.COM * Source - Source string 140*11225SDana.Myers@Sun.COM * 141*11225SDana.Myers@Sun.COM * RETURN: None 142*11225SDana.Myers@Sun.COM * 143*11225SDana.Myers@Sun.COM * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods. 144*11225SDana.Myers@Sun.COM * Performs removal of a leading asterisk if present -- workaround 145*11225SDana.Myers@Sun.COM * for a known issue on a bunch of machines. 146*11225SDana.Myers@Sun.COM * 147*11225SDana.Myers@Sun.COM ******************************************************************************/ 148*11225SDana.Myers@Sun.COM 149*11225SDana.Myers@Sun.COM static void 150*11225SDana.Myers@Sun.COM AcpiUtCopyIdString ( 151*11225SDana.Myers@Sun.COM char *Destination, 152*11225SDana.Myers@Sun.COM char *Source) 153*11225SDana.Myers@Sun.COM { 154*11225SDana.Myers@Sun.COM 155*11225SDana.Myers@Sun.COM /* 156*11225SDana.Myers@Sun.COM * Workaround for ID strings that have a leading asterisk. This construct 157*11225SDana.Myers@Sun.COM * is not allowed by the ACPI specification (ID strings must be 158*11225SDana.Myers@Sun.COM * alphanumeric), but enough existing machines have this embedded in their 159*11225SDana.Myers@Sun.COM * ID strings that the following code is useful. 160*11225SDana.Myers@Sun.COM */ 161*11225SDana.Myers@Sun.COM if (*Source == '*') 162*11225SDana.Myers@Sun.COM { 163*11225SDana.Myers@Sun.COM Source++; 164*11225SDana.Myers@Sun.COM } 165*11225SDana.Myers@Sun.COM 166*11225SDana.Myers@Sun.COM /* Do the actual copy */ 167*11225SDana.Myers@Sun.COM 168*11225SDana.Myers@Sun.COM ACPI_STRCPY (Destination, Source); 169*11225SDana.Myers@Sun.COM } 170*11225SDana.Myers@Sun.COM 171*11225SDana.Myers@Sun.COM 172*11225SDana.Myers@Sun.COM /******************************************************************************* 173*11225SDana.Myers@Sun.COM * 174*11225SDana.Myers@Sun.COM * FUNCTION: AcpiUtExecute_HID 175*11225SDana.Myers@Sun.COM * 176*11225SDana.Myers@Sun.COM * PARAMETERS: DeviceNode - Node for the device 177*11225SDana.Myers@Sun.COM * ReturnId - Where the string HID is returned 178*11225SDana.Myers@Sun.COM * 179*11225SDana.Myers@Sun.COM * RETURN: Status 180*11225SDana.Myers@Sun.COM * 181*11225SDana.Myers@Sun.COM * DESCRIPTION: Executes the _HID control method that returns the hardware 182*11225SDana.Myers@Sun.COM * ID of the device. The HID is either an 32-bit encoded EISAID 183*11225SDana.Myers@Sun.COM * Integer or a String. A string is always returned. An EISAID 184*11225SDana.Myers@Sun.COM * is converted to a string. 185*11225SDana.Myers@Sun.COM * 186*11225SDana.Myers@Sun.COM * NOTE: Internal function, no parameter validation 187*11225SDana.Myers@Sun.COM * 188*11225SDana.Myers@Sun.COM ******************************************************************************/ 189*11225SDana.Myers@Sun.COM 190*11225SDana.Myers@Sun.COM ACPI_STATUS 191*11225SDana.Myers@Sun.COM AcpiUtExecute_HID ( 192*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *DeviceNode, 193*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID **ReturnId) 194*11225SDana.Myers@Sun.COM { 195*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc; 196*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID *Hid; 197*11225SDana.Myers@Sun.COM UINT32 Length; 198*11225SDana.Myers@Sun.COM ACPI_STATUS Status; 199*11225SDana.Myers@Sun.COM 200*11225SDana.Myers@Sun.COM 201*11225SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (UtExecute_HID); 202*11225SDana.Myers@Sun.COM 203*11225SDana.Myers@Sun.COM 204*11225SDana.Myers@Sun.COM Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__HID, 205*11225SDana.Myers@Sun.COM ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc); 206*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 207*11225SDana.Myers@Sun.COM { 208*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 209*11225SDana.Myers@Sun.COM } 210*11225SDana.Myers@Sun.COM 211*11225SDana.Myers@Sun.COM /* Get the size of the String to be returned, includes null terminator */ 212*11225SDana.Myers@Sun.COM 213*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 214*11225SDana.Myers@Sun.COM { 215*11225SDana.Myers@Sun.COM Length = ACPI_EISAID_STRING_SIZE; 216*11225SDana.Myers@Sun.COM } 217*11225SDana.Myers@Sun.COM else 218*11225SDana.Myers@Sun.COM { 219*11225SDana.Myers@Sun.COM Length = ObjDesc->String.Length + 1; 220*11225SDana.Myers@Sun.COM } 221*11225SDana.Myers@Sun.COM 222*11225SDana.Myers@Sun.COM /* Allocate a buffer for the HID */ 223*11225SDana.Myers@Sun.COM 224*11225SDana.Myers@Sun.COM Hid = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DEVICE_ID) + (ACPI_SIZE) Length); 225*11225SDana.Myers@Sun.COM if (!Hid) 226*11225SDana.Myers@Sun.COM { 227*11225SDana.Myers@Sun.COM Status = AE_NO_MEMORY; 228*11225SDana.Myers@Sun.COM goto Cleanup; 229*11225SDana.Myers@Sun.COM } 230*11225SDana.Myers@Sun.COM 231*11225SDana.Myers@Sun.COM /* Area for the string starts after DEVICE_ID struct */ 232*11225SDana.Myers@Sun.COM 233*11225SDana.Myers@Sun.COM Hid->String = ACPI_ADD_PTR (char, Hid, sizeof (ACPI_DEVICE_ID)); 234*11225SDana.Myers@Sun.COM 235*11225SDana.Myers@Sun.COM /* Convert EISAID to a string or simply copy existing string */ 236*11225SDana.Myers@Sun.COM 237*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 238*11225SDana.Myers@Sun.COM { 239*11225SDana.Myers@Sun.COM AcpiExEisaIdToString (Hid->String, ObjDesc->Integer.Value); 240*11225SDana.Myers@Sun.COM } 241*11225SDana.Myers@Sun.COM else 242*11225SDana.Myers@Sun.COM { 243*11225SDana.Myers@Sun.COM AcpiUtCopyIdString (Hid->String, ObjDesc->String.Pointer); 244*11225SDana.Myers@Sun.COM } 245*11225SDana.Myers@Sun.COM 246*11225SDana.Myers@Sun.COM Hid->Length = Length; 247*11225SDana.Myers@Sun.COM *ReturnId = Hid; 248*11225SDana.Myers@Sun.COM 249*11225SDana.Myers@Sun.COM 250*11225SDana.Myers@Sun.COM Cleanup: 251*11225SDana.Myers@Sun.COM 252*11225SDana.Myers@Sun.COM /* On exit, we must delete the return object */ 253*11225SDana.Myers@Sun.COM 254*11225SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 255*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 256*11225SDana.Myers@Sun.COM } 257*11225SDana.Myers@Sun.COM 258*11225SDana.Myers@Sun.COM 259*11225SDana.Myers@Sun.COM /******************************************************************************* 260*11225SDana.Myers@Sun.COM * 261*11225SDana.Myers@Sun.COM * FUNCTION: AcpiUtExecute_UID 262*11225SDana.Myers@Sun.COM * 263*11225SDana.Myers@Sun.COM * PARAMETERS: DeviceNode - Node for the device 264*11225SDana.Myers@Sun.COM * ReturnId - Where the string UID is returned 265*11225SDana.Myers@Sun.COM * 266*11225SDana.Myers@Sun.COM * RETURN: Status 267*11225SDana.Myers@Sun.COM * 268*11225SDana.Myers@Sun.COM * DESCRIPTION: Executes the _UID control method that returns the unique 269*11225SDana.Myers@Sun.COM * ID of the device. The UID is either a 64-bit Integer (NOT an 270*11225SDana.Myers@Sun.COM * EISAID) or a string. Always returns a string. A 64-bit integer 271*11225SDana.Myers@Sun.COM * is converted to a decimal string. 272*11225SDana.Myers@Sun.COM * 273*11225SDana.Myers@Sun.COM * NOTE: Internal function, no parameter validation 274*11225SDana.Myers@Sun.COM * 275*11225SDana.Myers@Sun.COM ******************************************************************************/ 276*11225SDana.Myers@Sun.COM 277*11225SDana.Myers@Sun.COM ACPI_STATUS 278*11225SDana.Myers@Sun.COM AcpiUtExecute_UID ( 279*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *DeviceNode, 280*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID **ReturnId) 281*11225SDana.Myers@Sun.COM { 282*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc; 283*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID *Uid; 284*11225SDana.Myers@Sun.COM UINT32 Length; 285*11225SDana.Myers@Sun.COM ACPI_STATUS Status; 286*11225SDana.Myers@Sun.COM 287*11225SDana.Myers@Sun.COM 288*11225SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (UtExecute_UID); 289*11225SDana.Myers@Sun.COM 290*11225SDana.Myers@Sun.COM 291*11225SDana.Myers@Sun.COM Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__UID, 292*11225SDana.Myers@Sun.COM ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc); 293*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 294*11225SDana.Myers@Sun.COM { 295*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 296*11225SDana.Myers@Sun.COM } 297*11225SDana.Myers@Sun.COM 298*11225SDana.Myers@Sun.COM /* Get the size of the String to be returned, includes null terminator */ 299*11225SDana.Myers@Sun.COM 300*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 301*11225SDana.Myers@Sun.COM { 302*11225SDana.Myers@Sun.COM Length = ACPI_MAX64_DECIMAL_DIGITS + 1; 303*11225SDana.Myers@Sun.COM } 304*11225SDana.Myers@Sun.COM else 305*11225SDana.Myers@Sun.COM { 306*11225SDana.Myers@Sun.COM Length = ObjDesc->String.Length + 1; 307*11225SDana.Myers@Sun.COM } 308*11225SDana.Myers@Sun.COM 309*11225SDana.Myers@Sun.COM /* Allocate a buffer for the UID */ 310*11225SDana.Myers@Sun.COM 311*11225SDana.Myers@Sun.COM Uid = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DEVICE_ID) + (ACPI_SIZE) Length); 312*11225SDana.Myers@Sun.COM if (!Uid) 313*11225SDana.Myers@Sun.COM { 314*11225SDana.Myers@Sun.COM Status = AE_NO_MEMORY; 315*11225SDana.Myers@Sun.COM goto Cleanup; 316*11225SDana.Myers@Sun.COM } 317*11225SDana.Myers@Sun.COM 318*11225SDana.Myers@Sun.COM /* Area for the string starts after DEVICE_ID struct */ 319*11225SDana.Myers@Sun.COM 320*11225SDana.Myers@Sun.COM Uid->String = ACPI_ADD_PTR (char, Uid, sizeof (ACPI_DEVICE_ID)); 321*11225SDana.Myers@Sun.COM 322*11225SDana.Myers@Sun.COM /* Convert an Integer to string, or just copy an existing string */ 323*11225SDana.Myers@Sun.COM 324*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 325*11225SDana.Myers@Sun.COM { 326*11225SDana.Myers@Sun.COM AcpiExIntegerToString (Uid->String, ObjDesc->Integer.Value); 327*11225SDana.Myers@Sun.COM } 328*11225SDana.Myers@Sun.COM else 329*11225SDana.Myers@Sun.COM { 330*11225SDana.Myers@Sun.COM AcpiUtCopyIdString (Uid->String, ObjDesc->String.Pointer); 331*11225SDana.Myers@Sun.COM } 332*11225SDana.Myers@Sun.COM 333*11225SDana.Myers@Sun.COM Uid->Length = Length; 334*11225SDana.Myers@Sun.COM *ReturnId = Uid; 335*11225SDana.Myers@Sun.COM 336*11225SDana.Myers@Sun.COM 337*11225SDana.Myers@Sun.COM Cleanup: 338*11225SDana.Myers@Sun.COM 339*11225SDana.Myers@Sun.COM /* On exit, we must delete the return object */ 340*11225SDana.Myers@Sun.COM 341*11225SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 342*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 343*11225SDana.Myers@Sun.COM } 344*11225SDana.Myers@Sun.COM 345*11225SDana.Myers@Sun.COM 346*11225SDana.Myers@Sun.COM /******************************************************************************* 347*11225SDana.Myers@Sun.COM * 348*11225SDana.Myers@Sun.COM * FUNCTION: AcpiUtExecute_CID 349*11225SDana.Myers@Sun.COM * 350*11225SDana.Myers@Sun.COM * PARAMETERS: DeviceNode - Node for the device 351*11225SDana.Myers@Sun.COM * ReturnCidList - Where the CID list is returned 352*11225SDana.Myers@Sun.COM * 353*11225SDana.Myers@Sun.COM * RETURN: Status, list of CID strings 354*11225SDana.Myers@Sun.COM * 355*11225SDana.Myers@Sun.COM * DESCRIPTION: Executes the _CID control method that returns one or more 356*11225SDana.Myers@Sun.COM * compatible hardware IDs for the device. 357*11225SDana.Myers@Sun.COM * 358*11225SDana.Myers@Sun.COM * NOTE: Internal function, no parameter validation 359*11225SDana.Myers@Sun.COM * 360*11225SDana.Myers@Sun.COM * A _CID method can return either a single compatible ID or a package of 361*11225SDana.Myers@Sun.COM * compatible IDs. Each compatible ID can be one of the following: 362*11225SDana.Myers@Sun.COM * 1) Integer (32 bit compressed EISA ID) or 363*11225SDana.Myers@Sun.COM * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss") 364*11225SDana.Myers@Sun.COM * 365*11225SDana.Myers@Sun.COM * The Integer CIDs are converted to string format by this function. 366*11225SDana.Myers@Sun.COM * 367*11225SDana.Myers@Sun.COM ******************************************************************************/ 368*11225SDana.Myers@Sun.COM 369*11225SDana.Myers@Sun.COM ACPI_STATUS 370*11225SDana.Myers@Sun.COM AcpiUtExecute_CID ( 371*11225SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *DeviceNode, 372*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID_LIST **ReturnCidList) 373*11225SDana.Myers@Sun.COM { 374*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **CidObjects; 375*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc; 376*11225SDana.Myers@Sun.COM ACPI_DEVICE_ID_LIST *CidList; 377*11225SDana.Myers@Sun.COM char *NextIdString; 378*11225SDana.Myers@Sun.COM UINT32 StringAreaSize; 379*11225SDana.Myers@Sun.COM UINT32 Length; 380*11225SDana.Myers@Sun.COM UINT32 CidListSize; 381*11225SDana.Myers@Sun.COM ACPI_STATUS Status; 382*11225SDana.Myers@Sun.COM UINT32 Count; 383*11225SDana.Myers@Sun.COM UINT32 i; 384*11225SDana.Myers@Sun.COM 385*11225SDana.Myers@Sun.COM 386*11225SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (UtExecute_CID); 387*11225SDana.Myers@Sun.COM 388*11225SDana.Myers@Sun.COM 389*11225SDana.Myers@Sun.COM /* Evaluate the _CID method for this device */ 390*11225SDana.Myers@Sun.COM 391*11225SDana.Myers@Sun.COM Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__CID, 392*11225SDana.Myers@Sun.COM ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE, 393*11225SDana.Myers@Sun.COM &ObjDesc); 394*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 395*11225SDana.Myers@Sun.COM { 396*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 397*11225SDana.Myers@Sun.COM } 398*11225SDana.Myers@Sun.COM 399*11225SDana.Myers@Sun.COM /* 400*11225SDana.Myers@Sun.COM * Get the count and size of the returned _CIDs. _CID can return either 401*11225SDana.Myers@Sun.COM * a Package of Integers/Strings or a single Integer or String. 402*11225SDana.Myers@Sun.COM * Note: This section also validates that all CID elements are of the 403*11225SDana.Myers@Sun.COM * correct type (Integer or String). 404*11225SDana.Myers@Sun.COM */ 405*11225SDana.Myers@Sun.COM if (ObjDesc->Common.Type == ACPI_TYPE_PACKAGE) 406*11225SDana.Myers@Sun.COM { 407*11225SDana.Myers@Sun.COM Count = ObjDesc->Package.Count; 408*11225SDana.Myers@Sun.COM CidObjects = ObjDesc->Package.Elements; 409*11225SDana.Myers@Sun.COM } 410*11225SDana.Myers@Sun.COM else /* Single Integer or String CID */ 411*11225SDana.Myers@Sun.COM { 412*11225SDana.Myers@Sun.COM Count = 1; 413*11225SDana.Myers@Sun.COM CidObjects = &ObjDesc; 414*11225SDana.Myers@Sun.COM } 415*11225SDana.Myers@Sun.COM 416*11225SDana.Myers@Sun.COM StringAreaSize = 0; 417*11225SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 418*11225SDana.Myers@Sun.COM { 419*11225SDana.Myers@Sun.COM /* String lengths include null terminator */ 420*11225SDana.Myers@Sun.COM 421*11225SDana.Myers@Sun.COM switch (CidObjects[i]->Common.Type) 422*11225SDana.Myers@Sun.COM { 423*11225SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 424*11225SDana.Myers@Sun.COM StringAreaSize += ACPI_EISAID_STRING_SIZE; 425*11225SDana.Myers@Sun.COM break; 426*11225SDana.Myers@Sun.COM 427*11225SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 428*11225SDana.Myers@Sun.COM StringAreaSize += CidObjects[i]->String.Length + 1; 429*11225SDana.Myers@Sun.COM break; 430*11225SDana.Myers@Sun.COM 431*11225SDana.Myers@Sun.COM default: 432*11225SDana.Myers@Sun.COM Status = AE_TYPE; 433*11225SDana.Myers@Sun.COM goto Cleanup; 434*11225SDana.Myers@Sun.COM } 435*11225SDana.Myers@Sun.COM } 436*11225SDana.Myers@Sun.COM 437*11225SDana.Myers@Sun.COM /* 438*11225SDana.Myers@Sun.COM * Now that we know the length of the CIDs, allocate return buffer: 439*11225SDana.Myers@Sun.COM * 1) Size of the base structure + 440*11225SDana.Myers@Sun.COM * 2) Size of the CID DEVICE_ID array + 441*11225SDana.Myers@Sun.COM * 3) Size of the actual CID strings 442*11225SDana.Myers@Sun.COM */ 443*11225SDana.Myers@Sun.COM CidListSize = sizeof (ACPI_DEVICE_ID_LIST) + 444*11225SDana.Myers@Sun.COM ((Count - 1) * sizeof (ACPI_DEVICE_ID)) + 445*11225SDana.Myers@Sun.COM StringAreaSize; 446*11225SDana.Myers@Sun.COM 447*11225SDana.Myers@Sun.COM CidList = ACPI_ALLOCATE_ZEROED (CidListSize); 448*11225SDana.Myers@Sun.COM if (!CidList) 449*11225SDana.Myers@Sun.COM { 450*11225SDana.Myers@Sun.COM Status = AE_NO_MEMORY; 451*11225SDana.Myers@Sun.COM goto Cleanup; 452*11225SDana.Myers@Sun.COM } 453*11225SDana.Myers@Sun.COM 454*11225SDana.Myers@Sun.COM /* Area for CID strings starts after the CID DEVICE_ID array */ 455*11225SDana.Myers@Sun.COM 456*11225SDana.Myers@Sun.COM NextIdString = ACPI_CAST_PTR (char, CidList->Ids) + 457*11225SDana.Myers@Sun.COM ((ACPI_SIZE) Count * sizeof (ACPI_DEVICE_ID)); 458*11225SDana.Myers@Sun.COM 459*11225SDana.Myers@Sun.COM /* Copy/convert the CIDs to the return buffer */ 460*11225SDana.Myers@Sun.COM 461*11225SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 462*11225SDana.Myers@Sun.COM { 463*11225SDana.Myers@Sun.COM if (CidObjects[i]->Common.Type == ACPI_TYPE_INTEGER) 464*11225SDana.Myers@Sun.COM { 465*11225SDana.Myers@Sun.COM /* Convert the Integer (EISAID) CID to a string */ 466*11225SDana.Myers@Sun.COM 467*11225SDana.Myers@Sun.COM AcpiExEisaIdToString (NextIdString, CidObjects[i]->Integer.Value); 468*11225SDana.Myers@Sun.COM Length = ACPI_EISAID_STRING_SIZE; 469*11225SDana.Myers@Sun.COM } 470*11225SDana.Myers@Sun.COM else /* ACPI_TYPE_STRING */ 471*11225SDana.Myers@Sun.COM { 472*11225SDana.Myers@Sun.COM /* Copy the String CID from the returned object */ 473*11225SDana.Myers@Sun.COM 474*11225SDana.Myers@Sun.COM AcpiUtCopyIdString (NextIdString, CidObjects[i]->String.Pointer); 475*11225SDana.Myers@Sun.COM Length = CidObjects[i]->String.Length + 1; 476*11225SDana.Myers@Sun.COM } 477*11225SDana.Myers@Sun.COM 478*11225SDana.Myers@Sun.COM CidList->Ids[i].String = NextIdString; 479*11225SDana.Myers@Sun.COM CidList->Ids[i].Length = Length; 480*11225SDana.Myers@Sun.COM NextIdString += Length; 481*11225SDana.Myers@Sun.COM } 482*11225SDana.Myers@Sun.COM 483*11225SDana.Myers@Sun.COM /* Finish the CID list */ 484*11225SDana.Myers@Sun.COM 485*11225SDana.Myers@Sun.COM CidList->Count = Count; 486*11225SDana.Myers@Sun.COM CidList->ListSize = CidListSize; 487*11225SDana.Myers@Sun.COM *ReturnCidList = CidList; 488*11225SDana.Myers@Sun.COM 489*11225SDana.Myers@Sun.COM 490*11225SDana.Myers@Sun.COM Cleanup: 491*11225SDana.Myers@Sun.COM 492*11225SDana.Myers@Sun.COM /* On exit, we must delete the _CID return object */ 493*11225SDana.Myers@Sun.COM 494*11225SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 495*11225SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 496*11225SDana.Myers@Sun.COM } 497*11225SDana.Myers@Sun.COM 498