summarylogtreecommitdiffstats
path: root/0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch
diff options
context:
space:
mode:
Diffstat (limited to '0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch')
-rw-r--r--0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch266
1 files changed, 266 insertions, 0 deletions
diff --git a/0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch b/0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch
new file mode 100644
index 000000000000..13552ca342ef
--- /dev/null
+++ b/0005-v4-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch
@@ -0,0 +1,266 @@
+From: "Luke D. Jones" <luke@ljones.dev>
+To: hdegoede@redhat.com
+Cc: corentin.chary@gmail.com, ilpo.jarvinen@linux.intel.com,
+ platform-driver-x86@vger.kernel.org,
+ linux-kernel@vger.kernel.org, "Luke D. Jones" <luke@ljones.dev>
+Subject: [PATCH v4 5/9] platform/x86: asus-wmi: store a min default for ppt options
+Date: Thu, 4 Apr 2024 13:16:48 +1300 [thread overview]
+Message-ID: <20240404001652.86207-6-luke@ljones.dev> (raw)
+In-Reply-To: <20240404001652.86207-1-luke@ljones.dev>
+
+Laptops with any of the ppt or nv tunables default to the minimum setting
+on boot so we can safely assume a stored value is correct.
+
+This patch adds storing of those values in the local struct, and enables
+reading of those values back. To prevent creating a series of byte holes
+in the struct the "<name>_available" bool is removed and
+`asus_sysfs_is_visible()` uses the `ASUS_WMI_DEVID_<name>` directly.
+
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Luke D. Jones <luke@ljones.dev>
+---
+ drivers/platform/x86/asus-wmi.c | 127 +++++++++++++++++++++++++-------
+ 1 file changed, 99 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
+index 6c353b8e8da9..f13606fc62e6 100644
+--- a/drivers/platform/x86/asus-wmi.c
++++ b/drivers/platform/x86/asus-wmi.c
+@@ -273,13 +273,13 @@ struct asus_wmi {
+ u32 gpu_mux_dev;
+
+ /* Tunables provided by ASUS for gaming laptops */
+- bool ppt_pl2_sppt_available;
+- bool ppt_pl1_spl_available;
+- bool ppt_apu_sppt_available;
+- bool ppt_plat_sppt_available;
+- bool ppt_fppt_available;
+- bool nv_dyn_boost_available;
+- bool nv_temp_tgt_available;
++ 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;
+
+ u32 kbd_rgb_dev;
+ bool kbd_rgb_state_available;
+@@ -1031,11 +1031,21 @@ static ssize_t ppt_pl2_sppt_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->ppt_pl2_sppt = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(ppt_pl2_sppt);
++
++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,
+@@ -1065,11 +1075,20 @@ static ssize_t ppt_pl1_spl_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->ppt_pl1_spl = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(ppt_pl1_spl);
++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,
+@@ -1099,11 +1118,21 @@ static ssize_t ppt_fppt_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->ppt_fppt = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(ppt_fppt);
++
++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,
+@@ -1133,11 +1162,21 @@ static ssize_t ppt_apu_sppt_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->ppt_apu_sppt = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(ppt_apu_sppt);
++
++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,
+@@ -1167,11 +1206,21 @@ static ssize_t ppt_platform_sppt_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->ppt_platform_sppt = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(ppt_platform_sppt);
++
++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,
+@@ -1201,11 +1250,21 @@ static ssize_t nv_dynamic_boost_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->nv_dynamic_boost = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(nv_dynamic_boost);
++
++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,
+@@ -1235,11 +1294,21 @@ static ssize_t nv_temp_target_store(struct device *dev,
+ return -EIO;
+ }
+
++ asus->nv_temp_target = value;
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target");
+
+ return count;
+ }
+-static DEVICE_ATTR_WO(nv_temp_target);
++
++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);
+
+ /* Battery ********************************************************************/
+
+@@ -4295,19 +4364,19 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
+ else if (attr == &dev_attr_throttle_thermal_policy.attr)
+ ok = asus->throttle_thermal_policy_available;
+ else if (attr == &dev_attr_ppt_pl2_sppt.attr)
+- ok = asus->ppt_pl2_sppt_available;
++ devid = ASUS_WMI_DEVID_PPT_PL2_SPPT;
+ else if (attr == &dev_attr_ppt_pl1_spl.attr)
+- ok = asus->ppt_pl1_spl_available;
++ devid = ASUS_WMI_DEVID_PPT_PL1_SPL;
+ else if (attr == &dev_attr_ppt_fppt.attr)
+- ok = asus->ppt_fppt_available;
++ devid = ASUS_WMI_DEVID_PPT_FPPT;
+ else if (attr == &dev_attr_ppt_apu_sppt.attr)
+- ok = asus->ppt_apu_sppt_available;
++ devid = ASUS_WMI_DEVID_PPT_APU_SPPT;
+ else if (attr == &dev_attr_ppt_platform_sppt.attr)
+- ok = asus->ppt_plat_sppt_available;
++ devid = ASUS_WMI_DEVID_PPT_PLAT_SPPT;
+ else if (attr == &dev_attr_nv_dynamic_boost.attr)
+- ok = asus->nv_dyn_boost_available;
++ devid = ASUS_WMI_DEVID_NV_DYN_BOOST;
+ else if (attr == &dev_attr_nv_temp_target.attr)
+- ok = asus->nv_temp_tgt_available;
++ devid = ASUS_WMI_DEVID_NV_THERM_TARGET;
+ else if (attr == &dev_attr_boot_sound.attr)
+ devid = ASUS_WMI_DEVID_BOOT_SOUND;
+ else if (attr == &dev_attr_panel_od.attr)
+@@ -4553,18 +4622,20 @@ 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;
++
+ asus->charge_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CHARGE_MODE);
+ asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
+ asus->egpu_connect_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
+ 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);
+- asus->ppt_pl2_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL2_SPPT);
+- asus->ppt_pl1_spl_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL1_SPL);
+- asus->ppt_fppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_FPPT);
+- asus->ppt_apu_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_APU_SPPT);
+- asus->ppt_plat_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PLAT_SPPT);
+- asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
+- asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
+ asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
+ asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
+ && dmi_match(DMI_BOARD_NAME, "RC71L");
+--
+2.44.0