]> git.apps.os.sepia.ceph.com Git - ceph-client.git/commitdiff
platform/x86: acer-wmi: Stop using ACPI bitmap for platform profile choices
authorArmin Wolf <W_Armin@gmx.de>
Tue, 26 Aug 2025 20:40:07 +0000 (22:40 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 28 Aug 2025 15:49:31 +0000 (18:49 +0300)
It turns out that the platform firmware on some models does not return
valid data when reading the bitmap of supported platform profiles.
This prevents the driver from loading on said models, even when the
platform profile interface itself works.

Fix this by stop using said bitmap until we have figured out how
the OEM software itself detects available platform profiles.

Tested-by: Lynne Megido <lynne@bune.city>
Reported-by: Lynne Megido <lynne@bune.city>
Closes: https://lore.kernel.org/platform-driver-x86/3f56e68f-85df-4c0a-982c-43f9d635be38@bune.city/
Fixes: 191e21f1a4c3 ("platform/x86: acer-wmi: use an ACPI bitmap to set the platform profile choices")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20250826204007.5088-1-W_Armin@gmx.de
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/acer-wmi.c

index 69336bd778eead1c53e3940736404eb37faf7ee1..13eb22b35aa8f86a3c8b839a1258506b99b2da49 100644 (file)
@@ -129,6 +129,7 @@ enum acer_wmi_predator_v4_oc {
 enum acer_wmi_gaming_misc_setting {
        ACER_WMID_MISC_SETTING_OC_1                     = 0x0005,
        ACER_WMID_MISC_SETTING_OC_2                     = 0x0007,
+       /* Unreliable on some models */
        ACER_WMID_MISC_SETTING_SUPPORTED_PROFILES       = 0x000A,
        ACER_WMID_MISC_SETTING_PLATFORM_PROFILE         = 0x000B,
 };
@@ -794,9 +795,6 @@ static bool platform_profile_support;
  */
 static int last_non_turbo_profile = INT_MIN;
 
-/* The most performant supported profile */
-static int acer_predator_v4_max_perf;
-
 enum acer_predator_v4_thermal_profile {
        ACER_PREDATOR_V4_THERMAL_PROFILE_QUIET          = 0x00,
        ACER_PREDATOR_V4_THERMAL_PROFILE_BALANCED       = 0x01,
@@ -2014,7 +2012,7 @@ acer_predator_v4_platform_profile_set(struct device *dev,
        if (err)
                return err;
 
-       if (tp != acer_predator_v4_max_perf)
+       if (tp != ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO)
                last_non_turbo_profile = tp;
 
        return 0;
@@ -2023,55 +2021,14 @@ acer_predator_v4_platform_profile_set(struct device *dev,
 static int
 acer_predator_v4_platform_profile_probe(void *drvdata, unsigned long *choices)
 {
-       unsigned long supported_profiles;
-       int err;
+       set_bit(PLATFORM_PROFILE_PERFORMANCE, choices);
+       set_bit(PLATFORM_PROFILE_BALANCED_PERFORMANCE, choices);
+       set_bit(PLATFORM_PROFILE_BALANCED, choices);
+       set_bit(PLATFORM_PROFILE_QUIET, choices);
+       set_bit(PLATFORM_PROFILE_LOW_POWER, choices);
 
-       err = WMID_gaming_get_misc_setting(ACER_WMID_MISC_SETTING_SUPPORTED_PROFILES,
-                                          (u8 *)&supported_profiles);
-       if (err)
-               return err;
-
-       /* Iterate through supported profiles in order of increasing performance */
-       if (test_bit(ACER_PREDATOR_V4_THERMAL_PROFILE_ECO, &supported_profiles)) {
-               set_bit(PLATFORM_PROFILE_LOW_POWER, choices);
-               acer_predator_v4_max_perf = ACER_PREDATOR_V4_THERMAL_PROFILE_ECO;
-               last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_ECO;
-       }
-
-       if (test_bit(ACER_PREDATOR_V4_THERMAL_PROFILE_QUIET, &supported_profiles)) {
-               set_bit(PLATFORM_PROFILE_QUIET, choices);
-               acer_predator_v4_max_perf = ACER_PREDATOR_V4_THERMAL_PROFILE_QUIET;
-               last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_QUIET;
-       }
-
-       if (test_bit(ACER_PREDATOR_V4_THERMAL_PROFILE_BALANCED, &supported_profiles)) {
-               set_bit(PLATFORM_PROFILE_BALANCED, choices);
-               acer_predator_v4_max_perf = ACER_PREDATOR_V4_THERMAL_PROFILE_BALANCED;
-               last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_BALANCED;
-       }
-
-       if (test_bit(ACER_PREDATOR_V4_THERMAL_PROFILE_PERFORMANCE, &supported_profiles)) {
-               set_bit(PLATFORM_PROFILE_BALANCED_PERFORMANCE, choices);
-               acer_predator_v4_max_perf = ACER_PREDATOR_V4_THERMAL_PROFILE_PERFORMANCE;
-
-               /* We only use this profile as a fallback option in case no prior
-                * profile is supported.
-                */
-               if (last_non_turbo_profile < 0)
-                       last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_PERFORMANCE;
-       }
-
-       if (test_bit(ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO, &supported_profiles)) {
-               set_bit(PLATFORM_PROFILE_PERFORMANCE, choices);
-               acer_predator_v4_max_perf = ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO;
-
-               /* We need to handle the hypothetical case where only the turbo profile
-                * is supported. In this case the turbo toggle will essentially be a
-                * no-op.
-                */
-               if (last_non_turbo_profile < 0)
-                       last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO;
-       }
+       /* Set default non-turbo profile */
+       last_non_turbo_profile = ACER_PREDATOR_V4_THERMAL_PROFILE_BALANCED;
 
        return 0;
 }
@@ -2108,19 +2065,15 @@ static int acer_thermal_profile_change(void)
                if (cycle_gaming_thermal_profile) {
                        platform_profile_cycle();
                } else {
-                       /* Do nothing if no suitable platform profiles where found */
-                       if (last_non_turbo_profile < 0)
-                               return 0;
-
                        err = WMID_gaming_get_misc_setting(
                                ACER_WMID_MISC_SETTING_PLATFORM_PROFILE, &current_tp);
                        if (err)
                                return err;
 
-                       if (current_tp == acer_predator_v4_max_perf)
+                       if (current_tp == ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO)
                                tp = last_non_turbo_profile;
                        else
-                               tp = acer_predator_v4_max_perf;
+                               tp = ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO;
 
                        err = WMID_gaming_set_misc_setting(
                                ACER_WMID_MISC_SETTING_PLATFORM_PROFILE, tp);
@@ -2128,7 +2081,7 @@ static int acer_thermal_profile_change(void)
                                return err;
 
                        /* Store last profile for toggle */
-                       if (current_tp != acer_predator_v4_max_perf)
+                       if (current_tp != ACER_PREDATOR_V4_THERMAL_PROFILE_TURBO)
                                last_non_turbo_profile = current_tp;
 
                        platform_profile_notify(platform_profile_device);