diff options
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-0041-asus-wmi-Add-egpu-enable-method.patch')
-rw-r--r-- | sys-kernel_arch-sources-g14_files-0041-asus-wmi-Add-egpu-enable-method.patch | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/sys-kernel_arch-sources-g14_files-0041-asus-wmi-Add-egpu-enable-method.patch b/sys-kernel_arch-sources-g14_files-0041-asus-wmi-Add-egpu-enable-method.patch deleted file mode 100644 index 13804605dc37..000000000000 --- a/sys-kernel_arch-sources-g14_files-0041-asus-wmi-Add-egpu-enable-method.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 49872973ce89a5778cd57094eb2eebba530b1244 Mon Sep 17 00:00:00 2001 -From: "Luke D. Jones" <luke@ljones.dev> -Date: Sat, 17 Jul 2021 20:13:23 +1200 -Subject: [PATCH 103/103] asus-wmi: Add egpu enable method - -The X13 Flow laptops can utilise an external GPU. This requires -toggling an ACPI method which will first disable the internal -dGPU, and then enable the eGPU. - -Signed-off-by: Luke D. Jones <luke@ljones.dev> ---- - drivers/platform/x86/asus-wmi.c | 91 ++++++++++++++++++++++ - include/linux/platform_data/x86/asus-wmi.h | 3 + - 2 files changed, 94 insertions(+) - -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 02762a60d27a..ee5d8656641e 100644 ---- a/drivers/platform/x86/asus-wmi.c -+++ b/drivers/platform/x86/asus-wmi.c -@@ -210,6 +210,9 @@ struct asus_wmi { - u8 fan_boost_mode_mask; - u8 fan_boost_mode; - -+ bool egpu_enable_available; // 0 = enable -+ bool egpu_enable; -+ - bool dgpu_disable_available; - bool dgpu_disable; - -@@ -430,6 +433,86 @@ static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus) - } - } - -+/* eGPU ********************************************************************/ -+static int egpu_enable_check_present(struct asus_wmi *asus) -+{ -+ u32 result; -+ int err; -+ -+ asus->egpu_enable_available = false; -+ -+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_EGPU, &result); -+ if (err) { -+ if (err == -ENODEV) -+ return 0; -+ return err; -+ } -+ -+ if (result & ASUS_WMI_DSTS_PRESENCE_BIT) { -+ asus->egpu_enable_available = true; -+ asus->egpu_enable = result & ASUS_WMI_DSTS_STATUS_BIT; -+ } -+ -+ return 0; -+} -+ -+static int egpu_enable_write(struct asus_wmi *asus) -+{ -+ int err; -+ u8 value; -+ u32 retval; -+ -+ value = asus->egpu_enable; -+ -+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, value, &retval); -+ -+ if (err) { -+ pr_warn("Failed to set egpu disable: %d\n", err); -+ return err; -+ } -+ -+ if (retval > 1 || retval < 0) { -+ pr_warn("Failed to set egpu disable (retval): 0x%x\n", retval); -+ return -EIO; -+ } -+ -+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "egpu_enable"); -+ -+ return 0; -+} -+ -+static ssize_t egpu_enable_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct asus_wmi *asus = dev_get_drvdata(dev); -+ bool mode = asus->egpu_enable; -+ -+ return sysfs_emit(buf, "%d\n", mode); -+} -+ -+static ssize_t egpu_enable_store(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ int result; -+ bool disable; -+ struct asus_wmi *asus = dev_get_drvdata(dev); -+ -+ result = kstrtobool(buf, &disable); -+ if (result == -EINVAL) -+ return result; -+ -+ asus->egpu_enable = disable; -+ -+ result = egpu_enable_write(asus); -+ if (result != 0) -+ return result; -+ -+ return count; -+} -+ -+static DEVICE_ATTR_RW(egpu_enable); -+ - /* dGPU ********************************************************************/ - static int dgpu_disable_check_present(struct asus_wmi *asus) - { -@@ -2502,6 +2585,7 @@ static struct attribute *platform_attributes[] = { - &dev_attr_camera.attr, - &dev_attr_cardr.attr, - &dev_attr_touchpad.attr, -+ &dev_attr_egpu_enable.attr, - &dev_attr_dgpu_disable.attr, - &dev_attr_lid_resume.attr, - &dev_attr_als_enable.attr, -@@ -2529,6 +2613,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, - devid = ASUS_WMI_DEVID_LID_RESUME; - else if (attr == &dev_attr_als_enable.attr) - devid = ASUS_WMI_DEVID_ALS_ENABLE; -+ else if (attr == &dev_attr_egpu_enable.attr) -+ ok = asus->egpu_enable_available; - else if (attr == &dev_attr_dgpu_disable.attr) - ok = asus->dgpu_disable_available; - else if (attr == &dev_attr_fan_boost_mode.attr) -@@ -2792,6 +2878,10 @@ static int asus_wmi_add(struct platform_device *pdev) - if (err) - goto fail_platform; - -+ err = egpu_enable_check_present(asus); -+ if (err) -+ goto fail_egpu_enable; -+ - err = dgpu_disable_check_present(asus); - if (err) - goto fail_dgpu_disable; -@@ -2896,6 +2986,7 @@ static int asus_wmi_add(struct platform_device *pdev) - fail_sysfs: - fail_throttle_thermal_policy: - fail_fan_boost_mode: -+fail_egpu_enable: - fail_dgpu_disable: - fail_platform: - fail_panel_od: -diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h -index a528f9d0e4b7..17dc5cb6f3f2 100644 ---- a/include/linux/platform_data/x86/asus-wmi.h -+++ b/include/linux/platform_data/x86/asus-wmi.h -@@ -90,6 +90,9 @@ - /* Keyboard dock */ - #define ASUS_WMI_DEVID_KBD_DOCK 0x00120063 - -+/* dgpu on/off */ -+#define ASUS_WMI_DEVID_EGPU 0x00090019 -+ - /* dgpu on/off */ - #define ASUS_WMI_DEVID_DGPU 0x00090020 - --- -2.32.0 - |