From 2280fa4b05872392bff20b0798273c165f31dfc1 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 24 Jun 2024 16:50:37 +0200 Subject: [PATCH] 6.6-stable patches added patches: acpi-ec-evaluate-orphan-_reg-under-ec-device.patch --- ...evaluate-orphan-_reg-under-ec-device.patch | 152 ++++++++++++++++++ queue-6.6/series | 1 + 2 files changed, 153 insertions(+) create mode 100644 queue-6.6/acpi-ec-evaluate-orphan-_reg-under-ec-device.patch diff --git a/queue-6.6/acpi-ec-evaluate-orphan-_reg-under-ec-device.patch b/queue-6.6/acpi-ec-evaluate-orphan-_reg-under-ec-device.patch new file mode 100644 index 00000000000..7d93e4a1818 --- /dev/null +++ b/queue-6.6/acpi-ec-evaluate-orphan-_reg-under-ec-device.patch @@ -0,0 +1,152 @@ +From 0e6b6dedf16800df0ff73ffe2bb5066514db29c2 Mon Sep 17 00:00:00 2001 +From: "Rafael J. Wysocki" +Date: Wed, 12 Jun 2024 16:15:55 +0200 +Subject: ACPI: EC: Evaluate orphan _REG under EC device + +From: Rafael J. Wysocki + +commit 0e6b6dedf16800df0ff73ffe2bb5066514db29c2 upstream. + +After starting to install the EC address space handler at the ACPI +namespace root, if there is an "orphan" _REG method in the EC device's +scope, it will not be evaluated any more. This breaks EC operation +regions on some systems, like Asus gu605. + +To address this, use a wrapper around an existing ACPICA function to +look for an "orphan" _REG method in the EC device scope and evaluate +it if present. + +Fixes: 60fa6ae6e6d0 ("ACPI: EC: Install address space handler at the namespace root") +Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218945 +Reported-by: VitaliiT +Tested-by: VitaliiT +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + 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, 66 insertions(+), 5 deletions(-) + +--- a/drivers/acpi/acpica/acevents.h ++++ b/drivers/acpi/acpica/acevents.h +@@ -191,6 +191,10 @@ 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); + +--- a/drivers/acpi/acpica/evregion.c ++++ b/drivers/acpi/acpica/evregion.c +@@ -20,10 +20,6 @@ extern u8 acpi_gbl_default_address_space + + /* 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); +@@ -818,7 +814,7 @@ acpi_ev_reg_run(acpi_handle obj_handle, + * + ******************************************************************************/ + +-static void ++void + acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node, + acpi_adr_space_type space_id) + { +--- a/drivers/acpi/acpica/evxfregn.c ++++ b/drivers/acpi/acpica/evxfregn.c +@@ -306,3 +306,57 @@ acpi_execute_reg_methods(acpi_handle dev + } + + ACPI_EXPORT_SYMBOL(acpi_execute_reg_methods) ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_execute_orphan_reg_method ++ * ++ * PARAMETERS: device - Handle for the device ++ * space_id - The address space ID ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Execute an "orphan" _REG method that appears under an ACPI ++ * device. This is a _REG method that has no corresponding region ++ * within the device's scope. ++ * ++ ******************************************************************************/ ++acpi_status ++acpi_execute_orphan_reg_method(acpi_handle device, acpi_adr_space_type space_id) ++{ ++ struct acpi_namespace_node *node; ++ acpi_status status; ++ ++ ACPI_FUNCTION_TRACE(acpi_execute_orphan_reg_method); ++ ++ /* Parameter validation */ ++ ++ if (!device) { ++ return_ACPI_STATUS(AE_BAD_PARAMETER); ++ } ++ ++ status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); ++ if (ACPI_FAILURE(status)) { ++ return_ACPI_STATUS(status); ++ } ++ ++ /* Convert and validate the device handle */ ++ ++ node = acpi_ns_validate_handle(device); ++ if (node) { ++ ++ /* ++ * If an "orphan" _REG method is present in the device's scope ++ * for the given address space ID, run it. ++ */ ++ ++ acpi_ev_execute_orphan_reg_method(node, space_id); ++ } else { ++ status = AE_BAD_PARAMETER; ++ } ++ ++ (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); ++ return_ACPI_STATUS(status); ++} ++ ++ACPI_EXPORT_SYMBOL(acpi_execute_orphan_reg_method) +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -1502,6 +1502,9 @@ static int ec_install_handlers(struct ac + + 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); + } + +--- a/include/acpi/acpixf.h ++++ b/include/acpi/acpixf.h +@@ -663,6 +663,10 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status + 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, + acpi_adr_space_type diff --git a/queue-6.6/series b/queue-6.6/series index d168168c81e..67b4a866b9c 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -132,3 +132,4 @@ firmware-psci-fix-return-value-from-psci_system_susp.patch rdma-mlx5-fix-unwind-flow-as-part-of-mlx5_ib_stage_i.patch rdma-mlx5-add-check-for-srq-max_sge-attribute.patch rdma-mana_ib-ignore-optional-access-flags-for-mrs.patch +acpi-ec-evaluate-orphan-_reg-under-ec-device.patch -- 2.47.3