xref: /freebsd/sys/contrib/dev/acpica/components/dispatcher/dsinit.c (revision a9d8d09c46ec699e45f3fd46ca9abcf02e5baca9)
1a159c266SJung-uk Kim /******************************************************************************
2a159c266SJung-uk Kim  *
3a159c266SJung-uk Kim  * Module Name: dsinit - Object initialization namespace walk
4a159c266SJung-uk Kim  *
5a159c266SJung-uk Kim  *****************************************************************************/
6a159c266SJung-uk Kim 
7a159c266SJung-uk Kim /*
8efcc2a30SJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
9a159c266SJung-uk Kim  * All rights reserved.
10a159c266SJung-uk Kim  *
11a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13a159c266SJung-uk Kim  * are met:
14a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16a159c266SJung-uk Kim  *    without modification.
17a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21a159c266SJung-uk Kim  *    binary redistribution.
22a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25a159c266SJung-uk Kim  *
26a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28a159c266SJung-uk Kim  * Software Foundation.
29a159c266SJung-uk Kim  *
30a159c266SJung-uk Kim  * NO WARRANTY
31a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42a159c266SJung-uk Kim  */
43a159c266SJung-uk Kim 
44a159c266SJung-uk Kim #define __DSINIT_C__
45a159c266SJung-uk Kim 
46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
48a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
49a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
50a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
51a159c266SJung-uk Kim 
52a159c266SJung-uk Kim #define _COMPONENT          ACPI_DISPATCHER
53a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dsinit")
54a159c266SJung-uk Kim 
55a159c266SJung-uk Kim /* Local prototypes */
56a159c266SJung-uk Kim 
57a159c266SJung-uk Kim static ACPI_STATUS
58a159c266SJung-uk Kim AcpiDsInitOneObject (
59a159c266SJung-uk Kim     ACPI_HANDLE             ObjHandle,
60a159c266SJung-uk Kim     UINT32                  Level,
61a159c266SJung-uk Kim     void                    *Context,
62a159c266SJung-uk Kim     void                    **ReturnValue);
63a159c266SJung-uk Kim 
64a159c266SJung-uk Kim 
65a159c266SJung-uk Kim /*******************************************************************************
66a159c266SJung-uk Kim  *
67a159c266SJung-uk Kim  * FUNCTION:    AcpiDsInitOneObject
68a159c266SJung-uk Kim  *
69a159c266SJung-uk Kim  * PARAMETERS:  ObjHandle       - Node for the object
70a159c266SJung-uk Kim  *              Level           - Current nesting level
71a159c266SJung-uk Kim  *              Context         - Points to a init info struct
72a159c266SJung-uk Kim  *              ReturnValue     - Not used
73a159c266SJung-uk Kim  *
74a159c266SJung-uk Kim  * RETURN:      Status
75a159c266SJung-uk Kim  *
76a159c266SJung-uk Kim  * DESCRIPTION: Callback from AcpiWalkNamespace. Invoked for every object
77a159c266SJung-uk Kim  *              within the namespace.
78a159c266SJung-uk Kim  *
79a159c266SJung-uk Kim  *              Currently, the only objects that require initialization are:
80a159c266SJung-uk Kim  *              1) Methods
81a159c266SJung-uk Kim  *              2) Operation Regions
82a159c266SJung-uk Kim  *
83a159c266SJung-uk Kim  ******************************************************************************/
84a159c266SJung-uk Kim 
85a159c266SJung-uk Kim static ACPI_STATUS
86a159c266SJung-uk Kim AcpiDsInitOneObject (
87a159c266SJung-uk Kim     ACPI_HANDLE             ObjHandle,
88a159c266SJung-uk Kim     UINT32                  Level,
89a159c266SJung-uk Kim     void                    *Context,
90a159c266SJung-uk Kim     void                    **ReturnValue)
91a159c266SJung-uk Kim {
92a159c266SJung-uk Kim     ACPI_INIT_WALK_INFO     *Info = (ACPI_INIT_WALK_INFO *) Context;
93a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
94a159c266SJung-uk Kim     ACPI_OBJECT_TYPE        Type;
95a159c266SJung-uk Kim     ACPI_STATUS             Status;
96a159c266SJung-uk Kim 
97a159c266SJung-uk Kim 
98a159c266SJung-uk Kim     ACPI_FUNCTION_ENTRY ();
99a159c266SJung-uk Kim 
100a159c266SJung-uk Kim 
101a159c266SJung-uk Kim     /*
102a159c266SJung-uk Kim      * We are only interested in NS nodes owned by the table that
103a159c266SJung-uk Kim      * was just loaded
104a159c266SJung-uk Kim      */
105a159c266SJung-uk Kim     if (Node->OwnerId != Info->OwnerId)
106a159c266SJung-uk Kim     {
107a159c266SJung-uk Kim         return (AE_OK);
108a159c266SJung-uk Kim     }
109a159c266SJung-uk Kim 
110a159c266SJung-uk Kim     Info->ObjectCount++;
111a159c266SJung-uk Kim 
112a159c266SJung-uk Kim     /* And even then, we are only interested in a few object types */
113a159c266SJung-uk Kim 
114a159c266SJung-uk Kim     Type = AcpiNsGetType (ObjHandle);
115a159c266SJung-uk Kim 
116a159c266SJung-uk Kim     switch (Type)
117a159c266SJung-uk Kim     {
118a159c266SJung-uk Kim     case ACPI_TYPE_REGION:
119a159c266SJung-uk Kim 
120a159c266SJung-uk Kim         Status = AcpiDsInitializeRegion (ObjHandle);
121a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
122a159c266SJung-uk Kim         {
123a159c266SJung-uk Kim             ACPI_EXCEPTION ((AE_INFO, Status,
124a159c266SJung-uk Kim                 "During Region initialization %p [%4.4s]",
125a159c266SJung-uk Kim                 ObjHandle, AcpiUtGetNodeName (ObjHandle)));
126a159c266SJung-uk Kim         }
127a159c266SJung-uk Kim 
128a159c266SJung-uk Kim         Info->OpRegionCount++;
129a159c266SJung-uk Kim         break;
130a159c266SJung-uk Kim 
131a159c266SJung-uk Kim     case ACPI_TYPE_METHOD:
132a159c266SJung-uk Kim 
133a159c266SJung-uk Kim         Info->MethodCount++;
134a159c266SJung-uk Kim         break;
135a159c266SJung-uk Kim 
136a159c266SJung-uk Kim     case ACPI_TYPE_DEVICE:
137a159c266SJung-uk Kim 
138a159c266SJung-uk Kim         Info->DeviceCount++;
139a159c266SJung-uk Kim         break;
140a159c266SJung-uk Kim 
141a159c266SJung-uk Kim     default:
142*a9d8d09cSJung-uk Kim 
143a159c266SJung-uk Kim         break;
144a159c266SJung-uk Kim     }
145a159c266SJung-uk Kim 
146a159c266SJung-uk Kim     /*
147a159c266SJung-uk Kim      * We ignore errors from above, and always return OK, since
148a159c266SJung-uk Kim      * we don't want to abort the walk on a single error.
149a159c266SJung-uk Kim      */
150a159c266SJung-uk Kim     return (AE_OK);
151a159c266SJung-uk Kim }
152a159c266SJung-uk Kim 
153a159c266SJung-uk Kim 
154a159c266SJung-uk Kim /*******************************************************************************
155a159c266SJung-uk Kim  *
156a159c266SJung-uk Kim  * FUNCTION:    AcpiDsInitializeObjects
157a159c266SJung-uk Kim  *
158a159c266SJung-uk Kim  * PARAMETERS:  TableDesc       - Descriptor for parent ACPI table
159a159c266SJung-uk Kim  *              StartNode       - Root of subtree to be initialized.
160a159c266SJung-uk Kim  *
161a159c266SJung-uk Kim  * RETURN:      Status
162a159c266SJung-uk Kim  *
163a159c266SJung-uk Kim  * DESCRIPTION: Walk the namespace starting at "StartNode" and perform any
164a159c266SJung-uk Kim  *              necessary initialization on the objects found therein
165a159c266SJung-uk Kim  *
166a159c266SJung-uk Kim  ******************************************************************************/
167a159c266SJung-uk Kim 
168a159c266SJung-uk Kim ACPI_STATUS
169a159c266SJung-uk Kim AcpiDsInitializeObjects (
170a159c266SJung-uk Kim     UINT32                  TableIndex,
171a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *StartNode)
172a159c266SJung-uk Kim {
173a159c266SJung-uk Kim     ACPI_STATUS             Status;
174a159c266SJung-uk Kim     ACPI_INIT_WALK_INFO     Info;
175a159c266SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
176a159c266SJung-uk Kim     ACPI_OWNER_ID           OwnerId;
177a159c266SJung-uk Kim 
178a159c266SJung-uk Kim 
179a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (DsInitializeObjects);
180a159c266SJung-uk Kim 
181a159c266SJung-uk Kim 
182a159c266SJung-uk Kim     Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
183a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
184a159c266SJung-uk Kim     {
185a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
186a159c266SJung-uk Kim     }
187a159c266SJung-uk Kim 
188a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
189a159c266SJung-uk Kim         "**** Starting initialization of namespace objects ****\n"));
190a159c266SJung-uk Kim     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Parsing all Control Methods:"));
191a159c266SJung-uk Kim 
192a159c266SJung-uk Kim     /* Set all init info to zero */
193a159c266SJung-uk Kim 
194a159c266SJung-uk Kim     ACPI_MEMSET (&Info, 0, sizeof (ACPI_INIT_WALK_INFO));
195a159c266SJung-uk Kim 
196a159c266SJung-uk Kim     Info.OwnerId = OwnerId;
197a159c266SJung-uk Kim     Info.TableIndex = TableIndex;
198a159c266SJung-uk Kim 
199a159c266SJung-uk Kim     /* Walk entire namespace from the supplied root */
200a159c266SJung-uk Kim 
201a159c266SJung-uk Kim     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
202a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
203a159c266SJung-uk Kim     {
204a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
205a159c266SJung-uk Kim     }
206a159c266SJung-uk Kim 
207a159c266SJung-uk Kim     /*
208a159c266SJung-uk Kim      * We don't use AcpiWalkNamespace since we do not want to acquire
209a159c266SJung-uk Kim      * the namespace reader lock.
210a159c266SJung-uk Kim      */
211a159c266SJung-uk Kim     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, StartNode, ACPI_UINT32_MAX,
212a159c266SJung-uk Kim                 ACPI_NS_WALK_UNLOCK, AcpiDsInitOneObject, NULL, &Info, NULL);
213a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
214a159c266SJung-uk Kim     {
215a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));
216a159c266SJung-uk Kim     }
217a159c266SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
218a159c266SJung-uk Kim 
219a159c266SJung-uk Kim     Status = AcpiGetTableByIndex (TableIndex, &Table);
220a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
221a159c266SJung-uk Kim     {
222a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
223a159c266SJung-uk Kim     }
224a159c266SJung-uk Kim 
225a159c266SJung-uk Kim     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
226a159c266SJung-uk Kim         "\nTable [%4.4s](id %4.4X) - %u Objects with %u Devices %u Methods %u Regions\n",
227a159c266SJung-uk Kim         Table->Signature, OwnerId, Info.ObjectCount,
228a159c266SJung-uk Kim         Info.DeviceCount, Info.MethodCount, Info.OpRegionCount));
229a159c266SJung-uk Kim 
230a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
231a159c266SJung-uk Kim         "%u Methods, %u Regions\n", Info.MethodCount, Info.OpRegionCount));
232a159c266SJung-uk Kim 
233a159c266SJung-uk Kim     return_ACPI_STATUS (AE_OK);
234a159c266SJung-uk Kim }
235