diff options
Diffstat (limited to 'sys-kernel_arch-sources-g14_files-0040-asus-wmi-Add-dgpu-disable-method.patch')
-rw-r--r-- | sys-kernel_arch-sources-g14_files-0040-asus-wmi-Add-dgpu-disable-method.patch | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/sys-kernel_arch-sources-g14_files-0040-asus-wmi-Add-dgpu-disable-method.patch b/sys-kernel_arch-sources-g14_files-0040-asus-wmi-Add-dgpu-disable-method.patch deleted file mode 100644 index 415590fd6094..000000000000 --- a/sys-kernel_arch-sources-g14_files-0040-asus-wmi-Add-dgpu-disable-method.patch +++ /dev/null @@ -1,182 +0,0 @@ -From de08016c5ef567c853dcf2ff8d9c9b352af253b6 Mon Sep 17 00:00:00 2001 -From: "Luke D. Jones" <luke@ljones.dev> -Date: Sat, 17 Jul 2021 20:13:22 +1200 -Subject: [PATCH 102/103] asus-wmi: Add dgpu disable method - -In Windows the ASUS Armory Crate program can enable or disable the -dGPU via a WMI call. This functions much the same as various Linux -methods in software where the dGPU is removed from the device tree. - -However the WMI call saves the state of dGPU (enabled or not) and -this then changes the dGPU visibility in Linux with no way for -Linux users to re-enable it. We expose the WMI method so users can -see and change the dGPU ACPI state. - -Signed-off-by: Luke D. Jones <luke@ljones.dev> ---- - drivers/platform/x86/asus-wmi.c | 99 ++++++++++++++++++++++ - include/linux/platform_data/x86/asus-wmi.h | 3 + - 2 files changed, 102 insertions(+) - -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index cd881443bc2f..02762a60d27a 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 dgpu_disable_available; -+ bool dgpu_disable; -+ - bool throttle_thermal_policy_available; - u8 throttle_thermal_policy_mode; - -@@ -427,6 +430,94 @@ static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus) - } - } - -+/* dGPU ********************************************************************/ -+static int dgpu_disable_check_present(struct asus_wmi *asus) -+{ -+ u32 result; -+ int err; -+ -+ asus->dgpu_disable_available = false; -+ -+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_DGPU, &result); -+ if (err) { -+ if (err == -ENODEV) -+ return 0; -+ return err; -+ } -+ -+ if (result & ASUS_WMI_DSTS_PRESENCE_BIT) { -+ asus->dgpu_disable_available = true; -+ asus->dgpu_disable = result & ASUS_WMI_DSTS_STATUS_BIT; -+ } -+ -+ return 0; -+} -+ -+static int dgpu_disable_write(struct asus_wmi *asus) -+{ -+ int err; -+ u8 value; -+ u32 retval; -+ -+ value = asus->dgpu_disable; -+ -+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, value, &retval); -+ -+ if (err) { -+ pr_warn("Failed to set dgpu disable: %d\n", err); -+ return err; -+ } -+ -+ if (retval > 1 || retval < 0) { -+ pr_warn("Failed to set dgpu disable (retval): 0x%x\n", retval); -+ return -EIO; -+ } -+ -+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_disable"); -+ -+ return 0; -+} -+ -+static ssize_t dgpu_disable_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct asus_wmi *asus = dev_get_drvdata(dev); -+ bool mode = asus->dgpu_disable; -+ -+ return sysfs_emit(buf, "%d\n", mode); -+} -+ -+static ssize_t dgpu_disable_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->dgpu_disable = disable; -+ /* -+ * The ACPI call used does not save the mode unless the call is run twice. -+ * Once to disable, then once to check status and save - this is two code -+ * paths in the method in the ACPI dumps. -+ */ -+ result = dgpu_disable_write(asus); -+ if (result != 0) -+ return result; -+ -+ result = dgpu_disable_write(asus); -+ if (result != 0) -+ return result; -+ -+ return count; -+} -+ -+static DEVICE_ATTR_RW(dgpu_disable); -+ - /* Battery ********************************************************************/ - - /* The battery maximum charging percentage */ -@@ -2411,6 +2502,7 @@ static struct attribute *platform_attributes[] = { - &dev_attr_camera.attr, - &dev_attr_cardr.attr, - &dev_attr_touchpad.attr, -+ &dev_attr_dgpu_disable.attr, - &dev_attr_lid_resume.attr, - &dev_attr_als_enable.attr, - &dev_attr_fan_boost_mode.attr, -@@ -2437,6 +2529,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_dgpu_disable.attr) -+ ok = asus->dgpu_disable_available; - else if (attr == &dev_attr_fan_boost_mode.attr) - ok = asus->fan_boost_mode_available; - else if (attr == &dev_attr_throttle_thermal_policy.attr) -@@ -2698,6 +2792,10 @@ static int asus_wmi_add(struct platform_device *pdev) - if (err) - goto fail_platform; - -+ err = dgpu_disable_check_present(asus); -+ if (err) -+ goto fail_dgpu_disable; -+ - err = fan_boost_mode_check_present(asus); - if (err) - goto fail_fan_boost_mode; -@@ -2798,6 +2896,7 @@ static int asus_wmi_add(struct platform_device *pdev) - fail_sysfs: - fail_throttle_thermal_policy: - fail_fan_boost_mode: -+fail_dgpu_disable: - fail_platform: - fail_panel_od: - kfree(asus); -diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h -index 428aea701c7b..a528f9d0e4b7 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_DGPU 0x00090020 -+ - /* DSTS masks */ - #define ASUS_WMI_DSTS_STATUS_BIT 0x00000001 - #define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002 --- -2.32.0 - |