evrgnini.c revision 1.22 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: evrgnini- ACPI AddressSpace (OpRegion) init
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.22 christos /******************************************************************************
8 1.22 christos *
9 1.22 christos * 1. Copyright Notice
10 1.22 christos *
11 1.22 christos * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
12 1.1 jruoho * All rights reserved.
13 1.1 jruoho *
14 1.22 christos * 2. License
15 1.22 christos *
16 1.22 christos * 2.1. This is your license from Intel Corp. under its intellectual property
17 1.22 christos * rights. You may have additional license terms from the party that provided
18 1.22 christos * you this software, covering your right to use that party's intellectual
19 1.22 christos * property rights.
20 1.22 christos *
21 1.22 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 1.22 christos * copy of the source code appearing in this file ("Covered Code") an
23 1.22 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 1.22 christos * base code distributed originally by Intel ("Original Intel Code") to copy,
25 1.22 christos * make derivatives, distribute, use and display any portion of the Covered
26 1.22 christos * Code in any form, with the right to sublicense such rights; and
27 1.22 christos *
28 1.22 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 1.22 christos * license (with the right to sublicense), under only those claims of Intel
30 1.22 christos * patents that are infringed by the Original Intel Code, to make, use, sell,
31 1.22 christos * offer to sell, and import the Covered Code and derivative works thereof
32 1.22 christos * solely to the minimum extent necessary to exercise the above copyright
33 1.22 christos * license, and in no event shall the patent license extend to any additions
34 1.22 christos * to or modifications of the Original Intel Code. No other license or right
35 1.22 christos * is granted directly or by implication, estoppel or otherwise;
36 1.22 christos *
37 1.22 christos * The above copyright and patent license is granted only if the following
38 1.22 christos * conditions are met:
39 1.22 christos *
40 1.22 christos * 3. Conditions
41 1.22 christos *
42 1.22 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 1.22 christos * Redistribution of source code of any substantial portion of the Covered
44 1.22 christos * Code or modification with rights to further distribute source must include
45 1.22 christos * the above Copyright Notice, the above License, this list of Conditions,
46 1.22 christos * and the following Disclaimer and Export Compliance provision. In addition,
47 1.22 christos * Licensee must cause all Covered Code to which Licensee contributes to
48 1.22 christos * contain a file documenting the changes Licensee made to create that Covered
49 1.22 christos * Code and the date of any change. Licensee must include in that file the
50 1.22 christos * documentation of any changes made by any predecessor Licensee. Licensee
51 1.22 christos * must include a prominent statement that the modification is derived,
52 1.22 christos * directly or indirectly, from Original Intel Code.
53 1.22 christos *
54 1.22 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 1.22 christos * Redistribution of source code of any substantial portion of the Covered
56 1.22 christos * Code or modification without rights to further distribute source must
57 1.22 christos * include the following Disclaimer and Export Compliance provision in the
58 1.22 christos * documentation and/or other materials provided with distribution. In
59 1.22 christos * addition, Licensee may not authorize further sublicense of source of any
60 1.22 christos * portion of the Covered Code, and must include terms to the effect that the
61 1.22 christos * license from Licensee to its licensee is limited to the intellectual
62 1.22 christos * property embodied in the software Licensee provides to its licensee, and
63 1.22 christos * not to intellectual property embodied in modifications its licensee may
64 1.22 christos * make.
65 1.22 christos *
66 1.22 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 1.22 christos * substantial portion of the Covered Code or modification must reproduce the
68 1.22 christos * above Copyright Notice, and the following Disclaimer and Export Compliance
69 1.22 christos * provision in the documentation and/or other materials provided with the
70 1.22 christos * distribution.
71 1.22 christos *
72 1.22 christos * 3.4. Intel retains all right, title, and interest in and to the Original
73 1.22 christos * Intel Code.
74 1.22 christos *
75 1.22 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 1.22 christos * Intel shall be used in advertising or otherwise to promote the sale, use or
77 1.22 christos * other dealings in products derived from or relating to the Covered Code
78 1.22 christos * without prior written authorization from Intel.
79 1.22 christos *
80 1.22 christos * 4. Disclaimer and Export Compliance
81 1.22 christos *
82 1.22 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 1.22 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 1.22 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 1.22 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 1.22 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 1.22 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 1.22 christos * PARTICULAR PURPOSE.
89 1.22 christos *
90 1.22 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 1.22 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 1.22 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 1.22 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 1.22 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 1.22 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 1.22 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 1.22 christos * LIMITED REMEDY.
98 1.22 christos *
99 1.22 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 1.22 christos * software or system incorporating such software without first obtaining any
101 1.22 christos * required license or other approval from the U. S. Department of Commerce or
102 1.22 christos * any other agency or department of the United States Government. In the
103 1.22 christos * event Licensee exports any such software from the United States or
104 1.22 christos * re-exports any such software from a foreign destination, Licensee shall
105 1.22 christos * ensure that the distribution and export/re-export of the software is in
106 1.22 christos * compliance with all laws, regulations, orders, or other restrictions of the
107 1.22 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 1.22 christos * any of its subsidiaries will export/re-export any technical data, process,
109 1.22 christos * software, or service, directly or indirectly, to any country for which the
110 1.22 christos * United States government or any agency thereof requires an export license,
111 1.22 christos * other governmental approval, or letter of assurance, without first obtaining
112 1.22 christos * such license, approval or letter.
113 1.22 christos *
114 1.22 christos *****************************************************************************
115 1.22 christos *
116 1.22 christos * Alternatively, you may choose to be licensed under the terms of the
117 1.22 christos * following license:
118 1.22 christos *
119 1.3 jruoho * Redistribution and use in source and binary forms, with or without
120 1.3 jruoho * modification, are permitted provided that the following conditions
121 1.3 jruoho * are met:
122 1.3 jruoho * 1. Redistributions of source code must retain the above copyright
123 1.3 jruoho * notice, this list of conditions, and the following disclaimer,
124 1.3 jruoho * without modification.
125 1.3 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126 1.3 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
127 1.3 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
128 1.3 jruoho * including a substantially similar Disclaimer requirement for further
129 1.3 jruoho * binary redistribution.
130 1.3 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
131 1.3 jruoho * of any contributors may be used to endorse or promote products derived
132 1.3 jruoho * from this software without specific prior written permission.
133 1.3 jruoho *
134 1.3 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135 1.3 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136 1.18 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137 1.3 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138 1.22 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139 1.22 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140 1.22 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141 1.22 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142 1.22 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143 1.22 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144 1.22 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145 1.22 christos *
146 1.22 christos * Alternatively, you may choose to be licensed under the terms of the
147 1.22 christos * GNU General Public License ("GPL") version 2 as published by the Free
148 1.22 christos * Software Foundation.
149 1.22 christos *
150 1.22 christos *****************************************************************************/
151 1.1 jruoho
152 1.1 jruoho #include "acpi.h"
153 1.1 jruoho #include "accommon.h"
154 1.1 jruoho #include "acevents.h"
155 1.1 jruoho #include "acnamesp.h"
156 1.11 christos #include "acinterp.h"
157 1.1 jruoho
158 1.1 jruoho #define _COMPONENT ACPI_EVENTS
159 1.1 jruoho ACPI_MODULE_NAME ("evrgnini")
160 1.1 jruoho
161 1.1 jruoho
162 1.1 jruoho /*******************************************************************************
163 1.1 jruoho *
164 1.1 jruoho * FUNCTION: AcpiEvSystemMemoryRegionSetup
165 1.1 jruoho *
166 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
167 1.1 jruoho * Function - Start or stop
168 1.1 jruoho * HandlerContext - Address space handler context
169 1.1 jruoho * RegionContext - Region specific context
170 1.1 jruoho *
171 1.1 jruoho * RETURN: Status
172 1.1 jruoho *
173 1.1 jruoho * DESCRIPTION: Setup a SystemMemory operation region
174 1.1 jruoho *
175 1.1 jruoho ******************************************************************************/
176 1.1 jruoho
177 1.1 jruoho ACPI_STATUS
178 1.1 jruoho AcpiEvSystemMemoryRegionSetup (
179 1.1 jruoho ACPI_HANDLE Handle,
180 1.1 jruoho UINT32 Function,
181 1.1 jruoho void *HandlerContext,
182 1.1 jruoho void **RegionContext)
183 1.1 jruoho {
184 1.1 jruoho ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle;
185 1.1 jruoho ACPI_MEM_SPACE_CONTEXT *LocalRegionContext;
186 1.17 christos ACPI_MEM_MAPPING *Mm;
187 1.1 jruoho
188 1.1 jruoho
189 1.1 jruoho ACPI_FUNCTION_TRACE (EvSystemMemoryRegionSetup);
190 1.1 jruoho
191 1.1 jruoho
192 1.1 jruoho if (Function == ACPI_REGION_DEACTIVATE)
193 1.1 jruoho {
194 1.1 jruoho if (*RegionContext)
195 1.1 jruoho {
196 1.1 jruoho LocalRegionContext = (ACPI_MEM_SPACE_CONTEXT *) *RegionContext;
197 1.1 jruoho
198 1.17 christos /* Delete memory mappings if present */
199 1.1 jruoho
200 1.17 christos while (LocalRegionContext->FirstMm)
201 1.1 jruoho {
202 1.17 christos Mm = LocalRegionContext->FirstMm;
203 1.17 christos LocalRegionContext->FirstMm = Mm->NextMm;
204 1.17 christos AcpiOsUnmapMemory(Mm->LogicalAddress, Mm->Length);
205 1.17 christos ACPI_FREE(Mm);
206 1.1 jruoho }
207 1.1 jruoho ACPI_FREE (LocalRegionContext);
208 1.1 jruoho *RegionContext = NULL;
209 1.1 jruoho }
210 1.1 jruoho return_ACPI_STATUS (AE_OK);
211 1.1 jruoho }
212 1.1 jruoho
213 1.1 jruoho /* Create a new context */
214 1.1 jruoho
215 1.1 jruoho LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_MEM_SPACE_CONTEXT));
216 1.1 jruoho if (!(LocalRegionContext))
217 1.1 jruoho {
218 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
219 1.1 jruoho }
220 1.1 jruoho
221 1.1 jruoho /* Save the region length and address for use in the handler */
222 1.1 jruoho
223 1.1 jruoho LocalRegionContext->Length = RegionDesc->Region.Length;
224 1.1 jruoho LocalRegionContext->Address = RegionDesc->Region.Address;
225 1.1 jruoho
226 1.1 jruoho *RegionContext = LocalRegionContext;
227 1.1 jruoho return_ACPI_STATUS (AE_OK);
228 1.1 jruoho }
229 1.1 jruoho
230 1.1 jruoho
231 1.1 jruoho /*******************************************************************************
232 1.1 jruoho *
233 1.1 jruoho * FUNCTION: AcpiEvIoSpaceRegionSetup
234 1.1 jruoho *
235 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
236 1.1 jruoho * Function - Start or stop
237 1.1 jruoho * HandlerContext - Address space handler context
238 1.1 jruoho * RegionContext - Region specific context
239 1.1 jruoho *
240 1.1 jruoho * RETURN: Status
241 1.1 jruoho *
242 1.1 jruoho * DESCRIPTION: Setup a IO operation region
243 1.1 jruoho *
244 1.1 jruoho ******************************************************************************/
245 1.1 jruoho
246 1.1 jruoho ACPI_STATUS
247 1.1 jruoho AcpiEvIoSpaceRegionSetup (
248 1.1 jruoho ACPI_HANDLE Handle,
249 1.1 jruoho UINT32 Function,
250 1.1 jruoho void *HandlerContext,
251 1.1 jruoho void **RegionContext)
252 1.1 jruoho {
253 1.1 jruoho ACPI_FUNCTION_TRACE (EvIoSpaceRegionSetup);
254 1.1 jruoho
255 1.1 jruoho
256 1.1 jruoho if (Function == ACPI_REGION_DEACTIVATE)
257 1.1 jruoho {
258 1.1 jruoho *RegionContext = NULL;
259 1.1 jruoho }
260 1.1 jruoho else
261 1.1 jruoho {
262 1.1 jruoho *RegionContext = HandlerContext;
263 1.1 jruoho }
264 1.1 jruoho
265 1.1 jruoho return_ACPI_STATUS (AE_OK);
266 1.1 jruoho }
267 1.1 jruoho
268 1.1 jruoho
269 1.1 jruoho /*******************************************************************************
270 1.1 jruoho *
271 1.1 jruoho * FUNCTION: AcpiEvPciConfigRegionSetup
272 1.1 jruoho *
273 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
274 1.1 jruoho * Function - Start or stop
275 1.1 jruoho * HandlerContext - Address space handler context
276 1.1 jruoho * RegionContext - Region specific context
277 1.1 jruoho *
278 1.1 jruoho * RETURN: Status
279 1.1 jruoho *
280 1.1 jruoho * DESCRIPTION: Setup a PCI_Config operation region
281 1.1 jruoho *
282 1.1 jruoho * MUTEX: Assumes namespace is not locked
283 1.1 jruoho *
284 1.1 jruoho ******************************************************************************/
285 1.1 jruoho
286 1.1 jruoho ACPI_STATUS
287 1.1 jruoho AcpiEvPciConfigRegionSetup (
288 1.1 jruoho ACPI_HANDLE Handle,
289 1.1 jruoho UINT32 Function,
290 1.1 jruoho void *HandlerContext,
291 1.1 jruoho void **RegionContext)
292 1.1 jruoho {
293 1.1 jruoho ACPI_STATUS Status = AE_OK;
294 1.1 jruoho UINT64 PciValue;
295 1.1 jruoho ACPI_PCI_ID *PciId = *RegionContext;
296 1.1 jruoho ACPI_OPERAND_OBJECT *HandlerObj;
297 1.1 jruoho ACPI_NAMESPACE_NODE *ParentNode;
298 1.1 jruoho ACPI_NAMESPACE_NODE *PciRootNode;
299 1.1 jruoho ACPI_NAMESPACE_NODE *PciDeviceNode;
300 1.1 jruoho ACPI_OPERAND_OBJECT *RegionObj = (ACPI_OPERAND_OBJECT *) Handle;
301 1.1 jruoho
302 1.1 jruoho
303 1.1 jruoho ACPI_FUNCTION_TRACE (EvPciConfigRegionSetup);
304 1.1 jruoho
305 1.1 jruoho
306 1.1 jruoho HandlerObj = RegionObj->Region.Handler;
307 1.1 jruoho if (!HandlerObj)
308 1.1 jruoho {
309 1.1 jruoho /*
310 1.1 jruoho * No installed handler. This shouldn't happen because the dispatch
311 1.1 jruoho * routine checks before we get here, but we check again just in case.
312 1.1 jruoho */
313 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
314 1.1 jruoho "Attempting to init a region %p, with no handler\n", RegionObj));
315 1.1 jruoho return_ACPI_STATUS (AE_NOT_EXIST);
316 1.1 jruoho }
317 1.1 jruoho
318 1.1 jruoho *RegionContext = NULL;
319 1.1 jruoho if (Function == ACPI_REGION_DEACTIVATE)
320 1.1 jruoho {
321 1.1 jruoho if (PciId)
322 1.1 jruoho {
323 1.1 jruoho ACPI_FREE (PciId);
324 1.1 jruoho }
325 1.1 jruoho return_ACPI_STATUS (Status);
326 1.1 jruoho }
327 1.1 jruoho
328 1.1 jruoho ParentNode = RegionObj->Region.Node->Parent;
329 1.1 jruoho
330 1.1 jruoho /*
331 1.1 jruoho * Get the _SEG and _BBN values from the device upon which the handler
332 1.1 jruoho * is installed.
333 1.1 jruoho *
334 1.1 jruoho * We need to get the _SEG and _BBN objects relative to the PCI BUS device.
335 1.1 jruoho * This is the device the handler has been registered to handle.
336 1.1 jruoho */
337 1.1 jruoho
338 1.1 jruoho /*
339 1.1 jruoho * If the AddressSpace.Node is still pointing to the root, we need
340 1.1 jruoho * to scan upward for a PCI Root bridge and re-associate the OpRegion
341 1.1 jruoho * handlers with that device.
342 1.1 jruoho */
343 1.1 jruoho if (HandlerObj->AddressSpace.Node == AcpiGbl_RootNode)
344 1.1 jruoho {
345 1.1 jruoho /* Start search from the parent object */
346 1.1 jruoho
347 1.1 jruoho PciRootNode = ParentNode;
348 1.1 jruoho while (PciRootNode != AcpiGbl_RootNode)
349 1.1 jruoho {
350 1.1 jruoho /* Get the _HID/_CID in order to detect a RootBridge */
351 1.1 jruoho
352 1.1 jruoho if (AcpiEvIsPciRootBridge (PciRootNode))
353 1.1 jruoho {
354 1.1 jruoho /* Install a handler for this PCI root bridge */
355 1.1 jruoho
356 1.1 jruoho Status = AcpiInstallAddressSpaceHandler (
357 1.8 christos (ACPI_HANDLE) PciRootNode,
358 1.8 christos ACPI_ADR_SPACE_PCI_CONFIG,
359 1.8 christos ACPI_DEFAULT_HANDLER, NULL, NULL);
360 1.1 jruoho if (ACPI_FAILURE (Status))
361 1.1 jruoho {
362 1.1 jruoho if (Status == AE_SAME_HANDLER)
363 1.1 jruoho {
364 1.1 jruoho /*
365 1.1 jruoho * It is OK if the handler is already installed on the
366 1.1 jruoho * root bridge. Still need to return a context object
367 1.1 jruoho * for the new PCI_Config operation region, however.
368 1.1 jruoho */
369 1.1 jruoho }
370 1.1 jruoho else
371 1.1 jruoho {
372 1.1 jruoho ACPI_EXCEPTION ((AE_INFO, Status,
373 1.1 jruoho "Could not install PciConfig handler "
374 1.1 jruoho "for Root Bridge %4.4s",
375 1.1 jruoho AcpiUtGetNodeName (PciRootNode)));
376 1.1 jruoho }
377 1.1 jruoho }
378 1.1 jruoho break;
379 1.1 jruoho }
380 1.1 jruoho
381 1.1 jruoho PciRootNode = PciRootNode->Parent;
382 1.1 jruoho }
383 1.1 jruoho
384 1.1 jruoho /* PCI root bridge not found, use namespace root node */
385 1.1 jruoho }
386 1.1 jruoho else
387 1.1 jruoho {
388 1.1 jruoho PciRootNode = HandlerObj->AddressSpace.Node;
389 1.1 jruoho }
390 1.1 jruoho
391 1.1 jruoho /*
392 1.1 jruoho * If this region is now initialized, we are done.
393 1.1 jruoho * (InstallAddressSpaceHandler could have initialized it)
394 1.1 jruoho */
395 1.1 jruoho if (RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE)
396 1.1 jruoho {
397 1.1 jruoho return_ACPI_STATUS (AE_OK);
398 1.1 jruoho }
399 1.1 jruoho
400 1.1 jruoho /* Region is still not initialized. Create a new context */
401 1.1 jruoho
402 1.1 jruoho PciId = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PCI_ID));
403 1.1 jruoho if (!PciId)
404 1.1 jruoho {
405 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
406 1.1 jruoho }
407 1.1 jruoho
408 1.1 jruoho /*
409 1.1 jruoho * For PCI_Config space access, we need the segment, bus, device and
410 1.1 jruoho * function numbers. Acquire them here.
411 1.1 jruoho *
412 1.1 jruoho * Find the parent device object. (This allows the operation region to be
413 1.1 jruoho * within a subscope under the device, such as a control method.)
414 1.1 jruoho */
415 1.1 jruoho PciDeviceNode = RegionObj->Region.Node;
416 1.1 jruoho while (PciDeviceNode && (PciDeviceNode->Type != ACPI_TYPE_DEVICE))
417 1.1 jruoho {
418 1.1 jruoho PciDeviceNode = PciDeviceNode->Parent;
419 1.1 jruoho }
420 1.1 jruoho
421 1.1 jruoho if (!PciDeviceNode)
422 1.1 jruoho {
423 1.1 jruoho ACPI_FREE (PciId);
424 1.1 jruoho return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
425 1.1 jruoho }
426 1.1 jruoho
427 1.1 jruoho /*
428 1.3 jruoho * Get the PCI device and function numbers from the _ADR object
429 1.3 jruoho * contained in the parent's scope.
430 1.1 jruoho */
431 1.1 jruoho Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR,
432 1.8 christos PciDeviceNode, &PciValue);
433 1.1 jruoho
434 1.1 jruoho /*
435 1.1 jruoho * The default is zero, and since the allocation above zeroed the data,
436 1.1 jruoho * just do nothing on failure.
437 1.1 jruoho */
438 1.1 jruoho if (ACPI_SUCCESS (Status))
439 1.1 jruoho {
440 1.1 jruoho PciId->Device = ACPI_HIWORD (ACPI_LODWORD (PciValue));
441 1.1 jruoho PciId->Function = ACPI_LOWORD (ACPI_LODWORD (PciValue));
442 1.1 jruoho }
443 1.1 jruoho
444 1.1 jruoho /* The PCI segment number comes from the _SEG method */
445 1.1 jruoho
446 1.1 jruoho Status = AcpiUtEvaluateNumericObject (METHOD_NAME__SEG,
447 1.8 christos PciRootNode, &PciValue);
448 1.1 jruoho if (ACPI_SUCCESS (Status))
449 1.1 jruoho {
450 1.1 jruoho PciId->Segment = ACPI_LOWORD (PciValue);
451 1.1 jruoho }
452 1.1 jruoho
453 1.1 jruoho /* The PCI bus number comes from the _BBN method */
454 1.1 jruoho
455 1.1 jruoho Status = AcpiUtEvaluateNumericObject (METHOD_NAME__BBN,
456 1.8 christos PciRootNode, &PciValue);
457 1.1 jruoho if (ACPI_SUCCESS (Status))
458 1.1 jruoho {
459 1.1 jruoho PciId->Bus = ACPI_LOWORD (PciValue);
460 1.1 jruoho }
461 1.1 jruoho
462 1.3 jruoho /* Complete/update the PCI ID for this device */
463 1.1 jruoho
464 1.3 jruoho Status = AcpiHwDerivePciId (PciId, PciRootNode, RegionObj->Region.Node);
465 1.3 jruoho if (ACPI_FAILURE (Status))
466 1.3 jruoho {
467 1.3 jruoho ACPI_FREE (PciId);
468 1.3 jruoho return_ACPI_STATUS (Status);
469 1.3 jruoho }
470 1.1 jruoho
471 1.1 jruoho *RegionContext = PciId;
472 1.1 jruoho return_ACPI_STATUS (AE_OK);
473 1.1 jruoho }
474 1.1 jruoho
475 1.1 jruoho
476 1.1 jruoho /*******************************************************************************
477 1.1 jruoho *
478 1.1 jruoho * FUNCTION: AcpiEvIsPciRootBridge
479 1.1 jruoho *
480 1.1 jruoho * PARAMETERS: Node - Device node being examined
481 1.1 jruoho *
482 1.1 jruoho * RETURN: TRUE if device is a PCI/PCI-Express Root Bridge
483 1.1 jruoho *
484 1.1 jruoho * DESCRIPTION: Determine if the input device represents a PCI Root Bridge by
485 1.1 jruoho * examining the _HID and _CID for the device.
486 1.1 jruoho *
487 1.1 jruoho ******************************************************************************/
488 1.1 jruoho
489 1.13 christos BOOLEAN
490 1.1 jruoho AcpiEvIsPciRootBridge (
491 1.1 jruoho ACPI_NAMESPACE_NODE *Node)
492 1.1 jruoho {
493 1.1 jruoho ACPI_STATUS Status;
494 1.5 christos ACPI_PNP_DEVICE_ID *Hid;
495 1.5 christos ACPI_PNP_DEVICE_ID_LIST *Cid;
496 1.1 jruoho UINT32 i;
497 1.1 jruoho BOOLEAN Match;
498 1.1 jruoho
499 1.1 jruoho
500 1.1 jruoho /* Get the _HID and check for a PCI Root Bridge */
501 1.1 jruoho
502 1.1 jruoho Status = AcpiUtExecute_HID (Node, &Hid);
503 1.1 jruoho if (ACPI_FAILURE (Status))
504 1.1 jruoho {
505 1.1 jruoho return (FALSE);
506 1.1 jruoho }
507 1.1 jruoho
508 1.1 jruoho Match = AcpiUtIsPciRootBridge (Hid->String);
509 1.1 jruoho ACPI_FREE (Hid);
510 1.1 jruoho
511 1.1 jruoho if (Match)
512 1.1 jruoho {
513 1.1 jruoho return (TRUE);
514 1.1 jruoho }
515 1.1 jruoho
516 1.1 jruoho /* The _HID did not match. Get the _CID and check for a PCI Root Bridge */
517 1.1 jruoho
518 1.1 jruoho Status = AcpiUtExecute_CID (Node, &Cid);
519 1.1 jruoho if (ACPI_FAILURE (Status))
520 1.1 jruoho {
521 1.1 jruoho return (FALSE);
522 1.1 jruoho }
523 1.1 jruoho
524 1.1 jruoho /* Check all _CIDs in the returned list */
525 1.1 jruoho
526 1.1 jruoho for (i = 0; i < Cid->Count; i++)
527 1.1 jruoho {
528 1.1 jruoho if (AcpiUtIsPciRootBridge (Cid->Ids[i].String))
529 1.1 jruoho {
530 1.1 jruoho ACPI_FREE (Cid);
531 1.1 jruoho return (TRUE);
532 1.1 jruoho }
533 1.1 jruoho }
534 1.1 jruoho
535 1.1 jruoho ACPI_FREE (Cid);
536 1.1 jruoho return (FALSE);
537 1.1 jruoho }
538 1.1 jruoho
539 1.1 jruoho
540 1.1 jruoho /*******************************************************************************
541 1.1 jruoho *
542 1.1 jruoho * FUNCTION: AcpiEvPciBarRegionSetup
543 1.1 jruoho *
544 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
545 1.1 jruoho * Function - Start or stop
546 1.1 jruoho * HandlerContext - Address space handler context
547 1.1 jruoho * RegionContext - Region specific context
548 1.1 jruoho *
549 1.1 jruoho * RETURN: Status
550 1.1 jruoho *
551 1.1 jruoho * DESCRIPTION: Setup a PciBAR operation region
552 1.1 jruoho *
553 1.1 jruoho * MUTEX: Assumes namespace is not locked
554 1.1 jruoho *
555 1.1 jruoho ******************************************************************************/
556 1.1 jruoho
557 1.1 jruoho ACPI_STATUS
558 1.1 jruoho AcpiEvPciBarRegionSetup (
559 1.1 jruoho ACPI_HANDLE Handle,
560 1.1 jruoho UINT32 Function,
561 1.1 jruoho void *HandlerContext,
562 1.1 jruoho void **RegionContext)
563 1.1 jruoho {
564 1.1 jruoho ACPI_FUNCTION_TRACE (EvPciBarRegionSetup);
565 1.1 jruoho
566 1.1 jruoho
567 1.1 jruoho return_ACPI_STATUS (AE_OK);
568 1.1 jruoho }
569 1.1 jruoho
570 1.1 jruoho
571 1.1 jruoho /*******************************************************************************
572 1.1 jruoho *
573 1.1 jruoho * FUNCTION: AcpiEvCmosRegionSetup
574 1.1 jruoho *
575 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
576 1.1 jruoho * Function - Start or stop
577 1.1 jruoho * HandlerContext - Address space handler context
578 1.1 jruoho * RegionContext - Region specific context
579 1.1 jruoho *
580 1.1 jruoho * RETURN: Status
581 1.1 jruoho *
582 1.1 jruoho * DESCRIPTION: Setup a CMOS operation region
583 1.1 jruoho *
584 1.1 jruoho * MUTEX: Assumes namespace is not locked
585 1.1 jruoho *
586 1.1 jruoho ******************************************************************************/
587 1.1 jruoho
588 1.1 jruoho ACPI_STATUS
589 1.1 jruoho AcpiEvCmosRegionSetup (
590 1.1 jruoho ACPI_HANDLE Handle,
591 1.1 jruoho UINT32 Function,
592 1.1 jruoho void *HandlerContext,
593 1.1 jruoho void **RegionContext)
594 1.1 jruoho {
595 1.1 jruoho ACPI_FUNCTION_TRACE (EvCmosRegionSetup);
596 1.1 jruoho
597 1.1 jruoho
598 1.1 jruoho return_ACPI_STATUS (AE_OK);
599 1.1 jruoho }
600 1.1 jruoho
601 1.1 jruoho
602 1.1 jruoho /*******************************************************************************
603 1.1 jruoho *
604 1.19 christos * FUNCTION: AcpiEvDataTableRegionSetup
605 1.19 christos *
606 1.19 christos * PARAMETERS: Handle - Region we are interested in
607 1.19 christos * Function - Start or stop
608 1.19 christos * HandlerContext - Address space handler context
609 1.19 christos * RegionContext - Region specific context
610 1.19 christos *
611 1.19 christos * RETURN: Status
612 1.19 christos *
613 1.19 christos * DESCRIPTION: Setup a DataTableRegion
614 1.19 christos *
615 1.19 christos * MUTEX: Assumes namespace is not locked
616 1.19 christos *
617 1.19 christos ******************************************************************************/
618 1.19 christos
619 1.19 christos ACPI_STATUS
620 1.19 christos AcpiEvDataTableRegionSetup (
621 1.19 christos ACPI_HANDLE Handle,
622 1.19 christos UINT32 Function,
623 1.19 christos void *HandlerContext,
624 1.19 christos void **RegionContext)
625 1.19 christos {
626 1.19 christos ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle;
627 1.19 christos ACPI_DATA_TABLE_MAPPING *LocalRegionContext;
628 1.19 christos
629 1.19 christos
630 1.19 christos ACPI_FUNCTION_TRACE (EvDataTableRegionSetup);
631 1.19 christos
632 1.19 christos
633 1.19 christos if (Function == ACPI_REGION_DEACTIVATE)
634 1.19 christos {
635 1.19 christos if (*RegionContext)
636 1.19 christos {
637 1.19 christos ACPI_FREE (*RegionContext);
638 1.19 christos *RegionContext = NULL;
639 1.19 christos }
640 1.19 christos return_ACPI_STATUS (AE_OK);
641 1.19 christos }
642 1.19 christos
643 1.19 christos /* Create a new context */
644 1.19 christos
645 1.19 christos LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DATA_TABLE_MAPPING));
646 1.19 christos if (!(LocalRegionContext))
647 1.19 christos {
648 1.19 christos return_ACPI_STATUS (AE_NO_MEMORY);
649 1.19 christos }
650 1.19 christos
651 1.19 christos /* Save the data table pointer for use in the handler */
652 1.19 christos
653 1.19 christos LocalRegionContext->Pointer = RegionDesc->Region.Pointer;
654 1.19 christos
655 1.19 christos *RegionContext = LocalRegionContext;
656 1.19 christos return_ACPI_STATUS (AE_OK);
657 1.19 christos }
658 1.19 christos
659 1.19 christos
660 1.19 christos /*******************************************************************************
661 1.19 christos *
662 1.1 jruoho * FUNCTION: AcpiEvDefaultRegionSetup
663 1.1 jruoho *
664 1.1 jruoho * PARAMETERS: Handle - Region we are interested in
665 1.1 jruoho * Function - Start or stop
666 1.1 jruoho * HandlerContext - Address space handler context
667 1.1 jruoho * RegionContext - Region specific context
668 1.1 jruoho *
669 1.1 jruoho * RETURN: Status
670 1.1 jruoho *
671 1.1 jruoho * DESCRIPTION: Default region initialization
672 1.1 jruoho *
673 1.1 jruoho ******************************************************************************/
674 1.1 jruoho
675 1.1 jruoho ACPI_STATUS
676 1.1 jruoho AcpiEvDefaultRegionSetup (
677 1.1 jruoho ACPI_HANDLE Handle,
678 1.1 jruoho UINT32 Function,
679 1.1 jruoho void *HandlerContext,
680 1.1 jruoho void **RegionContext)
681 1.1 jruoho {
682 1.1 jruoho ACPI_FUNCTION_TRACE (EvDefaultRegionSetup);
683 1.1 jruoho
684 1.1 jruoho
685 1.1 jruoho if (Function == ACPI_REGION_DEACTIVATE)
686 1.1 jruoho {
687 1.1 jruoho *RegionContext = NULL;
688 1.1 jruoho }
689 1.1 jruoho else
690 1.1 jruoho {
691 1.1 jruoho *RegionContext = HandlerContext;
692 1.1 jruoho }
693 1.1 jruoho
694 1.1 jruoho return_ACPI_STATUS (AE_OK);
695 1.1 jruoho }
696 1.1 jruoho
697 1.1 jruoho
698 1.1 jruoho /*******************************************************************************
699 1.1 jruoho *
700 1.1 jruoho * FUNCTION: AcpiEvInitializeRegion
701 1.1 jruoho *
702 1.1 jruoho * PARAMETERS: RegionObj - Region we are initializing
703 1.1 jruoho *
704 1.1 jruoho * RETURN: Status
705 1.1 jruoho *
706 1.1 jruoho * DESCRIPTION: Initializes the region, finds any _REG methods and saves them
707 1.1 jruoho * for execution at a later time
708 1.1 jruoho *
709 1.1 jruoho * Get the appropriate address space handler for a newly
710 1.1 jruoho * created region.
711 1.1 jruoho *
712 1.1 jruoho * This also performs address space specific initialization. For
713 1.1 jruoho * example, PCI regions must have an _ADR object that contains
714 1.1 jruoho * a PCI address in the scope of the definition. This address is
715 1.1 jruoho * required to perform an access to PCI config space.
716 1.1 jruoho *
717 1.1 jruoho * MUTEX: Interpreter should be unlocked, because we may run the _REG
718 1.1 jruoho * method for this region.
719 1.1 jruoho *
720 1.11 christos * NOTE: Possible incompliance:
721 1.11 christos * There is a behavior conflict in automatic _REG execution:
722 1.11 christos * 1. When the interpreter is evaluating a method, we can only
723 1.11 christos * automatically run _REG for the following case:
724 1.11 christos * Method(_REG, 2) {}
725 1.11 christos * OperationRegion (OPR1, 0x80, 0x1000010, 0x4)
726 1.11 christos * 2. When the interpreter is loading a table, we can also
727 1.11 christos * automatically run _REG for the following case:
728 1.11 christos * OperationRegion (OPR1, 0x80, 0x1000010, 0x4)
729 1.11 christos * Method(_REG, 2) {}
730 1.11 christos * Though this may not be compliant to the de-facto standard, the
731 1.11 christos * logic is kept in order not to trigger regressions. And keeping
732 1.11 christos * this logic should be taken care by the caller of this function.
733 1.11 christos *
734 1.1 jruoho ******************************************************************************/
735 1.1 jruoho
736 1.1 jruoho ACPI_STATUS
737 1.1 jruoho AcpiEvInitializeRegion (
738 1.11 christos ACPI_OPERAND_OBJECT *RegionObj)
739 1.1 jruoho {
740 1.1 jruoho ACPI_OPERAND_OBJECT *HandlerObj;
741 1.1 jruoho ACPI_OPERAND_OBJECT *ObjDesc;
742 1.1 jruoho ACPI_ADR_SPACE_TYPE SpaceId;
743 1.1 jruoho ACPI_NAMESPACE_NODE *Node;
744 1.1 jruoho
745 1.1 jruoho
746 1.11 christos ACPI_FUNCTION_TRACE (EvInitializeRegion);
747 1.1 jruoho
748 1.1 jruoho
749 1.1 jruoho if (!RegionObj)
750 1.1 jruoho {
751 1.1 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER);
752 1.1 jruoho }
753 1.1 jruoho
754 1.1 jruoho if (RegionObj->Common.Flags & AOPOBJ_OBJECT_INITIALIZED)
755 1.1 jruoho {
756 1.1 jruoho return_ACPI_STATUS (AE_OK);
757 1.1 jruoho }
758 1.1 jruoho
759 1.8 christos RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
760 1.1 jruoho
761 1.1 jruoho Node = RegionObj->Region.Node->Parent;
762 1.1 jruoho SpaceId = RegionObj->Region.SpaceId;
763 1.1 jruoho
764 1.1 jruoho /*
765 1.1 jruoho * The following loop depends upon the root Node having no parent
766 1.8 christos * ie: AcpiGbl_RootNode->Parent being set to NULL
767 1.1 jruoho */
768 1.1 jruoho while (Node)
769 1.1 jruoho {
770 1.1 jruoho /* Check to see if a handler exists */
771 1.1 jruoho
772 1.1 jruoho HandlerObj = NULL;
773 1.1 jruoho ObjDesc = AcpiNsGetAttachedObject (Node);
774 1.1 jruoho if (ObjDesc)
775 1.1 jruoho {
776 1.1 jruoho /* Can only be a handler if the object exists */
777 1.1 jruoho
778 1.1 jruoho switch (Node->Type)
779 1.1 jruoho {
780 1.1 jruoho case ACPI_TYPE_DEVICE:
781 1.1 jruoho case ACPI_TYPE_PROCESSOR:
782 1.1 jruoho case ACPI_TYPE_THERMAL:
783 1.1 jruoho
784 1.8 christos HandlerObj = ObjDesc->CommonNotify.Handler;
785 1.1 jruoho break;
786 1.1 jruoho
787 1.1 jruoho default:
788 1.5 christos
789 1.1 jruoho /* Ignore other objects */
790 1.5 christos
791 1.1 jruoho break;
792 1.1 jruoho }
793 1.1 jruoho
794 1.8 christos HandlerObj = AcpiEvFindRegionHandler (SpaceId, HandlerObj);
795 1.8 christos if (HandlerObj)
796 1.1 jruoho {
797 1.8 christos /* Found correct handler */
798 1.8 christos
799 1.8 christos ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
800 1.8 christos "Found handler %p for region %p in obj %p\n",
801 1.8 christos HandlerObj, RegionObj, ObjDesc));
802 1.8 christos
803 1.11 christos (void) AcpiEvAttachRegion (HandlerObj, RegionObj, FALSE);
804 1.1 jruoho
805 1.8 christos /*
806 1.8 christos * Tell all users that this region is usable by
807 1.8 christos * running the _REG method
808 1.8 christos */
809 1.11 christos AcpiExExitInterpreter ();
810 1.11 christos (void) AcpiEvExecuteRegMethod (RegionObj, ACPI_REG_CONNECT);
811 1.11 christos AcpiExEnterInterpreter ();
812 1.8 christos return_ACPI_STATUS (AE_OK);
813 1.1 jruoho }
814 1.1 jruoho }
815 1.1 jruoho
816 1.1 jruoho /* This node does not have the handler we need; Pop up one level */
817 1.1 jruoho
818 1.1 jruoho Node = Node->Parent;
819 1.1 jruoho }
820 1.1 jruoho
821 1.11 christos /*
822 1.11 christos * If we get here, there is no handler for this region. This is not
823 1.11 christos * fatal because many regions get created before a handler is installed
824 1.11 christos * for said region.
825 1.11 christos */
826 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
827 1.1 jruoho "No handler for RegionType %s(%X) (RegionObj %p)\n",
828 1.1 jruoho AcpiUtGetRegionName (SpaceId), SpaceId, RegionObj));
829 1.1 jruoho
830 1.11 christos return_ACPI_STATUS (AE_OK);
831 1.1 jruoho }
832