]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: PM: s2idle: Only retrieve constraints when needed
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 9 Oct 2025 19:27:11 +0000 (21:27 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 20 Oct 2025 18:39:33 +0000 (20:39 +0200)
The evaluation of LPS0 _DSM Function 1 in lps0_device_attach() may be
useless if pm_debug_messages_on is never set.

For this reason, instead of evaluating it in lps0_device_attach(), do
that in a new .begin() callback for s2idle, acpi_s2idle_begin_lps0(),
only when pm_debug_messages_on is set at that point.

However, never attempt to evaluate LPS0 _DSM Function 1 more than once
to avoid recurring failures.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Link: https://patch.msgid.link/3027060.e9J7NaK4W3@rafael.j.wysocki
drivers/acpi/x86/s2idle.c

index 5ce556b1cfbc65db5a17c5200e9bfa2038154684..6d4d06236f616f5b2664ba1e00d5a78415400e8d 100644 (file)
@@ -303,6 +303,9 @@ static void lpi_check_constraints(void)
 {
        struct lpi_constraints *entry;
 
+       if (IS_ERR_OR_NULL(lpi_constraints_table))
+               return;
+
        for_each_lpi_constraint(entry) {
                struct acpi_device *adev = acpi_fetch_acpi_dev(entry->handle);
 
@@ -484,11 +487,6 @@ static int lps0_device_attach(struct acpi_device *adev,
 
        lps0_device_handle = adev->handle;
 
-       if (acpi_s2idle_vendor_amd())
-               lpi_device_get_constraints_amd();
-       else
-               lpi_device_get_constraints();
-
        /*
         * Use suspend-to-idle by default if ACPI_FADT_LOW_POWER_S0 is set in
         * the FADT and the default suspend mode was not set from the command
@@ -515,6 +513,25 @@ static struct acpi_scan_handler lps0_handler = {
        .attach = lps0_device_attach,
 };
 
+static int acpi_s2idle_begin_lps0(void)
+{
+       if (pm_debug_messages_on && !lpi_constraints_table) {
+               if (acpi_s2idle_vendor_amd())
+                       lpi_device_get_constraints_amd();
+               else
+                       lpi_device_get_constraints();
+
+               /*
+                * Try to retrieve the constraints only once because failures
+                * to do so usually are sticky.
+                */
+               if (!lpi_constraints_table)
+                       lpi_constraints_table = ERR_PTR(-ENODATA);
+       }
+
+       return acpi_s2idle_begin();
+}
+
 static int acpi_s2idle_prepare_late_lps0(void)
 {
        struct acpi_s2idle_dev_ops *handler;
@@ -612,7 +629,7 @@ static void acpi_s2idle_restore_early_lps0(void)
 }
 
 static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = {
-       .begin = acpi_s2idle_begin,
+       .begin = acpi_s2idle_begin_lps0,
        .prepare = acpi_s2idle_prepare,
        .prepare_late = acpi_s2idle_prepare_late_lps0,
        .check = acpi_s2idle_check_lps0,