1 /****************************************************************************** 2 * 3 * Module Name: evregion - ACPI address_space (op_region) handler dispatch 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2008, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <acpi/acpi.h> 45 #include "accommon.h" 46 #include "acevents.h" 47 #include "acnamesp.h" 48 #include "acinterp.h" 49 50 #define _COMPONENT ACPI_EVENTS 51 ACPI_MODULE_NAME("evregion") 52 53 /* Local prototypes */ 54 static acpi_status 55 acpi_ev_reg_run(acpi_handle obj_handle, 56 u32 level, void *context, void **return_value); 57 58 static acpi_status 59 acpi_ev_install_handler(acpi_handle obj_handle, 60 u32 level, void *context, void **return_value); 61 62 /* These are the address spaces that will get default handlers */ 63 64 #define ACPI_NUM_DEFAULT_SPACES 4 65 66 static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = { 67 ACPI_ADR_SPACE_SYSTEM_MEMORY, 68 ACPI_ADR_SPACE_SYSTEM_IO, 69 ACPI_ADR_SPACE_PCI_CONFIG, 70 ACPI_ADR_SPACE_DATA_TABLE 71 }; 72 73 /******************************************************************************* 74 * 75 * FUNCTION: acpi_ev_install_region_handlers 76 * 77 * PARAMETERS: None 78 * 79 * RETURN: Status 80 * 81 * DESCRIPTION: Installs the core subsystem default address space handlers. 82 * 83 ******************************************************************************/ 84 85 acpi_status acpi_ev_install_region_handlers(void) 86 { 87 acpi_status status; 88 u32 i; 89 90 ACPI_FUNCTION_TRACE(ev_install_region_handlers); 91 92 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 93 if (ACPI_FAILURE(status)) { 94 return_ACPI_STATUS(status); 95 } 96 97 /* 98 * All address spaces (PCI Config, EC, SMBus) are scope dependent and 99 * registration must occur for a specific device. 100 * 101 * In the case of the system memory and IO address spaces there is 102 * currently no device associated with the address space. For these we 103 * use the root. 104 * 105 * We install the default PCI config space handler at the root so that 106 * this space is immediately available even though the we have not 107 * enumerated all the PCI Root Buses yet. This is to conform to the ACPI 108 * specification which states that the PCI config space must be always 109 * available -- even though we are nowhere near ready to find the PCI root 110 * buses at this point. 111 * 112 * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler 113 * has already been installed (via acpi_install_address_space_handler). 114 * Similar for AE_SAME_HANDLER. 115 */ 116 for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { 117 status = acpi_ev_install_space_handler(acpi_gbl_root_node, 118 acpi_gbl_default_address_spaces 119 [i], 120 ACPI_DEFAULT_HANDLER, 121 NULL, NULL); 122 switch (status) { 123 case AE_OK: 124 case AE_SAME_HANDLER: 125 case AE_ALREADY_EXISTS: 126 127 /* These exceptions are all OK */ 128 129 status = AE_OK; 130 break; 131 132 default: 133 134 goto unlock_and_exit; 135 } 136 } 137 138 unlock_and_exit: 139 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 140 return_ACPI_STATUS(status); 141 } 142 143 /******************************************************************************* 144 * 145 * FUNCTION: acpi_ev_initialize_op_regions 146 * 147 * PARAMETERS: None 148 * 149 * RETURN: Status 150 * 151 * DESCRIPTION: Execute _REG methods for all Operation Regions that have 152 * an installed default region handler. 153 * 154 ******************************************************************************/ 155 156 acpi_status acpi_ev_initialize_op_regions(void) 157 { 158 acpi_status status; 159 u32 i; 160 161 ACPI_FUNCTION_TRACE(ev_initialize_op_regions); 162 163 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 164 if (ACPI_FAILURE(status)) { 165 return_ACPI_STATUS(status); 166 } 167 168 /* Run the _REG methods for op_regions in each default address space */ 169 170 for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { 171 /* 172 * TBD: Make sure handler is the DEFAULT handler, otherwise 173 * _REG will have already been run. 174 */ 175 status = acpi_ev_execute_reg_methods(acpi_gbl_root_node, 176 acpi_gbl_default_address_spaces 177 [i]); 178 } 179 180 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 181 return_ACPI_STATUS(status); 182 } 183 184 /******************************************************************************* 185 * 186 * FUNCTION: acpi_ev_execute_reg_method 187 * 188 * PARAMETERS: region_obj - Region object 189 * Function - Passed to _REG: On (1) or Off (0) 190 * 191 * RETURN: Status 192 * 193 * DESCRIPTION: Execute _REG method for a region 194 * 195 ******************************************************************************/ 196 197 acpi_status 198 acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) 199 { 200 struct acpi_evaluate_info *info; 201 union acpi_operand_object *args[3]; 202 union acpi_operand_object *region_obj2; 203 acpi_status status; 204 205 ACPI_FUNCTION_TRACE(ev_execute_reg_method); 206 207 region_obj2 = acpi_ns_get_secondary_object(region_obj); 208 if (!region_obj2) { 209 return_ACPI_STATUS(AE_NOT_EXIST); 210 } 211 212 if (region_obj2->extra.method_REG == NULL) { 213 return_ACPI_STATUS(AE_OK); 214 } 215 216 /* Allocate and initialize the evaluation information block */ 217 218 info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info)); 219 if (!info) { 220 return_ACPI_STATUS(AE_NO_MEMORY); 221 } 222 223 info->prefix_node = region_obj2->extra.method_REG; 224 info->pathname = NULL; 225 info->parameters = args; 226 info->flags = ACPI_IGNORE_RETURN_VALUE; 227 228 /* 229 * The _REG method has two arguments: 230 * 231 * Arg0 - Integer: 232 * Operation region space ID Same value as region_obj->Region.space_id 233 * 234 * Arg1 - Integer: 235 * connection status 1 for connecting the handler, 0 for disconnecting 236 * the handler (Passed as a parameter) 237 */ 238 args[0] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); 239 if (!args[0]) { 240 status = AE_NO_MEMORY; 241 goto cleanup1; 242 } 243 244 args[1] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); 245 if (!args[1]) { 246 status = AE_NO_MEMORY; 247 goto cleanup2; 248 } 249 250 /* Setup the parameter objects */ 251 252 args[0]->integer.value = region_obj->region.space_id; 253 args[1]->integer.value = function; 254 args[2] = NULL; 255 256 /* Execute the method, no return value */ 257 258 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname 259 (ACPI_TYPE_METHOD, info->prefix_node, NULL)); 260 261 status = acpi_ns_evaluate(info); 262 acpi_ut_remove_reference(args[1]); 263 264 cleanup2: 265 acpi_ut_remove_reference(args[0]); 266 267 cleanup1: 268 ACPI_FREE(info); 269 return_ACPI_STATUS(status); 270 } 271 272 /******************************************************************************* 273 * 274 * FUNCTION: acpi_ev_address_space_dispatch 275 * 276 * PARAMETERS: region_obj - Internal region object 277 * Function - Read or Write operation 278 * Address - Where in the space to read or write 279 * bit_width - Field width in bits (8, 16, 32, or 64) 280 * Value - Pointer to in or out value, must be 281 * full 64-bit acpi_integer 282 * 283 * RETURN: Status 284 * 285 * DESCRIPTION: Dispatch an address space or operation region access to 286 * a previously installed handler. 287 * 288 ******************************************************************************/ 289 290 acpi_status 291 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, 292 u32 function, 293 acpi_physical_address address, 294 u32 bit_width, acpi_integer * value) 295 { 296 acpi_status status; 297 acpi_adr_space_handler handler; 298 acpi_adr_space_setup region_setup; 299 union acpi_operand_object *handler_desc; 300 union acpi_operand_object *region_obj2; 301 void *region_context = NULL; 302 303 ACPI_FUNCTION_TRACE(ev_address_space_dispatch); 304 305 region_obj2 = acpi_ns_get_secondary_object(region_obj); 306 if (!region_obj2) { 307 return_ACPI_STATUS(AE_NOT_EXIST); 308 } 309 310 /* Ensure that there is a handler associated with this region */ 311 312 handler_desc = region_obj->region.handler; 313 if (!handler_desc) { 314 ACPI_ERROR((AE_INFO, 315 "No handler for Region [%4.4s] (%p) [%s]", 316 acpi_ut_get_node_name(region_obj->region.node), 317 region_obj, 318 acpi_ut_get_region_name(region_obj->region. 319 space_id))); 320 321 return_ACPI_STATUS(AE_NOT_EXIST); 322 } 323 324 /* 325 * It may be the case that the region has never been initialized. 326 * Some types of regions require special init code 327 */ 328 if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) { 329 330 /* This region has not been initialized yet, do it */ 331 332 region_setup = handler_desc->address_space.setup; 333 if (!region_setup) { 334 335 /* No initialization routine, exit with error */ 336 337 ACPI_ERROR((AE_INFO, 338 "No init routine for region(%p) [%s]", 339 region_obj, 340 acpi_ut_get_region_name(region_obj->region. 341 space_id))); 342 return_ACPI_STATUS(AE_NOT_EXIST); 343 } 344 345 /* 346 * We must exit the interpreter because the region setup will 347 * potentially execute control methods (for example, the _REG method 348 * for this region) 349 */ 350 acpi_ex_exit_interpreter(); 351 352 status = region_setup(region_obj, ACPI_REGION_ACTIVATE, 353 handler_desc->address_space.context, 354 ®ion_context); 355 356 /* Re-enter the interpreter */ 357 358 acpi_ex_enter_interpreter(); 359 360 /* Check for failure of the Region Setup */ 361 362 if (ACPI_FAILURE(status)) { 363 ACPI_EXCEPTION((AE_INFO, status, 364 "During region initialization: [%s]", 365 acpi_ut_get_region_name(region_obj-> 366 region. 367 space_id))); 368 return_ACPI_STATUS(status); 369 } 370 371 /* Region initialization may have been completed by region_setup */ 372 373 if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) { 374 region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE; 375 376 if (region_obj2->extra.region_context) { 377 378 /* The handler for this region was already installed */ 379 380 ACPI_FREE(region_context); 381 } else { 382 /* 383 * Save the returned context for use in all accesses to 384 * this particular region 385 */ 386 region_obj2->extra.region_context = 387 region_context; 388 } 389 } 390 } 391 392 /* We have everything we need, we can invoke the address space handler */ 393 394 handler = handler_desc->address_space.handler; 395 396 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 397 "Handler %p (@%p) Address %8.8X%8.8X [%s]\n", 398 ®ion_obj->region.handler->address_space, handler, 399 ACPI_FORMAT_NATIVE_UINT(address), 400 acpi_ut_get_region_name(region_obj->region. 401 space_id))); 402 403 if (!(handler_desc->address_space.handler_flags & 404 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { 405 /* 406 * For handlers other than the default (supplied) handlers, we must 407 * exit the interpreter because the handler *might* block -- we don't 408 * know what it will do, so we can't hold the lock on the intepreter. 409 */ 410 acpi_ex_exit_interpreter(); 411 } 412 413 /* Call the handler */ 414 415 status = handler(function, address, bit_width, value, 416 handler_desc->address_space.context, 417 region_obj2->extra.region_context); 418 419 if (ACPI_FAILURE(status)) { 420 ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]", 421 acpi_ut_get_region_name(region_obj->region. 422 space_id))); 423 } 424 425 if (!(handler_desc->address_space.handler_flags & 426 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { 427 /* 428 * We just returned from a non-default handler, we must re-enter the 429 * interpreter 430 */ 431 acpi_ex_enter_interpreter(); 432 } 433 434 return_ACPI_STATUS(status); 435 } 436 437 /******************************************************************************* 438 * 439 * FUNCTION: acpi_ev_detach_region 440 * 441 * PARAMETERS: region_obj - Region Object 442 * acpi_ns_is_locked - Namespace Region Already Locked? 443 * 444 * RETURN: None 445 * 446 * DESCRIPTION: Break the association between the handler and the region 447 * this is a two way association. 448 * 449 ******************************************************************************/ 450 451 void 452 acpi_ev_detach_region(union acpi_operand_object *region_obj, 453 u8 acpi_ns_is_locked) 454 { 455 union acpi_operand_object *handler_obj; 456 union acpi_operand_object *obj_desc; 457 union acpi_operand_object **last_obj_ptr; 458 acpi_adr_space_setup region_setup; 459 void **region_context; 460 union acpi_operand_object *region_obj2; 461 acpi_status status; 462 463 ACPI_FUNCTION_TRACE(ev_detach_region); 464 465 region_obj2 = acpi_ns_get_secondary_object(region_obj); 466 if (!region_obj2) { 467 return_VOID; 468 } 469 region_context = ®ion_obj2->extra.region_context; 470 471 /* Get the address handler from the region object */ 472 473 handler_obj = region_obj->region.handler; 474 if (!handler_obj) { 475 476 /* This region has no handler, all done */ 477 478 return_VOID; 479 } 480 481 /* Find this region in the handler's list */ 482 483 obj_desc = handler_obj->address_space.region_list; 484 last_obj_ptr = &handler_obj->address_space.region_list; 485 486 while (obj_desc) { 487 488 /* Is this the correct Region? */ 489 490 if (obj_desc == region_obj) { 491 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 492 "Removing Region %p from address handler %p\n", 493 region_obj, handler_obj)); 494 495 /* This is it, remove it from the handler's list */ 496 497 *last_obj_ptr = obj_desc->region.next; 498 obj_desc->region.next = NULL; /* Must clear field */ 499 500 if (acpi_ns_is_locked) { 501 status = 502 acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 503 if (ACPI_FAILURE(status)) { 504 return_VOID; 505 } 506 } 507 508 /* Now stop region accesses by executing the _REG method */ 509 510 status = acpi_ev_execute_reg_method(region_obj, 0); 511 if (ACPI_FAILURE(status)) { 512 ACPI_EXCEPTION((AE_INFO, status, 513 "from region _REG, [%s]", 514 acpi_ut_get_region_name 515 (region_obj->region.space_id))); 516 } 517 518 if (acpi_ns_is_locked) { 519 status = 520 acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 521 if (ACPI_FAILURE(status)) { 522 return_VOID; 523 } 524 } 525 526 /* 527 * If the region has been activated, call the setup handler with 528 * the deactivate notification 529 */ 530 if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) { 531 region_setup = handler_obj->address_space.setup; 532 status = 533 region_setup(region_obj, 534 ACPI_REGION_DEACTIVATE, 535 handler_obj->address_space. 536 context, region_context); 537 538 /* Init routine may fail, Just ignore errors */ 539 540 if (ACPI_FAILURE(status)) { 541 ACPI_EXCEPTION((AE_INFO, status, 542 "from region handler - deactivate, [%s]", 543 acpi_ut_get_region_name 544 (region_obj->region. 545 space_id))); 546 } 547 548 region_obj->region.flags &= 549 ~(AOPOBJ_SETUP_COMPLETE); 550 } 551 552 /* 553 * Remove handler reference in the region 554 * 555 * NOTE: this doesn't mean that the region goes away, the region 556 * is just inaccessible as indicated to the _REG method 557 * 558 * If the region is on the handler's list, this must be the 559 * region's handler 560 */ 561 region_obj->region.handler = NULL; 562 acpi_ut_remove_reference(handler_obj); 563 564 return_VOID; 565 } 566 567 /* Walk the linked list of handlers */ 568 569 last_obj_ptr = &obj_desc->region.next; 570 obj_desc = obj_desc->region.next; 571 } 572 573 /* If we get here, the region was not in the handler's region list */ 574 575 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 576 "Cannot remove region %p from address handler %p\n", 577 region_obj, handler_obj)); 578 579 return_VOID; 580 } 581 582 /******************************************************************************* 583 * 584 * FUNCTION: acpi_ev_attach_region 585 * 586 * PARAMETERS: handler_obj - Handler Object 587 * region_obj - Region Object 588 * acpi_ns_is_locked - Namespace Region Already Locked? 589 * 590 * RETURN: None 591 * 592 * DESCRIPTION: Create the association between the handler and the region 593 * this is a two way association. 594 * 595 ******************************************************************************/ 596 597 acpi_status 598 acpi_ev_attach_region(union acpi_operand_object *handler_obj, 599 union acpi_operand_object *region_obj, 600 u8 acpi_ns_is_locked) 601 { 602 603 ACPI_FUNCTION_TRACE(ev_attach_region); 604 605 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 606 "Adding Region [%4.4s] %p to address handler %p [%s]\n", 607 acpi_ut_get_node_name(region_obj->region.node), 608 region_obj, handler_obj, 609 acpi_ut_get_region_name(region_obj->region. 610 space_id))); 611 612 /* Link this region to the front of the handler's list */ 613 614 region_obj->region.next = handler_obj->address_space.region_list; 615 handler_obj->address_space.region_list = region_obj; 616 617 /* Install the region's handler */ 618 619 if (region_obj->region.handler) { 620 return_ACPI_STATUS(AE_ALREADY_EXISTS); 621 } 622 623 region_obj->region.handler = handler_obj; 624 acpi_ut_add_reference(handler_obj); 625 626 return_ACPI_STATUS(AE_OK); 627 } 628 629 /******************************************************************************* 630 * 631 * FUNCTION: acpi_ev_install_handler 632 * 633 * PARAMETERS: walk_namespace callback 634 * 635 * DESCRIPTION: This routine installs an address handler into objects that are 636 * of type Region or Device. 637 * 638 * If the Object is a Device, and the device has a handler of 639 * the same type then the search is terminated in that branch. 640 * 641 * This is because the existing handler is closer in proximity 642 * to any more regions than the one we are trying to install. 643 * 644 ******************************************************************************/ 645 646 static acpi_status 647 acpi_ev_install_handler(acpi_handle obj_handle, 648 u32 level, void *context, void **return_value) 649 { 650 union acpi_operand_object *handler_obj; 651 union acpi_operand_object *next_handler_obj; 652 union acpi_operand_object *obj_desc; 653 struct acpi_namespace_node *node; 654 acpi_status status; 655 656 ACPI_FUNCTION_NAME(ev_install_handler); 657 658 handler_obj = (union acpi_operand_object *)context; 659 660 /* Parameter validation */ 661 662 if (!handler_obj) { 663 return (AE_OK); 664 } 665 666 /* Convert and validate the device handle */ 667 668 node = acpi_ns_map_handle_to_node(obj_handle); 669 if (!node) { 670 return (AE_BAD_PARAMETER); 671 } 672 673 /* 674 * We only care about regions and objects that are allowed to have 675 * address space handlers 676 */ 677 if ((node->type != ACPI_TYPE_DEVICE) && 678 (node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) { 679 return (AE_OK); 680 } 681 682 /* Check for an existing internal object */ 683 684 obj_desc = acpi_ns_get_attached_object(node); 685 if (!obj_desc) { 686 687 /* No object, just exit */ 688 689 return (AE_OK); 690 } 691 692 /* Devices are handled different than regions */ 693 694 if (obj_desc->common.type == ACPI_TYPE_DEVICE) { 695 696 /* Check if this Device already has a handler for this address space */ 697 698 next_handler_obj = obj_desc->device.handler; 699 while (next_handler_obj) { 700 701 /* Found a handler, is it for the same address space? */ 702 703 if (next_handler_obj->address_space.space_id == 704 handler_obj->address_space.space_id) { 705 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 706 "Found handler for region [%s] in device %p(%p) " 707 "handler %p\n", 708 acpi_ut_get_region_name 709 (handler_obj->address_space. 710 space_id), obj_desc, 711 next_handler_obj, 712 handler_obj)); 713 714 /* 715 * Since the object we found it on was a device, then it 716 * means that someone has already installed a handler for 717 * the branch of the namespace from this device on. Just 718 * bail out telling the walk routine to not traverse this 719 * branch. This preserves the scoping rule for handlers. 720 */ 721 return (AE_CTRL_DEPTH); 722 } 723 724 /* Walk the linked list of handlers attached to this device */ 725 726 next_handler_obj = next_handler_obj->address_space.next; 727 } 728 729 /* 730 * As long as the device didn't have a handler for this space we 731 * don't care about it. We just ignore it and proceed. 732 */ 733 return (AE_OK); 734 } 735 736 /* Object is a Region */ 737 738 if (obj_desc->region.space_id != handler_obj->address_space.space_id) { 739 740 /* This region is for a different address space, just ignore it */ 741 742 return (AE_OK); 743 } 744 745 /* 746 * Now we have a region and it is for the handler's address space type. 747 * 748 * First disconnect region for any previous handler (if any) 749 */ 750 acpi_ev_detach_region(obj_desc, FALSE); 751 752 /* Connect the region to the new handler */ 753 754 status = acpi_ev_attach_region(handler_obj, obj_desc, FALSE); 755 return (status); 756 } 757 758 /******************************************************************************* 759 * 760 * FUNCTION: acpi_ev_install_space_handler 761 * 762 * PARAMETERS: Node - Namespace node for the device 763 * space_id - The address space ID 764 * Handler - Address of the handler 765 * Setup - Address of the setup function 766 * Context - Value passed to the handler on each access 767 * 768 * RETURN: Status 769 * 770 * DESCRIPTION: Install a handler for all op_regions of a given space_id. 771 * Assumes namespace is locked 772 * 773 ******************************************************************************/ 774 775 acpi_status 776 acpi_ev_install_space_handler(struct acpi_namespace_node * node, 777 acpi_adr_space_type space_id, 778 acpi_adr_space_handler handler, 779 acpi_adr_space_setup setup, void *context) 780 { 781 union acpi_operand_object *obj_desc; 782 union acpi_operand_object *handler_obj; 783 acpi_status status; 784 acpi_object_type type; 785 u8 flags = 0; 786 787 ACPI_FUNCTION_TRACE(ev_install_space_handler); 788 789 /* 790 * This registration is valid for only the types below and the root. This 791 * is where the default handlers get placed. 792 */ 793 if ((node->type != ACPI_TYPE_DEVICE) && 794 (node->type != ACPI_TYPE_PROCESSOR) && 795 (node->type != ACPI_TYPE_THERMAL) && (node != acpi_gbl_root_node)) { 796 status = AE_BAD_PARAMETER; 797 goto unlock_and_exit; 798 } 799 800 if (handler == ACPI_DEFAULT_HANDLER) { 801 flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED; 802 803 switch (space_id) { 804 case ACPI_ADR_SPACE_SYSTEM_MEMORY: 805 handler = acpi_ex_system_memory_space_handler; 806 setup = acpi_ev_system_memory_region_setup; 807 break; 808 809 case ACPI_ADR_SPACE_SYSTEM_IO: 810 handler = acpi_ex_system_io_space_handler; 811 setup = acpi_ev_io_space_region_setup; 812 break; 813 814 case ACPI_ADR_SPACE_PCI_CONFIG: 815 handler = acpi_ex_pci_config_space_handler; 816 setup = acpi_ev_pci_config_region_setup; 817 break; 818 819 case ACPI_ADR_SPACE_CMOS: 820 handler = acpi_ex_cmos_space_handler; 821 setup = acpi_ev_cmos_region_setup; 822 break; 823 824 case ACPI_ADR_SPACE_PCI_BAR_TARGET: 825 handler = acpi_ex_pci_bar_space_handler; 826 setup = acpi_ev_pci_bar_region_setup; 827 break; 828 829 case ACPI_ADR_SPACE_DATA_TABLE: 830 handler = acpi_ex_data_table_space_handler; 831 setup = NULL; 832 break; 833 834 default: 835 status = AE_BAD_PARAMETER; 836 goto unlock_and_exit; 837 } 838 } 839 840 /* If the caller hasn't specified a setup routine, use the default */ 841 842 if (!setup) { 843 setup = acpi_ev_default_region_setup; 844 } 845 846 /* Check for an existing internal object */ 847 848 obj_desc = acpi_ns_get_attached_object(node); 849 if (obj_desc) { 850 /* 851 * The attached device object already exists. Make sure the handler 852 * is not already installed. 853 */ 854 handler_obj = obj_desc->device.handler; 855 856 /* Walk the handler list for this device */ 857 858 while (handler_obj) { 859 860 /* Same space_id indicates a handler already installed */ 861 862 if (handler_obj->address_space.space_id == space_id) { 863 if (handler_obj->address_space.handler == 864 handler) { 865 /* 866 * It is (relatively) OK to attempt to install the SAME 867 * handler twice. This can easily happen with the 868 * PCI_Config space. 869 */ 870 status = AE_SAME_HANDLER; 871 goto unlock_and_exit; 872 } else { 873 /* A handler is already installed */ 874 875 status = AE_ALREADY_EXISTS; 876 } 877 goto unlock_and_exit; 878 } 879 880 /* Walk the linked list of handlers */ 881 882 handler_obj = handler_obj->address_space.next; 883 } 884 } else { 885 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 886 "Creating object on Device %p while installing handler\n", 887 node)); 888 889 /* obj_desc does not exist, create one */ 890 891 if (node->type == ACPI_TYPE_ANY) { 892 type = ACPI_TYPE_DEVICE; 893 } else { 894 type = node->type; 895 } 896 897 obj_desc = acpi_ut_create_internal_object(type); 898 if (!obj_desc) { 899 status = AE_NO_MEMORY; 900 goto unlock_and_exit; 901 } 902 903 /* Init new descriptor */ 904 905 obj_desc->common.type = (u8) type; 906 907 /* Attach the new object to the Node */ 908 909 status = acpi_ns_attach_object(node, obj_desc, type); 910 911 /* Remove local reference to the object */ 912 913 acpi_ut_remove_reference(obj_desc); 914 915 if (ACPI_FAILURE(status)) { 916 goto unlock_and_exit; 917 } 918 } 919 920 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, 921 "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", 922 acpi_ut_get_region_name(space_id), space_id, 923 acpi_ut_get_node_name(node), node, obj_desc)); 924 925 /* 926 * Install the handler 927 * 928 * At this point there is no existing handler. Just allocate the object 929 * for the handler and link it into the list. 930 */ 931 handler_obj = 932 acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER); 933 if (!handler_obj) { 934 status = AE_NO_MEMORY; 935 goto unlock_and_exit; 936 } 937 938 /* Init handler obj */ 939 940 handler_obj->address_space.space_id = (u8) space_id; 941 handler_obj->address_space.handler_flags = flags; 942 handler_obj->address_space.region_list = NULL; 943 handler_obj->address_space.node = node; 944 handler_obj->address_space.handler = handler; 945 handler_obj->address_space.context = context; 946 handler_obj->address_space.setup = setup; 947 948 /* Install at head of Device.address_space list */ 949 950 handler_obj->address_space.next = obj_desc->device.handler; 951 952 /* 953 * The Device object is the first reference on the handler_obj. 954 * Each region that uses the handler adds a reference. 955 */ 956 obj_desc->device.handler = handler_obj; 957 958 /* 959 * Walk the namespace finding all of the regions this 960 * handler will manage. 961 * 962 * Start at the device and search the branch toward 963 * the leaf nodes until either the leaf is encountered or 964 * a device is detected that has an address handler of the 965 * same type. 966 * 967 * In either case, back up and search down the remainder 968 * of the branch 969 */ 970 status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, 971 ACPI_NS_WALK_UNLOCK, 972 acpi_ev_install_handler, handler_obj, 973 NULL); 974 975 unlock_and_exit: 976 return_ACPI_STATUS(status); 977 } 978 979 /******************************************************************************* 980 * 981 * FUNCTION: acpi_ev_execute_reg_methods 982 * 983 * PARAMETERS: Node - Namespace node for the device 984 * space_id - The address space ID 985 * 986 * RETURN: Status 987 * 988 * DESCRIPTION: Run all _REG methods for the input Space ID; 989 * Note: assumes namespace is locked, or system init time. 990 * 991 ******************************************************************************/ 992 993 acpi_status 994 acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, 995 acpi_adr_space_type space_id) 996 { 997 acpi_status status; 998 999 ACPI_FUNCTION_TRACE(ev_execute_reg_methods); 1000 1001 /* 1002 * Run all _REG methods for all Operation Regions for this space ID. This 1003 * is a separate walk in order to handle any interdependencies between 1004 * regions and _REG methods. (i.e. handlers must be installed for all 1005 * regions of this Space ID before we can run any _REG methods) 1006 */ 1007 status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, 1008 ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, 1009 &space_id, NULL); 1010 1011 return_ACPI_STATUS(status); 1012 } 1013 1014 /******************************************************************************* 1015 * 1016 * FUNCTION: acpi_ev_reg_run 1017 * 1018 * PARAMETERS: walk_namespace callback 1019 * 1020 * DESCRIPTION: Run _REG method for region objects of the requested space_iD 1021 * 1022 ******************************************************************************/ 1023 1024 static acpi_status 1025 acpi_ev_reg_run(acpi_handle obj_handle, 1026 u32 level, void *context, void **return_value) 1027 { 1028 union acpi_operand_object *obj_desc; 1029 struct acpi_namespace_node *node; 1030 acpi_adr_space_type space_id; 1031 acpi_status status; 1032 1033 space_id = *ACPI_CAST_PTR(acpi_adr_space_type, context); 1034 1035 /* Convert and validate the device handle */ 1036 1037 node = acpi_ns_map_handle_to_node(obj_handle); 1038 if (!node) { 1039 return (AE_BAD_PARAMETER); 1040 } 1041 1042 /* 1043 * We only care about regions.and objects that are allowed to have address 1044 * space handlers 1045 */ 1046 if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) { 1047 return (AE_OK); 1048 } 1049 1050 /* Check for an existing internal object */ 1051 1052 obj_desc = acpi_ns_get_attached_object(node); 1053 if (!obj_desc) { 1054 1055 /* No object, just exit */ 1056 1057 return (AE_OK); 1058 } 1059 1060 /* Object is a Region */ 1061 1062 if (obj_desc->region.space_id != space_id) { 1063 1064 /* This region is for a different address space, just ignore it */ 1065 1066 return (AE_OK); 1067 } 1068 1069 status = acpi_ev_execute_reg_method(obj_desc, 1); 1070 return (status); 1071 } 1072