platform/x86: asus-wmi: Fix inconsistent use of thermal policies
BugLink: https://bugs.launchpad.net/bugs/2102118 [ Upstream commit 895085ec3f2ed7a26389943729e2904df1f88dc0 ] When changing the thermal policy using the platform profile API, a Vivobook thermal policy is stored in throttle_thermal_policy_mode. However everywhere else a normal thermal policy is stored inside this variable, potentially confusing the platform profile. Fix this by always storing normal thermal policy values inside throttle_thermal_policy_mode and only do the conversion when writing the thermal policy to hardware. This also fixes the order in which throttle_thermal_policy_switch_next() steps through the thermal modes on Vivobook machines. Tested-by: Casey G Bowman <casey.g.bowman@intel.com> Fixes: bcbfcebda2cb ("platform/x86: asus-wmi: add support for vivobook fan profiles") Signed-off-by: Armin Wolf <W_Armin@gmx.de> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20241107003811.615574-2-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> Stable-dep-of: 25fb5f47f34d ("platform/x86: asus-wmi: Ignore return value when writing thermal policy") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Koichiro Den <koichiro.den@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
@@ -3411,10 +3411,28 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
|
||||
/* Throttle thermal policy ****************************************************/
|
||||
static int throttle_thermal_policy_write(struct asus_wmi *asus)
|
||||
{
|
||||
u8 value = asus->throttle_thermal_policy_mode;
|
||||
u32 retval;
|
||||
u8 value;
|
||||
int err;
|
||||
|
||||
if (asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO) {
|
||||
switch (asus->throttle_thermal_policy_mode) {
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
|
||||
value = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO;
|
||||
break;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
|
||||
value = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO;
|
||||
break;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
|
||||
value = ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
value = asus->throttle_thermal_policy_mode;
|
||||
}
|
||||
|
||||
err = asus_wmi_set_devstate(asus->throttle_thermal_policy_dev,
|
||||
value, &retval);
|
||||
|
||||
@@ -3519,46 +3537,6 @@ static ssize_t throttle_thermal_policy_store(struct device *dev,
|
||||
static DEVICE_ATTR_RW(throttle_thermal_policy);
|
||||
|
||||
/* Platform profile ***********************************************************/
|
||||
static int asus_wmi_platform_profile_to_vivo(struct asus_wmi *asus, int mode)
|
||||
{
|
||||
bool vivo;
|
||||
|
||||
vivo = asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO;
|
||||
|
||||
if (vivo) {
|
||||
switch (mode) {
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO;
|
||||
}
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static int asus_wmi_platform_profile_mode_from_vivo(struct asus_wmi *asus, int mode)
|
||||
{
|
||||
bool vivo;
|
||||
|
||||
vivo = asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO;
|
||||
|
||||
if (vivo) {
|
||||
switch (mode) {
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO:
|
||||
return ASUS_THROTTLE_THERMAL_POLICY_SILENT;
|
||||
}
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
|
||||
enum platform_profile_option *profile)
|
||||
{
|
||||
@@ -3568,7 +3546,7 @@ static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
|
||||
asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
|
||||
tp = asus->throttle_thermal_policy_mode;
|
||||
|
||||
switch (asus_wmi_platform_profile_mode_from_vivo(asus, tp)) {
|
||||
switch (tp) {
|
||||
case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
|
||||
*profile = PLATFORM_PROFILE_BALANCED;
|
||||
break;
|
||||
@@ -3607,7 +3585,7 @@ static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
asus->throttle_thermal_policy_mode = asus_wmi_platform_profile_to_vivo(asus, tp);
|
||||
asus->throttle_thermal_policy_mode = tp;
|
||||
return throttle_thermal_policy_write(asus);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user