linux/drivers/acpi/acpica/evregion.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/******************************************************************************
   3 *
   4 * Module Name: evregion - Operation Region support
   5 *
   6 * Copyright (C) 2000 - 2021, Intel Corp.
   7 *
   8 *****************************************************************************/
   9
  10#include <acpi/acpi.h>
  11#include "accommon.h"
  12#include "acevents.h"
  13#include "acnamesp.h"
  14#include "acinterp.h"
  15
  16#define _COMPONENT          ACPI_EVENTS
  17ACPI_MODULE_NAME("evregion")
  18
  19extern u8 acpi_gbl_default_address_spaces[];
  20
  21/* Local prototypes */
  22
  23static void
  24acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
  25                                  acpi_adr_space_type space_id);
  26
  27static acpi_status
  28acpi_ev_reg_run(acpi_handle obj_handle,
  29                u32 level, void *context, void **return_value);
  30
  31/*******************************************************************************
  32 *
  33 * FUNCTION:    acpi_ev_initialize_op_regions
  34 *
  35 * PARAMETERS:  None
  36 *
  37 * RETURN:      Status
  38 *
  39 * DESCRIPTION: Execute _REG methods for all Operation Regions that have
  40 *              an installed default region handler.
  41 *
  42 ******************************************************************************/
  43
  44acpi_status acpi_ev_initialize_op_regions(void)
  45{
  46        acpi_status status;
  47        u32 i;
  48
  49        ACPI_FUNCTION_TRACE(ev_initialize_op_regions);
  50
  51        status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
  52        if (ACPI_FAILURE(status)) {
  53                return_ACPI_STATUS(status);
  54        }
  55
  56        /* Run the _REG methods for op_regions in each default address space */
  57
  58        for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
  59                /*
  60                 * Make sure the installed handler is the DEFAULT handler. If not the
  61                 * default, the _REG methods will have already been run (when the
  62                 * handler was installed)
  63                 */
  64                if (acpi_ev_has_default_handler(acpi_gbl_root_node,
  65                                                acpi_gbl_default_address_spaces
  66                                                [i])) {
  67                        acpi_ev_execute_reg_methods(acpi_gbl_root_node,
  68                                                    acpi_gbl_default_address_spaces
  69                                                    [i], ACPI_REG_CONNECT);
  70                }
  71        }
  72
  73        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
  74        return_ACPI_STATUS(status);
  75}
  76
  77/*******************************************************************************
  78 *
  79 * FUNCTION:    acpi_ev_address_space_dispatch
  80 *
  81 * PARAMETERS:  region_obj          - Internal region object
  82 *              field_obj           - Corresponding field. Can be NULL.
  83 *              function            - Read or Write operation
  84 *              region_offset       - Where in the region to read or write
  85 *              bit_width           - Field width in bits (8, 16, 32, or 64)
  86 *              value               - Pointer to in or out value, must be
  87 *                                    a full 64-bit integer
  88 *
  89 * RETURN:      Status
  90 *
  91 * DESCRIPTION: Dispatch an address space or operation region access to
  92 *              a previously installed handler.
  93 *
  94 * NOTE: During early initialization, we always install the default region
  95 * handlers for Memory, I/O and PCI_Config. This ensures that these operation
  96 * region address spaces are always available as per the ACPI specification.
  97 * This is especially needed in order to support the execution of
  98 * module-level AML code during loading of the ACPI tables.
  99 *
 100 ******************************************************************************/
 101
 102acpi_status
 103acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
 104                               union acpi_operand_object *field_obj,
 105                               u32 function,
 106                               u32 region_offset, u32 bit_width, u64 *value)
 107{
 108        acpi_status status;
 109        acpi_adr_space_handler handler;
 110        acpi_adr_space_setup region_setup;
 111        union acpi_operand_object *handler_desc;
 112        union acpi_operand_object *region_obj2;
 113        void *region_context = NULL;
 114        struct acpi_connection_info *context;
 115        acpi_mutex context_mutex;
 116        u8 context_locked;
 117        acpi_physical_address address;
 118
 119        ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
 120
 121        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 122        if (!region_obj2) {
 123                return_ACPI_STATUS(AE_NOT_EXIST);
 124        }
 125
 126        /* Ensure that there is a handler associated with this region */
 127
 128        handler_desc = region_obj->region.handler;
 129        if (!handler_desc) {
 130                ACPI_ERROR((AE_INFO,
 131                            "No handler for Region [%4.4s] (%p) [%s]",
 132                            acpi_ut_get_node_name(region_obj->region.node),
 133                            region_obj,
 134                            acpi_ut_get_region_name(region_obj->region.
 135                                                    space_id)));
 136
 137                return_ACPI_STATUS(AE_NOT_EXIST);
 138        }
 139
 140        context = handler_desc->address_space.context;
 141        context_mutex = handler_desc->address_space.context_mutex;
 142        context_locked = FALSE;
 143
 144        /*
 145         * It may be the case that the region has never been initialized.
 146         * Some types of regions require special init code
 147         */
 148        if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 149
 150                /* This region has not been initialized yet, do it */
 151
 152                region_setup = handler_desc->address_space.setup;
 153                if (!region_setup) {
 154
 155                        /* No initialization routine, exit with error */
 156
 157                        ACPI_ERROR((AE_INFO,
 158                                    "No init routine for region(%p) [%s]",
 159                                    region_obj,
 160                                    acpi_ut_get_region_name(region_obj->region.
 161                                                            space_id)));
 162                        return_ACPI_STATUS(AE_NOT_EXIST);
 163                }
 164
 165                /*
 166                 * We must exit the interpreter because the region setup will
 167                 * potentially execute control methods (for example, the _REG method
 168                 * for this region)
 169                 */
 170                acpi_ex_exit_interpreter();
 171
 172                status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
 173                                      context, &region_context);
 174
 175                /* Re-enter the interpreter */
 176
 177                acpi_ex_enter_interpreter();
 178
 179                /* Check for failure of the Region Setup */
 180
 181                if (ACPI_FAILURE(status)) {
 182                        ACPI_EXCEPTION((AE_INFO, status,
 183                                        "During region initialization: [%s]",
 184                                        acpi_ut_get_region_name(region_obj->
 185                                                                region.
 186                                                                space_id)));
 187                        return_ACPI_STATUS(status);
 188                }
 189
 190                /* Region initialization may have been completed by region_setup */
 191
 192                if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
 193                        region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
 194
 195                        /*
 196                         * Save the returned context for use in all accesses to
 197                         * the handler for this particular region
 198                         */
 199                        if (!(region_obj2->extra.region_context)) {
 200                                region_obj2->extra.region_context =
 201                                    region_context;
 202                        }
 203                }
 204        }
 205
 206        /* We have everything we need, we can invoke the address space handler */
 207
 208        handler = handler_desc->address_space.handler;
 209        address = (region_obj->region.address + region_offset);
 210
 211        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 212                          "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
 213                          &region_obj->region.handler->address_space, handler,
 214                          ACPI_FORMAT_UINT64(address),
 215                          acpi_ut_get_region_name(region_obj->region.
 216                                                  space_id)));
 217
 218        if (!(handler_desc->address_space.handler_flags &
 219              ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 220                /*
 221                 * For handlers other than the default (supplied) handlers, we must
 222                 * exit the interpreter because the handler *might* block -- we don't
 223                 * know what it will do, so we can't hold the lock on the interpreter.
 224                 */
 225                acpi_ex_exit_interpreter();
 226        }
 227
 228        /*
 229         * Special handling for generic_serial_bus and general_purpose_io:
 230         * There are three extra parameters that must be passed to the
 231         * handler via the context:
 232         *   1) Connection buffer, a resource template from Connection() op
 233         *   2) Length of the above buffer
 234         *   3) Actual access length from the access_as() op
 235         *
 236         * Since we pass these extra parameters via the context, which is
 237         * shared between threads, we must lock the context to avoid these
 238         * parameters being changed from another thread before the handler
 239         * has completed running.
 240         *
 241         * In addition, for general_purpose_io, the Address and bit_width fields
 242         * are defined as follows:
 243         *   1) Address is the pin number index of the field (bit offset from
 244         *      the previous Connection)
 245         *   2) bit_width is the actual bit length of the field (number of pins)
 246         */
 247        if ((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS ||
 248             region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) &&
 249            context && field_obj) {
 250
 251                status =
 252                    acpi_os_acquire_mutex(context_mutex, ACPI_WAIT_FOREVER);
 253                if (ACPI_FAILURE(status)) {
 254                        goto re_enter_interpreter;
 255                }
 256
 257                context_locked = TRUE;
 258
 259                /* Get the Connection (resource_template) buffer */
 260
 261                context->connection = field_obj->field.resource_buffer;
 262                context->length = field_obj->field.resource_length;
 263                context->access_length = field_obj->field.access_length;
 264
 265                if (region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) {
 266                        address = field_obj->field.pin_number_index;
 267                        bit_width = field_obj->field.bit_length;
 268                }
 269        }
 270
 271        /* Call the handler */
 272
 273        status = handler(function, address, bit_width, value, context,
 274                         region_obj2->extra.region_context);
 275
 276        if (context_locked) {
 277                acpi_os_release_mutex(context_mutex);
 278        }
 279
 280        if (ACPI_FAILURE(status)) {
 281                ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]",
 282                                acpi_ut_get_region_name(region_obj->region.
 283                                                        space_id)));
 284
 285                /*
 286                 * Special case for an EC timeout. These are seen so frequently
 287                 * that an additional error message is helpful
 288                 */
 289                if ((region_obj->region.space_id == ACPI_ADR_SPACE_EC) &&
 290                    (status == AE_TIME)) {
 291                        ACPI_ERROR((AE_INFO,
 292                                    "Timeout from EC hardware or EC device driver"));
 293                }
 294        }
 295
 296re_enter_interpreter:
 297        if (!(handler_desc->address_space.handler_flags &
 298              ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
 299                /*
 300                 * We just returned from a non-default handler, we must re-enter the
 301                 * interpreter
 302                 */
 303                acpi_ex_enter_interpreter();
 304        }
 305
 306        return_ACPI_STATUS(status);
 307}
 308
 309/*******************************************************************************
 310 *
 311 * FUNCTION:    acpi_ev_detach_region
 312 *
 313 * PARAMETERS:  region_obj          - Region Object
 314 *              acpi_ns_is_locked   - Namespace Region Already Locked?
 315 *
 316 * RETURN:      None
 317 *
 318 * DESCRIPTION: Break the association between the handler and the region
 319 *              this is a two way association.
 320 *
 321 ******************************************************************************/
 322
 323void
 324acpi_ev_detach_region(union acpi_operand_object *region_obj,
 325                      u8 acpi_ns_is_locked)
 326{
 327        union acpi_operand_object *handler_obj;
 328        union acpi_operand_object *obj_desc;
 329        union acpi_operand_object *start_desc;
 330        union acpi_operand_object **last_obj_ptr;
 331        acpi_adr_space_setup region_setup;
 332        void **region_context;
 333        union acpi_operand_object *region_obj2;
 334        acpi_status status;
 335
 336        ACPI_FUNCTION_TRACE(ev_detach_region);
 337
 338        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 339        if (!region_obj2) {
 340                return_VOID;
 341        }
 342        region_context = &region_obj2->extra.region_context;
 343
 344        /* Get the address handler from the region object */
 345
 346        handler_obj = region_obj->region.handler;
 347        if (!handler_obj) {
 348
 349                /* This region has no handler, all done */
 350
 351                return_VOID;
 352        }
 353
 354        /* Find this region in the handler's list */
 355
 356        obj_desc = handler_obj->address_space.region_list;
 357        start_desc = obj_desc;
 358        last_obj_ptr = &handler_obj->address_space.region_list;
 359
 360        while (obj_desc) {
 361
 362                /* Is this the correct Region? */
 363
 364                if (obj_desc == region_obj) {
 365                        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 366                                          "Removing Region %p from address handler %p\n",
 367                                          region_obj, handler_obj));
 368
 369                        /* This is it, remove it from the handler's list */
 370
 371                        *last_obj_ptr = obj_desc->region.next;
 372                        obj_desc->region.next = NULL;   /* Must clear field */
 373
 374                        if (acpi_ns_is_locked) {
 375                                status =
 376                                    acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 377                                if (ACPI_FAILURE(status)) {
 378                                        return_VOID;
 379                                }
 380                        }
 381
 382                        /* Now stop region accesses by executing the _REG method */
 383
 384                        status =
 385                            acpi_ev_execute_reg_method(region_obj,
 386                                                       ACPI_REG_DISCONNECT);
 387                        if (ACPI_FAILURE(status)) {
 388                                ACPI_EXCEPTION((AE_INFO, status,
 389                                                "from region _REG, [%s]",
 390                                                acpi_ut_get_region_name
 391                                                (region_obj->region.space_id)));
 392                        }
 393
 394                        if (acpi_ns_is_locked) {
 395                                status =
 396                                    acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 397                                if (ACPI_FAILURE(status)) {
 398                                        return_VOID;
 399                                }
 400                        }
 401
 402                        /*
 403                         * If the region has been activated, call the setup handler with
 404                         * the deactivate notification
 405                         */
 406                        if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {
 407                                region_setup = handler_obj->address_space.setup;
 408                                status =
 409                                    region_setup(region_obj,
 410                                                 ACPI_REGION_DEACTIVATE,
 411                                                 handler_obj->address_space.
 412                                                 context, region_context);
 413
 414                                /*
 415                                 * region_context should have been released by the deactivate
 416                                 * operation. We don't need access to it anymore here.
 417                                 */
 418                                if (region_context) {
 419                                        *region_context = NULL;
 420                                }
 421
 422                                /* Init routine may fail, Just ignore errors */
 423
 424                                if (ACPI_FAILURE(status)) {
 425                                        ACPI_EXCEPTION((AE_INFO, status,
 426                                                        "from region handler - deactivate, [%s]",
 427                                                        acpi_ut_get_region_name
 428                                                        (region_obj->region.
 429                                                         space_id)));
 430                                }
 431
 432                                region_obj->region.flags &=
 433                                    ~(AOPOBJ_SETUP_COMPLETE);
 434                        }
 435
 436                        /*
 437                         * Remove handler reference in the region
 438                         *
 439                         * NOTE: this doesn't mean that the region goes away, the region
 440                         * is just inaccessible as indicated to the _REG method
 441                         *
 442                         * If the region is on the handler's list, this must be the
 443                         * region's handler
 444                         */
 445                        region_obj->region.handler = NULL;
 446                        acpi_ut_remove_reference(handler_obj);
 447
 448                        return_VOID;
 449                }
 450
 451                /* Walk the linked list of handlers */
 452
 453                last_obj_ptr = &obj_desc->region.next;
 454                obj_desc = obj_desc->region.next;
 455
 456                /* Prevent infinite loop if list is corrupted */
 457
 458                if (obj_desc == start_desc) {
 459                        ACPI_ERROR((AE_INFO,
 460                                    "Circular handler list in region object %p",
 461                                    region_obj));
 462                        return_VOID;
 463                }
 464        }
 465
 466        /* If we get here, the region was not in the handler's region list */
 467
 468        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 469                          "Cannot remove region %p from address handler %p\n",
 470                          region_obj, handler_obj));
 471
 472        return_VOID;
 473}
 474
 475/*******************************************************************************
 476 *
 477 * FUNCTION:    acpi_ev_attach_region
 478 *
 479 * PARAMETERS:  handler_obj         - Handler Object
 480 *              region_obj          - Region Object
 481 *              acpi_ns_is_locked   - Namespace Region Already Locked?
 482 *
 483 * RETURN:      None
 484 *
 485 * DESCRIPTION: Create the association between the handler and the region
 486 *              this is a two way association.
 487 *
 488 ******************************************************************************/
 489
 490acpi_status
 491acpi_ev_attach_region(union acpi_operand_object *handler_obj,
 492                      union acpi_operand_object *region_obj,
 493                      u8 acpi_ns_is_locked)
 494{
 495
 496        ACPI_FUNCTION_TRACE(ev_attach_region);
 497
 498        /* Install the region's handler */
 499
 500        if (region_obj->region.handler) {
 501                return_ACPI_STATUS(AE_ALREADY_EXISTS);
 502        }
 503
 504        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
 505                          "Adding Region [%4.4s] %p to address handler %p [%s]\n",
 506                          acpi_ut_get_node_name(region_obj->region.node),
 507                          region_obj, handler_obj,
 508                          acpi_ut_get_region_name(region_obj->region.
 509                                                  space_id)));
 510
 511        /* Link this region to the front of the handler's list */
 512
 513        region_obj->region.next = handler_obj->address_space.region_list;
 514        handler_obj->address_space.region_list = region_obj;
 515        region_obj->region.handler = handler_obj;
 516        acpi_ut_add_reference(handler_obj);
 517
 518        return_ACPI_STATUS(AE_OK);
 519}
 520
 521/*******************************************************************************
 522 *
 523 * FUNCTION:    acpi_ev_execute_reg_method
 524 *
 525 * PARAMETERS:  region_obj          - Region object
 526 *              function            - Passed to _REG: On (1) or Off (0)
 527 *
 528 * RETURN:      Status
 529 *
 530 * DESCRIPTION: Execute _REG method for a region
 531 *
 532 ******************************************************************************/
 533
 534acpi_status
 535acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
 536{
 537        struct acpi_evaluate_info *info;
 538        union acpi_operand_object *args[3];
 539        union acpi_operand_object *region_obj2;
 540        const acpi_name *reg_name_ptr =
 541            ACPI_CAST_PTR(acpi_name, METHOD_NAME__REG);
 542        struct acpi_namespace_node *method_node;
 543        struct acpi_namespace_node *node;
 544        acpi_status status;
 545
 546        ACPI_FUNCTION_TRACE(ev_execute_reg_method);
 547
 548        if (!acpi_gbl_namespace_initialized ||
 549            region_obj->region.handler == NULL) {
 550                return_ACPI_STATUS(AE_OK);
 551        }
 552
 553        region_obj2 = acpi_ns_get_secondary_object(region_obj);
 554        if (!region_obj2) {
 555                return_ACPI_STATUS(AE_NOT_EXIST);
 556        }
 557
 558        /*
 559         * Find any "_REG" method associated with this region definition.
 560         * The method should always be updated as this function may be
 561         * invoked after a namespace change.
 562         */
 563        node = region_obj->region.node->parent;
 564        status =
 565            acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
 566                                     &method_node);
 567        if (ACPI_SUCCESS(status)) {
 568                /*
 569                 * The _REG method is optional and there can be only one per
 570                 * region definition. This will be executed when the handler is
 571                 * attached or removed.
 572                 */
 573                region_obj2->extra.method_REG = method_node;
 574        }
 575        if (region_obj2->extra.method_REG == NULL) {
 576                return_ACPI_STATUS(AE_OK);
 577        }
 578
 579        /* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
 580
 581        if ((function == ACPI_REG_CONNECT &&
 582             region_obj->common.flags & AOPOBJ_REG_CONNECTED) ||
 583            (function == ACPI_REG_DISCONNECT &&
 584             !(region_obj->common.flags & AOPOBJ_REG_CONNECTED))) {
 585                return_ACPI_STATUS(AE_OK);
 586        }
 587
 588        /* Allocate and initialize the evaluation information block */
 589
 590        info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
 591        if (!info) {
 592                return_ACPI_STATUS(AE_NO_MEMORY);
 593        }
 594
 595        info->prefix_node = region_obj2->extra.method_REG;
 596        info->relative_pathname = NULL;
 597        info->parameters = args;
 598        info->flags = ACPI_IGNORE_RETURN_VALUE;
 599
 600        /*
 601         * The _REG method has two arguments:
 602         *
 603         * arg0 - Integer:
 604         *  Operation region space ID Same value as region_obj->Region.space_id
 605         *
 606         * arg1 - Integer:
 607         *  connection status 1 for connecting the handler, 0 for disconnecting
 608         *  the handler (Passed as a parameter)
 609         */
 610        args[0] =
 611            acpi_ut_create_integer_object((u64)region_obj->region.space_id);
 612        if (!args[0]) {
 613                status = AE_NO_MEMORY;
 614                goto cleanup1;
 615        }
 616
 617        args[1] = acpi_ut_create_integer_object((u64)function);
 618        if (!args[1]) {
 619                status = AE_NO_MEMORY;
 620                goto cleanup2;
 621        }
 622
 623        args[2] = NULL;         /* Terminate list */
 624
 625        /* Execute the method, no return value */
 626
 627        ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
 628                        (ACPI_TYPE_METHOD, info->prefix_node, NULL));
 629
 630        status = acpi_ns_evaluate(info);
 631        acpi_ut_remove_reference(args[1]);
 632
 633        if (ACPI_FAILURE(status)) {
 634                goto cleanup2;
 635        }
 636
 637        if (function == ACPI_REG_CONNECT) {
 638                region_obj->common.flags |= AOPOBJ_REG_CONNECTED;
 639        } else {
 640                region_obj->common.flags &= ~AOPOBJ_REG_CONNECTED;
 641        }
 642
 643cleanup2:
 644        acpi_ut_remove_reference(args[0]);
 645
 646cleanup1:
 647        ACPI_FREE(info);
 648        return_ACPI_STATUS(status);
 649}
 650
 651/*******************************************************************************
 652 *
 653 * FUNCTION:    acpi_ev_execute_reg_methods
 654 *
 655 * PARAMETERS:  node            - Namespace node for the device
 656 *              space_id        - The address space ID
 657 *              function        - Passed to _REG: On (1) or Off (0)
 658 *
 659 * RETURN:      None
 660 *
 661 * DESCRIPTION: Run all _REG methods for the input Space ID;
 662 *              Note: assumes namespace is locked, or system init time.
 663 *
 664 ******************************************************************************/
 665
 666void
 667acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
 668                            acpi_adr_space_type space_id, u32 function)
 669{
 670        struct acpi_reg_walk_info info;
 671
 672        ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
 673
 674        /*
 675         * These address spaces do not need a call to _REG, since the ACPI
 676         * specification defines them as: "must always be accessible". Since
 677         * they never change state (never become unavailable), no need to ever
 678         * call _REG on them. Also, a data_table is not a "real" address space,
 679         * so do not call _REG. September 2018.
 680         */
 681        if ((space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) ||
 682            (space_id == ACPI_ADR_SPACE_SYSTEM_IO) ||
 683            (space_id == ACPI_ADR_SPACE_DATA_TABLE)) {
 684                return_VOID;
 685        }
 686
 687        info.space_id = space_id;
 688        info.function = function;
 689        info.reg_run_count = 0;
 690
 691        ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
 692                              "    Running _REG methods for SpaceId %s\n",
 693                              acpi_ut_get_region_name(info.space_id)));
 694
 695        /*
 696         * Run all _REG methods for all Operation Regions for this space ID. This
 697         * is a separate walk in order to handle any interdependencies between
 698         * regions and _REG methods. (i.e. handlers must be installed for all
 699         * regions of this Space ID before we can run any _REG methods)
 700         */
 701        (void)acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
 702                                     ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, NULL,
 703                                     &info, NULL);
 704
 705        /*
 706         * Special case for EC and GPIO: handle "orphan" _REG methods with
 707         * no region.
 708         */
 709        if (space_id == ACPI_ADR_SPACE_EC || space_id == ACPI_ADR_SPACE_GPIO) {
 710                acpi_ev_execute_orphan_reg_method(node, space_id);
 711        }
 712
 713        ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
 714                              "    Executed %u _REG methods for SpaceId %s\n",
 715                              info.reg_run_count,
 716                              acpi_ut_get_region_name(info.space_id)));
 717
 718        return_VOID;
 719}
 720
 721/*******************************************************************************
 722 *
 723 * FUNCTION:    acpi_ev_reg_run
 724 *
 725 * PARAMETERS:  walk_namespace callback
 726 *
 727 * DESCRIPTION: Run _REG method for region objects of the requested spaceID
 728 *
 729 ******************************************************************************/
 730
 731static acpi_status
 732acpi_ev_reg_run(acpi_handle obj_handle,
 733                u32 level, void *context, void **return_value)
 734{
 735        union acpi_operand_object *obj_desc;
 736        struct acpi_namespace_node *node;
 737        acpi_status status;
 738        struct acpi_reg_walk_info *info;
 739
 740        info = ACPI_CAST_PTR(struct acpi_reg_walk_info, context);
 741
 742        /* Convert and validate the device handle */
 743
 744        node = acpi_ns_validate_handle(obj_handle);
 745        if (!node) {
 746                return (AE_BAD_PARAMETER);
 747        }
 748
 749        /*
 750         * We only care about regions and objects that are allowed to have
 751         * address space handlers
 752         */
 753        if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
 754                return (AE_OK);
 755        }
 756
 757        /* Check for an existing internal object */
 758
 759        obj_desc = acpi_ns_get_attached_object(node);
 760        if (!obj_desc) {
 761
 762                /* No object, just exit */
 763
 764                return (AE_OK);
 765        }
 766
 767        /* Object is a Region */
 768
 769        if (obj_desc->region.space_id != info->space_id) {
 770
 771                /* This region is for a different address space, just ignore it */
 772
 773                return (AE_OK);
 774        }
 775
 776        info->reg_run_count++;
 777        status = acpi_ev_execute_reg_method(obj_desc, info->function);
 778        return (status);
 779}
 780
 781/*******************************************************************************
 782 *
 783 * FUNCTION:    acpi_ev_execute_orphan_reg_method
 784 *
 785 * PARAMETERS:  device_node         - Namespace node for an ACPI device
 786 *              space_id            - The address space ID
 787 *
 788 * RETURN:      None
 789 *
 790 * DESCRIPTION: Execute an "orphan" _REG method that appears under an ACPI
 791 *              device. This is a _REG method that has no corresponding region
 792 *              within the device's scope. ACPI tables depending on these
 793 *              "orphan" _REG methods have been seen for both EC and GPIO
 794 *              Operation Regions. Presumably the Windows ACPI implementation
 795 *              always calls the _REG method independent of the presence of
 796 *              an actual Operation Region with the correct address space ID.
 797 *
 798 *  MUTEX:      Assumes the namespace is locked
 799 *
 800 ******************************************************************************/
 801
 802static void
 803acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
 804                                  acpi_adr_space_type space_id)
 805{
 806        acpi_handle reg_method;
 807        struct acpi_namespace_node *next_node;
 808        acpi_status status;
 809        struct acpi_object_list args;
 810        union acpi_object objects[2];
 811
 812        ACPI_FUNCTION_TRACE(ev_execute_orphan_reg_method);
 813
 814        if (!device_node) {
 815                return_VOID;
 816        }
 817
 818        /* Namespace is currently locked, must release */
 819
 820        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 821
 822        /* Get a handle to a _REG method immediately under the EC device */
 823
 824        status = acpi_get_handle(device_node, METHOD_NAME__REG, &reg_method);
 825        if (ACPI_FAILURE(status)) {
 826                goto exit;      /* There is no _REG method present */
 827        }
 828
 829        /*
 830         * Execute the _REG method only if there is no Operation Region in
 831         * this scope with the Embedded Controller space ID. Otherwise, it
 832         * will already have been executed. Note, this allows for Regions
 833         * with other space IDs to be present; but the code below will then
 834         * execute the _REG method with the embedded_control space_ID argument.
 835         */
 836        next_node = acpi_ns_get_next_node(device_node, NULL);
 837        while (next_node) {
 838                if ((next_node->type == ACPI_TYPE_REGION) &&
 839                    (next_node->object) &&
 840                    (next_node->object->region.space_id == space_id)) {
 841                        goto exit;      /* Do not execute the _REG */
 842                }
 843
 844                next_node = acpi_ns_get_next_node(device_node, next_node);
 845        }
 846
 847        /* Evaluate the _REG(space_id,Connect) method */
 848
 849        args.count = 2;
 850        args.pointer = objects;
 851        objects[0].type = ACPI_TYPE_INTEGER;
 852        objects[0].integer.value = space_id;
 853        objects[1].type = ACPI_TYPE_INTEGER;
 854        objects[1].integer.value = ACPI_REG_CONNECT;
 855
 856        (void)acpi_evaluate_object(reg_method, NULL, &args, NULL);
 857
 858exit:
 859        /* We ignore all errors from above, don't care */
 860
 861        (void)acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
 862        return_VOID;
 863}
 864