xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utdelete.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: utdelete - object deletion and reference count utilities
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 __UTDELETE_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 #include <contrib/dev/acpica/include/acnamesp.h>
50*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h>
51*a159c266SJung-uk Kim 
52*a159c266SJung-uk Kim 
53*a159c266SJung-uk Kim #define _COMPONENT          ACPI_UTILITIES
54*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("utdelete")
55*a159c266SJung-uk Kim 
56*a159c266SJung-uk Kim /* Local prototypes */
57*a159c266SJung-uk Kim 
58*a159c266SJung-uk Kim static void
59*a159c266SJung-uk Kim AcpiUtDeleteInternalObj (
60*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object);
61*a159c266SJung-uk Kim 
62*a159c266SJung-uk Kim static void
63*a159c266SJung-uk Kim AcpiUtUpdateRefCount (
64*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object,
65*a159c266SJung-uk Kim     UINT32                  Action);
66*a159c266SJung-uk Kim 
67*a159c266SJung-uk Kim 
68*a159c266SJung-uk Kim /*******************************************************************************
69*a159c266SJung-uk Kim  *
70*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtDeleteInternalObj
71*a159c266SJung-uk Kim  *
72*a159c266SJung-uk Kim  * PARAMETERS:  Object         - Object to be deleted
73*a159c266SJung-uk Kim  *
74*a159c266SJung-uk Kim  * RETURN:      None
75*a159c266SJung-uk Kim  *
76*a159c266SJung-uk Kim  * DESCRIPTION: Low level object deletion, after reference counts have been
77*a159c266SJung-uk Kim  *              updated (All reference counts, including sub-objects!)
78*a159c266SJung-uk Kim  *
79*a159c266SJung-uk Kim  ******************************************************************************/
80*a159c266SJung-uk Kim 
81*a159c266SJung-uk Kim static void
82*a159c266SJung-uk Kim AcpiUtDeleteInternalObj (
83*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object)
84*a159c266SJung-uk Kim {
85*a159c266SJung-uk Kim     void                    *ObjPointer = NULL;
86*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *HandlerDesc;
87*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *SecondDesc;
88*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *NextDesc;
89*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     **LastObjPtr;
90*a159c266SJung-uk Kim 
91*a159c266SJung-uk Kim 
92*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (UtDeleteInternalObj, Object);
93*a159c266SJung-uk Kim 
94*a159c266SJung-uk Kim 
95*a159c266SJung-uk Kim     if (!Object)
96*a159c266SJung-uk Kim     {
97*a159c266SJung-uk Kim         return_VOID;
98*a159c266SJung-uk Kim     }
99*a159c266SJung-uk Kim 
100*a159c266SJung-uk Kim     /*
101*a159c266SJung-uk Kim      * Must delete or free any pointers within the object that are not
102*a159c266SJung-uk Kim      * actual ACPI objects (for example, a raw buffer pointer).
103*a159c266SJung-uk Kim      */
104*a159c266SJung-uk Kim     switch (Object->Common.Type)
105*a159c266SJung-uk Kim     {
106*a159c266SJung-uk Kim     case ACPI_TYPE_STRING:
107*a159c266SJung-uk Kim 
108*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** String %p, ptr %p\n",
109*a159c266SJung-uk Kim             Object, Object->String.Pointer));
110*a159c266SJung-uk Kim 
111*a159c266SJung-uk Kim         /* Free the actual string buffer */
112*a159c266SJung-uk Kim 
113*a159c266SJung-uk Kim         if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
114*a159c266SJung-uk Kim         {
115*a159c266SJung-uk Kim             /* But only if it is NOT a pointer into an ACPI table */
116*a159c266SJung-uk Kim 
117*a159c266SJung-uk Kim             ObjPointer = Object->String.Pointer;
118*a159c266SJung-uk Kim         }
119*a159c266SJung-uk Kim         break;
120*a159c266SJung-uk Kim 
121*a159c266SJung-uk Kim 
122*a159c266SJung-uk Kim     case ACPI_TYPE_BUFFER:
123*a159c266SJung-uk Kim 
124*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n",
125*a159c266SJung-uk Kim             Object, Object->Buffer.Pointer));
126*a159c266SJung-uk Kim 
127*a159c266SJung-uk Kim         /* Free the actual buffer */
128*a159c266SJung-uk Kim 
129*a159c266SJung-uk Kim         if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
130*a159c266SJung-uk Kim         {
131*a159c266SJung-uk Kim             /* But only if it is NOT a pointer into an ACPI table */
132*a159c266SJung-uk Kim 
133*a159c266SJung-uk Kim             ObjPointer = Object->Buffer.Pointer;
134*a159c266SJung-uk Kim         }
135*a159c266SJung-uk Kim         break;
136*a159c266SJung-uk Kim 
137*a159c266SJung-uk Kim 
138*a159c266SJung-uk Kim     case ACPI_TYPE_PACKAGE:
139*a159c266SJung-uk Kim 
140*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n",
141*a159c266SJung-uk Kim             Object->Package.Count));
142*a159c266SJung-uk Kim 
143*a159c266SJung-uk Kim         /*
144*a159c266SJung-uk Kim          * Elements of the package are not handled here, they are deleted
145*a159c266SJung-uk Kim          * separately
146*a159c266SJung-uk Kim          */
147*a159c266SJung-uk Kim 
148*a159c266SJung-uk Kim         /* Free the (variable length) element pointer array */
149*a159c266SJung-uk Kim 
150*a159c266SJung-uk Kim         ObjPointer = Object->Package.Elements;
151*a159c266SJung-uk Kim         break;
152*a159c266SJung-uk Kim 
153*a159c266SJung-uk Kim 
154*a159c266SJung-uk Kim     /*
155*a159c266SJung-uk Kim      * These objects have a possible list of notify handlers.
156*a159c266SJung-uk Kim      * Device object also may have a GPE block.
157*a159c266SJung-uk Kim      */
158*a159c266SJung-uk Kim     case ACPI_TYPE_DEVICE:
159*a159c266SJung-uk Kim 
160*a159c266SJung-uk Kim         if (Object->Device.GpeBlock)
161*a159c266SJung-uk Kim         {
162*a159c266SJung-uk Kim             (void) AcpiEvDeleteGpeBlock (Object->Device.GpeBlock);
163*a159c266SJung-uk Kim         }
164*a159c266SJung-uk Kim 
165*a159c266SJung-uk Kim         /*lint -fallthrough */
166*a159c266SJung-uk Kim 
167*a159c266SJung-uk Kim     case ACPI_TYPE_PROCESSOR:
168*a159c266SJung-uk Kim     case ACPI_TYPE_THERMAL:
169*a159c266SJung-uk Kim 
170*a159c266SJung-uk Kim         /* Walk the notify handler list for this object */
171*a159c266SJung-uk Kim 
172*a159c266SJung-uk Kim         HandlerDesc = Object->CommonNotify.Handler;
173*a159c266SJung-uk Kim         while (HandlerDesc)
174*a159c266SJung-uk Kim         {
175*a159c266SJung-uk Kim             NextDesc = HandlerDesc->AddressSpace.Next;
176*a159c266SJung-uk Kim             AcpiUtRemoveReference (HandlerDesc);
177*a159c266SJung-uk Kim             HandlerDesc = NextDesc;
178*a159c266SJung-uk Kim         }
179*a159c266SJung-uk Kim         break;
180*a159c266SJung-uk Kim 
181*a159c266SJung-uk Kim 
182*a159c266SJung-uk Kim     case ACPI_TYPE_MUTEX:
183*a159c266SJung-uk Kim 
184*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
185*a159c266SJung-uk Kim             "***** Mutex %p, OS Mutex %p\n",
186*a159c266SJung-uk Kim             Object, Object->Mutex.OsMutex));
187*a159c266SJung-uk Kim 
188*a159c266SJung-uk Kim         if (Object == AcpiGbl_GlobalLockMutex)
189*a159c266SJung-uk Kim         {
190*a159c266SJung-uk Kim             /* Global Lock has extra semaphore */
191*a159c266SJung-uk Kim 
192*a159c266SJung-uk Kim             (void) AcpiOsDeleteSemaphore (AcpiGbl_GlobalLockSemaphore);
193*a159c266SJung-uk Kim             AcpiGbl_GlobalLockSemaphore = NULL;
194*a159c266SJung-uk Kim 
195*a159c266SJung-uk Kim             AcpiOsDeleteMutex (Object->Mutex.OsMutex);
196*a159c266SJung-uk Kim             AcpiGbl_GlobalLockMutex = NULL;
197*a159c266SJung-uk Kim         }
198*a159c266SJung-uk Kim         else
199*a159c266SJung-uk Kim         {
200*a159c266SJung-uk Kim             AcpiExUnlinkMutex (Object);
201*a159c266SJung-uk Kim             AcpiOsDeleteMutex (Object->Mutex.OsMutex);
202*a159c266SJung-uk Kim         }
203*a159c266SJung-uk Kim         break;
204*a159c266SJung-uk Kim 
205*a159c266SJung-uk Kim 
206*a159c266SJung-uk Kim     case ACPI_TYPE_EVENT:
207*a159c266SJung-uk Kim 
208*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
209*a159c266SJung-uk Kim             "***** Event %p, OS Semaphore %p\n",
210*a159c266SJung-uk Kim             Object, Object->Event.OsSemaphore));
211*a159c266SJung-uk Kim 
212*a159c266SJung-uk Kim         (void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore);
213*a159c266SJung-uk Kim         Object->Event.OsSemaphore = NULL;
214*a159c266SJung-uk Kim         break;
215*a159c266SJung-uk Kim 
216*a159c266SJung-uk Kim 
217*a159c266SJung-uk Kim     case ACPI_TYPE_METHOD:
218*a159c266SJung-uk Kim 
219*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
220*a159c266SJung-uk Kim             "***** Method %p\n", Object));
221*a159c266SJung-uk Kim 
222*a159c266SJung-uk Kim         /* Delete the method mutex if it exists */
223*a159c266SJung-uk Kim 
224*a159c266SJung-uk Kim         if (Object->Method.Mutex)
225*a159c266SJung-uk Kim         {
226*a159c266SJung-uk Kim             AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex);
227*a159c266SJung-uk Kim             AcpiUtDeleteObjectDesc (Object->Method.Mutex);
228*a159c266SJung-uk Kim             Object->Method.Mutex = NULL;
229*a159c266SJung-uk Kim         }
230*a159c266SJung-uk Kim         break;
231*a159c266SJung-uk Kim 
232*a159c266SJung-uk Kim 
233*a159c266SJung-uk Kim     case ACPI_TYPE_REGION:
234*a159c266SJung-uk Kim 
235*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
236*a159c266SJung-uk Kim             "***** Region %p\n", Object));
237*a159c266SJung-uk Kim 
238*a159c266SJung-uk Kim         /*
239*a159c266SJung-uk Kim          * Update AddressRange list. However, only permanent regions
240*a159c266SJung-uk Kim          * are installed in this list. (Not created within a method)
241*a159c266SJung-uk Kim          */
242*a159c266SJung-uk Kim         if (!(Object->Region.Node->Flags & ANOBJ_TEMPORARY))
243*a159c266SJung-uk Kim         {
244*a159c266SJung-uk Kim             AcpiUtRemoveAddressRange (Object->Region.SpaceId,
245*a159c266SJung-uk Kim                 Object->Region.Node);
246*a159c266SJung-uk Kim         }
247*a159c266SJung-uk Kim 
248*a159c266SJung-uk Kim         SecondDesc = AcpiNsGetSecondaryObject (Object);
249*a159c266SJung-uk Kim         if (SecondDesc)
250*a159c266SJung-uk Kim         {
251*a159c266SJung-uk Kim             /*
252*a159c266SJung-uk Kim              * Free the RegionContext if and only if the handler is one of the
253*a159c266SJung-uk Kim              * default handlers -- and therefore, we created the context object
254*a159c266SJung-uk Kim              * locally, it was not created by an external caller.
255*a159c266SJung-uk Kim              */
256*a159c266SJung-uk Kim             HandlerDesc = Object->Region.Handler;
257*a159c266SJung-uk Kim             if (HandlerDesc)
258*a159c266SJung-uk Kim             {
259*a159c266SJung-uk Kim                 NextDesc = HandlerDesc->AddressSpace.RegionList;
260*a159c266SJung-uk Kim                 LastObjPtr = &HandlerDesc->AddressSpace.RegionList;
261*a159c266SJung-uk Kim 
262*a159c266SJung-uk Kim                 /* Remove the region object from the handler's list */
263*a159c266SJung-uk Kim 
264*a159c266SJung-uk Kim                 while (NextDesc)
265*a159c266SJung-uk Kim                 {
266*a159c266SJung-uk Kim                     if (NextDesc == Object)
267*a159c266SJung-uk Kim                     {
268*a159c266SJung-uk Kim                         *LastObjPtr = NextDesc->Region.Next;
269*a159c266SJung-uk Kim                         break;
270*a159c266SJung-uk Kim                     }
271*a159c266SJung-uk Kim 
272*a159c266SJung-uk Kim                     /* Walk the linked list of handler */
273*a159c266SJung-uk Kim 
274*a159c266SJung-uk Kim                     LastObjPtr = &NextDesc->Region.Next;
275*a159c266SJung-uk Kim                     NextDesc = NextDesc->Region.Next;
276*a159c266SJung-uk Kim                 }
277*a159c266SJung-uk Kim 
278*a159c266SJung-uk Kim                 if (HandlerDesc->AddressSpace.HandlerFlags &
279*a159c266SJung-uk Kim                     ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
280*a159c266SJung-uk Kim                 {
281*a159c266SJung-uk Kim                     /* Deactivate region and free region context */
282*a159c266SJung-uk Kim 
283*a159c266SJung-uk Kim                     if (HandlerDesc->AddressSpace.Setup)
284*a159c266SJung-uk Kim                     {
285*a159c266SJung-uk Kim                         (void) HandlerDesc->AddressSpace.Setup (Object,
286*a159c266SJung-uk Kim                             ACPI_REGION_DEACTIVATE,
287*a159c266SJung-uk Kim                             HandlerDesc->AddressSpace.Context,
288*a159c266SJung-uk Kim                             &SecondDesc->Extra.RegionContext);
289*a159c266SJung-uk Kim                     }
290*a159c266SJung-uk Kim                 }
291*a159c266SJung-uk Kim 
292*a159c266SJung-uk Kim                 AcpiUtRemoveReference (HandlerDesc);
293*a159c266SJung-uk Kim             }
294*a159c266SJung-uk Kim 
295*a159c266SJung-uk Kim             /* Now we can free the Extra object */
296*a159c266SJung-uk Kim 
297*a159c266SJung-uk Kim             AcpiUtDeleteObjectDesc (SecondDesc);
298*a159c266SJung-uk Kim         }
299*a159c266SJung-uk Kim         break;
300*a159c266SJung-uk Kim 
301*a159c266SJung-uk Kim 
302*a159c266SJung-uk Kim     case ACPI_TYPE_BUFFER_FIELD:
303*a159c266SJung-uk Kim 
304*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
305*a159c266SJung-uk Kim             "***** Buffer Field %p\n", Object));
306*a159c266SJung-uk Kim 
307*a159c266SJung-uk Kim         SecondDesc = AcpiNsGetSecondaryObject (Object);
308*a159c266SJung-uk Kim         if (SecondDesc)
309*a159c266SJung-uk Kim         {
310*a159c266SJung-uk Kim             AcpiUtDeleteObjectDesc (SecondDesc);
311*a159c266SJung-uk Kim         }
312*a159c266SJung-uk Kim         break;
313*a159c266SJung-uk Kim 
314*a159c266SJung-uk Kim 
315*a159c266SJung-uk Kim     case ACPI_TYPE_LOCAL_BANK_FIELD:
316*a159c266SJung-uk Kim 
317*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
318*a159c266SJung-uk Kim             "***** Bank Field %p\n", Object));
319*a159c266SJung-uk Kim 
320*a159c266SJung-uk Kim         SecondDesc = AcpiNsGetSecondaryObject (Object);
321*a159c266SJung-uk Kim         if (SecondDesc)
322*a159c266SJung-uk Kim         {
323*a159c266SJung-uk Kim             AcpiUtDeleteObjectDesc (SecondDesc);
324*a159c266SJung-uk Kim         }
325*a159c266SJung-uk Kim         break;
326*a159c266SJung-uk Kim 
327*a159c266SJung-uk Kim 
328*a159c266SJung-uk Kim     default:
329*a159c266SJung-uk Kim         break;
330*a159c266SJung-uk Kim     }
331*a159c266SJung-uk Kim 
332*a159c266SJung-uk Kim     /* Free any allocated memory (pointer within the object) found above */
333*a159c266SJung-uk Kim 
334*a159c266SJung-uk Kim     if (ObjPointer)
335*a159c266SJung-uk Kim     {
336*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object Subptr %p\n",
337*a159c266SJung-uk Kim             ObjPointer));
338*a159c266SJung-uk Kim         ACPI_FREE (ObjPointer);
339*a159c266SJung-uk Kim     }
340*a159c266SJung-uk Kim 
341*a159c266SJung-uk Kim     /* Now the object can be safely deleted */
342*a159c266SJung-uk Kim 
343*a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object %p [%s]\n",
344*a159c266SJung-uk Kim         Object, AcpiUtGetObjectTypeName (Object)));
345*a159c266SJung-uk Kim 
346*a159c266SJung-uk Kim     AcpiUtDeleteObjectDesc (Object);
347*a159c266SJung-uk Kim     return_VOID;
348*a159c266SJung-uk Kim }
349*a159c266SJung-uk Kim 
350*a159c266SJung-uk Kim 
351*a159c266SJung-uk Kim /*******************************************************************************
352*a159c266SJung-uk Kim  *
353*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtDeleteInternalObjectList
354*a159c266SJung-uk Kim  *
355*a159c266SJung-uk Kim  * PARAMETERS:  ObjList         - Pointer to the list to be deleted
356*a159c266SJung-uk Kim  *
357*a159c266SJung-uk Kim  * RETURN:      None
358*a159c266SJung-uk Kim  *
359*a159c266SJung-uk Kim  * DESCRIPTION: This function deletes an internal object list, including both
360*a159c266SJung-uk Kim  *              simple objects and package objects
361*a159c266SJung-uk Kim  *
362*a159c266SJung-uk Kim  ******************************************************************************/
363*a159c266SJung-uk Kim 
364*a159c266SJung-uk Kim void
365*a159c266SJung-uk Kim AcpiUtDeleteInternalObjectList (
366*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     **ObjList)
367*a159c266SJung-uk Kim {
368*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     **InternalObj;
369*a159c266SJung-uk Kim 
370*a159c266SJung-uk Kim 
371*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (UtDeleteInternalObjectList);
372*a159c266SJung-uk Kim 
373*a159c266SJung-uk Kim 
374*a159c266SJung-uk Kim     /* Walk the null-terminated internal list */
375*a159c266SJung-uk Kim 
376*a159c266SJung-uk Kim     for (InternalObj = ObjList; *InternalObj; InternalObj++)
377*a159c266SJung-uk Kim     {
378*a159c266SJung-uk Kim         AcpiUtRemoveReference (*InternalObj);
379*a159c266SJung-uk Kim     }
380*a159c266SJung-uk Kim 
381*a159c266SJung-uk Kim     /* Free the combined parameter pointer list and object array */
382*a159c266SJung-uk Kim 
383*a159c266SJung-uk Kim     ACPI_FREE (ObjList);
384*a159c266SJung-uk Kim     return_VOID;
385*a159c266SJung-uk Kim }
386*a159c266SJung-uk Kim 
387*a159c266SJung-uk Kim 
388*a159c266SJung-uk Kim /*******************************************************************************
389*a159c266SJung-uk Kim  *
390*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtUpdateRefCount
391*a159c266SJung-uk Kim  *
392*a159c266SJung-uk Kim  * PARAMETERS:  Object          - Object whose ref count is to be updated
393*a159c266SJung-uk Kim  *              Action          - What to do
394*a159c266SJung-uk Kim  *
395*a159c266SJung-uk Kim  * RETURN:      New ref count
396*a159c266SJung-uk Kim  *
397*a159c266SJung-uk Kim  * DESCRIPTION: Modify the ref count and return it.
398*a159c266SJung-uk Kim  *
399*a159c266SJung-uk Kim  ******************************************************************************/
400*a159c266SJung-uk Kim 
401*a159c266SJung-uk Kim static void
402*a159c266SJung-uk Kim AcpiUtUpdateRefCount (
403*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object,
404*a159c266SJung-uk Kim     UINT32                  Action)
405*a159c266SJung-uk Kim {
406*a159c266SJung-uk Kim     UINT16                  Count;
407*a159c266SJung-uk Kim     UINT16                  NewCount;
408*a159c266SJung-uk Kim 
409*a159c266SJung-uk Kim 
410*a159c266SJung-uk Kim     ACPI_FUNCTION_NAME (UtUpdateRefCount);
411*a159c266SJung-uk Kim 
412*a159c266SJung-uk Kim 
413*a159c266SJung-uk Kim     if (!Object)
414*a159c266SJung-uk Kim     {
415*a159c266SJung-uk Kim         return;
416*a159c266SJung-uk Kim     }
417*a159c266SJung-uk Kim 
418*a159c266SJung-uk Kim     Count = Object->Common.ReferenceCount;
419*a159c266SJung-uk Kim     NewCount = Count;
420*a159c266SJung-uk Kim 
421*a159c266SJung-uk Kim     /*
422*a159c266SJung-uk Kim      * Perform the reference count action (increment, decrement, force delete)
423*a159c266SJung-uk Kim      */
424*a159c266SJung-uk Kim     switch (Action)
425*a159c266SJung-uk Kim     {
426*a159c266SJung-uk Kim     case REF_INCREMENT:
427*a159c266SJung-uk Kim 
428*a159c266SJung-uk Kim         NewCount++;
429*a159c266SJung-uk Kim         Object->Common.ReferenceCount = NewCount;
430*a159c266SJung-uk Kim 
431*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
432*a159c266SJung-uk Kim             "Obj %p Refs=%X, [Incremented]\n",
433*a159c266SJung-uk Kim             Object, NewCount));
434*a159c266SJung-uk Kim         break;
435*a159c266SJung-uk Kim 
436*a159c266SJung-uk Kim     case REF_DECREMENT:
437*a159c266SJung-uk Kim 
438*a159c266SJung-uk Kim         if (Count < 1)
439*a159c266SJung-uk Kim         {
440*a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
441*a159c266SJung-uk Kim                 "Obj %p Refs=%X, can't decrement! (Set to 0)\n",
442*a159c266SJung-uk Kim                 Object, NewCount));
443*a159c266SJung-uk Kim 
444*a159c266SJung-uk Kim             NewCount = 0;
445*a159c266SJung-uk Kim         }
446*a159c266SJung-uk Kim         else
447*a159c266SJung-uk Kim         {
448*a159c266SJung-uk Kim             NewCount--;
449*a159c266SJung-uk Kim 
450*a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
451*a159c266SJung-uk Kim                 "Obj %p Refs=%X, [Decremented]\n",
452*a159c266SJung-uk Kim                 Object, NewCount));
453*a159c266SJung-uk Kim         }
454*a159c266SJung-uk Kim 
455*a159c266SJung-uk Kim         if (Object->Common.Type == ACPI_TYPE_METHOD)
456*a159c266SJung-uk Kim         {
457*a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
458*a159c266SJung-uk Kim                 "Method Obj %p Refs=%X, [Decremented]\n", Object, NewCount));
459*a159c266SJung-uk Kim         }
460*a159c266SJung-uk Kim 
461*a159c266SJung-uk Kim         Object->Common.ReferenceCount = NewCount;
462*a159c266SJung-uk Kim         if (NewCount == 0)
463*a159c266SJung-uk Kim         {
464*a159c266SJung-uk Kim             AcpiUtDeleteInternalObj (Object);
465*a159c266SJung-uk Kim         }
466*a159c266SJung-uk Kim         break;
467*a159c266SJung-uk Kim 
468*a159c266SJung-uk Kim     case REF_FORCE_DELETE:
469*a159c266SJung-uk Kim 
470*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
471*a159c266SJung-uk Kim             "Obj %p Refs=%X, Force delete! (Set to 0)\n", Object, Count));
472*a159c266SJung-uk Kim 
473*a159c266SJung-uk Kim         NewCount = 0;
474*a159c266SJung-uk Kim         Object->Common.ReferenceCount = NewCount;
475*a159c266SJung-uk Kim         AcpiUtDeleteInternalObj (Object);
476*a159c266SJung-uk Kim         break;
477*a159c266SJung-uk Kim 
478*a159c266SJung-uk Kim     default:
479*a159c266SJung-uk Kim 
480*a159c266SJung-uk Kim         ACPI_ERROR ((AE_INFO, "Unknown action (0x%X)", Action));
481*a159c266SJung-uk Kim         break;
482*a159c266SJung-uk Kim     }
483*a159c266SJung-uk Kim 
484*a159c266SJung-uk Kim     /*
485*a159c266SJung-uk Kim      * Sanity check the reference count, for debug purposes only.
486*a159c266SJung-uk Kim      * (A deleted object will have a huge reference count)
487*a159c266SJung-uk Kim      */
488*a159c266SJung-uk Kim     if (Count > ACPI_MAX_REFERENCE_COUNT)
489*a159c266SJung-uk Kim     {
490*a159c266SJung-uk Kim         ACPI_WARNING ((AE_INFO,
491*a159c266SJung-uk Kim             "Large Reference Count (0x%X) in object %p", Count, Object));
492*a159c266SJung-uk Kim     }
493*a159c266SJung-uk Kim }
494*a159c266SJung-uk Kim 
495*a159c266SJung-uk Kim 
496*a159c266SJung-uk Kim /*******************************************************************************
497*a159c266SJung-uk Kim  *
498*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtUpdateObjectReference
499*a159c266SJung-uk Kim  *
500*a159c266SJung-uk Kim  * PARAMETERS:  Object              - Increment ref count for this object
501*a159c266SJung-uk Kim  *                                    and all sub-objects
502*a159c266SJung-uk Kim  *              Action              - Either REF_INCREMENT or REF_DECREMENT or
503*a159c266SJung-uk Kim  *                                    REF_FORCE_DELETE
504*a159c266SJung-uk Kim  *
505*a159c266SJung-uk Kim  * RETURN:      Status
506*a159c266SJung-uk Kim  *
507*a159c266SJung-uk Kim  * DESCRIPTION: Increment the object reference count
508*a159c266SJung-uk Kim  *
509*a159c266SJung-uk Kim  * Object references are incremented when:
510*a159c266SJung-uk Kim  * 1) An object is attached to a Node (namespace object)
511*a159c266SJung-uk Kim  * 2) An object is copied (all subobjects must be incremented)
512*a159c266SJung-uk Kim  *
513*a159c266SJung-uk Kim  * Object references are decremented when:
514*a159c266SJung-uk Kim  * 1) An object is detached from an Node
515*a159c266SJung-uk Kim  *
516*a159c266SJung-uk Kim  ******************************************************************************/
517*a159c266SJung-uk Kim 
518*a159c266SJung-uk Kim ACPI_STATUS
519*a159c266SJung-uk Kim AcpiUtUpdateObjectReference (
520*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object,
521*a159c266SJung-uk Kim     UINT16                  Action)
522*a159c266SJung-uk Kim {
523*a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
524*a159c266SJung-uk Kim     ACPI_GENERIC_STATE      *StateList = NULL;
525*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *NextObject = NULL;
526*a159c266SJung-uk Kim     ACPI_GENERIC_STATE      *State;
527*a159c266SJung-uk Kim     UINT32                  i;
528*a159c266SJung-uk Kim 
529*a159c266SJung-uk Kim 
530*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (UtUpdateObjectReference, Object);
531*a159c266SJung-uk Kim 
532*a159c266SJung-uk Kim 
533*a159c266SJung-uk Kim     while (Object)
534*a159c266SJung-uk Kim     {
535*a159c266SJung-uk Kim         /* Make sure that this isn't a namespace handle */
536*a159c266SJung-uk Kim 
537*a159c266SJung-uk Kim         if (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED)
538*a159c266SJung-uk Kim         {
539*a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
540*a159c266SJung-uk Kim                 "Object %p is NS handle\n", Object));
541*a159c266SJung-uk Kim             return_ACPI_STATUS (AE_OK);
542*a159c266SJung-uk Kim         }
543*a159c266SJung-uk Kim 
544*a159c266SJung-uk Kim         /*
545*a159c266SJung-uk Kim          * All sub-objects must have their reference count incremented also.
546*a159c266SJung-uk Kim          * Different object types have different subobjects.
547*a159c266SJung-uk Kim          */
548*a159c266SJung-uk Kim         switch (Object->Common.Type)
549*a159c266SJung-uk Kim         {
550*a159c266SJung-uk Kim         case ACPI_TYPE_DEVICE:
551*a159c266SJung-uk Kim         case ACPI_TYPE_PROCESSOR:
552*a159c266SJung-uk Kim         case ACPI_TYPE_POWER:
553*a159c266SJung-uk Kim         case ACPI_TYPE_THERMAL:
554*a159c266SJung-uk Kim 
555*a159c266SJung-uk Kim             /* Update the notify objects for these types (if present) */
556*a159c266SJung-uk Kim 
557*a159c266SJung-uk Kim             AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
558*a159c266SJung-uk Kim             AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
559*a159c266SJung-uk Kim             break;
560*a159c266SJung-uk Kim 
561*a159c266SJung-uk Kim         case ACPI_TYPE_PACKAGE:
562*a159c266SJung-uk Kim             /*
563*a159c266SJung-uk Kim              * We must update all the sub-objects of the package,
564*a159c266SJung-uk Kim              * each of whom may have their own sub-objects.
565*a159c266SJung-uk Kim              */
566*a159c266SJung-uk Kim             for (i = 0; i < Object->Package.Count; i++)
567*a159c266SJung-uk Kim             {
568*a159c266SJung-uk Kim                 /*
569*a159c266SJung-uk Kim                  * Push each element onto the stack for later processing.
570*a159c266SJung-uk Kim                  * Note: There can be null elements within the package,
571*a159c266SJung-uk Kim                  * these are simply ignored
572*a159c266SJung-uk Kim                  */
573*a159c266SJung-uk Kim                 Status = AcpiUtCreateUpdateStateAndPush (
574*a159c266SJung-uk Kim                             Object->Package.Elements[i], Action, &StateList);
575*a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
576*a159c266SJung-uk Kim                 {
577*a159c266SJung-uk Kim                     goto ErrorExit;
578*a159c266SJung-uk Kim                 }
579*a159c266SJung-uk Kim             }
580*a159c266SJung-uk Kim             break;
581*a159c266SJung-uk Kim 
582*a159c266SJung-uk Kim         case ACPI_TYPE_BUFFER_FIELD:
583*a159c266SJung-uk Kim 
584*a159c266SJung-uk Kim             NextObject = Object->BufferField.BufferObj;
585*a159c266SJung-uk Kim             break;
586*a159c266SJung-uk Kim 
587*a159c266SJung-uk Kim         case ACPI_TYPE_LOCAL_REGION_FIELD:
588*a159c266SJung-uk Kim 
589*a159c266SJung-uk Kim             NextObject = Object->Field.RegionObj;
590*a159c266SJung-uk Kim             break;
591*a159c266SJung-uk Kim 
592*a159c266SJung-uk Kim         case ACPI_TYPE_LOCAL_BANK_FIELD:
593*a159c266SJung-uk Kim 
594*a159c266SJung-uk Kim             NextObject = Object->BankField.BankObj;
595*a159c266SJung-uk Kim             Status = AcpiUtCreateUpdateStateAndPush (
596*a159c266SJung-uk Kim                         Object->BankField.RegionObj, Action, &StateList);
597*a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
598*a159c266SJung-uk Kim             {
599*a159c266SJung-uk Kim                 goto ErrorExit;
600*a159c266SJung-uk Kim             }
601*a159c266SJung-uk Kim             break;
602*a159c266SJung-uk Kim 
603*a159c266SJung-uk Kim         case ACPI_TYPE_LOCAL_INDEX_FIELD:
604*a159c266SJung-uk Kim 
605*a159c266SJung-uk Kim             NextObject = Object->IndexField.IndexObj;
606*a159c266SJung-uk Kim             Status = AcpiUtCreateUpdateStateAndPush (
607*a159c266SJung-uk Kim                         Object->IndexField.DataObj, Action, &StateList);
608*a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
609*a159c266SJung-uk Kim             {
610*a159c266SJung-uk Kim                 goto ErrorExit;
611*a159c266SJung-uk Kim             }
612*a159c266SJung-uk Kim             break;
613*a159c266SJung-uk Kim 
614*a159c266SJung-uk Kim         case ACPI_TYPE_LOCAL_REFERENCE:
615*a159c266SJung-uk Kim             /*
616*a159c266SJung-uk Kim              * The target of an Index (a package, string, or buffer) or a named
617*a159c266SJung-uk Kim              * reference must track changes to the ref count of the index or
618*a159c266SJung-uk Kim              * target object.
619*a159c266SJung-uk Kim              */
620*a159c266SJung-uk Kim             if ((Object->Reference.Class == ACPI_REFCLASS_INDEX) ||
621*a159c266SJung-uk Kim                 (Object->Reference.Class== ACPI_REFCLASS_NAME))
622*a159c266SJung-uk Kim             {
623*a159c266SJung-uk Kim                 NextObject = Object->Reference.Object;
624*a159c266SJung-uk Kim             }
625*a159c266SJung-uk Kim             break;
626*a159c266SJung-uk Kim 
627*a159c266SJung-uk Kim         case ACPI_TYPE_REGION:
628*a159c266SJung-uk Kim         default:
629*a159c266SJung-uk Kim             break; /* No subobjects for all other types */
630*a159c266SJung-uk Kim         }
631*a159c266SJung-uk Kim 
632*a159c266SJung-uk Kim         /*
633*a159c266SJung-uk Kim          * Now we can update the count in the main object. This can only
634*a159c266SJung-uk Kim          * happen after we update the sub-objects in case this causes the
635*a159c266SJung-uk Kim          * main object to be deleted.
636*a159c266SJung-uk Kim          */
637*a159c266SJung-uk Kim         AcpiUtUpdateRefCount (Object, Action);
638*a159c266SJung-uk Kim         Object = NULL;
639*a159c266SJung-uk Kim 
640*a159c266SJung-uk Kim         /* Move on to the next object to be updated */
641*a159c266SJung-uk Kim 
642*a159c266SJung-uk Kim         if (NextObject)
643*a159c266SJung-uk Kim         {
644*a159c266SJung-uk Kim             Object = NextObject;
645*a159c266SJung-uk Kim             NextObject = NULL;
646*a159c266SJung-uk Kim         }
647*a159c266SJung-uk Kim         else if (StateList)
648*a159c266SJung-uk Kim         {
649*a159c266SJung-uk Kim             State = AcpiUtPopGenericState (&StateList);
650*a159c266SJung-uk Kim             Object = State->Update.Object;
651*a159c266SJung-uk Kim             AcpiUtDeleteGenericState (State);
652*a159c266SJung-uk Kim         }
653*a159c266SJung-uk Kim     }
654*a159c266SJung-uk Kim 
655*a159c266SJung-uk Kim     return_ACPI_STATUS (AE_OK);
656*a159c266SJung-uk Kim 
657*a159c266SJung-uk Kim 
658*a159c266SJung-uk Kim ErrorExit:
659*a159c266SJung-uk Kim 
660*a159c266SJung-uk Kim     ACPI_EXCEPTION ((AE_INFO, Status,
661*a159c266SJung-uk Kim         "Could not update object reference count"));
662*a159c266SJung-uk Kim 
663*a159c266SJung-uk Kim     /* Free any stacked Update State objects */
664*a159c266SJung-uk Kim 
665*a159c266SJung-uk Kim     while (StateList)
666*a159c266SJung-uk Kim     {
667*a159c266SJung-uk Kim         State = AcpiUtPopGenericState (&StateList);
668*a159c266SJung-uk Kim         AcpiUtDeleteGenericState (State);
669*a159c266SJung-uk Kim     }
670*a159c266SJung-uk Kim 
671*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
672*a159c266SJung-uk Kim }
673*a159c266SJung-uk Kim 
674*a159c266SJung-uk Kim 
675*a159c266SJung-uk Kim /*******************************************************************************
676*a159c266SJung-uk Kim  *
677*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtAddReference
678*a159c266SJung-uk Kim  *
679*a159c266SJung-uk Kim  * PARAMETERS:  Object          - Object whose reference count is to be
680*a159c266SJung-uk Kim  *                                incremented
681*a159c266SJung-uk Kim  *
682*a159c266SJung-uk Kim  * RETURN:      None
683*a159c266SJung-uk Kim  *
684*a159c266SJung-uk Kim  * DESCRIPTION: Add one reference to an ACPI object
685*a159c266SJung-uk Kim  *
686*a159c266SJung-uk Kim  ******************************************************************************/
687*a159c266SJung-uk Kim 
688*a159c266SJung-uk Kim void
689*a159c266SJung-uk Kim AcpiUtAddReference (
690*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object)
691*a159c266SJung-uk Kim {
692*a159c266SJung-uk Kim 
693*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (UtAddReference, Object);
694*a159c266SJung-uk Kim 
695*a159c266SJung-uk Kim 
696*a159c266SJung-uk Kim     /* Ensure that we have a valid object */
697*a159c266SJung-uk Kim 
698*a159c266SJung-uk Kim     if (!AcpiUtValidInternalObject (Object))
699*a159c266SJung-uk Kim     {
700*a159c266SJung-uk Kim         return_VOID;
701*a159c266SJung-uk Kim     }
702*a159c266SJung-uk Kim 
703*a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
704*a159c266SJung-uk Kim         "Obj %p Current Refs=%X [To Be Incremented]\n",
705*a159c266SJung-uk Kim         Object, Object->Common.ReferenceCount));
706*a159c266SJung-uk Kim 
707*a159c266SJung-uk Kim     /* Increment the reference count */
708*a159c266SJung-uk Kim 
709*a159c266SJung-uk Kim     (void) AcpiUtUpdateObjectReference (Object, REF_INCREMENT);
710*a159c266SJung-uk Kim     return_VOID;
711*a159c266SJung-uk Kim }
712*a159c266SJung-uk Kim 
713*a159c266SJung-uk Kim 
714*a159c266SJung-uk Kim /*******************************************************************************
715*a159c266SJung-uk Kim  *
716*a159c266SJung-uk Kim  * FUNCTION:    AcpiUtRemoveReference
717*a159c266SJung-uk Kim  *
718*a159c266SJung-uk Kim  * PARAMETERS:  Object         - Object whose ref count will be decremented
719*a159c266SJung-uk Kim  *
720*a159c266SJung-uk Kim  * RETURN:      None
721*a159c266SJung-uk Kim  *
722*a159c266SJung-uk Kim  * DESCRIPTION: Decrement the reference count of an ACPI internal object
723*a159c266SJung-uk Kim  *
724*a159c266SJung-uk Kim  ******************************************************************************/
725*a159c266SJung-uk Kim 
726*a159c266SJung-uk Kim void
727*a159c266SJung-uk Kim AcpiUtRemoveReference (
728*a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object)
729*a159c266SJung-uk Kim {
730*a159c266SJung-uk Kim 
731*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (UtRemoveReference, Object);
732*a159c266SJung-uk Kim 
733*a159c266SJung-uk Kim 
734*a159c266SJung-uk Kim     /*
735*a159c266SJung-uk Kim      * Allow a NULL pointer to be passed in, just ignore it. This saves
736*a159c266SJung-uk Kim      * each caller from having to check. Also, ignore NS nodes.
737*a159c266SJung-uk Kim      *
738*a159c266SJung-uk Kim      */
739*a159c266SJung-uk Kim     if (!Object ||
740*a159c266SJung-uk Kim         (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED))
741*a159c266SJung-uk Kim 
742*a159c266SJung-uk Kim     {
743*a159c266SJung-uk Kim         return_VOID;
744*a159c266SJung-uk Kim     }
745*a159c266SJung-uk Kim 
746*a159c266SJung-uk Kim     /* Ensure that we have a valid object */
747*a159c266SJung-uk Kim 
748*a159c266SJung-uk Kim     if (!AcpiUtValidInternalObject (Object))
749*a159c266SJung-uk Kim     {
750*a159c266SJung-uk Kim         return_VOID;
751*a159c266SJung-uk Kim     }
752*a159c266SJung-uk Kim 
753*a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
754*a159c266SJung-uk Kim         "Obj %p Current Refs=%X [To Be Decremented]\n",
755*a159c266SJung-uk Kim         Object, Object->Common.ReferenceCount));
756*a159c266SJung-uk Kim 
757*a159c266SJung-uk Kim     /*
758*a159c266SJung-uk Kim      * Decrement the reference count, and only actually delete the object
759*a159c266SJung-uk Kim      * if the reference count becomes 0. (Must also decrement the ref count
760*a159c266SJung-uk Kim      * of all subobjects!)
761*a159c266SJung-uk Kim      */
762*a159c266SJung-uk Kim     (void) AcpiUtUpdateObjectReference (Object, REF_DECREMENT);
763*a159c266SJung-uk Kim     return_VOID;
764*a159c266SJung-uk Kim }
765*a159c266SJung-uk Kim 
766*a159c266SJung-uk Kim 
767