FAILED: patch "[PATCH] ACPI: EC: Evaluate _REG outside the EC scope more carefully" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 71bf41b8e913ec9fc91f0d39ab8fb320229ec604
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026040842-swagger-sharpie-884e@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 71bf41b8e913ec9fc91f0d39ab8fb320229ec604 Mon Sep 17 00:00:00 2001
From: "Rafael J. Wysocki" <[email protected]>
Date: Mon, 12 Aug 2024 15:16:21 +0200
Subject: [PATCH] ACPI: EC: Evaluate _REG outside the EC scope more carefully
Commit 60fa6ae6e6d0 ("ACPI: EC: Install address space handler at the namespace root") caused _REG methods for EC operation regions outside the EC device scope to be evaluated which on some systems leads to the evaluation of _REG methods in the scopes of device objects representing devices that are not present and not functional according to the _STA return values. Some of those device objects represent EC "alternatives" and if _REG is evaluated for their operation regions, the platform firmware may be confused and the platform may start to behave incorrectly.
To avoid this problem, only evaluate _REG for EC operation regions located in the scopes of device objects representing known-to-be-present devices.
For this purpose, partially revert commit 60fa6ae6e6d0 and trigger the evaluation of _REG for EC operation regions from acpi_bus_attach() for the known-valid devices.
drivers/acpi/ec.c +9 -2
@@ -1487,12 +1487,13 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)static int ec_install_handlers (struct acpi_ec *ec,struct acpi_device *device,bool call_reg) { -acpi_handle scope_handle = ec == first_ec ?ACPI_ROOT_OBJECT : ec->handle;acpi_status status;acpi_ec_start (ec, false);if (!test_bit (EC_FLAGS_EC_HANDLER_INSTALLED , &ec->flags)) { +acpi_handle scope_handle = ec == first_ec ?ACPI_ROOT_OBJECT : ec->handle; +acpi_ec_enter_noirq (ec); status = acpi_install_address_space_handler_no_reg(scope_handle, ACPI_ADR_SPACE_EC,
@@ -1506,7 +1507,7 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, }if (call_reg && !test_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags)) { -acpi_execute_reg_methods (scope_handle,ACPI_UINT32_MAX ,ACPI_ADR_SPACE_EC ); +acpi_execute_reg_methods (ec->handle,ACPI_UINT32_MAX ,ACPI_ADR_SPACE_EC );set_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags); }
@@ -1721,6 +1722,12 @@ static void acpi_ec_remove(struct acpi_device *device) } } +void acpi_ec_register_opregions (struct acpi_device *adev) +{ +if (first_ec && first_ec->handle != adev->handle) +acpi_execute_reg_methods (adev->handle,1 ,ACPI_ADR_SPACE_EC ); +} +static acpi_status ec_parse_io_ports (struct acpi_resource *resource,void *context) {
drivers/acpi/internal.h +1 -0
@@ -223,6 +223,7 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, acpi_handle handle, acpi_ec_query_func func, void *data);void acpi_ec_remove_query_handler (struct acpi_ec *ec,u8 query_bit); +void acpi_ec_register_opregions (struct acpi_device *adev);#ifdef CONFIG_PM_SLEEP void acpi_ec_flush_work (void );
drivers/acpi/scan.c +2 -0
@@ -2273,6 +2273,8 @@ static int acpi_bus_attach(struct acpi_device *device, void *first_pass)if (device->handler) goto ok; +acpi_ec_register_opregions (device); +if (!device->flags.initialized) { device->flags.power_manageable = device->power.states[ACPI_STATE_D0 ].flags.valid;
Sasha Levin
maintainerPATCH 1/3 Revert "ACPI: EC: Evaluate orphan _REG under EC device"
From: "Rafael J. Wysocki" <[email protected]>
[ Upstream commit 779bac9994452f6a894524f70c00cfb0cd4b6364 ]
This reverts commit 0e6b6dedf168 ("Revert "ACPI: EC: Evaluate orphan _REG under EC device") because the problem addressed by it will be addressed differently in what follows.
Stable-dep-of: 71bf41b8e913 ("ACPI: EC: Evaluate _REG outside the EC scope more carefully")
--- drivers/acpi/acpica/acevents.h | 4 --- drivers/acpi/acpica/evregion.c | 6 +++- drivers/acpi/acpica/evxfregn.c | 54 ---------------------------------- drivers/acpi/ec.c | 3 -- include/acpi/acpixf.h | 4 --- 5 files changed, 5 insertions(+), 66 deletions(-)
drivers/acpi/acpica/acevents.h +0 -4
@@ -191,10 +191,6 @@ void acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, acpi_adr_space_type space_id, u32 function); -void -acpi_ev_execute_orphan_reg_method (struct acpi_namespace_node *node, -acpi_adr_space_type space_id); -acpi_status acpi_ev_execute_reg_method (union acpi_operand_object *region_obj,u32 function);
drivers/acpi/acpica/evregion.c +5 -1
@@ -20,6 +20,10 @@ extern u8 acpi_gbl_default_address_spaces[];/* Local prototypes */ +static void +acpi_ev_execute_orphan_reg_method (struct acpi_namespace_node *device_node, +acpi_adr_space_type space_id); +static acpi_status acpi_ev_reg_run (acpi_handle obj_handle,u32 level,void *context,void **return_value);
@@ -807,7 +811,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,* ******************************************************************************/ -void +static void acpi_ev_execute_orphan_reg_method (struct acpi_namespace_node *device_node,acpi_adr_space_type space_id) {
drivers/acpi/acpica/evxfregn.c +0 -54
57 lines not on this page · raw message
drivers/acpi/ec.c +0 -3
@@ -1532,9 +1532,6 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device,if (call_reg && !test_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags)) {acpi_execute_reg_methods (scope_handle,ACPI_ADR_SPACE_EC ); -if (scope_handle != ec->handle) -acpi_execute_orphan_reg_method (ec->handle,ACPI_ADR_SPACE_EC ); -set_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags); }
include/acpi/acpixf.h +0 -4
@@ -668,10 +668,6 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_execute_reg_methods(acpi_handle device, acpi_adr_space_type space_id)) -ACPI_EXTERNAL_RETURN_STATUS(acpi_status - acpi_execute_orphan_reg_method(acpi_handle device, - acpi_adr_space_type - space_id)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_remove_address_space_handler(acpi_handle device,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/3 ACPICA: Add a depth argument to acpi_execute_reg_methods()
From: "Rafael J. Wysocki" <[email protected]>
[ Upstream commit cdf65d73e001fde600b18d7e45afadf559425ce5 ]
A subsequent change will need to pass a depth argument to acpi_execute_reg_methods(), so prepare that function for it.
No intentional functional changes.
Stable-dep-of: 71bf41b8e913 ("ACPI: EC: Evaluate _REG outside the EC scope more carefully")
--- drivers/acpi/acpica/acevents.h | 2 +- drivers/acpi/acpica/evregion.c | 6 ++++-- drivers/acpi/acpica/evxfregn.c | 10 +++++++--- drivers/acpi/ec.c | 2 +- include/acpi/acpixf.h | 1 + 5 files changed, 14 insertions(+), 7 deletions(-)
drivers/acpi/acpica/acevents.h +1 -1
@@ -188,7 +188,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj, u8 acpi_ns_is_locked);void -acpi_ev_execute_reg_methods (struct acpi_namespace_node *node, +acpi_ev_execute_reg_methods (struct acpi_namespace_node *node,u32 max_depth,acpi_adr_space_type space_id,u32 function); acpi_status
drivers/acpi/acpica/evregion.c +4 -2
@@ -65,6 +65,7 @@ acpi_status acpi_ev_initialize_op_regions(void) acpi_gbl_default_address_spaces [i])) {acpi_ev_execute_reg_methods (acpi_gbl_root_node, +ACPI_UINT32_MAX , acpi_gbl_default_address_spaces [i],ACPI_REG_CONNECT ); }
@@ -665,6 +666,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)* FUNCTION: acpi_ev_execute_reg_methods * * PARAMETERS: node - Namespace node for the device +* max_depth - Depth to which search for _REG * space_id - The address space ID * function - Passed to _REG: On (1) or Off (0) *
@@ -676,7 +678,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)******************************************************************************/ void -acpi_ev_execute_reg_methods (struct acpi_namespace_node *node, +acpi_ev_execute_reg_methods (struct acpi_namespace_node *node,u32 max_depth,acpi_adr_space_type space_id,u32 function) {struct acpi_reg_walk_info info;
@@ -710,7 +712,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,* regions and _REG methods. (i.e. handlers must be installed for all * regions of this Space ID before we can run any _REG methods) */ - (void )acpi_ns_walk_namespace (ACPI_TYPE_ANY , node,ACPI_UINT32_MAX , + (void )acpi_ns_walk_namespace (ACPI_TYPE_ANY , node, max_depth,ACPI_NS_WALK_UNLOCK , acpi_ev_reg_run,NULL , &info,NULL );
drivers/acpi/acpica/evxfregn.c +7 -3
@@ -85,7 +85,8 @@ acpi_install_address_space_handler_internal(acpi_handle device,/* Run all _REG methods for this address space */ if (run_reg) { -acpi_ev_execute_reg_methods (node, space_id,ACPI_REG_CONNECT ); +acpi_ev_execute_reg_methods (node,ACPI_UINT32_MAX , space_id, +ACPI_REG_CONNECT ); } unlock_and_exit:
@@ -261,6 +262,7 @@ ACPI_EXPORT_SYMBOL(acpi_remove_address_space_handler)* FUNCTION: acpi_execute_reg_methods * * PARAMETERS: device - Handle for the device +* max_depth - Depth to which search for _REG * space_id - The address space ID * * RETURN: Status
@@ -269,7 +271,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_address_space_handler)* ******************************************************************************/ acpi_status -acpi_execute_reg_methods (acpi_handle device,acpi_adr_space_type space_id) +acpi_execute_reg_methods (acpi_handle device,u32 max_depth, +acpi_adr_space_type space_id) {struct acpi_namespace_node *node;acpi_status status;
@@ -294,7 +297,8 @@ acpi_execute_reg_methods(acpi_handle device, acpi_adr_space_type space_id)/* Run all _REG methods for this address space */ -acpi_ev_execute_reg_methods (node, space_id,ACPI_REG_CONNECT ); +acpi_ev_execute_reg_methods (node, max_depth, space_id, +ACPI_REG_CONNECT ); }else { status =AE_BAD_PARAMETER ; }
drivers/acpi/ec.c +1 -1
@@ -1531,7 +1531,7 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, }if (call_reg && !test_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags)) { -acpi_execute_reg_methods (scope_handle,ACPI_ADR_SPACE_EC ); +acpi_execute_reg_methods (scope_handle,ACPI_UINT32_MAX ,ACPI_ADR_SPACE_EC );set_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags); }
include/acpi/acpixf.h +1 -0
@@ -666,6 +666,7 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status void *context)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_execute_reg_methods(acpi_handle device, + u32 nax_depth, acpi_adr_space_type space_id)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/3 ACPI: EC: Evaluate _REG outside the EC scope more carefully
In reply to Sasha LevinFrom: "Rafael J. Wysocki" <[email protected]>
[ Upstream commit 71bf41b8e913ec9fc91f0d39ab8fb320229ec604 ]
Commit 60fa6ae6e6d0 ("ACPI: EC: Install address space handler at the namespace root") caused _REG methods for EC operation regions outside the EC device scope to be evaluated which on some systems leads to the evaluation of _REG methods in the scopes of device objects representing devices that are not present and not functional according to the _STA return values. Some of those device objects represent EC "alternatives" and if _REG is evaluated for their operation regions, the platform firmware may be confused and the platform may start to behave incorrectly.
To avoid this problem, only evaluate _REG for EC operation regions located in the scopes of device objects representing known-to-be-present devices.
For this purpose, partially revert commit 60fa6ae6e6d0 and trigger the evaluation of _REG for EC operation regions from acpi_bus_attach() for the known-valid devices.
--- drivers/acpi/ec.c | 11 +++++++++-- drivers/acpi/internal.h | 1 + drivers/acpi/scan.c | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-)
drivers/acpi/ec.c +9 -2
@@ -1512,12 +1512,13 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)static int ec_install_handlers (struct acpi_ec *ec,struct acpi_device *device,bool call_reg) { -acpi_handle scope_handle = ec == first_ec ?ACPI_ROOT_OBJECT : ec->handle;acpi_status status;acpi_ec_start (ec, false);if (!test_bit (EC_FLAGS_EC_HANDLER_INSTALLED , &ec->flags)) { +acpi_handle scope_handle = ec == first_ec ?ACPI_ROOT_OBJECT : ec->handle; +acpi_ec_enter_noirq (ec); status = acpi_install_address_space_handler_no_reg(scope_handle, ACPI_ADR_SPACE_EC,
@@ -1531,7 +1532,7 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device, }if (call_reg && !test_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags)) { -acpi_execute_reg_methods (scope_handle,ACPI_UINT32_MAX ,ACPI_ADR_SPACE_EC ); +acpi_execute_reg_methods (ec->handle,ACPI_UINT32_MAX ,ACPI_ADR_SPACE_EC );set_bit (EC_FLAGS_EC_REG_CALLED , &ec->flags); }
@@ -1749,6 +1750,12 @@ static int acpi_ec_remove(struct acpi_device *device)return 0 ; } +void acpi_ec_register_opregions (struct acpi_device *adev) +{ +if (first_ec && first_ec->handle != adev->handle) +acpi_execute_reg_methods (adev->handle,1 ,ACPI_ADR_SPACE_EC ); +} +static acpi_status ec_parse_io_ports (struct acpi_resource *resource,void *context) {
drivers/acpi/internal.h +1 -0
@@ -210,6 +210,7 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, acpi_handle handle, acpi_ec_query_func func, void *data);void acpi_ec_remove_query_handler (struct acpi_ec *ec,u8 query_bit); +void acpi_ec_register_opregions (struct acpi_device *adev);#ifdef CONFIG_PM_SLEEP void acpi_ec_flush_work (void );
drivers/acpi/scan.c +2 -0
@@ -2198,6 +2198,8 @@ static int acpi_bus_attach(struct acpi_device *device, void *first_pass)if (device->handler) goto ok; +acpi_ec_register_opregions (device); +if (!device->flags.initialized) { device->flags.power_manageable = device->power.states[ACPI_STATE_D0 ].flags.valid;
Signature · 1 line
2.53.0