1db2bae30SDana Myers /******************************************************************************
2db2bae30SDana Myers *
3db2bae30SDana Myers * Module Name: dsinit - Object initialization namespace walk
4db2bae30SDana Myers *
5db2bae30SDana Myers *****************************************************************************/
6db2bae30SDana Myers
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9db2bae30SDana Myers * All rights reserved.
10db2bae30SDana Myers *
1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross * are met:
1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross * without modification.
1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross * binary redistribution.
2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross * from this software without specific prior written permission.
25db2bae30SDana Myers *
2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross * Software Foundation.
29db2bae30SDana Myers *
3026f3cdf0SGordon Ross * NO WARRANTY
3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross */
43db2bae30SDana Myers
44db2bae30SDana Myers #include "acpi.h"
45aa2aa9a6SDana Myers #include "accommon.h"
46db2bae30SDana Myers #include "acdispat.h"
47db2bae30SDana Myers #include "acnamesp.h"
48db2bae30SDana Myers #include "actables.h"
49db2bae30SDana Myers
50db2bae30SDana Myers #define _COMPONENT ACPI_DISPATCHER
51db2bae30SDana Myers ACPI_MODULE_NAME ("dsinit")
52db2bae30SDana Myers
53*385cc6b4SJerry Jelinek
54db2bae30SDana Myers /* Local prototypes */
55db2bae30SDana Myers
56db2bae30SDana Myers static ACPI_STATUS
57db2bae30SDana Myers AcpiDsInitOneObject (
58db2bae30SDana Myers ACPI_HANDLE ObjHandle,
59db2bae30SDana Myers UINT32 Level,
60db2bae30SDana Myers void *Context,
61db2bae30SDana Myers void **ReturnValue);
62db2bae30SDana Myers
63db2bae30SDana Myers
64db2bae30SDana Myers /*******************************************************************************
65db2bae30SDana Myers *
66db2bae30SDana Myers * FUNCTION: AcpiDsInitOneObject
67db2bae30SDana Myers *
68db2bae30SDana Myers * PARAMETERS: ObjHandle - Node for the object
69db2bae30SDana Myers * Level - Current nesting level
70db2bae30SDana Myers * Context - Points to a init info struct
71db2bae30SDana Myers * ReturnValue - Not used
72db2bae30SDana Myers *
73db2bae30SDana Myers * RETURN: Status
74db2bae30SDana Myers *
75db2bae30SDana Myers * DESCRIPTION: Callback from AcpiWalkNamespace. Invoked for every object
76db2bae30SDana Myers * within the namespace.
77db2bae30SDana Myers *
78db2bae30SDana Myers * Currently, the only objects that require initialization are:
79db2bae30SDana Myers * 1) Methods
80db2bae30SDana Myers * 2) Operation Regions
81db2bae30SDana Myers *
82db2bae30SDana Myers ******************************************************************************/
83db2bae30SDana Myers
84db2bae30SDana Myers static ACPI_STATUS
AcpiDsInitOneObject(ACPI_HANDLE ObjHandle,UINT32 Level,void * Context,void ** ReturnValue)85db2bae30SDana Myers AcpiDsInitOneObject (
86db2bae30SDana Myers ACPI_HANDLE ObjHandle,
87db2bae30SDana Myers UINT32 Level,
88db2bae30SDana Myers void *Context,
89db2bae30SDana Myers void **ReturnValue)
90db2bae30SDana Myers {
91db2bae30SDana Myers ACPI_INIT_WALK_INFO *Info = (ACPI_INIT_WALK_INFO *) Context;
92db2bae30SDana Myers ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
93db2bae30SDana Myers ACPI_STATUS Status;
94*385cc6b4SJerry Jelinek ACPI_OPERAND_OBJECT *ObjDesc;
95db2bae30SDana Myers
96db2bae30SDana Myers
97db2bae30SDana Myers ACPI_FUNCTION_ENTRY ();
98db2bae30SDana Myers
99db2bae30SDana Myers
100db2bae30SDana Myers /*
101db2bae30SDana Myers * We are only interested in NS nodes owned by the table that
102db2bae30SDana Myers * was just loaded
103db2bae30SDana Myers */
104db2bae30SDana Myers if (Node->OwnerId != Info->OwnerId)
105db2bae30SDana Myers {
106db2bae30SDana Myers return (AE_OK);
107db2bae30SDana Myers }
108db2bae30SDana Myers
109db2bae30SDana Myers Info->ObjectCount++;
110db2bae30SDana Myers
111db2bae30SDana Myers /* And even then, we are only interested in a few object types */
112db2bae30SDana Myers
113*385cc6b4SJerry Jelinek switch (AcpiNsGetType (ObjHandle))
114db2bae30SDana Myers {
115db2bae30SDana Myers case ACPI_TYPE_REGION:
116db2bae30SDana Myers
117db2bae30SDana Myers Status = AcpiDsInitializeRegion (ObjHandle);
118db2bae30SDana Myers if (ACPI_FAILURE (Status))
119db2bae30SDana Myers {
120db2bae30SDana Myers ACPI_EXCEPTION ((AE_INFO, Status,
121db2bae30SDana Myers "During Region initialization %p [%4.4s]",
122db2bae30SDana Myers ObjHandle, AcpiUtGetNodeName (ObjHandle)));
123db2bae30SDana Myers }
124db2bae30SDana Myers
125db2bae30SDana Myers Info->OpRegionCount++;
126db2bae30SDana Myers break;
127db2bae30SDana Myers
128db2bae30SDana Myers case ACPI_TYPE_METHOD:
129*385cc6b4SJerry Jelinek /*
130*385cc6b4SJerry Jelinek * Auto-serialization support. We will examine each method that is
131*385cc6b4SJerry Jelinek * NotSerialized to determine if it creates any Named objects. If
132*385cc6b4SJerry Jelinek * it does, it will be marked serialized to prevent problems if
133*385cc6b4SJerry Jelinek * the method is entered by two or more threads and an attempt is
134*385cc6b4SJerry Jelinek * made to create the same named object twice -- which results in
135*385cc6b4SJerry Jelinek * an AE_ALREADY_EXISTS exception and method abort.
136*385cc6b4SJerry Jelinek */
137db2bae30SDana Myers Info->MethodCount++;
138*385cc6b4SJerry Jelinek ObjDesc = AcpiNsGetAttachedObject (Node);
139*385cc6b4SJerry Jelinek if (!ObjDesc)
140*385cc6b4SJerry Jelinek {
141db2bae30SDana Myers break;
142*385cc6b4SJerry Jelinek }
143db2bae30SDana Myers
144*385cc6b4SJerry Jelinek /* Ignore if already serialized */
145*385cc6b4SJerry Jelinek
146*385cc6b4SJerry Jelinek if (ObjDesc->Method.InfoFlags & ACPI_METHOD_SERIALIZED)
147*385cc6b4SJerry Jelinek {
148*385cc6b4SJerry Jelinek Info->SerialMethodCount++;
149*385cc6b4SJerry Jelinek break;
150*385cc6b4SJerry Jelinek }
151*385cc6b4SJerry Jelinek
152*385cc6b4SJerry Jelinek if (AcpiGbl_AutoSerializeMethods)
153*385cc6b4SJerry Jelinek {
154*385cc6b4SJerry Jelinek /* Parse/scan method and serialize it if necessary */
155*385cc6b4SJerry Jelinek
156*385cc6b4SJerry Jelinek AcpiDsAutoSerializeMethod (Node, ObjDesc);
157*385cc6b4SJerry Jelinek if (ObjDesc->Method.InfoFlags & ACPI_METHOD_SERIALIZED)
158*385cc6b4SJerry Jelinek {
159*385cc6b4SJerry Jelinek /* Method was just converted to Serialized */
160*385cc6b4SJerry Jelinek
161*385cc6b4SJerry Jelinek Info->SerialMethodCount++;
162*385cc6b4SJerry Jelinek Info->SerializedMethodCount++;
163*385cc6b4SJerry Jelinek break;
164*385cc6b4SJerry Jelinek }
165*385cc6b4SJerry Jelinek }
166*385cc6b4SJerry Jelinek
167*385cc6b4SJerry Jelinek Info->NonSerialMethodCount++;
168*385cc6b4SJerry Jelinek break;
169db2bae30SDana Myers
170db2bae30SDana Myers case ACPI_TYPE_DEVICE:
171db2bae30SDana Myers
172db2bae30SDana Myers Info->DeviceCount++;
173db2bae30SDana Myers break;
174db2bae30SDana Myers
175db2bae30SDana Myers default:
176*385cc6b4SJerry Jelinek
177db2bae30SDana Myers break;
178db2bae30SDana Myers }
179db2bae30SDana Myers
180db2bae30SDana Myers /*
181db2bae30SDana Myers * We ignore errors from above, and always return OK, since
182db2bae30SDana Myers * we don't want to abort the walk on a single error.
183db2bae30SDana Myers */
184db2bae30SDana Myers return (AE_OK);
185db2bae30SDana Myers }
186db2bae30SDana Myers
187db2bae30SDana Myers
188db2bae30SDana Myers /*******************************************************************************
189db2bae30SDana Myers *
190db2bae30SDana Myers * FUNCTION: AcpiDsInitializeObjects
191db2bae30SDana Myers *
192db2bae30SDana Myers * PARAMETERS: TableDesc - Descriptor for parent ACPI table
193db2bae30SDana Myers * StartNode - Root of subtree to be initialized.
194db2bae30SDana Myers *
195db2bae30SDana Myers * RETURN: Status
196db2bae30SDana Myers *
197db2bae30SDana Myers * DESCRIPTION: Walk the namespace starting at "StartNode" and perform any
198db2bae30SDana Myers * necessary initialization on the objects found therein
199db2bae30SDana Myers *
200db2bae30SDana Myers ******************************************************************************/
201db2bae30SDana Myers
202db2bae30SDana Myers ACPI_STATUS
AcpiDsInitializeObjects(UINT32 TableIndex,ACPI_NAMESPACE_NODE * StartNode)203db2bae30SDana Myers AcpiDsInitializeObjects (
204db2bae30SDana Myers UINT32 TableIndex,
205db2bae30SDana Myers ACPI_NAMESPACE_NODE *StartNode)
206db2bae30SDana Myers {
207db2bae30SDana Myers ACPI_STATUS Status;
208db2bae30SDana Myers ACPI_INIT_WALK_INFO Info;
209db2bae30SDana Myers ACPI_TABLE_HEADER *Table;
210db2bae30SDana Myers ACPI_OWNER_ID OwnerId;
211db2bae30SDana Myers
212db2bae30SDana Myers
213db2bae30SDana Myers ACPI_FUNCTION_TRACE (DsInitializeObjects);
214db2bae30SDana Myers
215db2bae30SDana Myers
216db2bae30SDana Myers Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
217db2bae30SDana Myers if (ACPI_FAILURE (Status))
218db2bae30SDana Myers {
219db2bae30SDana Myers return_ACPI_STATUS (Status);
220db2bae30SDana Myers }
221db2bae30SDana Myers
222db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
223db2bae30SDana Myers "**** Starting initialization of namespace objects ****\n"));
224db2bae30SDana Myers
22526f3cdf0SGordon Ross /* Set all init info to zero */
22626f3cdf0SGordon Ross
227*385cc6b4SJerry Jelinek memset (&Info, 0, sizeof (ACPI_INIT_WALK_INFO));
22826f3cdf0SGordon Ross
229db2bae30SDana Myers Info.OwnerId = OwnerId;
23026f3cdf0SGordon Ross Info.TableIndex = TableIndex;
231db2bae30SDana Myers
232db2bae30SDana Myers /* Walk entire namespace from the supplied root */
233db2bae30SDana Myers
234aa2aa9a6SDana Myers Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
235aa2aa9a6SDana Myers if (ACPI_FAILURE (Status))
236aa2aa9a6SDana Myers {
237aa2aa9a6SDana Myers return_ACPI_STATUS (Status);
238aa2aa9a6SDana Myers }
239aa2aa9a6SDana Myers
240aa2aa9a6SDana Myers /*
241aa2aa9a6SDana Myers * We don't use AcpiWalkNamespace since we do not want to acquire
242aa2aa9a6SDana Myers * the namespace reader lock.
243aa2aa9a6SDana Myers */
244aa2aa9a6SDana Myers Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, StartNode, ACPI_UINT32_MAX,
24557190917SDana Myers ACPI_NS_WALK_UNLOCK, AcpiDsInitOneObject, NULL, &Info, NULL);
246db2bae30SDana Myers if (ACPI_FAILURE (Status))
247db2bae30SDana Myers {
248db2bae30SDana Myers ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));
249db2bae30SDana Myers }
250aa2aa9a6SDana Myers (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
251db2bae30SDana Myers
252db2bae30SDana Myers Status = AcpiGetTableByIndex (TableIndex, &Table);
253db2bae30SDana Myers if (ACPI_FAILURE (Status))
254db2bae30SDana Myers {
255db2bae30SDana Myers return_ACPI_STATUS (Status);
256db2bae30SDana Myers }
257db2bae30SDana Myers
258*385cc6b4SJerry Jelinek /* DSDT is always the first AML table */
259db2bae30SDana Myers
260*385cc6b4SJerry Jelinek if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT))
261*385cc6b4SJerry Jelinek {
262*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
263*385cc6b4SJerry Jelinek "\nInitializing Namespace objects:\n"));
264*385cc6b4SJerry Jelinek }
265*385cc6b4SJerry Jelinek
266*385cc6b4SJerry Jelinek /* Summary of objects initialized */
267*385cc6b4SJerry Jelinek
268*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
269*385cc6b4SJerry Jelinek "Table [%4.4s: %-8.8s] (id %.2X) - %4u Objects with %3u Devices, "
270*385cc6b4SJerry Jelinek "%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
271*385cc6b4SJerry Jelinek Table->Signature, Table->OemTableId, OwnerId, Info.ObjectCount,
272*385cc6b4SJerry Jelinek Info.DeviceCount,Info.OpRegionCount, Info.MethodCount,
273*385cc6b4SJerry Jelinek Info.SerialMethodCount, Info.NonSerialMethodCount,
274*385cc6b4SJerry Jelinek Info.SerializedMethodCount));
275*385cc6b4SJerry Jelinek
276*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "%u Methods, %u Regions\n",
277*385cc6b4SJerry Jelinek Info.MethodCount, Info.OpRegionCount));
278db2bae30SDana Myers
279db2bae30SDana Myers return_ACPI_STATUS (AE_OK);
280db2bae30SDana Myers }
281