xref: /titanic_50/usr/src/uts/intel/io/acpica/dispatcher/dsinit.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
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