aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/evxfregn.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/acpica/evxfregn.c')
-rw-r--r--drivers/acpi/acpica/evxfregn.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c
index 541cbc1544d5..00cd95692a91 100644
--- a/drivers/acpi/acpica/evxfregn.c
+++ b/drivers/acpi/acpica/evxfregn.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2010, Intel Corp. 9 * Copyright (C) 2000 - 2011, Intel Corp.
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -64,6 +64,12 @@ ACPI_MODULE_NAME("evxfregn")
64 * 64 *
65 * DESCRIPTION: Install a handler for all op_regions of a given space_id. 65 * DESCRIPTION: Install a handler for all op_regions of a given space_id.
66 * 66 *
67 * NOTE: This function should only be called after acpi_enable_subsystem has
68 * been called. This is because any _REG methods associated with the Space ID
69 * are executed here, and these methods can only be safely executed after
70 * the default handlers have been installed and the hardware has been
71 * initialized (via acpi_enable_subsystem.)
72 *
67 ******************************************************************************/ 73 ******************************************************************************/
68acpi_status 74acpi_status
69acpi_install_address_space_handler(acpi_handle device, 75acpi_install_address_space_handler(acpi_handle device,
@@ -104,6 +110,37 @@ acpi_install_address_space_handler(acpi_handle device,
104 goto unlock_and_exit; 110 goto unlock_and_exit;
105 } 111 }
106 112
113 /*
114 * For the default space_iDs, (the IDs for which there are default region handlers
115 * installed) Only execute the _REG methods if the global initialization _REG
116 * methods have already been run (via acpi_initialize_objects). In other words,
117 * we will defer the execution of the _REG methods for these space_iDs until
118 * execution of acpi_initialize_objects. This is done because we need the handlers
119 * for the default spaces (mem/io/pci/table) to be installed before we can run
120 * any control methods (or _REG methods). There is known BIOS code that depends
121 * on this.
122 *
123 * For all other space_iDs, we can safely execute the _REG methods immediately.
124 * This means that for IDs like embedded_controller, this function should be called
125 * only after acpi_enable_subsystem has been called.
126 */
127 switch (space_id) {
128 case ACPI_ADR_SPACE_SYSTEM_MEMORY:
129 case ACPI_ADR_SPACE_SYSTEM_IO:
130 case ACPI_ADR_SPACE_PCI_CONFIG:
131 case ACPI_ADR_SPACE_DATA_TABLE:
132
133 if (!acpi_gbl_reg_methods_executed) {
134
135 /* We will defer execution of the _REG methods for this space */
136 goto unlock_and_exit;
137 }
138 break;
139
140 default:
141 break;
142 }
143
107 /* Run all _REG methods for this address space */ 144 /* Run all _REG methods for this address space */
108 145
109 status = acpi_ev_execute_reg_methods(node, space_id); 146 status = acpi_ev_execute_reg_methods(node, space_id);