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

Commit aa343014 authored by Bob Moore's avatar Bob Moore Committed by Greg Kroah-Hartman
Browse files

ACPICA: Never run _REG on system_memory and system_IO



[ Upstream commit 8b1cafdcb4b75c5027c52f1e82b47ebe727ad7ed ]

These address spaces are defined by the ACPI spec to be
"always available", and thus _REG should never be run on them.
Provides compatibility with other ACPI implementations.

Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarErik Schmauss <erik.schmauss@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent c7263e71
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -247,6 +247,8 @@ acpi_status
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
			  u8 acpi_ns_locked);
			  u8 acpi_ns_locked);


u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node);

/*
/*
 * evsci - SCI (System Control Interrupt) handling/dispatch
 * evsci - SCI (System Control Interrupt) handling/dispatch
 */
 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -428,9 +428,9 @@ struct acpi_simple_repair_info {
/* Info for running the _REG methods */
/* Info for running the _REG methods */


struct acpi_reg_walk_info {
struct acpi_reg_walk_info {
	acpi_adr_space_type space_id;
	u32 function;
	u32 function;
	u32 reg_run_count;
	u32 reg_run_count;
	acpi_adr_space_type space_id;
};
};


/*****************************************************************************
/*****************************************************************************
+15 −2
Original line number Original line Diff line number Diff line
@@ -677,6 +677,19 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,


	ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
	ACPI_FUNCTION_TRACE(ev_execute_reg_methods);


	/*
	 * These address spaces do not need a call to _REG, since the ACPI
	 * specification defines them as: "must always be accessible". Since
	 * they never change state (never become unavailable), no need to ever
	 * call _REG on them. Also, a data_table is not a "real" address space,
	 * so do not call _REG. September 2018.
	 */
	if ((space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) ||
	    (space_id == ACPI_ADR_SPACE_SYSTEM_IO) ||
	    (space_id == ACPI_ADR_SPACE_DATA_TABLE)) {
		return_VOID;
	}

	info.space_id = space_id;
	info.space_id = space_id;
	info.function = function;
	info.function = function;
	info.reg_run_count = 0;
	info.reg_run_count = 0;
@@ -738,8 +751,8 @@ acpi_ev_reg_run(acpi_handle obj_handle,
	}
	}


	/*
	/*
	 * We only care about regions.and objects that are allowed to have address
	 * We only care about regions and objects that are allowed to have
	 * space handlers
	 * address space handlers
	 */
	 */
	if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
	if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
		return (AE_OK);
		return (AE_OK);
+1 −5
Original line number Original line Diff line number Diff line
@@ -50,9 +50,6 @@
#define _COMPONENT          ACPI_EVENTS
#define _COMPONENT          ACPI_EVENTS
ACPI_MODULE_NAME("evrgnini")
ACPI_MODULE_NAME("evrgnini")


/* Local prototypes */
static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node);

/*******************************************************************************
/*******************************************************************************
 *
 *
 * FUNCTION:    acpi_ev_system_memory_region_setup
 * FUNCTION:    acpi_ev_system_memory_region_setup
@@ -67,7 +64,6 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node);
 * DESCRIPTION: Setup a system_memory operation region
 * DESCRIPTION: Setup a system_memory operation region
 *
 *
 ******************************************************************************/
 ******************************************************************************/

acpi_status
acpi_status
acpi_ev_system_memory_region_setup(acpi_handle handle,
acpi_ev_system_memory_region_setup(acpi_handle handle,
				   u32 function,
				   u32 function,
@@ -347,7 +343,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
 *
 *
 ******************************************************************************/
 ******************************************************************************/


static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
{
{
	acpi_status status;
	acpi_status status;
	struct acpi_pnp_device_id *hid;
	struct acpi_pnp_device_id *hid;
+0 −1
Original line number Original line Diff line number Diff line
@@ -227,7 +227,6 @@ acpi_remove_address_space_handler(acpi_handle device,
				 */
				 */
				region_obj =
				region_obj =
				    handler_obj->address_space.region_list;
				    handler_obj->address_space.region_list;

			}
			}


			/* Remove this Handler object from the list */
			/* Remove this Handler object from the list */