summarylogtreecommitdiffstats
path: root/0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch
diff options
context:
space:
mode:
Diffstat (limited to '0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch')
-rw-r--r--0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch120
1 files changed, 120 insertions, 0 deletions
diff --git a/0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch b/0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch
new file mode 100644
index 000000000000..276d041715d9
--- /dev/null
+++ b/0002-v4-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-MUX.patch
@@ -0,0 +1,120 @@
+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 2/9] platform/x86: asus-wmi: add support for Vivobook GPU MUX
+Date: Thu, 4 Apr 2024 13:16:45 +1300 [thread overview]
+Message-ID: <20240404001652.86207-3-luke@ljones.dev> (raw)
+In-Reply-To: <20240404001652.86207-1-luke@ljones.dev>
+
+Add support for the Vivobook dgpu MUX available on the ASUS Viviobook
+and some of the other ranges (Zen).
+
+This MUX functions exactly the same as the existing ROG MUX support so
+the existing functionality now detects which MUX is available and uses
+that for control.
+
+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 | 22 +++++++++++++---------
+ include/linux/platform_data/x86/asus-wmi.h | 1 +
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
+index aa2a3b402e33..1ab4380e9771 100644
+--- a/drivers/platform/x86/asus-wmi.c
++++ b/drivers/platform/x86/asus-wmi.c
+@@ -270,7 +270,7 @@ struct asus_wmi {
+ bool egpu_enable_available;
+ bool egpu_connect_available;
+ bool dgpu_disable_available;
+- bool gpu_mux_mode_available;
++ u32 gpu_mux_dev;
+
+ /* Tunables provided by ASUS for gaming laptops */
+ bool ppt_pl2_sppt_available;
+@@ -693,8 +693,8 @@ static ssize_t dgpu_disable_store(struct device *dev,
+ if (disable > 1)
+ return -EINVAL;
+
+- if (asus->gpu_mux_mode_available) {
+- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
++ if (asus->gpu_mux_dev) {
++ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
+ if (result < 0)
+ /* An error here may signal greater failure of GPU handling */
+ return result;
+@@ -759,8 +759,8 @@ static ssize_t egpu_enable_store(struct device *dev,
+ return err;
+ }
+
+- if (asus->gpu_mux_mode_available) {
+- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
++ if (asus->gpu_mux_dev) {
++ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
+ if (result < 0) {
+ /* An error here may signal greater failure of GPU handling */
+ pr_warn("Failed to get gpu mux status: %d\n", result);
+@@ -813,7 +813,7 @@ static ssize_t gpu_mux_mode_show(struct device *dev,
+ struct asus_wmi *asus = dev_get_drvdata(dev);
+ int result;
+
+- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
++ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
+ if (result < 0)
+ return result;
+
+@@ -859,7 +859,7 @@ static ssize_t gpu_mux_mode_store(struct device *dev,
+ }
+ }
+
+- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_MUX, optimus, &result);
++ err = asus_wmi_set_devstate(asus->gpu_mux_dev, optimus, &result);
+ if (err) {
+ dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
+ return err;
+@@ -4239,7 +4239,7 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
+ else if (attr == &dev_attr_dgpu_disable.attr)
+ ok = asus->dgpu_disable_available;
+ else if (attr == &dev_attr_gpu_mux_mode.attr)
+- ok = asus->gpu_mux_mode_available;
++ ok = asus->gpu_mux_dev != 0;
+ else if (attr == &dev_attr_fan_boost_mode.attr)
+ ok = asus->fan_boost_mode_available;
+ else if (attr == &dev_attr_throttle_thermal_policy.attr)
+@@ -4505,7 +4505,6 @@ static int asus_wmi_add(struct platform_device *pdev)
+ 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->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX);
+ asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE);
+ 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);
+@@ -4524,6 +4523,11 @@ static int asus_wmi_add(struct platform_device *pdev)
+ else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE2))
+ asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE2;
+
++ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX))
++ asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX;
++ else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX_VIVO))
++ asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX_VIVO;
++
+ err = fan_boost_mode_check_present(asus);
+ if (err)
+ goto fail_fan_boost_mode;
+diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
+index 9cadce10ad9a..b48b024dd844 100644
+--- a/include/linux/platform_data/x86/asus-wmi.h
++++ b/include/linux/platform_data/x86/asus-wmi.h
+@@ -128,6 +128,7 @@
+
+ /* gpu mux switch, 0 = dGPU, 1 = Optimus */
+ #define ASUS_WMI_DEVID_GPU_MUX 0x00090016
++#define ASUS_WMI_DEVID_GPU_MUX_VIVO 0x00090026
+
+ /* TUF laptop RGB modes/colours */
+ #define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056
+--
+2.44.0