diff options
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch')
-rw-r--r-- | sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch | 209 |
1 files changed, 0 insertions, 209 deletions
diff --git a/sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch b/sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch deleted file mode 100644 index c2ade498368f..000000000000 --- a/sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch +++ /dev/null @@ -1,209 +0,0 @@ -This is a backported version of the following patch from 5.13-rc4 - -From 9b7ff25d129df7c4f61e08382993e1988d56f6a7 Mon Sep 17 00:00:00 2001 -From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> -Date: Fri, 21 May 2021 15:13:11 +0200 -Subject: ACPI: power: Refine turning off unused power resources - -Commit 7e4fdeafa61f ("ACPI: power: Turn off unused power resources -unconditionally") dropped the power resource state check from -acpi_turn_off_unused_power_resources(), because according to the -ACPI specification (e.g. ACPI 6.4, Section 7.2.2) the OS "may run -the _OFF method repeatedly, even if the resource is already off". - -However, it turns out that some systems do not follow the -specification in this particular respect and that commit introduced -boot issues on them, so refine acpi_turn_off_unused_power_resources() -to only turn off power resources without any users after device -enumeration and restore its previous behavior in the system-wide -resume path. - -Fixes: 7e4fdeafa61f ("ACPI: power: Turn off unused power resources unconditionally") -Link: https://uefi.org/specs/ACPI/6.4/07_Power_and_Performance_Mgmt/declaring-a-power-resource-object.html#off -BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213019 -Reported-by: Zhang Rui <rui.zhang@intel.com> -Tested-by: Zhang Rui <rui.zhang@intel.com> -Reported-by: Dave Olsthoorn <dave@bewaar.me> -Tested-by: Dave Olsthoorn <dave@bewaar.me> -Reported-by: Shujun Wang <wsj20369@163.com> -Tested-by: Shujun Wang <wsj20369@163.com> -Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> ---- - drivers/acpi/internal.h | 4 ++-- - drivers/acpi/power.c | 59 ++++++++++++++++++++++++++++++++++++++----------- - drivers/acpi/scan.c | 2 +- - drivers/acpi/sleep.c | 2 +- - 4 files changed, 50 insertions(+), 17 deletions(-) - - - ---- linux-5.12/drivers/acpi/internal.h.orig 2021-06-11 13:58:34.918396821 -0700 -+++ linux-5.12/drivers/acpi/internal.h 2021-06-11 13:59:36.571792727 -0700 -@@ -135,7 +135,7 @@ - void acpi_power_resources_list_free(struct list_head *list); - int acpi_extract_power_resources(union acpi_object *package, unsigned int start, - struct list_head *list); --int acpi_add_power_resource(acpi_handle handle); -+struct acpi_device *acpi_add_power_resource(acpi_handle handle); - void acpi_power_add_remove_device(struct acpi_device *adev, bool add); - int acpi_power_wakeup_list_init(struct list_head *list, int *system_level); - int acpi_device_sleep_wake(struct acpi_device *dev, -@@ -143,7 +143,7 @@ - int acpi_power_get_inferred_state(struct acpi_device *device, int *state); - int acpi_power_on_resources(struct acpi_device *device, int state); - int acpi_power_transition(struct acpi_device *device, int state); --void acpi_turn_off_unused_power_resources(void); -+void acpi_turn_off_unused_power_resources(bool init); - - /* -------------------------------------------------------------------------- - Device Power Management ---- linux-5.12/drivers/acpi/power.c.orig 2021-06-11 13:58:34.918396821 -0700 -+++ linux-5.12/drivers/acpi/power.c 2021-06-11 14:00:09.121484875 -0700 -@@ -52,6 +52,7 @@ - u32 system_level; - u32 order; - unsigned int ref_count; -+ unsigned int users; - bool wakeup_enabled; - struct mutex resource_lock; - struct list_head dependents; -@@ -147,6 +148,7 @@ - - for (i = start; i < package->package.count; i++) { - union acpi_object *element = &package->package.elements[i]; -+ struct acpi_device *rdev; - acpi_handle rhandle; - - if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { -@@ -163,13 +165,16 @@ - if (acpi_power_resource_is_dup(package, start, i)) - continue; - -- err = acpi_add_power_resource(rhandle); -- if (err) -+ rdev = acpi_add_power_resource(rhandle); -+ if (!rdev) { -+ err = -ENODEV; - break; -- -+ } - err = acpi_power_resources_list_add(rhandle, list); - if (err) - break; -+ -+ to_power_resource(rdev)->users++; - } - if (err) - acpi_power_resources_list_free(list); -@@ -907,7 +912,7 @@ - mutex_unlock(&power_resource_list_lock); - } - --int acpi_add_power_resource(acpi_handle handle) -+struct acpi_device *acpi_add_power_resource(acpi_handle handle) - { - struct acpi_power_resource *resource; - struct acpi_device *device = NULL; -@@ -918,11 +923,11 @@ - - acpi_bus_get_device(handle, &device); - if (device) -- return 0; -+ return device; - - resource = kzalloc(sizeof(*resource), GFP_KERNEL); - if (!resource) -- return -ENOMEM; -+ return NULL; - - device = &resource->device; - acpi_init_device_object(device, handle, ACPI_BUS_TYPE_POWER, -@@ -960,11 +965,11 @@ - - acpi_power_add_resource_to_list(resource); - acpi_device_add_finalize(device); -- return 0; -+ return device; - - err: - acpi_release_power_resource(&device->dev); -- return result; -+ return NULL; - } - - #ifdef CONFIG_ACPI_SLEEP -@@ -998,7 +1003,38 @@ - } - #endif - --void acpi_turn_off_unused_power_resources(void) -+static void acpi_power_turn_off_if_unused(struct acpi_power_resource *resource, -+ bool init) -+{ -+ if (resource->ref_count > 0) -+ return; -+ -+ if (init) { -+ if (resource->users > 0) -+ return; -+ } else { -+ int result, state; -+ -+ result = acpi_power_get_state(resource->device.handle, &state); -+ if (result || state == ACPI_POWER_RESOURCE_STATE_OFF) -+ return; -+ } -+ -+ dev_info(&resource->device.dev, "Turning OFF\n"); -+ __acpi_power_off(resource); -+} -+ -+/** -+ * acpi_turn_off_unused_power_resources - Turn off power resources not in use. -+ * @init: Control switch. -+ * -+ * If @ainit is set, unconditionally turn off all of the ACPI power resources -+ * without any users. -+ * -+ * Otherwise, turn off all ACPI power resources without active references (that -+ * is, the ones that should be "off" at the moment) that are "on". -+ */ -+void acpi_turn_off_unused_power_resources(bool init) - { - struct acpi_power_resource *resource; - -@@ -1015,11 +1051,7 @@ - continue; - } - -- if (state == ACPI_POWER_RESOURCE_STATE_ON -- && !resource->ref_count) { -- dev_info(&resource->device.dev, "Turning OFF\n"); -- __acpi_power_off(resource); -- } -+ acpi_power_turn_off_if_unused(resource, init); - - mutex_unlock(&resource->resource_lock); - } ---- linux-5.12/drivers/acpi/scan.c.orig 2021-06-11 13:58:34.918396821 -0700 -+++ linux-5.12/drivers/acpi/scan.c 2021-06-11 13:59:36.573792709 -0700 -@@ -2394,7 +2394,7 @@ - } - } - -- acpi_turn_off_unused_power_resources(); -+ acpi_turn_off_unused_power_resources(true); - - acpi_scan_initialized = true; - ---- linux-5.12/drivers/acpi/sleep.c 2021-06-11 14:05:25.798799399 -0700 -+++ linux-5.12/drivers/acpi/sleep.c.new 2021-06-11 14:04:41.767145304 -0700 -@@ -504,7 +504,7 @@ - */ - static void acpi_pm_end(void) - { -- acpi_turn_off_unused_power_resources(); -+ acpi_turn_off_unused_power_resources(false); - acpi_scan_lock_release(); - /* - * This is necessary in case acpi_pm_finish() is not called during a
\ No newline at end of file |