1*a159c266SJung-uk Kim /****************************************************************************** 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: utids - support for device IDs - HID, UID, CID 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim *****************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim #define __UTIDS_C__ 45*a159c266SJung-uk Kim 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 49*a159c266SJung-uk Kim 50*a159c266SJung-uk Kim 51*a159c266SJung-uk Kim #define _COMPONENT ACPI_UTILITIES 52*a159c266SJung-uk Kim ACPI_MODULE_NAME ("utids") 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim 55*a159c266SJung-uk Kim /******************************************************************************* 56*a159c266SJung-uk Kim * 57*a159c266SJung-uk Kim * FUNCTION: AcpiUtExecute_HID 58*a159c266SJung-uk Kim * 59*a159c266SJung-uk Kim * PARAMETERS: DeviceNode - Node for the device 60*a159c266SJung-uk Kim * ReturnId - Where the string HID is returned 61*a159c266SJung-uk Kim * 62*a159c266SJung-uk Kim * RETURN: Status 63*a159c266SJung-uk Kim * 64*a159c266SJung-uk Kim * DESCRIPTION: Executes the _HID control method that returns the hardware 65*a159c266SJung-uk Kim * ID of the device. The HID is either an 32-bit encoded EISAID 66*a159c266SJung-uk Kim * Integer or a String. A string is always returned. An EISAID 67*a159c266SJung-uk Kim * is converted to a string. 68*a159c266SJung-uk Kim * 69*a159c266SJung-uk Kim * NOTE: Internal function, no parameter validation 70*a159c266SJung-uk Kim * 71*a159c266SJung-uk Kim ******************************************************************************/ 72*a159c266SJung-uk Kim 73*a159c266SJung-uk Kim ACPI_STATUS 74*a159c266SJung-uk Kim AcpiUtExecute_HID ( 75*a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *DeviceNode, 76*a159c266SJung-uk Kim ACPI_DEVICE_ID **ReturnId) 77*a159c266SJung-uk Kim { 78*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc; 79*a159c266SJung-uk Kim ACPI_DEVICE_ID *Hid; 80*a159c266SJung-uk Kim UINT32 Length; 81*a159c266SJung-uk Kim ACPI_STATUS Status; 82*a159c266SJung-uk Kim 83*a159c266SJung-uk Kim 84*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtExecute_HID); 85*a159c266SJung-uk Kim 86*a159c266SJung-uk Kim 87*a159c266SJung-uk Kim Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__HID, 88*a159c266SJung-uk Kim ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc); 89*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 90*a159c266SJung-uk Kim { 91*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 92*a159c266SJung-uk Kim } 93*a159c266SJung-uk Kim 94*a159c266SJung-uk Kim /* Get the size of the String to be returned, includes null terminator */ 95*a159c266SJung-uk Kim 96*a159c266SJung-uk Kim if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 97*a159c266SJung-uk Kim { 98*a159c266SJung-uk Kim Length = ACPI_EISAID_STRING_SIZE; 99*a159c266SJung-uk Kim } 100*a159c266SJung-uk Kim else 101*a159c266SJung-uk Kim { 102*a159c266SJung-uk Kim Length = ObjDesc->String.Length + 1; 103*a159c266SJung-uk Kim } 104*a159c266SJung-uk Kim 105*a159c266SJung-uk Kim /* Allocate a buffer for the HID */ 106*a159c266SJung-uk Kim 107*a159c266SJung-uk Kim Hid = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DEVICE_ID) + (ACPI_SIZE) Length); 108*a159c266SJung-uk Kim if (!Hid) 109*a159c266SJung-uk Kim { 110*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 111*a159c266SJung-uk Kim goto Cleanup; 112*a159c266SJung-uk Kim } 113*a159c266SJung-uk Kim 114*a159c266SJung-uk Kim /* Area for the string starts after DEVICE_ID struct */ 115*a159c266SJung-uk Kim 116*a159c266SJung-uk Kim Hid->String = ACPI_ADD_PTR (char, Hid, sizeof (ACPI_DEVICE_ID)); 117*a159c266SJung-uk Kim 118*a159c266SJung-uk Kim /* Convert EISAID to a string or simply copy existing string */ 119*a159c266SJung-uk Kim 120*a159c266SJung-uk Kim if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 121*a159c266SJung-uk Kim { 122*a159c266SJung-uk Kim AcpiExEisaIdToString (Hid->String, ObjDesc->Integer.Value); 123*a159c266SJung-uk Kim } 124*a159c266SJung-uk Kim else 125*a159c266SJung-uk Kim { 126*a159c266SJung-uk Kim ACPI_STRCPY (Hid->String, ObjDesc->String.Pointer); 127*a159c266SJung-uk Kim } 128*a159c266SJung-uk Kim 129*a159c266SJung-uk Kim Hid->Length = Length; 130*a159c266SJung-uk Kim *ReturnId = Hid; 131*a159c266SJung-uk Kim 132*a159c266SJung-uk Kim 133*a159c266SJung-uk Kim Cleanup: 134*a159c266SJung-uk Kim 135*a159c266SJung-uk Kim /* On exit, we must delete the return object */ 136*a159c266SJung-uk Kim 137*a159c266SJung-uk Kim AcpiUtRemoveReference (ObjDesc); 138*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 139*a159c266SJung-uk Kim } 140*a159c266SJung-uk Kim 141*a159c266SJung-uk Kim 142*a159c266SJung-uk Kim /******************************************************************************* 143*a159c266SJung-uk Kim * 144*a159c266SJung-uk Kim * FUNCTION: AcpiUtExecute_UID 145*a159c266SJung-uk Kim * 146*a159c266SJung-uk Kim * PARAMETERS: DeviceNode - Node for the device 147*a159c266SJung-uk Kim * ReturnId - Where the string UID is returned 148*a159c266SJung-uk Kim * 149*a159c266SJung-uk Kim * RETURN: Status 150*a159c266SJung-uk Kim * 151*a159c266SJung-uk Kim * DESCRIPTION: Executes the _UID control method that returns the unique 152*a159c266SJung-uk Kim * ID of the device. The UID is either a 64-bit Integer (NOT an 153*a159c266SJung-uk Kim * EISAID) or a string. Always returns a string. A 64-bit integer 154*a159c266SJung-uk Kim * is converted to a decimal string. 155*a159c266SJung-uk Kim * 156*a159c266SJung-uk Kim * NOTE: Internal function, no parameter validation 157*a159c266SJung-uk Kim * 158*a159c266SJung-uk Kim ******************************************************************************/ 159*a159c266SJung-uk Kim 160*a159c266SJung-uk Kim ACPI_STATUS 161*a159c266SJung-uk Kim AcpiUtExecute_UID ( 162*a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *DeviceNode, 163*a159c266SJung-uk Kim ACPI_DEVICE_ID **ReturnId) 164*a159c266SJung-uk Kim { 165*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc; 166*a159c266SJung-uk Kim ACPI_DEVICE_ID *Uid; 167*a159c266SJung-uk Kim UINT32 Length; 168*a159c266SJung-uk Kim ACPI_STATUS Status; 169*a159c266SJung-uk Kim 170*a159c266SJung-uk Kim 171*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtExecute_UID); 172*a159c266SJung-uk Kim 173*a159c266SJung-uk Kim 174*a159c266SJung-uk Kim Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__UID, 175*a159c266SJung-uk Kim ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc); 176*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 177*a159c266SJung-uk Kim { 178*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 179*a159c266SJung-uk Kim } 180*a159c266SJung-uk Kim 181*a159c266SJung-uk Kim /* Get the size of the String to be returned, includes null terminator */ 182*a159c266SJung-uk Kim 183*a159c266SJung-uk Kim if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 184*a159c266SJung-uk Kim { 185*a159c266SJung-uk Kim Length = ACPI_MAX64_DECIMAL_DIGITS + 1; 186*a159c266SJung-uk Kim } 187*a159c266SJung-uk Kim else 188*a159c266SJung-uk Kim { 189*a159c266SJung-uk Kim Length = ObjDesc->String.Length + 1; 190*a159c266SJung-uk Kim } 191*a159c266SJung-uk Kim 192*a159c266SJung-uk Kim /* Allocate a buffer for the UID */ 193*a159c266SJung-uk Kim 194*a159c266SJung-uk Kim Uid = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DEVICE_ID) + (ACPI_SIZE) Length); 195*a159c266SJung-uk Kim if (!Uid) 196*a159c266SJung-uk Kim { 197*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 198*a159c266SJung-uk Kim goto Cleanup; 199*a159c266SJung-uk Kim } 200*a159c266SJung-uk Kim 201*a159c266SJung-uk Kim /* Area for the string starts after DEVICE_ID struct */ 202*a159c266SJung-uk Kim 203*a159c266SJung-uk Kim Uid->String = ACPI_ADD_PTR (char, Uid, sizeof (ACPI_DEVICE_ID)); 204*a159c266SJung-uk Kim 205*a159c266SJung-uk Kim /* Convert an Integer to string, or just copy an existing string */ 206*a159c266SJung-uk Kim 207*a159c266SJung-uk Kim if (ObjDesc->Common.Type == ACPI_TYPE_INTEGER) 208*a159c266SJung-uk Kim { 209*a159c266SJung-uk Kim AcpiExIntegerToString (Uid->String, ObjDesc->Integer.Value); 210*a159c266SJung-uk Kim } 211*a159c266SJung-uk Kim else 212*a159c266SJung-uk Kim { 213*a159c266SJung-uk Kim ACPI_STRCPY (Uid->String, ObjDesc->String.Pointer); 214*a159c266SJung-uk Kim } 215*a159c266SJung-uk Kim 216*a159c266SJung-uk Kim Uid->Length = Length; 217*a159c266SJung-uk Kim *ReturnId = Uid; 218*a159c266SJung-uk Kim 219*a159c266SJung-uk Kim 220*a159c266SJung-uk Kim Cleanup: 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim /* On exit, we must delete the return object */ 223*a159c266SJung-uk Kim 224*a159c266SJung-uk Kim AcpiUtRemoveReference (ObjDesc); 225*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 226*a159c266SJung-uk Kim } 227*a159c266SJung-uk Kim 228*a159c266SJung-uk Kim 229*a159c266SJung-uk Kim /******************************************************************************* 230*a159c266SJung-uk Kim * 231*a159c266SJung-uk Kim * FUNCTION: AcpiUtExecute_CID 232*a159c266SJung-uk Kim * 233*a159c266SJung-uk Kim * PARAMETERS: DeviceNode - Node for the device 234*a159c266SJung-uk Kim * ReturnCidList - Where the CID list is returned 235*a159c266SJung-uk Kim * 236*a159c266SJung-uk Kim * RETURN: Status, list of CID strings 237*a159c266SJung-uk Kim * 238*a159c266SJung-uk Kim * DESCRIPTION: Executes the _CID control method that returns one or more 239*a159c266SJung-uk Kim * compatible hardware IDs for the device. 240*a159c266SJung-uk Kim * 241*a159c266SJung-uk Kim * NOTE: Internal function, no parameter validation 242*a159c266SJung-uk Kim * 243*a159c266SJung-uk Kim * A _CID method can return either a single compatible ID or a package of 244*a159c266SJung-uk Kim * compatible IDs. Each compatible ID can be one of the following: 245*a159c266SJung-uk Kim * 1) Integer (32 bit compressed EISA ID) or 246*a159c266SJung-uk Kim * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss") 247*a159c266SJung-uk Kim * 248*a159c266SJung-uk Kim * The Integer CIDs are converted to string format by this function. 249*a159c266SJung-uk Kim * 250*a159c266SJung-uk Kim ******************************************************************************/ 251*a159c266SJung-uk Kim 252*a159c266SJung-uk Kim ACPI_STATUS 253*a159c266SJung-uk Kim AcpiUtExecute_CID ( 254*a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *DeviceNode, 255*a159c266SJung-uk Kim ACPI_DEVICE_ID_LIST **ReturnCidList) 256*a159c266SJung-uk Kim { 257*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **CidObjects; 258*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc; 259*a159c266SJung-uk Kim ACPI_DEVICE_ID_LIST *CidList; 260*a159c266SJung-uk Kim char *NextIdString; 261*a159c266SJung-uk Kim UINT32 StringAreaSize; 262*a159c266SJung-uk Kim UINT32 Length; 263*a159c266SJung-uk Kim UINT32 CidListSize; 264*a159c266SJung-uk Kim ACPI_STATUS Status; 265*a159c266SJung-uk Kim UINT32 Count; 266*a159c266SJung-uk Kim UINT32 i; 267*a159c266SJung-uk Kim 268*a159c266SJung-uk Kim 269*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtExecute_CID); 270*a159c266SJung-uk Kim 271*a159c266SJung-uk Kim 272*a159c266SJung-uk Kim /* Evaluate the _CID method for this device */ 273*a159c266SJung-uk Kim 274*a159c266SJung-uk Kim Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__CID, 275*a159c266SJung-uk Kim ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE, 276*a159c266SJung-uk Kim &ObjDesc); 277*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 278*a159c266SJung-uk Kim { 279*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 280*a159c266SJung-uk Kim } 281*a159c266SJung-uk Kim 282*a159c266SJung-uk Kim /* 283*a159c266SJung-uk Kim * Get the count and size of the returned _CIDs. _CID can return either 284*a159c266SJung-uk Kim * a Package of Integers/Strings or a single Integer or String. 285*a159c266SJung-uk Kim * Note: This section also validates that all CID elements are of the 286*a159c266SJung-uk Kim * correct type (Integer or String). 287*a159c266SJung-uk Kim */ 288*a159c266SJung-uk Kim if (ObjDesc->Common.Type == ACPI_TYPE_PACKAGE) 289*a159c266SJung-uk Kim { 290*a159c266SJung-uk Kim Count = ObjDesc->Package.Count; 291*a159c266SJung-uk Kim CidObjects = ObjDesc->Package.Elements; 292*a159c266SJung-uk Kim } 293*a159c266SJung-uk Kim else /* Single Integer or String CID */ 294*a159c266SJung-uk Kim { 295*a159c266SJung-uk Kim Count = 1; 296*a159c266SJung-uk Kim CidObjects = &ObjDesc; 297*a159c266SJung-uk Kim } 298*a159c266SJung-uk Kim 299*a159c266SJung-uk Kim StringAreaSize = 0; 300*a159c266SJung-uk Kim for (i = 0; i < Count; i++) 301*a159c266SJung-uk Kim { 302*a159c266SJung-uk Kim /* String lengths include null terminator */ 303*a159c266SJung-uk Kim 304*a159c266SJung-uk Kim switch (CidObjects[i]->Common.Type) 305*a159c266SJung-uk Kim { 306*a159c266SJung-uk Kim case ACPI_TYPE_INTEGER: 307*a159c266SJung-uk Kim StringAreaSize += ACPI_EISAID_STRING_SIZE; 308*a159c266SJung-uk Kim break; 309*a159c266SJung-uk Kim 310*a159c266SJung-uk Kim case ACPI_TYPE_STRING: 311*a159c266SJung-uk Kim StringAreaSize += CidObjects[i]->String.Length + 1; 312*a159c266SJung-uk Kim break; 313*a159c266SJung-uk Kim 314*a159c266SJung-uk Kim default: 315*a159c266SJung-uk Kim Status = AE_TYPE; 316*a159c266SJung-uk Kim goto Cleanup; 317*a159c266SJung-uk Kim } 318*a159c266SJung-uk Kim } 319*a159c266SJung-uk Kim 320*a159c266SJung-uk Kim /* 321*a159c266SJung-uk Kim * Now that we know the length of the CIDs, allocate return buffer: 322*a159c266SJung-uk Kim * 1) Size of the base structure + 323*a159c266SJung-uk Kim * 2) Size of the CID DEVICE_ID array + 324*a159c266SJung-uk Kim * 3) Size of the actual CID strings 325*a159c266SJung-uk Kim */ 326*a159c266SJung-uk Kim CidListSize = sizeof (ACPI_DEVICE_ID_LIST) + 327*a159c266SJung-uk Kim ((Count - 1) * sizeof (ACPI_DEVICE_ID)) + 328*a159c266SJung-uk Kim StringAreaSize; 329*a159c266SJung-uk Kim 330*a159c266SJung-uk Kim CidList = ACPI_ALLOCATE_ZEROED (CidListSize); 331*a159c266SJung-uk Kim if (!CidList) 332*a159c266SJung-uk Kim { 333*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 334*a159c266SJung-uk Kim goto Cleanup; 335*a159c266SJung-uk Kim } 336*a159c266SJung-uk Kim 337*a159c266SJung-uk Kim /* Area for CID strings starts after the CID DEVICE_ID array */ 338*a159c266SJung-uk Kim 339*a159c266SJung-uk Kim NextIdString = ACPI_CAST_PTR (char, CidList->Ids) + 340*a159c266SJung-uk Kim ((ACPI_SIZE) Count * sizeof (ACPI_DEVICE_ID)); 341*a159c266SJung-uk Kim 342*a159c266SJung-uk Kim /* Copy/convert the CIDs to the return buffer */ 343*a159c266SJung-uk Kim 344*a159c266SJung-uk Kim for (i = 0; i < Count; i++) 345*a159c266SJung-uk Kim { 346*a159c266SJung-uk Kim if (CidObjects[i]->Common.Type == ACPI_TYPE_INTEGER) 347*a159c266SJung-uk Kim { 348*a159c266SJung-uk Kim /* Convert the Integer (EISAID) CID to a string */ 349*a159c266SJung-uk Kim 350*a159c266SJung-uk Kim AcpiExEisaIdToString (NextIdString, CidObjects[i]->Integer.Value); 351*a159c266SJung-uk Kim Length = ACPI_EISAID_STRING_SIZE; 352*a159c266SJung-uk Kim } 353*a159c266SJung-uk Kim else /* ACPI_TYPE_STRING */ 354*a159c266SJung-uk Kim { 355*a159c266SJung-uk Kim /* Copy the String CID from the returned object */ 356*a159c266SJung-uk Kim 357*a159c266SJung-uk Kim ACPI_STRCPY (NextIdString, CidObjects[i]->String.Pointer); 358*a159c266SJung-uk Kim Length = CidObjects[i]->String.Length + 1; 359*a159c266SJung-uk Kim } 360*a159c266SJung-uk Kim 361*a159c266SJung-uk Kim CidList->Ids[i].String = NextIdString; 362*a159c266SJung-uk Kim CidList->Ids[i].Length = Length; 363*a159c266SJung-uk Kim NextIdString += Length; 364*a159c266SJung-uk Kim } 365*a159c266SJung-uk Kim 366*a159c266SJung-uk Kim /* Finish the CID list */ 367*a159c266SJung-uk Kim 368*a159c266SJung-uk Kim CidList->Count = Count; 369*a159c266SJung-uk Kim CidList->ListSize = CidListSize; 370*a159c266SJung-uk Kim *ReturnCidList = CidList; 371*a159c266SJung-uk Kim 372*a159c266SJung-uk Kim 373*a159c266SJung-uk Kim Cleanup: 374*a159c266SJung-uk Kim 375*a159c266SJung-uk Kim /* On exit, we must delete the _CID return object */ 376*a159c266SJung-uk Kim 377*a159c266SJung-uk Kim AcpiUtRemoveReference (ObjDesc); 378*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 379*a159c266SJung-uk Kim } 380*a159c266SJung-uk Kim 381