diff options
Diffstat (limited to '0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch')
-rw-r--r-- | 0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch | 600 |
1 files changed, 600 insertions, 0 deletions
diff --git a/0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch b/0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch new file mode 100644 index 000000000000..5623ec594dc2 --- /dev/null +++ b/0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch @@ -0,0 +1,600 @@ +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 8c957d8fe74e..e266966d015c 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -117,15 +117,17 @@ module_param(fnlock_default, bool, 0444); + /* Mask to determine if setting temperature or percentage */ + #define FAN_CURVE_PWM_MASK 0x04 + +-/* Limits for tunables available on ASUS ROG laptops */ ++/* Default limits for tunables available on ASUS ROG laptops */ + #define PPT_TOTAL_MIN 5 +-#define PPT_TOTAL_MAX 250 +-#define PPT_CPU_MIN 5 +-#define PPT_CPU_MAX 130 ++#define PPT_TOTAL_DEFAULT 80 ++#define PPT_TOTAL_MAX_DEFAULT 150 ++#define PPT_CPU_MIN 5 ++#define PPT_CPU_DEFAULT 80 ++#define PPT_CPU_MAX_DEFAULT 100 + #define NVIDIA_BOOST_MIN 5 +-#define NVIDIA_BOOST_MAX 25 ++#define NVIDIA_BOOST_MAX_DEFAULT 25 + #define NVIDIA_TEMP_MIN 75 +-#define NVIDIA_TEMP_MAX 87 ++#define NVIDIA_TEMP_MAX_DEFAULT 87 + + #define ASUS_SCREENPAD_BRIGHT_MIN 20 + #define ASUS_SCREENPAD_BRIGHT_MAX 255 +@@ -224,6 +226,23 @@ struct fan_curve_data { + u8 percents[FAN_CURVE_POINTS]; + }; + ++/* Tunables provided by ASUS for gaming laptops */ ++struct rog_tunables { ++ u32 total_max; ++ u32 cpu_max; ++ ++ u32 ppt_pl1_spl; // sustained limit, total_max ++ u32 ppt_pl2_sppt; ++ u32 ppt_apu_sppt; // cpu_max ++ u32 ppt_platform_sppt; ++ u32 ppt_fppt; ++ ++ u32 nv_dynamic_boost_max; ++ u32 nv_dynamic_boost; ++ u32 nv_temp_target_max; ++ u32 nv_temp_target; ++}; ++ + struct asus_wmi { + int dsts_id; + int spec; +@@ -278,14 +297,7 @@ struct asus_wmi { + bool dgpu_disable_available; + u32 gpu_mux_dev; + +- /* Tunables provided by ASUS for gaming laptops */ +- u32 ppt_pl2_sppt; +- u32 ppt_pl1_spl; +- u32 ppt_apu_sppt; +- u32 ppt_platform_sppt; +- u32 ppt_fppt; +- u32 nv_dynamic_boost; +- u32 nv_temp_target; ++ struct rog_tunables rog_tunables; + + u32 kbd_rgb_dev; + bool kbd_rgb_state_available; +@@ -648,6 +660,105 @@ static void asus_wmi_input_exit(struct asus_wmi *asus) + asus->inputdev = NULL; + } + ++/* Helper macros for generalised WMI calls */ ++ ++/* Generic store function for use with many ROG tunables */ ++static ssize_t rog_tunable_store(struct asus_wmi *asus, ++ struct attribute *attr, ++ const char *buf, size_t count, ++ u32 min, u32 max, u32 *store_value, u32 wmi_dev) ++{ ++ int result, err; ++ u32 value; ++ ++ result = kstrtou32(buf, 10, &value); ++ if (result) ++ return result; ++ ++ if (value < min || value > max) ++ return -EINVAL; ++ ++ err = asus_wmi_set_devstate(wmi_dev, value, &result); ++ if (err) { ++ pr_warn("Failed to set %s: %d\n", attr->name, err); ++ return err; ++ } ++ ++ if (result > 1) { ++ pr_warn("Failed to set %s (result): 0x%x\n", attr->name, result); ++ return -EIO; ++ } ++ ++ if (store_value != NULL) ++ *store_value = value; ++ sysfs_notify(&asus->platform_device->dev.kobj, NULL, attr->name); ++ ++ return count; ++} ++ ++#define ROG_TUNABLE_STORE(_fname, _min, _max, _wmi) \ ++static ssize_t _fname##_store(struct device *dev, \ ++ struct device_attribute *attr, const char *buf, size_t count) \ ++{ \ ++ struct asus_wmi *asus = dev_get_drvdata(dev); \ ++ return rog_tunable_store(asus, &attr->attr, buf, count, \ ++ _min, asus->rog_tunables._max, \ ++ &asus->rog_tunables._fname, _wmi); \ ++} ++ ++#define ROG_TUNABLE_SHOW(_fname) \ ++static ssize_t _fname##_show(struct device *dev, \ ++ struct device_attribute *attr, char *buf) \ ++{ \ ++ struct asus_wmi *asus = dev_get_drvdata(dev); \ ++ return sysfs_emit(buf, "%u\n", asus->rog_tunables._fname); \ ++} ++ ++#define ROG_TUNABLE_MIN_SHOW(_fname, _minv) \ ++static ssize_t _fname##_min_show(struct device *dev, \ ++ struct device_attribute *attr, char *buf) \ ++{ \ ++ return sysfs_emit(buf, "%u\n", _minv); \ ++} ++ ++#define ROG_TUNABLE_MAX_SHOW(_fname, _maxv) \ ++static ssize_t _fname##_max_show(struct device *dev, \ ++ struct device_attribute *attr, char *buf) \ ++{ \ ++ struct asus_wmi *asus = dev_get_drvdata(dev); \ ++ return sysfs_emit(buf, "%u\n", asus->rog_tunables._maxv); \ ++} ++ ++#define ROG_ATTR_RW(_fname, _minv, _maxv, _wmi) \ ++ROG_TUNABLE_STORE(_fname, _minv, _maxv, _wmi); \ ++ROG_TUNABLE_SHOW(_fname); \ ++static DEVICE_ATTR_RW(_fname); \ ++ROG_TUNABLE_MIN_SHOW(_fname, _minv); \ ++static DEVICE_ATTR_RO(_fname##_min); \ ++ROG_TUNABLE_MAX_SHOW(_fname, _maxv); \ ++static DEVICE_ATTR_RO(_fname##_max); ++ ++/* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/ ++ROG_ATTR_RW(ppt_pl1_spl, PPT_TOTAL_MIN, total_max, ASUS_WMI_DEVID_PPT_PL1_SPL); ++ ++/* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/ ++ROG_ATTR_RW(ppt_pl2_sppt, PPT_TOTAL_MIN, total_max, ASUS_WMI_DEVID_PPT_PL2_SPPT); ++ ++/* Tunable: PPT APU FPPT ******************************************************/ ++ROG_ATTR_RW(ppt_fppt, PPT_TOTAL_MIN, total_max, ASUS_WMI_DEVID_PPT_FPPT); ++ ++/* Tunable: PPT APU SPPT *****************************************************/ ++ROG_ATTR_RW(ppt_apu_sppt, PPT_CPU_MIN, cpu_max, ASUS_WMI_DEVID_PPT_APU_SPPT); ++ ++/* Tunable: PPT platform SPPT ************************************************/ ++ROG_ATTR_RW(ppt_platform_sppt, PPT_CPU_MIN, cpu_max, ASUS_WMI_DEVID_PPT_PLAT_SPPT); ++ ++/* Tunable: NVIDIA dynamic boost *********************************************/ ++ROG_ATTR_RW(nv_dynamic_boost, NVIDIA_BOOST_MIN, nv_dynamic_boost_max, ASUS_WMI_DEVID_NV_DYN_BOOST); ++ ++/* Tunable: NVIDIA temperature target ****************************************/ ++ROG_ATTR_RW(nv_temp_target, NVIDIA_TEMP_MIN, nv_temp_target_max, ASUS_WMI_DEVID_NV_THERM_TARGET); ++ + /* Tablet mode ****************************************************************/ + + static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) +@@ -1033,306 +1144,6 @@ static const struct attribute_group *kbd_rgb_mode_groups[] = { + NULL, + }; + +-/* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/ +-static ssize_t ppt_pl2_sppt_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL2_SPPT, value, &result); +- if (err) { +- pr_warn("Failed to set ppt_pl2_sppt: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set ppt_pl2_sppt (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->ppt_pl2_sppt = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt"); +- +- return count; +-} +- +-static ssize_t ppt_pl2_sppt_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->ppt_pl2_sppt); +-} +-static DEVICE_ATTR_RW(ppt_pl2_sppt); +- +-/* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/ +-static ssize_t ppt_pl1_spl_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL1_SPL, value, &result); +- if (err) { +- pr_warn("Failed to set ppt_pl1_spl: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set ppt_pl1_spl (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->ppt_pl1_spl = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl"); +- +- return count; +-} +-static ssize_t ppt_pl1_spl_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->ppt_pl1_spl); +-} +-static DEVICE_ATTR_RW(ppt_pl1_spl); +- +-/* Tunable: PPT APU FPPT ******************************************************/ +-static ssize_t ppt_fppt_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_FPPT, value, &result); +- if (err) { +- pr_warn("Failed to set ppt_fppt: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set ppt_fppt (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->ppt_fppt = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt"); +- +- return count; +-} +- +-static ssize_t ppt_fppt_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->ppt_fppt); +-} +-static DEVICE_ATTR_RW(ppt_fppt); +- +-/* Tunable: PPT APU SPPT *****************************************************/ +-static ssize_t ppt_apu_sppt_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < PPT_CPU_MIN || value > PPT_CPU_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_APU_SPPT, value, &result); +- if (err) { +- pr_warn("Failed to set ppt_apu_sppt: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set ppt_apu_sppt (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->ppt_apu_sppt = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt"); +- +- return count; +-} +- +-static ssize_t ppt_apu_sppt_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->ppt_apu_sppt); +-} +-static DEVICE_ATTR_RW(ppt_apu_sppt); +- +-/* Tunable: PPT platform SPPT ************************************************/ +-static ssize_t ppt_platform_sppt_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < PPT_CPU_MIN || value > PPT_CPU_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PLAT_SPPT, value, &result); +- if (err) { +- pr_warn("Failed to set ppt_platform_sppt: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set ppt_platform_sppt (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->ppt_platform_sppt = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt"); +- +- return count; +-} +- +-static ssize_t ppt_platform_sppt_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->ppt_platform_sppt); +-} +-static DEVICE_ATTR_RW(ppt_platform_sppt); +- +-/* Tunable: NVIDIA dynamic boost *********************************************/ +-static ssize_t nv_dynamic_boost_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < NVIDIA_BOOST_MIN || value > NVIDIA_BOOST_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_DYN_BOOST, value, &result); +- if (err) { +- pr_warn("Failed to set nv_dynamic_boost: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set nv_dynamic_boost (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->nv_dynamic_boost = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost"); +- +- return count; +-} +- +-static ssize_t nv_dynamic_boost_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->nv_dynamic_boost); +-} +-static DEVICE_ATTR_RW(nv_dynamic_boost); +- +-/* Tunable: NVIDIA temperature target ****************************************/ +-static ssize_t nv_temp_target_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, err; +- u32 value; +- +- result = kstrtou32(buf, 10, &value); +- if (result) +- return result; +- +- if (value < NVIDIA_TEMP_MIN || value > NVIDIA_TEMP_MAX) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_THERM_TARGET, value, &result); +- if (err) { +- pr_warn("Failed to set nv_temp_target: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set nv_temp_target (result): 0x%x\n", result); +- return -EIO; +- } +- +- asus->nv_temp_target = value; +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target"); +- +- return count; +-} +- +-static ssize_t nv_temp_target_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- return sysfs_emit(buf, "%u\n", asus->nv_temp_target); +-} +-static DEVICE_ATTR_RW(nv_temp_target); +- + /* Ally MCU Powersave ********************************************************/ + static ssize_t mcu_powersave_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -4405,13 +4216,27 @@ static struct attribute *platform_attributes[] = { + &dev_attr_als_enable.attr, + &dev_attr_fan_boost_mode.attr, + &dev_attr_throttle_thermal_policy.attr, +- &dev_attr_ppt_pl2_sppt.attr, + &dev_attr_ppt_pl1_spl.attr, ++ &dev_attr_ppt_pl1_spl_min.attr, ++ &dev_attr_ppt_pl1_spl_max.attr, ++ &dev_attr_ppt_pl2_sppt.attr, ++ &dev_attr_ppt_pl2_sppt_min.attr, ++ &dev_attr_ppt_pl2_sppt_max.attr, + &dev_attr_ppt_fppt.attr, ++ &dev_attr_ppt_fppt_min.attr, ++ &dev_attr_ppt_fppt_max.attr, + &dev_attr_ppt_apu_sppt.attr, ++ &dev_attr_ppt_apu_sppt_min.attr, ++ &dev_attr_ppt_apu_sppt_max.attr, + &dev_attr_ppt_platform_sppt.attr, ++ &dev_attr_ppt_platform_sppt_min.attr, ++ &dev_attr_ppt_platform_sppt_max.attr, + &dev_attr_nv_dynamic_boost.attr, ++ &dev_attr_nv_dynamic_boost_min.attr, ++ &dev_attr_nv_dynamic_boost_max.attr, + &dev_attr_nv_temp_target.attr, ++ &dev_attr_nv_temp_target_min.attr, ++ &dev_attr_nv_temp_target_max.attr, + &dev_attr_mcu_powersave.attr, + &dev_attr_boot_sound.attr, + &dev_attr_panel_od.attr, +@@ -4690,6 +4515,72 @@ static void asus_wmi_debugfs_init(struct asus_wmi *asus) + + /* Init / exit ****************************************************************/ + ++/* Set up the min/max and defaults for ROG tunables */ ++static void init_rog_tunables(struct asus_wmi *asus) ++{ ++ const char *product; ++ u32 max_boost = NVIDIA_BOOST_MAX_DEFAULT; ++ u32 total_default = PPT_TOTAL_DEFAULT; ++ u32 total_max = PPT_TOTAL_MAX_DEFAULT; ++ u32 cpu_default = PPT_CPU_DEFAULT; ++ u32 cpu_max = PPT_CPU_MAX_DEFAULT; ++ ++ /* ++ * ASUS product_name contains everything required, e.g, ++ * "ROG Flow X16 GV601VV_GV601VV_00185149B" ++ */ ++ product = dmi_get_system_info(DMI_PRODUCT_NAME); ++ ++ if (strstr(product, "GA402R")) { ++ total_default = 125; ++ } else if (strstr(product, "13QY")) { ++ total_max = 250; ++ } else if (strstr(product, "X13")) { ++ total_max = 75; ++ total_default = 50; ++ } else if (strstr(product, "RC71")) { ++ total_max = 50; ++ total_default = 30; ++ } else if (strstr(product, "G814") ++ || strstr(product, "G614") ++ || strstr(product, "G834") ++ || strstr(product, "G634")) { ++ total_max = 175; ++ } else if (strstr(product, "GA402X") ++ || strstr(product, "GA403") ++ || strstr(product, "FA507N") ++ || strstr(product, "FA507X") ++ || strstr(product, "FA707N") ++ || strstr(product, "FA707X")) { ++ total_max = 90; ++ } ++ ++ if (strstr(product, "GZ301ZE")) { ++ max_boost = 5; ++ } else if (strstr(product, "FX507ZC4")) { ++ max_boost = 15; ++ } else if (strstr(product, "GU605")) { ++ max_boost = 20; ++ } ++ ++ /* ensure defaults for tunables */ ++ asus->rog_tunables.total_max = total_max; ++ asus->rog_tunables.cpu_max = cpu_max; ++ ++ asus->rog_tunables.ppt_pl1_spl = total_default; ++ asus->rog_tunables.ppt_pl2_sppt = total_default; ++ asus->rog_tunables.ppt_apu_sppt = total_default; ++ ++ asus->rog_tunables.ppt_platform_sppt = cpu_default; ++ asus->rog_tunables.ppt_fppt = cpu_default; ++ ++ asus->rog_tunables.nv_dynamic_boost_max = max_boost; ++ asus->rog_tunables.nv_dynamic_boost = NVIDIA_BOOST_MIN; ++ asus->rog_tunables.nv_temp_target_max = NVIDIA_TEMP_MAX_DEFAULT; ++ asus->rog_tunables.nv_temp_target = NVIDIA_TEMP_MIN; ++ ++} ++ + static int asus_wmi_add(struct platform_device *pdev) + { + struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver); +@@ -4715,15 +4606,7 @@ static int asus_wmi_add(struct platform_device *pdev) + if (err) + goto fail_platform; + +- /* ensure defaults for tunables */ +- asus->ppt_pl2_sppt = 5; +- asus->ppt_pl1_spl = 5; +- asus->ppt_apu_sppt = 5; +- asus->ppt_platform_sppt = 5; +- asus->ppt_fppt = 5; +- asus->nv_dynamic_boost = 5; +- asus->nv_temp_target = 75; +- ++ init_rog_tunables(asus); + asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU); + asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU); + asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE); |