Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef09c4f5 authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

ACPICA: Add mechanism to defer _REG methods for some installed handlers



The memory/io/pci/dataTable regions must always be available. For
any user installed handlers for these spaces, defer execution
of _REG methods until acpi_enable_subsystem. This prevents any
chicken/egg problems and ensures that no methods are executed
until all of these regions are ready and available.

Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 47863b9c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -273,6 +273,10 @@ ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS];
ACPI_EXTERN u8 acpi_gbl_last_owner_id_index;
ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset;

/* Initialization sequencing */

ACPI_EXTERN u8 acpi_gbl_reg_methods_executed;

/* Misc */

ACPI_EXTERN u32 acpi_gbl_original_mode;
+2 −0
Original line number Diff line number Diff line
@@ -231,6 +231,8 @@ acpi_status acpi_ev_initialize_op_regions(void)
		}
	}

	acpi_gbl_reg_methods_executed = TRUE;

	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
	return_ACPI_STATUS(status);
}
+32 −2
Original line number Diff line number Diff line
@@ -110,9 +110,39 @@ acpi_install_address_space_handler(acpi_handle device,
		goto unlock_and_exit;
	}

	/*
	 * 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);
		break;
	}

      unlock_and_exit:
	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+1 −0
Original line number Diff line number Diff line
@@ -323,6 +323,7 @@ acpi_status acpi_ut_init_globals(void)
	acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
	acpi_gbl_osi_data = 0;
	acpi_gbl_osi_mutex = NULL;
	acpi_gbl_reg_methods_executed = FALSE;

	/* Hardware oriented */