Message ID | 20240620082223.20178-3-dev@doubly.so (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | platform/x86: asus-wmi: support a couple Zenbook 2023 features | expand |
On Thu, 20 Jun 2024, at 8:22 PM, Devin Bayer wrote: > Support changing the fan mode (silent, performance, standard). I reused > the existing fan_boost_mode sysfs entry. > > Signed-off-by: Devin Bayer <dev@doubly.so> > --- > drivers/platform/x86/asus-wmi.c | 87 ++++++++++++++++++++-- > include/linux/platform_data/x86/asus-wmi.h | 1 + > 2 files changed, 82 insertions(+), 6 deletions(-) > > diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c > index 5585f15e7920..e27b8f86d57b 100644 > --- a/drivers/platform/x86/asus-wmi.c > +++ b/drivers/platform/x86/asus-wmi.c > @@ -73,7 +73,6 @@ module_param(fnlock_default, bool, 0444); > #define NOTIFY_LID_FLIP_ROG 0xbd > > #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0) > -#define ASUS_WMI_DEVID_CAMERA_LED 0x00060079 Be careful not to introduce extraneous changes. > > #define ASUS_MID_FAN_DESC "mid_fan" > #define ASUS_GPU_FAN_DESC "gpu_fan" > @@ -94,6 +93,10 @@ module_param(fnlock_default, bool, 0444); > #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02 > #define ASUS_FAN_BOOST_MODES_MASK 0x03 > > +#define ASUS_FAN_BOOST_MODE2_NORMAL 0 > +#define ASUS_FAN_BOOST_MODE2_SILENT 1 > +#define ASUS_FAN_BOOST_MODE2_OVERBOOST 2 > + > #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0 > #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1 > #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2 > @@ -268,6 +271,7 @@ struct asus_wmi { > int agfn_pwm; > > bool fan_boost_mode_available; > + u32 fan_boost_mode_dev_id; > u8 fan_boost_mode_mask; > u8 fan_boost_mode; > > @@ -3019,14 +3023,14 @@ static int asus_wmi_fan_init(struct asus_wmi *asus) > > /* Fan mode *******************************************************************/ > > -static int fan_boost_mode_check_present(struct asus_wmi *asus) > +static int fan_boost_mode1_check_present(struct asus_wmi *asus) > { > u32 result; > int err; > > - asus->fan_boost_mode_available = false; > + asus->fan_boost_mode_dev_id = ASUS_WMI_DEVID_FAN_BOOST_MODE; > > - err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE, > + err = asus_wmi_get_devstate(asus, asus->fan_boost_mode_dev_id, > &result); > if (err) { > if (err == -ENODEV) > @@ -3044,16 +3048,87 @@ static int fan_boost_mode_check_present(struct asus_wmi *asus) > return 0; > } > > +static int fan_boost_mode2_check_present(struct asus_wmi *asus) > +{ > + u32 result; > + int err; > + > + asus->fan_boost_mode_mask = ASUS_FAN_BOOST_MODES_MASK; > + asus->fan_boost_mode_dev_id = ASUS_WMI_DEVID_FAN_BOOST_MODE2; > + > + err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE2, > + &result); > + if (err) { > + if (err == -ENODEV) > + return 0; > + else > + return err; > + } > + > + if (! (result & ASUS_WMI_DSTS_PRESENCE_BIT)) > + return 0; > + > + asus->fan_boost_mode_available = true; > + > + if (result & ASUS_FAN_BOOST_MODE2_SILENT) { > + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT; > + } else if(result & ASUS_FAN_BOOST_MODE2_OVERBOOST) { > + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST; > + } else { > + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL; > + } > + > + return 0; > +} > + > +static int fan_boost_mode_check_present(struct asus_wmi *asus) > +{ > + int err; > + > + asus->fan_boost_mode_available = false; > + > + err = fan_boost_mode1_check_present(asus); > + if (err) > + return err; > + > + if (!asus->fan_boost_mode_available) { > + err = fan_boost_mode2_check_present(asus); > + } > + > + return err; > +} > + > static int fan_boost_mode_write(struct asus_wmi *asus) > { > u32 retval; > u8 value; > + u8 hw_value; > int err; > > value = asus->fan_boost_mode; > > - pr_info("Set fan boost mode: %u\n", value); > - err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value, > + /* transform userspace values into hardware values */ > + if(asus->fan_boost_mode_dev_id == ASUS_WMI_DEVID_FAN_BOOST_MODE2) { > + switch(value) { > + case ASUS_FAN_BOOST_MODE_SILENT: > + hw_value = ASUS_FAN_BOOST_MODE2_SILENT; > + break; > + case ASUS_FAN_BOOST_MODE_OVERBOOST: > + hw_value = ASUS_FAN_BOOST_MODE2_OVERBOOST; > + break; > + case ASUS_FAN_BOOST_MODE_NORMAL: > + hw_value = ASUS_FAN_BOOST_MODE2_NORMAL; > + break; > + default: > + return -EINVAL; > + > + } > + } else { > + hw_value = value; > + } > + > + pr_info("Set fan boost mode: user=%u hw=%u\n", value, hw_value); > + err = asus_wmi_set_devstate(asus->fan_boost_mode_dev_id, hw_value, > &retval); > > sysfs_notify(&asus->platform_device->dev.kobj, NULL, > diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h > index b3c35e33f1e7..62982f67d632 100644 > --- a/include/linux/platform_data/x86/asus-wmi.h > +++ b/include/linux/platform_data/x86/asus-wmi.h > @@ -65,6 +65,7 @@ > /* Writing a brightness re-enables the screen if disabled */ > #define ASUS_WMI_DEVID_SCREENPAD_LIGHT 0x00050032 > #define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018 > +#define ASUS_WMI_DEVID_FAN_BOOST_MODE2 0x00110019 > #define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075 > > /* Misc */ > -- > 2.45.2 > > Thank you for the work on this. But I must point out that the same 0x00110019 method has already been submitted as a patch to work with the existing "throttle_thermal" functionality, which itself is also tied to platoform_profile class support. See https://lore.kernel.org/platform-driver-x86/20240609144849.2532-1-mohamed.ghanmi@supcom.tn/T/#mcd18e74676084e21d5c15af84bc08d8c6b375fb9 If you could submit only the first patch instead please?
On 20/06/2024 23.17, Luke Jones wrote: > >> #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0) >> -#define ASUS_WMI_DEVID_CAMERA_LED 0x00060079 > > Be careful not to introduce extraneous changes. Yes, will do. > Thank you for the work on this. But I must point out that the same 0x00110019 method has already been submitted as a patch to work with the existing "throttle_thermal" functionality, which itself is also tied to platoform_profile class support. > > See https://lore.kernel.org/platform-driver-x86/20240609144849.2532-1-mohamed.ghanmi@supcom.tn/T/#mcd18e74676084e21d5c15af84bc08d8c6b375fb9 I see that now. > If you could submit only the first patch instead please? I'll followup on this topic in the other thread. ~ Dev
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 5585f15e7920..e27b8f86d57b 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -73,7 +73,6 @@ module_param(fnlock_default, bool, 0444); #define NOTIFY_LID_FLIP_ROG 0xbd #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0) -#define ASUS_WMI_DEVID_CAMERA_LED 0x00060079 #define ASUS_MID_FAN_DESC "mid_fan" #define ASUS_GPU_FAN_DESC "gpu_fan" @@ -94,6 +93,10 @@ module_param(fnlock_default, bool, 0444); #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02 #define ASUS_FAN_BOOST_MODES_MASK 0x03 +#define ASUS_FAN_BOOST_MODE2_NORMAL 0 +#define ASUS_FAN_BOOST_MODE2_SILENT 1 +#define ASUS_FAN_BOOST_MODE2_OVERBOOST 2 + #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2 @@ -268,6 +271,7 @@ struct asus_wmi { int agfn_pwm; bool fan_boost_mode_available; + u32 fan_boost_mode_dev_id; u8 fan_boost_mode_mask; u8 fan_boost_mode; @@ -3019,14 +3023,14 @@ static int asus_wmi_fan_init(struct asus_wmi *asus) /* Fan mode *******************************************************************/ -static int fan_boost_mode_check_present(struct asus_wmi *asus) +static int fan_boost_mode1_check_present(struct asus_wmi *asus) { u32 result; int err; - asus->fan_boost_mode_available = false; + asus->fan_boost_mode_dev_id = ASUS_WMI_DEVID_FAN_BOOST_MODE; - err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE, + err = asus_wmi_get_devstate(asus, asus->fan_boost_mode_dev_id, &result); if (err) { if (err == -ENODEV) @@ -3044,16 +3048,87 @@ static int fan_boost_mode_check_present(struct asus_wmi *asus) return 0; } +static int fan_boost_mode2_check_present(struct asus_wmi *asus) +{ + u32 result; + int err; + + asus->fan_boost_mode_mask = ASUS_FAN_BOOST_MODES_MASK; + asus->fan_boost_mode_dev_id = ASUS_WMI_DEVID_FAN_BOOST_MODE2; + + err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE2, + &result); + if (err) { + if (err == -ENODEV) + return 0; + else + return err; + } + + if (! (result & ASUS_WMI_DSTS_PRESENCE_BIT)) + return 0; + + asus->fan_boost_mode_available = true; + + if (result & ASUS_FAN_BOOST_MODE2_SILENT) { + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT; + } else if(result & ASUS_FAN_BOOST_MODE2_OVERBOOST) { + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST; + } else { + asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL; + } + + return 0; +} + +static int fan_boost_mode_check_present(struct asus_wmi *asus) +{ + int err; + + asus->fan_boost_mode_available = false; + + err = fan_boost_mode1_check_present(asus); + if (err) + return err; + + if (!asus->fan_boost_mode_available) { + err = fan_boost_mode2_check_present(asus); + } + + return err; +} + static int fan_boost_mode_write(struct asus_wmi *asus) { u32 retval; u8 value; + u8 hw_value; int err; value = asus->fan_boost_mode; - pr_info("Set fan boost mode: %u\n", value); - err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value, + /* transform userspace values into hardware values */ + if(asus->fan_boost_mode_dev_id == ASUS_WMI_DEVID_FAN_BOOST_MODE2) { + switch(value) { + case ASUS_FAN_BOOST_MODE_SILENT: + hw_value = ASUS_FAN_BOOST_MODE2_SILENT; + break; + case ASUS_FAN_BOOST_MODE_OVERBOOST: + hw_value = ASUS_FAN_BOOST_MODE2_OVERBOOST; + break; + case ASUS_FAN_BOOST_MODE_NORMAL: + hw_value = ASUS_FAN_BOOST_MODE2_NORMAL; + break; + default: + return -EINVAL; + + } + } else { + hw_value = value; + } + + pr_info("Set fan boost mode: user=%u hw=%u\n", value, hw_value); + err = asus_wmi_set_devstate(asus->fan_boost_mode_dev_id, hw_value, &retval); sysfs_notify(&asus->platform_device->dev.kobj, NULL, diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h index b3c35e33f1e7..62982f67d632 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -65,6 +65,7 @@ /* Writing a brightness re-enables the screen if disabled */ #define ASUS_WMI_DEVID_SCREENPAD_LIGHT 0x00050032 #define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018 +#define ASUS_WMI_DEVID_FAN_BOOST_MODE2 0x00110019 #define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075 /* Misc */
Support changing the fan mode (silent, performance, standard). I reused the existing fan_boost_mode sysfs entry. Signed-off-by: Devin Bayer <dev@doubly.so> --- drivers/platform/x86/asus-wmi.c | 87 ++++++++++++++++++++-- include/linux/platform_data/x86/asus-wmi.h | 1 + 2 files changed, 82 insertions(+), 6 deletions(-)