Deleted Added
full compact
evrgnini.c (80062) evrgnini.c (82367)
1/******************************************************************************
2 *
3 * Module Name: evrgnini- ACPI AddressSpace (OpRegion) init
1/******************************************************************************
2 *
3 * Module Name: evrgnini- ACPI AddressSpace (OpRegion) init
4 * $Revision: 44 $
4 * $Revision: 45 $
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights. You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code. No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision. In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change. Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee. Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution. In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government. In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117
118#define __EVRGNINI_C__
119
120#include "acpi.h"
121#include "acevents.h"
122#include "acnamesp.h"
123#include "acinterp.h"
124#include "amlcode.h"
125
126#define _COMPONENT ACPI_EVENTS
127 MODULE_NAME ("evrgnini")
128
129
130/*******************************************************************************
131 *
132 * FUNCTION: AcpiEvSystemMemoryRegionSetup
133 *
134 * PARAMETERS: RegionObj - region we are interested in
135 * Function - start or stop
136 * HandlerContext - Address space handler context
137 * RegionContext - Region specific context
138 *
139 * RETURN: Status
140 *
141 * DESCRIPTION: Do any prep work for region handling, a nop for now
142 *
143 ******************************************************************************/
144
145ACPI_STATUS
146AcpiEvSystemMemoryRegionSetup (
147 ACPI_HANDLE Handle,
148 UINT32 Function,
149 void *HandlerContext,
150 void **RegionContext)
151{
152 FUNCTION_TRACE ("EvSystemMemoryRegionSetup");
153
154
155 if (Function == ACPI_REGION_DEACTIVATE)
156 {
157 if (*RegionContext)
158 {
159 ACPI_MEM_FREE (*RegionContext);
160 *RegionContext = NULL;
161 }
162 return_ACPI_STATUS (AE_OK);
163 }
164
165
166 /* Activate. Create a new context */
167
168 *RegionContext = ACPI_MEM_CALLOCATE (sizeof (ACPI_MEM_SPACE_CONTEXT));
169 if (!(*RegionContext))
170 {
171 return_ACPI_STATUS (AE_NO_MEMORY);
172 }
173
174 return_ACPI_STATUS (AE_OK);
175}
176
177
178/*******************************************************************************
179 *
180 * FUNCTION: AcpiEvIoSpaceRegionSetup
181 *
182 * PARAMETERS: RegionObj - region we are interested in
183 * Function - start or stop
184 * HandlerContext - Address space handler context
185 * RegionContext - Region specific context
186 *
187 * RETURN: Status
188 *
189 * DESCRIPTION: Do any prep work for region handling
190 *
191 ******************************************************************************/
192
193ACPI_STATUS
194AcpiEvIoSpaceRegionSetup (
195 ACPI_HANDLE Handle,
196 UINT32 Function,
197 void *HandlerContext,
198 void **RegionContext)
199{
200 FUNCTION_TRACE ("EvIoSpaceRegionSetup");
201
202
203 if (Function == ACPI_REGION_DEACTIVATE)
204 {
205 *RegionContext = NULL;
206 }
207 else
208 {
209 *RegionContext = HandlerContext;
210 }
211
212 return_ACPI_STATUS (AE_OK);
213}
214
215
216/*******************************************************************************
217 *
218 * FUNCTION: AcpiEvPciConfigRegionSetup
219 *
220 * PARAMETERS: RegionObj - region we are interested in
221 * Function - start or stop
222 * HandlerContext - Address space handler context
223 * RegionContext - Region specific context
224 *
225 * RETURN: Status
226 *
227 * DESCRIPTION: Do any prep work for region handling
228 *
229 * MUTEX: Assumes namespace is not locked
230 *
231 ******************************************************************************/
232
233ACPI_STATUS
234AcpiEvPciConfigRegionSetup (
235 ACPI_HANDLE Handle,
236 UINT32 Function,
237 void *HandlerContext,
238 void **RegionContext)
239{
240 ACPI_STATUS Status = AE_OK;
241 ACPI_INTEGER Temp;
242 ACPI_PCI_ID *PciId = *RegionContext;
243 ACPI_OPERAND_OBJECT *HandlerObj;
244 ACPI_NAMESPACE_NODE *Node;
245 ACPI_OPERAND_OBJECT *RegionObj = (ACPI_OPERAND_OBJECT *) Handle;
246 ACPI_DEVICE_ID ObjectHID;
247
248
249 FUNCTION_TRACE ("EvPciConfigRegionSetup");
250
251
252 HandlerObj = RegionObj->Region.AddrHandler;
253 if (!HandlerObj)
254 {
255 /*
256 * No installed handler. This shouldn't happen because the dispatch
257 * routine checks before we get here, but we check again just in case.
258 */
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights. You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code. No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision. In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change. Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee. Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution. In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government. In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117
118#define __EVRGNINI_C__
119
120#include "acpi.h"
121#include "acevents.h"
122#include "acnamesp.h"
123#include "acinterp.h"
124#include "amlcode.h"
125
126#define _COMPONENT ACPI_EVENTS
127 MODULE_NAME ("evrgnini")
128
129
130/*******************************************************************************
131 *
132 * FUNCTION: AcpiEvSystemMemoryRegionSetup
133 *
134 * PARAMETERS: RegionObj - region we are interested in
135 * Function - start or stop
136 * HandlerContext - Address space handler context
137 * RegionContext - Region specific context
138 *
139 * RETURN: Status
140 *
141 * DESCRIPTION: Do any prep work for region handling, a nop for now
142 *
143 ******************************************************************************/
144
145ACPI_STATUS
146AcpiEvSystemMemoryRegionSetup (
147 ACPI_HANDLE Handle,
148 UINT32 Function,
149 void *HandlerContext,
150 void **RegionContext)
151{
152 FUNCTION_TRACE ("EvSystemMemoryRegionSetup");
153
154
155 if (Function == ACPI_REGION_DEACTIVATE)
156 {
157 if (*RegionContext)
158 {
159 ACPI_MEM_FREE (*RegionContext);
160 *RegionContext = NULL;
161 }
162 return_ACPI_STATUS (AE_OK);
163 }
164
165
166 /* Activate. Create a new context */
167
168 *RegionContext = ACPI_MEM_CALLOCATE (sizeof (ACPI_MEM_SPACE_CONTEXT));
169 if (!(*RegionContext))
170 {
171 return_ACPI_STATUS (AE_NO_MEMORY);
172 }
173
174 return_ACPI_STATUS (AE_OK);
175}
176
177
178/*******************************************************************************
179 *
180 * FUNCTION: AcpiEvIoSpaceRegionSetup
181 *
182 * PARAMETERS: RegionObj - region we are interested in
183 * Function - start or stop
184 * HandlerContext - Address space handler context
185 * RegionContext - Region specific context
186 *
187 * RETURN: Status
188 *
189 * DESCRIPTION: Do any prep work for region handling
190 *
191 ******************************************************************************/
192
193ACPI_STATUS
194AcpiEvIoSpaceRegionSetup (
195 ACPI_HANDLE Handle,
196 UINT32 Function,
197 void *HandlerContext,
198 void **RegionContext)
199{
200 FUNCTION_TRACE ("EvIoSpaceRegionSetup");
201
202
203 if (Function == ACPI_REGION_DEACTIVATE)
204 {
205 *RegionContext = NULL;
206 }
207 else
208 {
209 *RegionContext = HandlerContext;
210 }
211
212 return_ACPI_STATUS (AE_OK);
213}
214
215
216/*******************************************************************************
217 *
218 * FUNCTION: AcpiEvPciConfigRegionSetup
219 *
220 * PARAMETERS: RegionObj - region we are interested in
221 * Function - start or stop
222 * HandlerContext - Address space handler context
223 * RegionContext - Region specific context
224 *
225 * RETURN: Status
226 *
227 * DESCRIPTION: Do any prep work for region handling
228 *
229 * MUTEX: Assumes namespace is not locked
230 *
231 ******************************************************************************/
232
233ACPI_STATUS
234AcpiEvPciConfigRegionSetup (
235 ACPI_HANDLE Handle,
236 UINT32 Function,
237 void *HandlerContext,
238 void **RegionContext)
239{
240 ACPI_STATUS Status = AE_OK;
241 ACPI_INTEGER Temp;
242 ACPI_PCI_ID *PciId = *RegionContext;
243 ACPI_OPERAND_OBJECT *HandlerObj;
244 ACPI_NAMESPACE_NODE *Node;
245 ACPI_OPERAND_OBJECT *RegionObj = (ACPI_OPERAND_OBJECT *) Handle;
246 ACPI_DEVICE_ID ObjectHID;
247
248
249 FUNCTION_TRACE ("EvPciConfigRegionSetup");
250
251
252 HandlerObj = RegionObj->Region.AddrHandler;
253 if (!HandlerObj)
254 {
255 /*
256 * No installed handler. This shouldn't happen because the dispatch
257 * routine checks before we get here, but we check again just in case.
258 */
259 DEBUG_PRINTP (TRACE_OPREGION,
260 ("Attempting to init a region %X, with no handler\n", RegionObj));
259 ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
260 "Attempting to init a region %X, with no handler\n", RegionObj));
261 return_ACPI_STATUS (AE_NOT_EXIST);
262 }
263
264 if (Function == ACPI_REGION_DEACTIVATE)
265 {
266 if (PciId)
267 {
268 ACPI_MEM_FREE (PciId);
269 *RegionContext = NULL;
270 }
271
272 return_ACPI_STATUS (Status);
273 }
274
275
276 /* Create a new context */
277
278 PciId = ACPI_MEM_CALLOCATE (sizeof (ACPI_PCI_ID));
279 if (!PciId)
280 {
281 return_ACPI_STATUS (AE_NO_MEMORY);
282 }
283
284 /*
285 * For PCI Config space access, we have to pass the segment, bus,
286 * device and function numbers. This routine must acquire those.
287 */
288
289 /*
290 * First get device and function numbers from the _ADR object
291 * in the parent's scope.
292 */
293 Node = AcpiNsGetParentObject (RegionObj->Region.Node);
294
295
296 /* AcpiEvaluate the _ADR object */
297
298 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node, &Temp);
299
300 /*
301 * The default is zero, since the allocation above zeroed the data, just
302 * do nothing on failures.
303 */
304 if (ACPI_SUCCESS (Status))
305 {
306 PciId->Device = HIWORD (Temp);
307 PciId->Function = LOWORD (Temp);
308 }
309
310 /*
311 * Get the _SEG and _BBN values from the device upon which the handler
312 * is installed.
313 *
314 * We need to get the _SEG and _BBN objects relative to the PCI BUS device.
315 * This is the device the handler has been registered to handle.
316 */
317
318 /*
319 * If the AddrHandler.Node is still pointing to the root, we need
320 * to scan upward for a PCI Root bridge and re-associate the OpRegion
321 * handlers with that device.
322 */
323 if (HandlerObj->AddrHandler.Node == AcpiGbl_RootNode)
324 {
325 /*
326 * Node is currently the parent object
327 */
328 while (Node != AcpiGbl_RootNode)
329 {
330 Status = AcpiUtExecute_HID (Node, &ObjectHID);
331 if (ACPI_SUCCESS (Status))
332 {
333 if (!(STRNCMP (ObjectHID.Buffer, PCI_ROOT_HID_STRING,
334 sizeof (PCI_ROOT_HID_STRING))))
335 {
336 AcpiInstallAddressSpaceHandler (Node,
337 ACPI_ADR_SPACE_PCI_CONFIG,
338 ACPI_DEFAULT_HANDLER, NULL, NULL);
339 break;
340 }
341 }
342
343 Node = AcpiNsGetParentObject (Node);
344 }
345 }
346 else
347 {
348 Node = HandlerObj->AddrHandler.Node;
349 }
350
351 /*
352 * The PCI segment number comes from the _SEG method
353 */
354 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__SEG, Node, &Temp);
355 if (ACPI_SUCCESS (Status))
356 {
357 PciId->Segment = LOWORD (Temp);
358 }
359
360 /*
361 * The PCI bus number comes from the _BBN method
362 */
363 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__BBN, Node, &Temp);
364 if (ACPI_SUCCESS (Status))
365 {
366 PciId->Bus = LOWORD (Temp);
367 }
368
369 *RegionContext = PciId;
370 return_ACPI_STATUS (AE_OK);
371}
372
373
374/*******************************************************************************
375 *
376 * FUNCTION: AcpiEvDefaultRegionSetup
377 *
378 * PARAMETERS: RegionObj - region we are interested in
379 * Function - start or stop
380 * HandlerContext - Address space handler context
381 * RegionContext - Region specific context
382 *
383 * RETURN: Status
384 *
385 * DESCRIPTION: Do any prep work for region handling
386 *
387 ******************************************************************************/
388
389ACPI_STATUS
390AcpiEvDefaultRegionSetup (
391 ACPI_HANDLE Handle,
392 UINT32 Function,
393 void *HandlerContext,
394 void **RegionContext)
395{
396 FUNCTION_TRACE ("EvDefaultRegionSetup");
397
398
399 if (Function == ACPI_REGION_DEACTIVATE)
400 {
401 *RegionContext = NULL;
402 }
403 else
404 {
405 *RegionContext = HandlerContext;
406 }
407
408 return_ACPI_STATUS (AE_OK);
409}
410
411
412/*******************************************************************************
413 *
414 * FUNCTION: AcpiEvInitializeRegion
415 *
416 * PARAMETERS: RegionObj - Region we are initializing
417 *
418 * RETURN: Status
419 *
420 * DESCRIPTION: Initializes the region, finds any _REG methods and saves them
421 * for execution at a later time
422 *
423 * Get the appropriate address space handler for a newly
424 * created region.
425 *
426 * This also performs address space specific intialization. For
427 * example, PCI regions must have an _ADR object that contains
428 * a PCI address in the scope of the definition. This address is
429 * required to perform an access to PCI config space.
430 *
431 ******************************************************************************/
432
433ACPI_STATUS
434AcpiEvInitializeRegion (
435 ACPI_OPERAND_OBJECT *RegionObj,
436 BOOLEAN AcpiNsLocked)
437{
438 ACPI_OPERAND_OBJECT *HandlerObj;
439 ACPI_OPERAND_OBJECT *ObjDesc;
440 ACPI_ADR_SPACE_TYPE SpaceId;
441 ACPI_NAMESPACE_NODE *Node;
442 ACPI_STATUS Status;
443 ACPI_NAMESPACE_NODE *MethodNode;
444 ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
445
446
447 FUNCTION_TRACE_U32 ("EvInitializeRegion", AcpiNsLocked);
448
449
450 if (!RegionObj)
451 {
452 return_ACPI_STATUS (AE_BAD_PARAMETER);
453 }
454
455 Node = AcpiNsGetParentObject (RegionObj->Region.Node);
456 SpaceId = RegionObj->Region.SpaceId;
457
458 RegionObj->Region.AddrHandler = NULL;
459 RegionObj->Region.Extra->Extra.Method_REG = NULL;
460 RegionObj->Region.Flags &= ~(AOPOBJ_INITIALIZED);
461
462 /*
463 * Find any "_REG" associated with this region definition
464 */
465 Status = AcpiNsSearchNode (*RegNamePtr, Node,
466 ACPI_TYPE_METHOD, &MethodNode);
467 if (ACPI_SUCCESS (Status))
468 {
469 /*
470 * The _REG method is optional and there can be only one per region
471 * definition. This will be executed when the handler is attached
472 * or removed
473 */
474 RegionObj->Region.Extra->Extra.Method_REG = MethodNode;
475 }
476
477 /*
478 * The following loop depends upon the root Node having no parent
479 * ie: AcpiGbl_RootNode->ParentEntry being set to NULL
480 */
481 while (Node)
482 {
483 /*
484 * Check to see if a handler exists
485 */
486 HandlerObj = NULL;
487 ObjDesc = AcpiNsGetAttachedObject (Node);
488 if (ObjDesc)
489 {
490 /*
491 * can only be a handler if the object exists
492 */
493 switch (Node->Type)
494 {
495 case ACPI_TYPE_DEVICE:
496
497 HandlerObj = ObjDesc->Device.AddrHandler;
498 break;
499
500 case ACPI_TYPE_PROCESSOR:
501
502 HandlerObj = ObjDesc->Processor.AddrHandler;
503 break;
504
505 case ACPI_TYPE_THERMAL:
506
507 HandlerObj = ObjDesc->ThermalZone.AddrHandler;
508 break;
509 }
510
511 while (HandlerObj)
512 {
513 /*
514 * This guy has at least one address handler
515 * see if it has the type we want
516 */
517 if (HandlerObj->AddrHandler.SpaceId == SpaceId)
518 {
261 return_ACPI_STATUS (AE_NOT_EXIST);
262 }
263
264 if (Function == ACPI_REGION_DEACTIVATE)
265 {
266 if (PciId)
267 {
268 ACPI_MEM_FREE (PciId);
269 *RegionContext = NULL;
270 }
271
272 return_ACPI_STATUS (Status);
273 }
274
275
276 /* Create a new context */
277
278 PciId = ACPI_MEM_CALLOCATE (sizeof (ACPI_PCI_ID));
279 if (!PciId)
280 {
281 return_ACPI_STATUS (AE_NO_MEMORY);
282 }
283
284 /*
285 * For PCI Config space access, we have to pass the segment, bus,
286 * device and function numbers. This routine must acquire those.
287 */
288
289 /*
290 * First get device and function numbers from the _ADR object
291 * in the parent's scope.
292 */
293 Node = AcpiNsGetParentObject (RegionObj->Region.Node);
294
295
296 /* AcpiEvaluate the _ADR object */
297
298 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node, &Temp);
299
300 /*
301 * The default is zero, since the allocation above zeroed the data, just
302 * do nothing on failures.
303 */
304 if (ACPI_SUCCESS (Status))
305 {
306 PciId->Device = HIWORD (Temp);
307 PciId->Function = LOWORD (Temp);
308 }
309
310 /*
311 * Get the _SEG and _BBN values from the device upon which the handler
312 * is installed.
313 *
314 * We need to get the _SEG and _BBN objects relative to the PCI BUS device.
315 * This is the device the handler has been registered to handle.
316 */
317
318 /*
319 * If the AddrHandler.Node is still pointing to the root, we need
320 * to scan upward for a PCI Root bridge and re-associate the OpRegion
321 * handlers with that device.
322 */
323 if (HandlerObj->AddrHandler.Node == AcpiGbl_RootNode)
324 {
325 /*
326 * Node is currently the parent object
327 */
328 while (Node != AcpiGbl_RootNode)
329 {
330 Status = AcpiUtExecute_HID (Node, &ObjectHID);
331 if (ACPI_SUCCESS (Status))
332 {
333 if (!(STRNCMP (ObjectHID.Buffer, PCI_ROOT_HID_STRING,
334 sizeof (PCI_ROOT_HID_STRING))))
335 {
336 AcpiInstallAddressSpaceHandler (Node,
337 ACPI_ADR_SPACE_PCI_CONFIG,
338 ACPI_DEFAULT_HANDLER, NULL, NULL);
339 break;
340 }
341 }
342
343 Node = AcpiNsGetParentObject (Node);
344 }
345 }
346 else
347 {
348 Node = HandlerObj->AddrHandler.Node;
349 }
350
351 /*
352 * The PCI segment number comes from the _SEG method
353 */
354 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__SEG, Node, &Temp);
355 if (ACPI_SUCCESS (Status))
356 {
357 PciId->Segment = LOWORD (Temp);
358 }
359
360 /*
361 * The PCI bus number comes from the _BBN method
362 */
363 Status = AcpiUtEvaluateNumericObject (METHOD_NAME__BBN, Node, &Temp);
364 if (ACPI_SUCCESS (Status))
365 {
366 PciId->Bus = LOWORD (Temp);
367 }
368
369 *RegionContext = PciId;
370 return_ACPI_STATUS (AE_OK);
371}
372
373
374/*******************************************************************************
375 *
376 * FUNCTION: AcpiEvDefaultRegionSetup
377 *
378 * PARAMETERS: RegionObj - region we are interested in
379 * Function - start or stop
380 * HandlerContext - Address space handler context
381 * RegionContext - Region specific context
382 *
383 * RETURN: Status
384 *
385 * DESCRIPTION: Do any prep work for region handling
386 *
387 ******************************************************************************/
388
389ACPI_STATUS
390AcpiEvDefaultRegionSetup (
391 ACPI_HANDLE Handle,
392 UINT32 Function,
393 void *HandlerContext,
394 void **RegionContext)
395{
396 FUNCTION_TRACE ("EvDefaultRegionSetup");
397
398
399 if (Function == ACPI_REGION_DEACTIVATE)
400 {
401 *RegionContext = NULL;
402 }
403 else
404 {
405 *RegionContext = HandlerContext;
406 }
407
408 return_ACPI_STATUS (AE_OK);
409}
410
411
412/*******************************************************************************
413 *
414 * FUNCTION: AcpiEvInitializeRegion
415 *
416 * PARAMETERS: RegionObj - Region we are initializing
417 *
418 * RETURN: Status
419 *
420 * DESCRIPTION: Initializes the region, finds any _REG methods and saves them
421 * for execution at a later time
422 *
423 * Get the appropriate address space handler for a newly
424 * created region.
425 *
426 * This also performs address space specific intialization. For
427 * example, PCI regions must have an _ADR object that contains
428 * a PCI address in the scope of the definition. This address is
429 * required to perform an access to PCI config space.
430 *
431 ******************************************************************************/
432
433ACPI_STATUS
434AcpiEvInitializeRegion (
435 ACPI_OPERAND_OBJECT *RegionObj,
436 BOOLEAN AcpiNsLocked)
437{
438 ACPI_OPERAND_OBJECT *HandlerObj;
439 ACPI_OPERAND_OBJECT *ObjDesc;
440 ACPI_ADR_SPACE_TYPE SpaceId;
441 ACPI_NAMESPACE_NODE *Node;
442 ACPI_STATUS Status;
443 ACPI_NAMESPACE_NODE *MethodNode;
444 ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
445
446
447 FUNCTION_TRACE_U32 ("EvInitializeRegion", AcpiNsLocked);
448
449
450 if (!RegionObj)
451 {
452 return_ACPI_STATUS (AE_BAD_PARAMETER);
453 }
454
455 Node = AcpiNsGetParentObject (RegionObj->Region.Node);
456 SpaceId = RegionObj->Region.SpaceId;
457
458 RegionObj->Region.AddrHandler = NULL;
459 RegionObj->Region.Extra->Extra.Method_REG = NULL;
460 RegionObj->Region.Flags &= ~(AOPOBJ_INITIALIZED);
461
462 /*
463 * Find any "_REG" associated with this region definition
464 */
465 Status = AcpiNsSearchNode (*RegNamePtr, Node,
466 ACPI_TYPE_METHOD, &MethodNode);
467 if (ACPI_SUCCESS (Status))
468 {
469 /*
470 * The _REG method is optional and there can be only one per region
471 * definition. This will be executed when the handler is attached
472 * or removed
473 */
474 RegionObj->Region.Extra->Extra.Method_REG = MethodNode;
475 }
476
477 /*
478 * The following loop depends upon the root Node having no parent
479 * ie: AcpiGbl_RootNode->ParentEntry being set to NULL
480 */
481 while (Node)
482 {
483 /*
484 * Check to see if a handler exists
485 */
486 HandlerObj = NULL;
487 ObjDesc = AcpiNsGetAttachedObject (Node);
488 if (ObjDesc)
489 {
490 /*
491 * can only be a handler if the object exists
492 */
493 switch (Node->Type)
494 {
495 case ACPI_TYPE_DEVICE:
496
497 HandlerObj = ObjDesc->Device.AddrHandler;
498 break;
499
500 case ACPI_TYPE_PROCESSOR:
501
502 HandlerObj = ObjDesc->Processor.AddrHandler;
503 break;
504
505 case ACPI_TYPE_THERMAL:
506
507 HandlerObj = ObjDesc->ThermalZone.AddrHandler;
508 break;
509 }
510
511 while (HandlerObj)
512 {
513 /*
514 * This guy has at least one address handler
515 * see if it has the type we want
516 */
517 if (HandlerObj->AddrHandler.SpaceId == SpaceId)
518 {
519 DEBUG_PRINTP (TRACE_OPREGION,
520 ("Found handler %p for region %p in obj %p\n",
519 ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
520 "Found handler %p for region %p in obj %p\n",
521 HandlerObj, RegionObj, ObjDesc));
522
523 /*
524 * Found it! Now update the region and the handler
525 */
526 AcpiEvAssociateRegionAndHandler (HandlerObj, RegionObj,
527 AcpiNsLocked);
528 return_ACPI_STATUS (AE_OK);
529 }
530
531 HandlerObj = HandlerObj->AddrHandler.Next;
532
533 } /* while handlerobj */
534 }
535
536 /*
537 * This one does not have the handler we need
538 * Pop up one level
539 */
540 Node = AcpiNsGetParentObject (Node);
541
542 } /* while Node != ROOT */
543
544 /*
545 * If we get here, there is no handler for this region
546 */
521 HandlerObj, RegionObj, ObjDesc));
522
523 /*
524 * Found it! Now update the region and the handler
525 */
526 AcpiEvAssociateRegionAndHandler (HandlerObj, RegionObj,
527 AcpiNsLocked);
528 return_ACPI_STATUS (AE_OK);
529 }
530
531 HandlerObj = HandlerObj->AddrHandler.Next;
532
533 } /* while handlerobj */
534 }
535
536 /*
537 * This one does not have the handler we need
538 * Pop up one level
539 */
540 Node = AcpiNsGetParentObject (Node);
541
542 } /* while Node != ROOT */
543
544 /*
545 * If we get here, there is no handler for this region
546 */
547 DEBUG_PRINTP (TRACE_OPREGION,
548 ("No handler for RegionType %s(%X) (RegionObj %p)\n",
547 ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
548 "No handler for RegionType %s(%X) (RegionObj %p)\n",
549 AcpiUtGetRegionName (SpaceId), SpaceId, RegionObj));
550
551 return_ACPI_STATUS (AE_NOT_EXIST);
552}
553
549 AcpiUtGetRegionName (SpaceId), SpaceId, RegionObj));
550
551 return_ACPI_STATUS (AE_NOT_EXIST);
552}
553