|
@@ -110,9 +110,39 @@ acpi_install_address_space_handler(acpi_handle device,
|
|
|
goto unlock_and_exit;
|
|
|
}
|
|
|
|
|
|
- /* Run all _REG methods for this address space */
|
|
|
+ /*
|
|
|
+ * For the default space_iDs, (the IDs for which there are default region handlers
|
|
|
+ * installed) Only execute the _REG methods if the global initialization _REG
|
|
|
+ * methods have already been run (via acpi_initialize_objects). In other words,
|
|
|
+ * we will defer the execution of the _REG methods for these space_iDs until
|
|
|
+ * execution of acpi_initialize_objects. This is done because we need the handlers
|
|
|
+ * for the default spaces (mem/io/pci/table) to be installed before we can run
|
|
|
+ * any control methods (or _REG methods). There is known BIOS code that depends
|
|
|
+ * on this.
|
|
|
+ *
|
|
|
+ * For all other space_iDs, we can safely execute the _REG methods immediately.
|
|
|
+ * This means that for IDs like embedded_controller, this function should be called
|
|
|
+ * only after acpi_enable_subsystem has been called.
|
|
|
+ */
|
|
|
+ switch (space_id) {
|
|
|
+ case ACPI_ADR_SPACE_SYSTEM_MEMORY:
|
|
|
+ case ACPI_ADR_SPACE_SYSTEM_IO:
|
|
|
+ case ACPI_ADR_SPACE_PCI_CONFIG:
|
|
|
+ case ACPI_ADR_SPACE_DATA_TABLE:
|
|
|
+
|
|
|
+ if (acpi_gbl_reg_methods_executed) {
|
|
|
+
|
|
|
+ /* Run all _REG methods for this address space */
|
|
|
+
|
|
|
+ status = acpi_ev_execute_reg_methods(node, space_id);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
|
|
|
- status = acpi_ev_execute_reg_methods(node, space_id);
|
|
|
+ status = acpi_ev_execute_reg_methods(node, space_id);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
unlock_and_exit:
|
|
|
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|