summarylogtreecommitdiffstats
path: root/sys-kernel_arch-sources-g14_files-0014-acpi_unused-v2.patch
diff options
context:
space:
mode:
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.patch209
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