1 /******************************************************************************
 
   3  * Module Name: evregion - ACPI address_space (op_region) handler dispatch
 
   5  *****************************************************************************/
 
   8  * Copyright (C) 2000 - 2008, Intel Corp.
 
  11  * Redistribution and use in source and binary forms, with or without
 
  12  * modification, are permitted provided that the following conditions
 
  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.
 
  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.
 
  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.
 
  44 #include <acpi/acpi.h>
 
  50 #define _COMPONENT          ACPI_EVENTS
 
  51 ACPI_MODULE_NAME("evregion")
 
  53 /* Local prototypes */
 
  55 acpi_ev_reg_run(acpi_handle obj_handle,
 
  56                 u32 level, void *context, void **return_value);
 
  59 acpi_ev_install_handler(acpi_handle obj_handle,
 
  60                         u32 level, void *context, void **return_value);
 
  62 /* These are the address spaces that will get default handlers */
 
  64 #define ACPI_NUM_DEFAULT_SPACES     4
 
  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
 
  73 /*******************************************************************************
 
  75  * FUNCTION:    acpi_ev_install_region_handlers
 
  81  * DESCRIPTION: Installs the core subsystem default address space handlers.
 
  83  ******************************************************************************/
 
  85 acpi_status acpi_ev_install_region_handlers(void)
 
  90         ACPI_FUNCTION_TRACE(ev_install_region_handlers);
 
  92         status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 
  93         if (ACPI_FAILURE(status)) {
 
  94                 return_ACPI_STATUS(status);
 
  98          * All address spaces (PCI Config, EC, SMBus) are scope dependent and
 
  99          * registration must occur for a specific device.
 
 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
 
 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.
 
 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.
 
 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
 
 120                                                        ACPI_DEFAULT_HANDLER,
 
 124                 case AE_SAME_HANDLER:
 
 125                 case AE_ALREADY_EXISTS:
 
 127                         /* These exceptions are all OK */
 
 134                         goto unlock_and_exit;
 
 139         (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 
 140         return_ACPI_STATUS(status);
 
 143 /*******************************************************************************
 
 145  * FUNCTION:    acpi_ev_initialize_op_regions
 
 151  * DESCRIPTION: Execute _REG methods for all Operation Regions that have
 
 152  *              an installed default region handler.
 
 154  ******************************************************************************/
 
 156 acpi_status acpi_ev_initialize_op_regions(void)
 
 161         ACPI_FUNCTION_TRACE(ev_initialize_op_regions);
 
 163         status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 
 164         if (ACPI_FAILURE(status)) {
 
 165                 return_ACPI_STATUS(status);
 
 168         /* Run the _REG methods for op_regions in each default address space */
 
 170         for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
 
 172                  * TBD: Make sure handler is the DEFAULT handler, otherwise
 
 173                  * _REG will have already been run.
 
 175                 status = acpi_ev_execute_reg_methods(acpi_gbl_root_node,
 
 176                                                      acpi_gbl_default_address_spaces
 
 180         (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 
 181         return_ACPI_STATUS(status);
 
 184 /*******************************************************************************
 
 186  * FUNCTION:    acpi_ev_execute_reg_method
 
 188  * PARAMETERS:  region_obj          - Region object
 
 189  *              Function            - Passed to _REG: On (1) or Off (0)
 
 193  * DESCRIPTION: Execute _REG method for a region
 
 195  ******************************************************************************/
 
 198 acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
 
 200         struct acpi_evaluate_info *info;
 
 201         union acpi_operand_object *args[3];
 
 202         union acpi_operand_object *region_obj2;
 
 205         ACPI_FUNCTION_TRACE(ev_execute_reg_method);
 
 207         region_obj2 = acpi_ns_get_secondary_object(region_obj);
 
 209                 return_ACPI_STATUS(AE_NOT_EXIST);
 
 212         if (region_obj2->extra.method_REG == NULL) {
 
 213                 return_ACPI_STATUS(AE_OK);
 
 216         /* Allocate and initialize the evaluation information block */
 
 218         info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
 
 220                 return_ACPI_STATUS(AE_NO_MEMORY);
 
 223         info->prefix_node = region_obj2->extra.method_REG;
 
 224         info->pathname = NULL;
 
 225         info->parameters = args;
 
 226         info->flags = ACPI_IGNORE_RETURN_VALUE;
 
 229          * The _REG method has two arguments:
 
 232          *  Operation region space ID Same value as region_obj->Region.space_id
 
 235          *  connection status 1 for connecting the handler, 0 for disconnecting
 
 236          *  the handler (Passed as a parameter)
 
 238         args[0] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
 
 240                 status = AE_NO_MEMORY;
 
 244         args[1] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
 
 246                 status = AE_NO_MEMORY;
 
 250         /* Setup the parameter objects */
 
 252         args[0]->integer.value = region_obj->region.space_id;
 
 253         args[1]->integer.value = function;
 
 256         /* Execute the method, no return value */
 
 258         ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
 
 259                         (ACPI_TYPE_METHOD, info->prefix_node, NULL));
 
 261         status = acpi_ns_evaluate(info);
 
 262         acpi_ut_remove_reference(args[1]);
 
 265         acpi_ut_remove_reference(args[0]);
 
 269         return_ACPI_STATUS(status);
 
 272 /*******************************************************************************
 
 274  * FUNCTION:    acpi_ev_address_space_dispatch
 
 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
 
 285  * DESCRIPTION: Dispatch an address space or operation region access to
 
 286  *              a previously installed handler.
 
 288  ******************************************************************************/
 
 291 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
 
 293                                acpi_physical_address address,
 
 294                                u32 bit_width, acpi_integer * value)
 
 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;
 
 303         ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
 
 305         region_obj2 = acpi_ns_get_secondary_object(region_obj);
 
 307                 return_ACPI_STATUS(AE_NOT_EXIST);
 
 310         /* Ensure that there is a handler associated with this region */
 
 312         handler_desc = region_obj->region.handler;
 
 315                             "No handler for Region [%4.4s] (%p) [%s]",
 
 316                             acpi_ut_get_node_name(region_obj->region.node),
 
 318                             acpi_ut_get_region_name(region_obj->region.
 
 321                 return_ACPI_STATUS(AE_NOT_EXIST);
 
 325          * It may be the case that the region has never been initialized.
 
 326          * Some types of regions require special init code
 
 328         if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 
 330                 /* This region has not been initialized yet, do it */
 
 332                 region_setup = handler_desc->address_space.setup;
 
 335                         /* No initialization routine, exit with error */
 
 338                                     "No init routine for region(%p) [%s]",
 
 340                                     acpi_ut_get_region_name(region_obj->region.
 
 342                         return_ACPI_STATUS(AE_NOT_EXIST);
 
 346                  * We must exit the interpreter because the region setup will
 
 347                  * potentially execute control methods (for example, the _REG method
 
 350                 acpi_ex_exit_interpreter();
 
 352                 status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
 
 353                                       handler_desc->address_space.context,
 
 356                 /* Re-enter the interpreter */
 
 358                 acpi_ex_enter_interpreter();
 
 360                 /* Check for failure of the Region Setup */
 
 362                 if (ACPI_FAILURE(status)) {
 
 363                         ACPI_EXCEPTION((AE_INFO, status,
 
 364                                         "During region initialization: [%s]",
 
 365                                         acpi_ut_get_region_name(region_obj->
 
 368                         return_ACPI_STATUS(status);
 
 371                 /* Region initialization may have been completed by region_setup */
 
 373                 if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 
 374                         region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
 
 376                         if (region_obj2->extra.region_context) {
 
 378                                 /* The handler for this region was already installed */
 
 380                                 ACPI_FREE(region_context);
 
 383                                  * Save the returned context for use in all accesses to
 
 384                                  * this particular region
 
 386                                 region_obj2->extra.region_context =
 
 392         /* We have everything we need, we can invoke the address space handler */
 
 394         handler = handler_desc->address_space.handler;
 
 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.
 
 403         if (!(handler_desc->address_space.handler_flags &
 
 404               ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 
 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.
 
 410                 acpi_ex_exit_interpreter();
 
 413         /* Call the handler */
 
 415         status = handler(function, address, bit_width, value,
 
 416                          handler_desc->address_space.context,
 
 417                          region_obj2->extra.region_context);
 
 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.
 
 425         if (!(handler_desc->address_space.handler_flags &
 
 426               ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 
 428                  * We just returned from a non-default handler, we must re-enter the
 
 431                 acpi_ex_enter_interpreter();
 
 434         return_ACPI_STATUS(status);
 
 437 /*******************************************************************************
 
 439  * FUNCTION:    acpi_ev_detach_region
 
 441  * PARAMETERS:  region_obj          - Region Object
 
 442  *              acpi_ns_is_locked   - Namespace Region Already Locked?
 
 446  * DESCRIPTION: Break the association between the handler and the region
 
 447  *              this is a two way association.
 
 449  ******************************************************************************/
 
 452 acpi_ev_detach_region(union acpi_operand_object *region_obj,
 
 453                       u8 acpi_ns_is_locked)
 
 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;
 
 463         ACPI_FUNCTION_TRACE(ev_detach_region);
 
 465         region_obj2 = acpi_ns_get_secondary_object(region_obj);
 
 469         region_context = ®ion_obj2->extra.region_context;
 
 471         /* Get the address handler from the region object */
 
 473         handler_obj = region_obj->region.handler;
 
 476                 /* This region has no handler, all done */
 
 481         /* Find this region in the handler's list */
 
 483         obj_desc = handler_obj->address_space.region_list;
 
 484         last_obj_ptr = &handler_obj->address_space.region_list;
 
 488                 /* Is this the correct Region? */
 
 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));
 
 495                         /* This is it, remove it from the handler's list */
 
 497                         *last_obj_ptr = obj_desc->region.next;
 
 498                         obj_desc->region.next = NULL;   /* Must clear field */
 
 500                         if (acpi_ns_is_locked) {
 
 502                                     acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 
 503                                 if (ACPI_FAILURE(status)) {
 
 508                         /* Now stop region accesses by executing the _REG method */
 
 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)));
 
 518                         if (acpi_ns_is_locked) {
 
 520                                     acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 
 521                                 if (ACPI_FAILURE(status)) {
 
 527                          * If the region has been activated, call the setup handler with
 
 528                          * the deactivate notification
 
 530                         if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {
 
 531                                 region_setup = handler_obj->address_space.setup;
 
 533                                     region_setup(region_obj,
 
 534                                                  ACPI_REGION_DEACTIVATE,
 
 535                                                  handler_obj->address_space.
 
 536                                                  context, region_context);
 
 538                                 /* Init routine may fail, Just ignore errors */
 
 540                                 if (ACPI_FAILURE(status)) {
 
 541                                         ACPI_EXCEPTION((AE_INFO, status,
 
 542                                                         "from region handler - deactivate, [%s]",
 
 543                                                         acpi_ut_get_region_name
 
 548                                 region_obj->region.flags &=
 
 549                                     ~(AOPOBJ_SETUP_COMPLETE);
 
 553                          * Remove handler reference in the region
 
 555                          * NOTE: this doesn't mean that the region goes away, the region
 
 556                          * is just inaccessible as indicated to the _REG method
 
 558                          * If the region is on the handler's list, this must be the
 
 561                         region_obj->region.handler = NULL;
 
 562                         acpi_ut_remove_reference(handler_obj);
 
 567                 /* Walk the linked list of handlers */
 
 569                 last_obj_ptr = &obj_desc->region.next;
 
 570                 obj_desc = obj_desc->region.next;
 
 573         /* If we get here, the region was not in the handler's region list */
 
 575         ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 
 576                           "Cannot remove region %p from address handler %p\n",
 
 577                           region_obj, handler_obj));
 
 582 /*******************************************************************************
 
 584  * FUNCTION:    acpi_ev_attach_region
 
 586  * PARAMETERS:  handler_obj         - Handler Object
 
 587  *              region_obj          - Region Object
 
 588  *              acpi_ns_is_locked   - Namespace Region Already Locked?
 
 592  * DESCRIPTION: Create the association between the handler and the region
 
 593  *              this is a two way association.
 
 595  ******************************************************************************/
 
 598 acpi_ev_attach_region(union acpi_operand_object *handler_obj,
 
 599                       union acpi_operand_object *region_obj,
 
 600                       u8 acpi_ns_is_locked)
 
 603         ACPI_FUNCTION_TRACE(ev_attach_region);
 
 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.
 
 612         /* Link this region to the front of the handler's list */
 
 614         region_obj->region.next = handler_obj->address_space.region_list;
 
 615         handler_obj->address_space.region_list = region_obj;
 
 617         /* Install the region's handler */
 
 619         if (region_obj->region.handler) {
 
 620                 return_ACPI_STATUS(AE_ALREADY_EXISTS);
 
 623         region_obj->region.handler = handler_obj;
 
 624         acpi_ut_add_reference(handler_obj);
 
 626         return_ACPI_STATUS(AE_OK);
 
 629 /*******************************************************************************
 
 631  * FUNCTION:    acpi_ev_install_handler
 
 633  * PARAMETERS:  walk_namespace callback
 
 635  * DESCRIPTION: This routine installs an address handler into objects that are
 
 636  *              of type Region or Device.
 
 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.
 
 641  *              This is because the existing handler is closer in proximity
 
 642  *              to any more regions than the one we are trying to install.
 
 644  ******************************************************************************/
 
 647 acpi_ev_install_handler(acpi_handle obj_handle,
 
 648                         u32 level, void *context, void **return_value)
 
 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;
 
 656         ACPI_FUNCTION_NAME(ev_install_handler);
 
 658         handler_obj = (union acpi_operand_object *)context;
 
 660         /* Parameter validation */
 
 666         /* Convert and validate the device handle */
 
 668         node = acpi_ns_map_handle_to_node(obj_handle);
 
 670                 return (AE_BAD_PARAMETER);
 
 674          * We only care about regions and objects that are allowed to have
 
 675          * address space handlers
 
 677         if ((node->type != ACPI_TYPE_DEVICE) &&
 
 678             (node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
 
 682         /* Check for an existing internal object */
 
 684         obj_desc = acpi_ns_get_attached_object(node);
 
 687                 /* No object, just exit */
 
 692         /* Devices are handled different than regions */
 
 694         if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_DEVICE) {
 
 696                 /* Check if this Device already has a handler for this address space */
 
 698                 next_handler_obj = obj_desc->device.handler;
 
 699                 while (next_handler_obj) {
 
 701                         /* Found a handler, is it for the same address space? */
 
 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) handler %p\n",
 
 707                                                   acpi_ut_get_region_name
 
 708                                                   (handler_obj->address_space.
 
 714                                  * Since the object we found it on was a device, then it
 
 715                                  * means that someone has already installed a handler for
 
 716                                  * the branch of the namespace from this device on. Just
 
 717                                  * bail out telling the walk routine to not traverse this
 
 718                                  * branch. This preserves the scoping rule for handlers.
 
 720                                 return (AE_CTRL_DEPTH);
 
 723                         /* Walk the linked list of handlers attached to this device */
 
 725                         next_handler_obj = next_handler_obj->address_space.next;
 
 729                  * As long as the device didn't have a handler for this space we
 
 730                  * don't care about it. We just ignore it and proceed.
 
 735         /* Object is a Region */
 
 737         if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
 
 739                 /* This region is for a different address space, just ignore it */
 
 745          * Now we have a region and it is for the handler's address space type.
 
 747          * First disconnect region for any previous handler (if any)
 
 749         acpi_ev_detach_region(obj_desc, FALSE);
 
 751         /* Connect the region to the new handler */
 
 753         status = acpi_ev_attach_region(handler_obj, obj_desc, FALSE);
 
 757 /*******************************************************************************
 
 759  * FUNCTION:    acpi_ev_install_space_handler
 
 761  * PARAMETERS:  Node            - Namespace node for the device
 
 762  *              space_id        - The address space ID
 
 763  *              Handler         - Address of the handler
 
 764  *              Setup           - Address of the setup function
 
 765  *              Context         - Value passed to the handler on each access
 
 769  * DESCRIPTION: Install a handler for all op_regions of a given space_id.
 
 770  *              Assumes namespace is locked
 
 772  ******************************************************************************/
 
 775 acpi_ev_install_space_handler(struct acpi_namespace_node * node,
 
 776                               acpi_adr_space_type space_id,
 
 777                               acpi_adr_space_handler handler,
 
 778                               acpi_adr_space_setup setup, void *context)
 
 780         union acpi_operand_object *obj_desc;
 
 781         union acpi_operand_object *handler_obj;
 
 783         acpi_object_type type;
 
 786         ACPI_FUNCTION_TRACE(ev_install_space_handler);
 
 789          * This registration is valid for only the types below and the root. This
 
 790          * is where the default handlers get placed.
 
 792         if ((node->type != ACPI_TYPE_DEVICE) &&
 
 793             (node->type != ACPI_TYPE_PROCESSOR) &&
 
 794             (node->type != ACPI_TYPE_THERMAL) && (node != acpi_gbl_root_node)) {
 
 795                 status = AE_BAD_PARAMETER;
 
 796                 goto unlock_and_exit;
 
 799         if (handler == ACPI_DEFAULT_HANDLER) {
 
 800                 flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED;
 
 803                 case ACPI_ADR_SPACE_SYSTEM_MEMORY:
 
 804                         handler = acpi_ex_system_memory_space_handler;
 
 805                         setup = acpi_ev_system_memory_region_setup;
 
 808                 case ACPI_ADR_SPACE_SYSTEM_IO:
 
 809                         handler = acpi_ex_system_io_space_handler;
 
 810                         setup = acpi_ev_io_space_region_setup;
 
 813                 case ACPI_ADR_SPACE_PCI_CONFIG:
 
 814                         handler = acpi_ex_pci_config_space_handler;
 
 815                         setup = acpi_ev_pci_config_region_setup;
 
 818                 case ACPI_ADR_SPACE_CMOS:
 
 819                         handler = acpi_ex_cmos_space_handler;
 
 820                         setup = acpi_ev_cmos_region_setup;
 
 823                 case ACPI_ADR_SPACE_PCI_BAR_TARGET:
 
 824                         handler = acpi_ex_pci_bar_space_handler;
 
 825                         setup = acpi_ev_pci_bar_region_setup;
 
 828                 case ACPI_ADR_SPACE_DATA_TABLE:
 
 829                         handler = acpi_ex_data_table_space_handler;
 
 834                         status = AE_BAD_PARAMETER;
 
 835                         goto unlock_and_exit;
 
 839         /* If the caller hasn't specified a setup routine, use the default */
 
 842                 setup = acpi_ev_default_region_setup;
 
 845         /* Check for an existing internal object */
 
 847         obj_desc = acpi_ns_get_attached_object(node);
 
 850                  * The attached device object already exists. Make sure the handler
 
 851                  * is not already installed.
 
 853                 handler_obj = obj_desc->device.handler;
 
 855                 /* Walk the handler list for this device */
 
 857                 while (handler_obj) {
 
 859                         /* Same space_id indicates a handler already installed */
 
 861                         if (handler_obj->address_space.space_id == space_id) {
 
 862                                 if (handler_obj->address_space.handler ==
 
 865                                          * It is (relatively) OK to attempt to install the SAME
 
 866                                          * handler twice. This can easily happen with the
 
 869                                         status = AE_SAME_HANDLER;
 
 870                                         goto unlock_and_exit;
 
 872                                         /* A handler is already installed */
 
 874                                         status = AE_ALREADY_EXISTS;
 
 876                                 goto unlock_and_exit;
 
 879                         /* Walk the linked list of handlers */
 
 881                         handler_obj = handler_obj->address_space.next;
 
 884                 ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 
 885                                   "Creating object on Device %p while installing handler\n",
 
 888                 /* obj_desc does not exist, create one */
 
 890                 if (node->type == ACPI_TYPE_ANY) {
 
 891                         type = ACPI_TYPE_DEVICE;
 
 896                 obj_desc = acpi_ut_create_internal_object(type);
 
 898                         status = AE_NO_MEMORY;
 
 899                         goto unlock_and_exit;
 
 902                 /* Init new descriptor */
 
 904                 obj_desc->common.type = (u8) type;
 
 906                 /* Attach the new object to the Node */
 
 908                 status = acpi_ns_attach_object(node, obj_desc, type);
 
 910                 /* Remove local reference to the object */
 
 912                 acpi_ut_remove_reference(obj_desc);
 
 914                 if (ACPI_FAILURE(status)) {
 
 915                         goto unlock_and_exit;
 
 919         ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 
 920                           "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
 
 921                           acpi_ut_get_region_name(space_id), space_id,
 
 922                           acpi_ut_get_node_name(node), node, obj_desc));
 
 925          * Install the handler
 
 927          * At this point there is no existing handler. Just allocate the object
 
 928          * for the handler and link it into the list.
 
 931             acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
 
 933                 status = AE_NO_MEMORY;
 
 934                 goto unlock_and_exit;
 
 937         /* Init handler obj */
 
 939         handler_obj->address_space.space_id = (u8) space_id;
 
 940         handler_obj->address_space.handler_flags = flags;
 
 941         handler_obj->address_space.region_list = NULL;
 
 942         handler_obj->address_space.node = node;
 
 943         handler_obj->address_space.handler = handler;
 
 944         handler_obj->address_space.context = context;
 
 945         handler_obj->address_space.setup = setup;
 
 947         /* Install at head of Device.address_space list */
 
 949         handler_obj->address_space.next = obj_desc->device.handler;
 
 952          * The Device object is the first reference on the handler_obj.
 
 953          * Each region that uses the handler adds a reference.
 
 955         obj_desc->device.handler = handler_obj;
 
 958          * Walk the namespace finding all of the regions this
 
 959          * handler will manage.
 
 961          * Start at the device and search the branch toward
 
 962          * the leaf nodes until either the leaf is encountered or
 
 963          * a device is detected that has an address handler of the
 
 966          * In either case, back up and search down the remainder
 
 969         status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
 
 971                                         acpi_ev_install_handler, handler_obj,
 
 975         return_ACPI_STATUS(status);
 
 978 /*******************************************************************************
 
 980  * FUNCTION:    acpi_ev_execute_reg_methods
 
 982  * PARAMETERS:  Node            - Namespace node for the device
 
 983  *              space_id        - The address space ID
 
 987  * DESCRIPTION: Run all _REG methods for the input Space ID;
 
 988  *              Note: assumes namespace is locked, or system init time.
 
 990  ******************************************************************************/
 
 993 acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
 
 994                             acpi_adr_space_type space_id)
 
 998         ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
 
1001          * Run all _REG methods for all Operation Regions for this space ID. This
 
1002          * is a separate walk in order to handle any interdependencies between
 
1003          * regions and _REG methods. (i.e. handlers must be installed for all
 
1004          * regions of this Space ID before we can run any _REG methods)
 
1006         status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
 
1007                                         ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
 
1010         return_ACPI_STATUS(status);
 
1013 /*******************************************************************************
 
1015  * FUNCTION:    acpi_ev_reg_run
 
1017  * PARAMETERS:  walk_namespace callback
 
1019  * DESCRIPTION: Run _REG method for region objects of the requested space_iD
 
1021  ******************************************************************************/
 
1024 acpi_ev_reg_run(acpi_handle obj_handle,
 
1025                 u32 level, void *context, void **return_value)
 
1027         union acpi_operand_object *obj_desc;
 
1028         struct acpi_namespace_node *node;
 
1029         acpi_adr_space_type space_id;
 
1032         space_id = *ACPI_CAST_PTR(acpi_adr_space_type, context);
 
1034         /* Convert and validate the device handle */
 
1036         node = acpi_ns_map_handle_to_node(obj_handle);
 
1038                 return (AE_BAD_PARAMETER);
 
1042          * We only care about regions.and objects that are allowed to have address
 
1045         if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
 
1049         /* Check for an existing internal object */
 
1051         obj_desc = acpi_ns_get_attached_object(node);
 
1054                 /* No object, just exit */
 
1059         /* Object is a Region */
 
1061         if (obj_desc->region.space_id != space_id) {
 
1063                 /* This region is for a different address space, just ignore it */
 
1068         status = acpi_ev_execute_reg_method(obj_desc, 1);