xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utids.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
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