FAILED: patch "[PATCH] ACPI: EC: Evaluate _REG outside the EC scope more carefully" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-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-5.15.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 '2026040843-barge-ebay-46c4@gregkh' --subject-prefix 'PATCH 5.15.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;