linux/drivers/acpi/acpica/evregion.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: evregion - ACPI address_space (op_region) handler dispatch
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2012, 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
  51ACPI_MODULE_NAME("evregion")
  52
  53/* Local prototypes */
  54static u8
  55acpi_ev_has_default_handler(struct acpi_namespace_node *node,
  56                            acpi_adr_space_type space_id);
  57
  58static void acpi_ev_orphan_ec_reg_method(void);
  59
  60static acpi_status
  61acpi_ev_reg_run(acpi_handle obj_handle,
  62                u32 level, void *context, void **return_value);
  63
  64static acpi_status
  65acpi_ev_install_handler(acpi_handle obj_handle,
  66                        u32 level, void *context, void **return_value);
  67
  68/* These are the address spaces that will get default handlers */
  69
  70#define ACPI_NUM_DEFAULT_SPACES     4
  71
  72static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
  73        ACPI_ADR_SPACE_SYSTEM_MEMORY,
  74        ACPI_ADR_SPACE_SYSTEM_IO,
  75        ACPI_ADR_SPACE_PCI_CONFIG,
  76        ACPI_ADR_SPACE_DATA_TABLE
  77};
  78
  79/*******************************************************************************
  80 *
  81 * FUNCTION:    acpi_ev_install_region_handlers
  82 *
  83 * PARAMETERS:  None
  84 *
  85 * RETURN:      Status
  86 *
  87 * DESCRIPTION: Installs the core subsystem default address space handlers.
  88 *
  89 ******************************************************************************/
  90
  91acpi_status acpi_ev_install_region_handlers(void)
  92{
  93        acpi_status status;
  94        u32 i;
  95
  96        ACPI_FUNCTION_TRACE(ev_install_region_handlers);
  97
  98        status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
  99        if (ACPI_FAILURE(status)) {
 100                return_ACPI_STATUS(status);
 101        }
 102
 103        /*
 104         * All address spaces (PCI Config, EC, SMBus) are scope dependent and
 105         * registration must occur for a specific device.
 106         *
 107         * In the case of the system memory and IO address spaces there is
 108         * currently no device associated with the address space. For these we
 109         * use the root.
 110         *
 111         * We install the default PCI config space handler at the root so that
 112         * this space is immediately available even though the we have not
 113         * enumerated all the PCI Root Buses yet. This is to conform to the ACPI
 114         * specification which states that the PCI config space must be always
 115         * available -- even though we are nowhere near ready to find the PCI root
 116         * buses at this point.
 117         *
 118         * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler
 119         * has already been installed (via acpi_install_address_space_handler).
 120         * Similar for AE_SAME_HANDLER.
 121         */
 122        for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
 123                status = acpi_ev_install_space_handler(acpi_gbl_root_node,
 124                                                       acpi_gbl_default_address_spaces
 125                                                       [i],
 126                                                       ACPI_DEFAULT_HANDLER,
 127                                                       NULL, NULL);
 128                switch (status) {
 129                case AE_OK:
 130                case AE_SAME_HANDLER:
 131                case AE_ALREADY_EXISTS:
 132
 133                        /* These exceptions are all OK */
 134
 135                        status = AE_OK;
 136                        break;
 137
 138                default:
 139
 140                        goto unlock_and_exit;
 141                }
 142        }
 143
 144      unlock_and_exit:
 145        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 146        return_ACPI_STATUS(status);
 147}
 148
 149/*******************************************************************************
 150 *
 151 * FUNCTION:    acpi_ev_has_default_handler
 152 *
 153 * PARAMETERS:  node                - Namespace node for the device
 154 *              space_id            - The address space ID
 155 *
 156 * RETURN:      TRUE if default handler is installed, FALSE otherwise
 157 *
 158 * DESCRIPTION: Check if the default handler is installed for the requested
 159 *              space ID.
 160 *
 161 ******************************************************************************/
 162
 163static u8
 164acpi_ev_has_default_handler(struct acpi_namespace_node *node,
 165                            acpi_adr_space_type space_id)
 166{
 167        union acpi_operand_object *obj_desc;
 168        union acpi_operand_object *handler_obj;
 169
 170        /* Must have an existing internal object */
 171
 172        obj_desc = acpi_ns_get_attached_object(node);
 173        if (obj_desc) {
 174                handler_obj = obj_desc->device.handler;
 175
 176                /* Walk the linked list of handlers for this object */
 177
 178                while (handler_obj) {
 179                        if (handler_obj->address_space.space_id == space_id) {
 180                                if (handler_obj->address_space.handler_flags &
 181                                    ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
 182                                        return (TRUE);
 183                                }
 184                        }
 185
 186                        handler_obj = handler_obj->address_space.next;
 187                }
 188        }
 189
 190        return (FALSE);
 191}
 192
 193/*******************************************************************************
 194 *
 195 * FUNCTION:    acpi_ev_initialize_op_regions
 196 *
 197 * PARAMETERS:  None
 198 *
 199 * RETURN:      Status
 200 *
 201 * DESCRIPTION: Execute _REG methods for all Operation Regions that have
 202 *              an installed default region handler.
 203 *
 204 ******************************************************************************/
 205
 206acpi_status acpi_ev_initialize_op_regions(void)
 207{
 208        acpi_status status;
 209        u32 i;
 210
 211        ACPI_FUNCTION_TRACE(ev_initialize_op_regions);
 212
 213        status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 214        if (ACPI_FAILURE(status)) {
 215                return_ACPI_STATUS(status);
 216        }
 217
 218        /* Run the _REG methods for op_regions in each default address space */
 219
 220        for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
 221                /*
 222                 * Make sure the installed handler is the DEFAULT handler. If not the
 223                 * default, the _REG methods will have already been run (when the
 224                 * handler was installed)
 225                 */
 226                if (acpi_ev_has_default_handler(acpi_gbl_root_node,
 227                                                acpi_gbl_default_address_spaces
 228                                                [i])) {
 229                        status =
 230                            acpi_ev_execute_reg_methods(acpi_gbl_root_node,
 231                                                        acpi_gbl_default_address_spaces
 232                                                        [i]);
 233                }
 234        }
 235
 236        acpi_gbl_reg_methods_executed = TRUE;
 237
 238        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 239        return_ACPI_STATUS(status);
 240}
 241
 242/*******************************************************************************
 243 *
 244 * FUNCTION:    acpi_ev_execute_reg_method
 245 *
 246 * PARAMETERS:  region_obj          - Region object
 247 *              function            - Passed to _REG: On (1) or Off (0)
 248 *
 249 * RETURN:      Status
 250 *
 251 * DESCRIPTION: Execute _REG method for a region
 252 *
 253 ******************************************************************************/
 254
 255acpi_status
 256acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
 257{
 258        struct acpi_evaluate_info *info;
 259        union acpi_operand_object *args[3];
 260        union acpi_operand_object *region_obj2;
 261        acpi_status status;
 262
 263        ACPI_FUNCTION_TRACE(ev_execute_reg_method);
 264
 265        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 266        if (!region_obj2) {
 267                return_ACPI_STATUS(AE_NOT_EXIST);
 268        }
 269
 270        if (region_obj2->extra.method_REG == NULL) {
 271                return_ACPI_STATUS(AE_OK);
 272        }
 273
 274        /* Allocate and initialize the evaluation information block */
 275
 276        info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
 277        if (!info) {
 278                return_ACPI_STATUS(AE_NO_MEMORY);
 279        }
 280
 281        info->prefix_node = region_obj2->extra.method_REG;
 282        info->pathname = NULL;
 283        info->parameters = args;
 284        info->flags = ACPI_IGNORE_RETURN_VALUE;
 285
 286        /*
 287         * The _REG method has two arguments:
 288         *
 289         * arg0 - Integer:
 290         *  Operation region space ID Same value as region_obj->Region.space_id
 291         *
 292         * arg1 - Integer:
 293         *  connection status 1 for connecting the handler, 0 for disconnecting
 294         *  the handler (Passed as a parameter)
 295         */
 296        args[0] =
 297            acpi_ut_create_integer_object((u64) region_obj->region.space_id);
 298        if (!args[0]) {
 299                status = AE_NO_MEMORY;
 300                goto cleanup1;
 301        }
 302
 303        args[1] = acpi_ut_create_integer_object((u64) function);
 304        if (!args[1]) {
 305                status = AE_NO_MEMORY;
 306                goto cleanup2;
 307        }
 308
 309        args[2] = NULL;         /* Terminate list */
 310
 311        /* Execute the method, no return value */
 312
 313        ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
 314                        (ACPI_TYPE_METHOD, info->prefix_node, NULL));
 315
 316        status = acpi_ns_evaluate(info);
 317        acpi_ut_remove_reference(args[1]);
 318
 319      cleanup2:
 320        acpi_ut_remove_reference(args[0]);
 321
 322      cleanup1:
 323        ACPI_FREE(info);
 324        return_ACPI_STATUS(status);
 325}
 326
 327/*******************************************************************************
 328 *
 329 * FUNCTION:    acpi_ev_address_space_dispatch
 330 *
 331 * PARAMETERS:  region_obj          - Internal region object
 332 *              field_obj           - Corresponding field. Can be NULL.
 333 *              function            - Read or Write operation
 334 *              region_offset       - Where in the region to read or write
 335 *              bit_width           - Field width in bits (8, 16, 32, or 64)
 336 *              value               - Pointer to in or out value, must be
 337 *                                    a full 64-bit integer
 338 *
 339 * RETURN:      Status
 340 *
 341 * DESCRIPTION: Dispatch an address space or operation region access to
 342 *              a previously installed handler.
 343 *
 344 ******************************************************************************/
 345
 346acpi_status
 347acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
 348                               union acpi_operand_object *field_obj,
 349                               u32 function,
 350                               u32 region_offset, u32 bit_width, u64 *value)
 351{
 352        acpi_status status;
 353        acpi_adr_space_handler handler;
 354        acpi_adr_space_setup region_setup;
 355        union acpi_operand_object *handler_desc;
 356        union acpi_operand_object *region_obj2;
 357        void *region_context = NULL;
 358        struct acpi_connection_info *context;
 359
 360        ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
 361
 362        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 363        if (!region_obj2) {
 364                return_ACPI_STATUS(AE_NOT_EXIST);
 365        }
 366
 367        /* Ensure that there is a handler associated with this region */
 368
 369        handler_desc = region_obj->region.handler;
 370        if (!handler_desc) {
 371                ACPI_ERROR((AE_INFO,
 372                            "No handler for Region [%4.4s] (%p) [%s]",
 373                            acpi_ut_get_node_name(region_obj->region.node),
 374                            region_obj,
 375                            acpi_ut_get_region_name(region_obj->region.
 376                                                    space_id)));
 377
 378                return_ACPI_STATUS(AE_NOT_EXIST);
 379        }
 380
 381        context = handler_desc->address_space.context;
 382
 383        /*
 384         * It may be the case that the region has never been initialized.
 385         * Some types of regions require special init code
 386         */
 387        if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 388
 389                /* This region has not been initialized yet, do it */
 390
 391                region_setup = handler_desc->address_space.setup;
 392                if (!region_setup) {
 393
 394                        /* No initialization routine, exit with error */
 395
 396                        ACPI_ERROR((AE_INFO,
 397                                    "No init routine for region(%p) [%s]",
 398                                    region_obj,
 399                                    acpi_ut_get_region_name(region_obj->region.
 400                                                            space_id)));
 401                        return_ACPI_STATUS(AE_NOT_EXIST);
 402                }
 403
 404                /*
 405                 * We must exit the interpreter because the region setup will
 406                 * potentially execute control methods (for example, the _REG method
 407                 * for this region)
 408                 */
 409                acpi_ex_exit_interpreter();
 410
 411                status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
 412                                      context, &region_context);
 413
 414                /* Re-enter the interpreter */
 415
 416                acpi_ex_enter_interpreter();
 417
 418                /* Check for failure of the Region Setup */
 419
 420                if (ACPI_FAILURE(status)) {
 421                        ACPI_EXCEPTION((AE_INFO, status,
 422                                        "During region initialization: [%s]",
 423                                        acpi_ut_get_region_name(region_obj->
 424                                                                region.
 425                                                                space_id)));
 426                        return_ACPI_STATUS(status);
 427                }
 428
 429                /* Region initialization may have been completed by region_setup */
 430
 431                if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 432                        region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
 433
 434                        if (region_obj2->extra.region_context) {
 435
 436                                /* The handler for this region was already installed */
 437
 438                                ACPI_FREE(region_context);
 439                        } else {
 440                                /*
 441                                 * Save the returned context for use in all accesses to
 442                                 * this particular region
 443                                 */
 444                                region_obj2->extra.region_context =
 445                                    region_context;
 446                        }
 447                }
 448        }
 449
 450        /* We have everything we need, we can invoke the address space handler */
 451
 452        handler = handler_desc->address_space.handler;
 453
 454        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 455                          "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
 456                          &region_obj->region.handler->address_space, handler,
 457                          ACPI_FORMAT_NATIVE_UINT(region_obj->region.address +
 458                                                  region_offset),
 459                          acpi_ut_get_region_name(region_obj->region.
 460                                                  space_id)));
 461
 462        /*
 463         * Special handling for generic_serial_bus and general_purpose_io:
 464         * There are three extra parameters that must be passed to the
 465         * handler via the context:
 466         *   1) Connection buffer, a resource template from Connection() op.
 467         *   2) Length of the above buffer.
 468         *   3) Actual access length from the access_as() op.
 469         */
 470        if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) ||
 471             (region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) &&
 472            context && field_obj) {
 473
 474                /* Get the Connection (resource_template) buffer */
 475
 476                context->connection = field_obj->field.resource_buffer;
 477                context->length = field_obj->field.resource_length;
 478                context->access_length = field_obj->field.access_length;
 479        }
 480
 481        if (!(handler_desc->address_space.handler_flags &
 482              ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 483                /*
 484                 * For handlers other than the default (supplied) handlers, we must
 485                 * exit the interpreter because the handler *might* block -- we don't
 486                 * know what it will do, so we can't hold the lock on the intepreter.
 487                 */
 488                acpi_ex_exit_interpreter();
 489        }
 490
 491        /* Call the handler */
 492
 493        status = handler(function,
 494                         (region_obj->region.address + region_offset),
 495                         bit_width, value, context,
 496                         region_obj2->extra.region_context);
 497
 498        if (ACPI_FAILURE(status)) {
 499                ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]",
 500                                acpi_ut_get_region_name(region_obj->region.
 501                                                        space_id)));
 502        }
 503
 504        if (!(handler_desc->address_space.handler_flags &
 505              ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 506                /*
 507                 * We just returned from a non-default handler, we must re-enter the
 508                 * interpreter
 509                 */
 510                acpi_ex_enter_interpreter();
 511        }
 512
 513        return_ACPI_STATUS(status);
 514}
 515
 516/*******************************************************************************
 517 *
 518 * FUNCTION:    acpi_ev_detach_region
 519 *
 520 * PARAMETERS:  region_obj          - Region Object
 521 *              acpi_ns_is_locked   - Namespace Region Already Locked?
 522 *
 523 * RETURN:      None
 524 *
 525 * DESCRIPTION: Break the association between the handler and the region
 526 *              this is a two way association.
 527 *
 528 ******************************************************************************/
 529
 530void
 531acpi_ev_detach_region(union acpi_operand_object *region_obj,
 532                      u8 acpi_ns_is_locked)
 533{
 534        union acpi_operand_object *handler_obj;
 535        union acpi_operand_object *obj_desc;
 536        union acpi_operand_object **last_obj_ptr;
 537        acpi_adr_space_setup region_setup;
 538        void **region_context;
 539        union acpi_operand_object *region_obj2;
 540        acpi_status status;
 541
 542        ACPI_FUNCTION_TRACE(ev_detach_region);
 543
 544        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 545        if (!region_obj2) {
 546                return_VOID;
 547        }
 548        region_context = &region_obj2->extra.region_context;
 549
 550        /* Get the address handler from the region object */
 551
 552        handler_obj = region_obj->region.handler;
 553        if (!handler_obj) {
 554
 555                /* This region has no handler, all done */
 556
 557                return_VOID;
 558        }
 559
 560        /* Find this region in the handler's list */
 561
 562        obj_desc = handler_obj->address_space.region_list;
 563        last_obj_ptr = &handler_obj->address_space.region_list;
 564
 565        while (obj_desc) {
 566
 567                /* Is this the correct Region? */
 568
 569                if (obj_desc == region_obj) {
 570                        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 571                                          "Removing Region %p from address handler %p\n",
 572                                          region_obj, handler_obj));
 573
 574                        /* This is it, remove it from the handler's list */
 575
 576                        *last_obj_ptr = obj_desc->region.next;
 577                        obj_desc->region.next = NULL;   /* Must clear field */
 578
 579                        if (acpi_ns_is_locked) {
 580                                status =
 581                                    acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 582                                if (ACPI_FAILURE(status)) {
 583                                        return_VOID;
 584                                }
 585                        }
 586
 587                        /* Now stop region accesses by executing the _REG method */
 588
 589                        status =
 590                            acpi_ev_execute_reg_method(region_obj,
 591                                                       ACPI_REG_DISCONNECT);
 592                        if (ACPI_FAILURE(status)) {
 593                                ACPI_EXCEPTION((AE_INFO, status,
 594                                                "from region _REG, [%s]",
 595                                                acpi_ut_get_region_name
 596                                                (region_obj->region.space_id)));
 597                        }
 598
 599                        if (acpi_ns_is_locked) {
 600                                status =
 601                                    acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 602                                if (ACPI_FAILURE(status)) {
 603                                        return_VOID;
 604                                }
 605                        }
 606
 607                        /*
 608                         * If the region has been activated, call the setup handler with
 609                         * the deactivate notification
 610                         */
 611                        if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {
 612                                region_setup = handler_obj->address_space.setup;
 613                                status =
 614                                    region_setup(region_obj,
 615                                                 ACPI_REGION_DEACTIVATE,
 616                                                 handler_obj->address_space.
 617                                                 context, region_context);
 618
 619                                /* Init routine may fail, Just ignore errors */
 620
 621                                if (ACPI_FAILURE(status)) {
 622                                        ACPI_EXCEPTION((AE_INFO, status,
 623                                                        "from region handler - deactivate, [%s]",
 624                                                        acpi_ut_get_region_name
 625                                                        (region_obj->region.
 626                                                         space_id)));
 627                                }
 628
 629                                region_obj->region.flags &=
 630                                    ~(AOPOBJ_SETUP_COMPLETE);
 631                        }
 632
 633                        /*
 634                         * Remove handler reference in the region
 635                         *
 636                         * NOTE: this doesn't mean that the region goes away, the region
 637                         * is just inaccessible as indicated to the _REG method
 638                         *
 639                         * If the region is on the handler's list, this must be the
 640                         * region's handler
 641                         */
 642                        region_obj->region.handler = NULL;
 643                        acpi_ut_remove_reference(handler_obj);
 644
 645                        return_VOID;
 646                }
 647
 648                /* Walk the linked list of handlers */
 649
 650                last_obj_ptr = &obj_desc->region.next;
 651                obj_desc = obj_desc->region.next;
 652        }
 653
 654        /* If we get here, the region was not in the handler's region list */
 655
 656        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 657                          "Cannot remove region %p from address handler %p\n",
 658                          region_obj, handler_obj));
 659
 660        return_VOID;
 661}
 662
 663/*******************************************************************************
 664 *
 665 * FUNCTION:    acpi_ev_attach_region
 666 *
 667 * PARAMETERS:  handler_obj         - Handler Object
 668 *              region_obj          - Region Object
 669 *              acpi_ns_is_locked   - Namespace Region Already Locked?
 670 *
 671 * RETURN:      None
 672 *
 673 * DESCRIPTION: Create the association between the handler and the region
 674 *              this is a two way association.
 675 *
 676 ******************************************************************************/
 677
 678acpi_status
 679acpi_ev_attach_region(union acpi_operand_object *handler_obj,
 680                      union acpi_operand_object *region_obj,
 681                      u8 acpi_ns_is_locked)
 682{
 683
 684        ACPI_FUNCTION_TRACE(ev_attach_region);
 685
 686        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 687                          "Adding Region [%4.4s] %p to address handler %p [%s]\n",
 688                          acpi_ut_get_node_name(region_obj->region.node),
 689                          region_obj, handler_obj,
 690                          acpi_ut_get_region_name(region_obj->region.
 691                                                  space_id)));
 692
 693        /* Link this region to the front of the handler's list */
 694
 695        region_obj->region.next = handler_obj->address_space.region_list;
 696        handler_obj->address_space.region_list = region_obj;
 697
 698        /* Install the region's handler */
 699
 700        if (region_obj->region.handler) {
 701                return_ACPI_STATUS(AE_ALREADY_EXISTS);
 702        }
 703
 704        region_obj->region.handler = handler_obj;
 705        acpi_ut_add_reference(handler_obj);
 706
 707        return_ACPI_STATUS(AE_OK);
 708}
 709
 710/*******************************************************************************
 711 *
 712 * FUNCTION:    acpi_ev_install_handler
 713 *
 714 * PARAMETERS:  walk_namespace callback
 715 *
 716 * DESCRIPTION: This routine installs an address handler into objects that are
 717 *              of type Region or Device.
 718 *
 719 *              If the Object is a Device, and the device has a handler of
 720 *              the same type then the search is terminated in that branch.
 721 *
 722 *              This is because the existing handler is closer in proximity
 723 *              to any more regions than the one we are trying to install.
 724 *
 725 ******************************************************************************/
 726
 727static acpi_status
 728acpi_ev_install_handler(acpi_handle obj_handle,
 729                        u32 level, void *context, void **return_value)
 730{
 731        union acpi_operand_object *handler_obj;
 732        union acpi_operand_object *next_handler_obj;
 733        union acpi_operand_object *obj_desc;
 734        struct acpi_namespace_node *node;
 735        acpi_status status;
 736
 737        ACPI_FUNCTION_NAME(ev_install_handler);
 738
 739        handler_obj = (union acpi_operand_object *)context;
 740
 741        /* Parameter validation */
 742
 743        if (!handler_obj) {
 744                return (AE_OK);
 745        }
 746
 747        /* Convert and validate the device handle */
 748
 749        node = acpi_ns_validate_handle(obj_handle);
 750        if (!node) {
 751                return (AE_BAD_PARAMETER);
 752        }
 753
 754        /*
 755         * We only care about regions and objects that are allowed to have
 756         * address space handlers
 757         */
 758        if ((node->type != ACPI_TYPE_DEVICE) &&
 759            (node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
 760                return (AE_OK);
 761        }
 762
 763        /* Check for an existing internal object */
 764
 765        obj_desc = acpi_ns_get_attached_object(node);
 766        if (!obj_desc) {
 767
 768                /* No object, just exit */
 769
 770                return (AE_OK);
 771        }
 772
 773        /* Devices are handled different than regions */
 774
 775        if (obj_desc->common.type == ACPI_TYPE_DEVICE) {
 776
 777                /* Check if this Device already has a handler for this address space */
 778
 779                next_handler_obj = obj_desc->device.handler;
 780                while (next_handler_obj) {
 781
 782                        /* Found a handler, is it for the same address space? */
 783
 784                        if (next_handler_obj->address_space.space_id ==
 785                            handler_obj->address_space.space_id) {
 786                                ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 787                                                  "Found handler for region [%s] in device %p(%p) "
 788                                                  "handler %p\n",
 789                                                  acpi_ut_get_region_name
 790                                                  (handler_obj->address_space.
 791                                                   space_id), obj_desc,
 792                                                  next_handler_obj,
 793                                                  handler_obj));
 794
 795                                /*
 796                                 * Since the object we found it on was a device, then it
 797                                 * means that someone has already installed a handler for
 798                                 * the branch of the namespace from this device on. Just
 799                                 * bail out telling the walk routine to not traverse this
 800                                 * branch. This preserves the scoping rule for handlers.
 801                                 */
 802                                return (AE_CTRL_DEPTH);
 803                        }
 804
 805                        /* Walk the linked list of handlers attached to this device */
 806
 807                        next_handler_obj = next_handler_obj->address_space.next;
 808                }
 809
 810                /*
 811                 * As long as the device didn't have a handler for this space we
 812                 * don't care about it. We just ignore it and proceed.
 813                 */
 814                return (AE_OK);
 815        }
 816
 817        /* Object is a Region */
 818
 819        if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
 820
 821                /* This region is for a different address space, just ignore it */
 822
 823                return (AE_OK);
 824        }
 825
 826        /*
 827         * Now we have a region and it is for the handler's address space type.
 828         *
 829         * First disconnect region for any previous handler (if any)
 830         */
 831        acpi_ev_detach_region(obj_desc, FALSE);
 832
 833        /* Connect the region to the new handler */
 834
 835        status = acpi_ev_attach_region(handler_obj, obj_desc, FALSE);
 836        return (status);
 837}
 838
 839/*******************************************************************************
 840 *
 841 * FUNCTION:    acpi_ev_install_space_handler
 842 *
 843 * PARAMETERS:  node            - Namespace node for the device
 844 *              space_id        - The address space ID
 845 *              handler         - Address of the handler
 846 *              setup           - Address of the setup function
 847 *              context         - Value passed to the handler on each access
 848 *
 849 * RETURN:      Status
 850 *
 851 * DESCRIPTION: Install a handler for all op_regions of a given space_id.
 852 *              Assumes namespace is locked
 853 *
 854 ******************************************************************************/
 855
 856acpi_status
 857acpi_ev_install_space_handler(struct acpi_namespace_node * node,
 858                              acpi_adr_space_type space_id,
 859                              acpi_adr_space_handler handler,
 860                              acpi_adr_space_setup setup, void *context)
 861{
 862        union acpi_operand_object *obj_desc;
 863        union acpi_operand_object *handler_obj;
 864        acpi_status status;
 865        acpi_object_type type;
 866        u8 flags = 0;
 867
 868        ACPI_FUNCTION_TRACE(ev_install_space_handler);
 869
 870        /*
 871         * This registration is valid for only the types below and the root. This
 872         * is where the default handlers get placed.
 873         */
 874        if ((node->type != ACPI_TYPE_DEVICE) &&
 875            (node->type != ACPI_TYPE_PROCESSOR) &&
 876            (node->type != ACPI_TYPE_THERMAL) && (node != acpi_gbl_root_node)) {
 877                status = AE_BAD_PARAMETER;
 878                goto unlock_and_exit;
 879        }
 880
 881        if (handler == ACPI_DEFAULT_HANDLER) {
 882                flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED;
 883
 884                switch (space_id) {
 885                case ACPI_ADR_SPACE_SYSTEM_MEMORY:
 886                        handler = acpi_ex_system_memory_space_handler;
 887                        setup = acpi_ev_system_memory_region_setup;
 888                        break;
 889
 890                case ACPI_ADR_SPACE_SYSTEM_IO:
 891                        handler = acpi_ex_system_io_space_handler;
 892                        setup = acpi_ev_io_space_region_setup;
 893                        break;
 894
 895                case ACPI_ADR_SPACE_PCI_CONFIG:
 896                        handler = acpi_ex_pci_config_space_handler;
 897                        setup = acpi_ev_pci_config_region_setup;
 898                        break;
 899
 900                case ACPI_ADR_SPACE_CMOS:
 901                        handler = acpi_ex_cmos_space_handler;
 902                        setup = acpi_ev_cmos_region_setup;
 903                        break;
 904
 905                case ACPI_ADR_SPACE_PCI_BAR_TARGET:
 906                        handler = acpi_ex_pci_bar_space_handler;
 907                        setup = acpi_ev_pci_bar_region_setup;
 908                        break;
 909
 910                case ACPI_ADR_SPACE_DATA_TABLE:
 911                        handler = acpi_ex_data_table_space_handler;
 912                        setup = NULL;
 913                        break;
 914
 915                default:
 916                        status = AE_BAD_PARAMETER;
 917                        goto unlock_and_exit;
 918                }
 919        }
 920
 921        /* If the caller hasn't specified a setup routine, use the default */
 922
 923        if (!setup) {
 924                setup = acpi_ev_default_region_setup;
 925        }
 926
 927        /* Check for an existing internal object */
 928
 929        obj_desc = acpi_ns_get_attached_object(node);
 930        if (obj_desc) {
 931                /*
 932                 * The attached device object already exists. Make sure the handler
 933                 * is not already installed.
 934                 */
 935                handler_obj = obj_desc->device.handler;
 936
 937                /* Walk the handler list for this device */
 938
 939                while (handler_obj) {
 940
 941                        /* Same space_id indicates a handler already installed */
 942
 943                        if (handler_obj->address_space.space_id == space_id) {
 944                                if (handler_obj->address_space.handler ==
 945                                    handler) {
 946                                        /*
 947                                         * It is (relatively) OK to attempt to install the SAME
 948                                         * handler twice. This can easily happen with the
 949                                         * PCI_Config space.
 950                                         */
 951                                        status = AE_SAME_HANDLER;
 952                                        goto unlock_and_exit;
 953                                } else {
 954                                        /* A handler is already installed */
 955
 956                                        status = AE_ALREADY_EXISTS;
 957                                }
 958                                goto unlock_and_exit;
 959                        }
 960
 961                        /* Walk the linked list of handlers */
 962
 963                        handler_obj = handler_obj->address_space.next;
 964                }
 965        } else {
 966                ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 967                                  "Creating object on Device %p while installing handler\n",
 968                                  node));
 969
 970                /* obj_desc does not exist, create one */
 971
 972                if (node->type == ACPI_TYPE_ANY) {
 973                        type = ACPI_TYPE_DEVICE;
 974                } else {
 975                        type = node->type;
 976                }
 977
 978                obj_desc = acpi_ut_create_internal_object(type);
 979                if (!obj_desc) {
 980                        status = AE_NO_MEMORY;
 981                        goto unlock_and_exit;
 982                }
 983
 984                /* Init new descriptor */
 985
 986                obj_desc->common.type = (u8) type;
 987
 988                /* Attach the new object to the Node */
 989
 990                status = acpi_ns_attach_object(node, obj_desc, type);
 991
 992                /* Remove local reference to the object */
 993
 994                acpi_ut_remove_reference(obj_desc);
 995
 996                if (ACPI_FAILURE(status)) {
 997                        goto unlock_and_exit;
 998                }
 999        }
1000
1001        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
1002                          "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
1003                          acpi_ut_get_region_name(space_id), space_id,
1004                          acpi_ut_get_node_name(node), node, obj_desc));
1005
1006        /*
1007         * Install the handler
1008         *
1009         * At this point there is no existing handler. Just allocate the object
1010         * for the handler and link it into the list.
1011         */
1012        handler_obj =
1013            acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
1014        if (!handler_obj) {
1015                status = AE_NO_MEMORY;
1016                goto unlock_and_exit;
1017        }
1018
1019        /* Init handler obj */
1020
1021        handler_obj->address_space.space_id = (u8) space_id;
1022        handler_obj->address_space.handler_flags = flags;
1023        handler_obj->address_space.region_list = NULL;
1024        handler_obj->address_space.node = node;
1025        handler_obj->address_space.handler = handler;
1026        handler_obj->address_space.context = context;
1027        handler_obj->address_space.setup = setup;
1028
1029        /* Install at head of Device.address_space list */
1030
1031        handler_obj->address_space.next = obj_desc->device.handler;
1032
1033        /*
1034         * The Device object is the first reference on the handler_obj.
1035         * Each region that uses the handler adds a reference.
1036         */
1037        obj_desc->device.handler = handler_obj;
1038
1039        /*
1040         * Walk the namespace finding all of the regions this
1041         * handler will manage.
1042         *
1043         * Start at the device and search the branch toward
1044         * the leaf nodes until either the leaf is encountered or
1045         * a device is detected that has an address handler of the
1046         * same type.
1047         *
1048         * In either case, back up and search down the remainder
1049         * of the branch
1050         */
1051        status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
1052                                        ACPI_NS_WALK_UNLOCK,
1053                                        acpi_ev_install_handler, NULL,
1054                                        handler_obj, NULL);
1055
1056      unlock_and_exit:
1057        return_ACPI_STATUS(status);
1058}
1059
1060/*******************************************************************************
1061 *
1062 * FUNCTION:    acpi_ev_execute_reg_methods
1063 *
1064 * PARAMETERS:  node            - Namespace node for the device
1065 *              space_id        - The address space ID
1066 *
1067 * RETURN:      Status
1068 *
1069 * DESCRIPTION: Run all _REG methods for the input Space ID;
1070 *              Note: assumes namespace is locked, or system init time.
1071 *
1072 ******************************************************************************/
1073
1074acpi_status
1075acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
1076                            acpi_adr_space_type space_id)
1077{
1078        acpi_status status;
1079
1080        ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
1081
1082        /*
1083         * Run all _REG methods for all Operation Regions for this space ID. This
1084         * is a separate walk in order to handle any interdependencies between
1085         * regions and _REG methods. (i.e. handlers must be installed for all
1086         * regions of this Space ID before we can run any _REG methods)
1087         */
1088        status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
1089                                        ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
1090                                        NULL, &space_id, NULL);
1091
1092        /* Special case for EC: handle "orphan" _REG methods with no region */
1093
1094        if (space_id == ACPI_ADR_SPACE_EC) {
1095                acpi_ev_orphan_ec_reg_method();
1096        }
1097
1098        return_ACPI_STATUS(status);
1099}
1100
1101/*******************************************************************************
1102 *
1103 * FUNCTION:    acpi_ev_reg_run
1104 *
1105 * PARAMETERS:  walk_namespace callback
1106 *
1107 * DESCRIPTION: Run _REG method for region objects of the requested spaceID
1108 *
1109 ******************************************************************************/
1110
1111static acpi_status
1112acpi_ev_reg_run(acpi_handle obj_handle,
1113                u32 level, void *context, void **return_value)
1114{
1115        union acpi_operand_object *obj_desc;
1116        struct acpi_namespace_node *node;
1117        acpi_adr_space_type space_id;
1118        acpi_status status;
1119
1120        space_id = *ACPI_CAST_PTR(acpi_adr_space_type, context);
1121
1122        /* Convert and validate the device handle */
1123
1124        node = acpi_ns_validate_handle(obj_handle);
1125        if (!node) {
1126                return (AE_BAD_PARAMETER);
1127        }
1128
1129        /*
1130         * We only care about regions.and objects that are allowed to have address
1131         * space handlers
1132         */
1133        if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
1134                return (AE_OK);
1135        }
1136
1137        /* Check for an existing internal object */
1138
1139        obj_desc = acpi_ns_get_attached_object(node);
1140        if (!obj_desc) {
1141
1142                /* No object, just exit */
1143
1144                return (AE_OK);
1145        }
1146
1147        /* Object is a Region */
1148
1149        if (obj_desc->region.space_id != space_id) {
1150
1151                /* This region is for a different address space, just ignore it */
1152
1153                return (AE_OK);
1154        }
1155
1156        status = acpi_ev_execute_reg_method(obj_desc, ACPI_REG_CONNECT);
1157        return (status);
1158}
1159
1160/*******************************************************************************
1161 *
1162 * FUNCTION:    acpi_ev_orphan_ec_reg_method
1163 *
1164 * PARAMETERS:  None
1165 *
1166 * RETURN:      None
1167 *
1168 * DESCRIPTION: Execute an "orphan" _REG method that appears under the EC
1169 *              device. This is a _REG method that has no corresponding region
1170 *              within the EC device scope. The orphan _REG method appears to
1171 *              have been enabled by the description of the ECDT in the ACPI
1172 *              specification: "The availability of the region space can be
1173 *              detected by providing a _REG method object underneath the
1174 *              Embedded Controller device."
1175 *
1176 *              To quickly access the EC device, we use the EC_ID that appears
1177 *              within the ECDT. Otherwise, we would need to perform a time-
1178 *              consuming namespace walk, executing _HID methods to find the
1179 *              EC device.
1180 *
1181 ******************************************************************************/
1182
1183static void acpi_ev_orphan_ec_reg_method(void)
1184{
1185        struct acpi_table_ecdt *table;
1186        acpi_status status;
1187        struct acpi_object_list args;
1188        union acpi_object objects[2];
1189        struct acpi_namespace_node *ec_device_node;
1190        struct acpi_namespace_node *reg_method;
1191        struct acpi_namespace_node *next_node;
1192
1193        ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method);
1194
1195        /* Get the ECDT (if present in system) */
1196
1197        status = acpi_get_table(ACPI_SIG_ECDT, 0,
1198                                ACPI_CAST_INDIRECT_PTR(struct acpi_table_header,
1199                                                       &table));
1200        if (ACPI_FAILURE(status)) {
1201                return_VOID;
1202        }
1203
1204        /* We need a valid EC_ID string */
1205
1206        if (!(*table->id)) {
1207                return_VOID;
1208        }
1209
1210        /* Namespace is currently locked, must release */
1211
1212        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
1213
1214        /* Get a handle to the EC device referenced in the ECDT */
1215
1216        status = acpi_get_handle(NULL,
1217                                 ACPI_CAST_PTR(char, table->id),
1218                                 ACPI_CAST_PTR(acpi_handle, &ec_device_node));
1219        if (ACPI_FAILURE(status)) {
1220                goto exit;
1221        }
1222
1223        /* Get a handle to a _REG method immediately under the EC device */
1224
1225        status = acpi_get_handle(ec_device_node,
1226                                 METHOD_NAME__REG, ACPI_CAST_PTR(acpi_handle,
1227                                                                 &reg_method));
1228        if (ACPI_FAILURE(status)) {
1229                goto exit;
1230        }
1231
1232        /*
1233         * Execute the _REG method only if there is no Operation Region in
1234         * this scope with the Embedded Controller space ID. Otherwise, it
1235         * will already have been executed. Note, this allows for Regions
1236         * with other space IDs to be present; but the code below will then
1237         * execute the _REG method with the EC space ID argument.
1238         */
1239        next_node = acpi_ns_get_next_node(ec_device_node, NULL);
1240        while (next_node) {
1241                if ((next_node->type == ACPI_TYPE_REGION) &&
1242                    (next_node->object) &&
1243                    (next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) {
1244                        goto exit;      /* Do not execute _REG */
1245                }
1246                next_node = acpi_ns_get_next_node(ec_device_node, next_node);
1247        }
1248
1249        /* Evaluate the _REG(EC,Connect) method */
1250
1251        args.count = 2;
1252        args.pointer = objects;
1253        objects[0].type = ACPI_TYPE_INTEGER;
1254        objects[0].integer.value = ACPI_ADR_SPACE_EC;
1255        objects[1].type = ACPI_TYPE_INTEGER;
1256        objects[1].integer.value = ACPI_REG_CONNECT;
1257
1258        status = acpi_evaluate_object(reg_method, NULL, &args, NULL);
1259
1260      exit:
1261        /* We ignore all errors from above, don't care */
1262
1263        status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
1264        return_VOID;
1265}
1266