1 | /******************************************************************************* |
2 | * |
3 | * Module Name: nsxfobj - Public interfaces to the ACPI subsystem |
4 | * ACPI Object oriented interfaces |
5 | * |
6 | ******************************************************************************/ |
7 | |
8 | /* |
9 | * Copyright (C) 2000 - 2016, Intel Corp. |
10 | * All rights reserved. |
11 | * |
12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions |
14 | * are met: |
15 | * 1. Redistributions of source code must retain the above copyright |
16 | * notice, this list of conditions, and the following disclaimer, |
17 | * without modification. |
18 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer |
19 | * substantially similar to the "NO WARRANTY" disclaimer below |
20 | * ("Disclaimer") and any redistribution must be conditioned upon |
21 | * including a substantially similar Disclaimer requirement for further |
22 | * binary redistribution. |
23 | * 3. Neither the names of the above-listed copyright holders nor the names |
24 | * of any contributors may be used to endorse or promote products derived |
25 | * from this software without specific prior written permission. |
26 | * |
27 | * Alternatively, this software may be distributed under the terms of the |
28 | * GNU General Public License ("GPL") version 2 as published by the Free |
29 | * Software Foundation. |
30 | * |
31 | * NO WARRANTY |
32 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
33 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
34 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR |
35 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
36 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
40 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
41 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
42 | * POSSIBILITY OF SUCH DAMAGES. |
43 | */ |
44 | |
45 | #define EXPORT_ACPI_INTERFACES |
46 | |
47 | #include "acpi.h" |
48 | #include "accommon.h" |
49 | #include "acnamesp.h" |
50 | |
51 | |
52 | #define _COMPONENT ACPI_NAMESPACE |
53 | ACPI_MODULE_NAME ("nsxfobj" ) |
54 | |
55 | /******************************************************************************* |
56 | * |
57 | * FUNCTION: AcpiGetType |
58 | * |
59 | * PARAMETERS: Handle - Handle of object whose type is desired |
60 | * RetType - Where the type will be placed |
61 | * |
62 | * RETURN: Status |
63 | * |
64 | * DESCRIPTION: This routine returns the type associatd with a particular handle |
65 | * |
66 | ******************************************************************************/ |
67 | |
68 | ACPI_STATUS |
69 | AcpiGetType ( |
70 | ACPI_HANDLE Handle, |
71 | ACPI_OBJECT_TYPE *RetType) |
72 | { |
73 | ACPI_NAMESPACE_NODE *Node; |
74 | ACPI_STATUS Status; |
75 | |
76 | |
77 | /* Parameter Validation */ |
78 | |
79 | if (!RetType) |
80 | { |
81 | return (AE_BAD_PARAMETER); |
82 | } |
83 | |
84 | /* Special case for the predefined Root Node (return type ANY) */ |
85 | |
86 | if (Handle == ACPI_ROOT_OBJECT) |
87 | { |
88 | *RetType = ACPI_TYPE_ANY; |
89 | return (AE_OK); |
90 | } |
91 | |
92 | Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); |
93 | if (ACPI_FAILURE (Status)) |
94 | { |
95 | return (Status); |
96 | } |
97 | |
98 | /* Convert and validate the handle */ |
99 | |
100 | Node = AcpiNsValidateHandle (Handle); |
101 | if (!Node) |
102 | { |
103 | (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); |
104 | return (AE_BAD_PARAMETER); |
105 | } |
106 | |
107 | *RetType = Node->Type; |
108 | |
109 | Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); |
110 | return (Status); |
111 | } |
112 | |
113 | ACPI_EXPORT_SYMBOL (AcpiGetType) |
114 | |
115 | |
116 | /******************************************************************************* |
117 | * |
118 | * FUNCTION: AcpiGetParent |
119 | * |
120 | * PARAMETERS: Handle - Handle of object whose parent is desired |
121 | * RetHandle - Where the parent handle will be placed |
122 | * |
123 | * RETURN: Status |
124 | * |
125 | * DESCRIPTION: Returns a handle to the parent of the object represented by |
126 | * Handle. |
127 | * |
128 | ******************************************************************************/ |
129 | |
130 | ACPI_STATUS |
131 | AcpiGetParent ( |
132 | ACPI_HANDLE Handle, |
133 | ACPI_HANDLE *RetHandle) |
134 | { |
135 | ACPI_NAMESPACE_NODE *Node; |
136 | ACPI_NAMESPACE_NODE *ParentNode; |
137 | ACPI_STATUS Status; |
138 | |
139 | |
140 | if (!RetHandle) |
141 | { |
142 | return (AE_BAD_PARAMETER); |
143 | } |
144 | |
145 | /* Special case for the predefined Root Node (no parent) */ |
146 | |
147 | if (Handle == ACPI_ROOT_OBJECT) |
148 | { |
149 | return (AE_NULL_ENTRY); |
150 | } |
151 | |
152 | Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); |
153 | if (ACPI_FAILURE (Status)) |
154 | { |
155 | return (Status); |
156 | } |
157 | |
158 | /* Convert and validate the handle */ |
159 | |
160 | Node = AcpiNsValidateHandle (Handle); |
161 | if (!Node) |
162 | { |
163 | Status = AE_BAD_PARAMETER; |
164 | goto UnlockAndExit; |
165 | } |
166 | |
167 | /* Get the parent entry */ |
168 | |
169 | ParentNode = Node->Parent; |
170 | *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, ParentNode); |
171 | |
172 | /* Return exception if parent is null */ |
173 | |
174 | if (!ParentNode) |
175 | { |
176 | Status = AE_NULL_ENTRY; |
177 | } |
178 | |
179 | |
180 | UnlockAndExit: |
181 | |
182 | (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); |
183 | return (Status); |
184 | } |
185 | |
186 | ACPI_EXPORT_SYMBOL (AcpiGetParent) |
187 | |
188 | |
189 | /******************************************************************************* |
190 | * |
191 | * FUNCTION: AcpiGetNextObject |
192 | * |
193 | * PARAMETERS: Type - Type of object to be searched for |
194 | * Parent - Parent object whose children we are getting |
195 | * LastChild - Previous child that was found. |
196 | * The NEXT child will be returned |
197 | * RetHandle - Where handle to the next object is placed |
198 | * |
199 | * RETURN: Status |
200 | * |
201 | * DESCRIPTION: Return the next peer object within the namespace. If Handle is |
202 | * valid, Scope is ignored. Otherwise, the first object within |
203 | * Scope is returned. |
204 | * |
205 | ******************************************************************************/ |
206 | |
207 | ACPI_STATUS |
208 | AcpiGetNextObject ( |
209 | ACPI_OBJECT_TYPE Type, |
210 | ACPI_HANDLE Parent, |
211 | ACPI_HANDLE Child, |
212 | ACPI_HANDLE *RetHandle) |
213 | { |
214 | ACPI_STATUS Status; |
215 | ACPI_NAMESPACE_NODE *Node; |
216 | ACPI_NAMESPACE_NODE *ParentNode = NULL; |
217 | ACPI_NAMESPACE_NODE *ChildNode = NULL; |
218 | |
219 | |
220 | /* Parameter validation */ |
221 | |
222 | if (Type > ACPI_TYPE_EXTERNAL_MAX) |
223 | { |
224 | return (AE_BAD_PARAMETER); |
225 | } |
226 | |
227 | Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); |
228 | if (ACPI_FAILURE (Status)) |
229 | { |
230 | return (Status); |
231 | } |
232 | |
233 | /* If null handle, use the parent */ |
234 | |
235 | if (!Child) |
236 | { |
237 | /* Start search at the beginning of the specified scope */ |
238 | |
239 | ParentNode = AcpiNsValidateHandle (Parent); |
240 | if (!ParentNode) |
241 | { |
242 | Status = AE_BAD_PARAMETER; |
243 | goto UnlockAndExit; |
244 | } |
245 | } |
246 | else |
247 | { |
248 | /* Non-null handle, ignore the parent */ |
249 | /* Convert and validate the handle */ |
250 | |
251 | ChildNode = AcpiNsValidateHandle (Child); |
252 | if (!ChildNode) |
253 | { |
254 | Status = AE_BAD_PARAMETER; |
255 | goto UnlockAndExit; |
256 | } |
257 | } |
258 | |
259 | /* Internal function does the real work */ |
260 | |
261 | Node = AcpiNsGetNextNodeTyped (Type, ParentNode, ChildNode); |
262 | if (!Node) |
263 | { |
264 | Status = AE_NOT_FOUND; |
265 | goto UnlockAndExit; |
266 | } |
267 | |
268 | if (RetHandle) |
269 | { |
270 | *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node); |
271 | } |
272 | |
273 | |
274 | UnlockAndExit: |
275 | |
276 | (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); |
277 | return (Status); |
278 | } |
279 | |
280 | ACPI_EXPORT_SYMBOL (AcpiGetNextObject) |
281 | |