diff options
author | Taijian | 2024-05-27 18:25:33 +0200 |
---|---|---|
committer | Taijian | 2024-05-27 18:25:33 +0200 |
commit | 76dd32313ff56173f9d02726ae71f8b6ffc5d170 (patch) | |
tree | cf0e720c5766d82e140f7b0fba1680b19af66d5f | |
parent | 51b8f655f5bebc66fe7ab7f339f1229713167fda (diff) | |
download | aur-76dd32313ff56173f9d02726ae71f8b6ffc5d170.tar.gz |
add more patches
-rw-r--r-- | .SRCINFO | 28 | ||||
-rw-r--r-- | 0001-hid-asus-use-hid-for-brightness-control-on-keyboard.patch | 123 | ||||
-rw-r--r-- | 0003-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch (renamed from 0005-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch) | 4 | ||||
-rw-r--r-- | 0004-Debugging.patch (renamed from 0003-Debugging.patch) | 44 | ||||
-rw-r--r-- | 0005-asus-wmi-don-t-error-out-if-platform_profile-already.patch (renamed from 0004-asus-wmi-don-t-error-out-if-platform_profile-already.patch) | 21 | ||||
-rw-r--r-- | 0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch | 600 | ||||
-rw-r--r-- | 0007-asus-wmi-reduce-code-duplication.patch | 278 | ||||
-rw-r--r-- | 0008-asus-wmi-add-panel-fhd.patch | 57 | ||||
-rw-r--r-- | 0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch | 57 | ||||
-rw-r--r-- | 0010-asus-wmi-enable-disable-cores.patch | 152 | ||||
-rw-r--r-- | 0011-asus-wmi-apu_mem-setting.patch | 179 | ||||
-rw-r--r-- | 0012-asus-wmi-dgpu-tgp.patch | 71 | ||||
-rw-r--r-- | PKGBUILD | 30 | ||||
-rw-r--r-- | fix_amd_eDP_HDR_flickering.patch | 14 |
14 files changed, 1471 insertions, 187 deletions
@@ -1,7 +1,7 @@ pkgbase = linux-g14 pkgdesc = Linux-g14 pkgver = 6.9.2.arch1 - pkgrel = 1 + pkgrel = 2 url = https://gitlab.com/dragonn/linux-g14.git arch = x86_64 license = GPL-2.0-only @@ -31,9 +31,16 @@ pkgbase = linux-g14 source = 0001-sched-ext.patch::https://raw.githubusercontent.com/cachyos/kernel-patches/master/6.9/sched/0001-sched-ext.patch source = 0001-ALSA-PCI-HDA-Adjust-G814JZR-to-use-SPI-init-for-amp.patch source = 0002-hid-asus-use-hid-for-brightness-control-on-keyboard.patch - source = 0003-Debugging.patch - source = 0004-asus-wmi-don-t-error-out-if-platform_profile-already.patch - source = 0005-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch + source = 0003-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch + source = 0004-Debugging.patch + source = 0005-asus-wmi-don-t-error-out-if-platform_profile-already.patch + source = 0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch + source = 0007-asus-wmi-reduce-code-duplication.patch + source = 0008-asus-wmi-add-panel-fhd.patch + source = 0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch + source = 0010-asus-wmi-enable-disable-cores.patch + source = 0011-asus-wmi-apu_mem-setting.patch + source = 0012-asus-wmi-dgpu-tgp.patch source = 0001-ACPI-resource-Skip-IRQ-override-on-ASUS-TUF-Gaming-A.patch source = 0002-ACPI-resource-Skip-IRQ-override-on-ASUS-TUF-Gaming-A.patch source = v2-0005-platform-x86-asus-wmi-don-t-allow-eGPU-switching-.patch @@ -74,9 +81,16 @@ pkgbase = linux-g14 sha256sums = 6003eb7821c5df01af93386d82425bb49a0c70c92a8f6eddcdbd625a38b45754 sha256sums = 9152af5811a61dd196c520ac39792aebee325fda093ecf9acd19f80819cf8d7c sha256sums = 567efcbb400bf2dc7327a790839d2a441bd7ca9fb7f5b2b07591c4abc63554bf - sha256sums = 6ab14523be3cadf4d495dd13b0ed12a1241118d93d8313f47a8dea6b1bf16df6 - sha256sums = c9835e39798d97ba0ca48c0d2353d1182715d4bfc99964051993dacc8f59ba83 - sha256sums = 423380be1902da29e695cb201516751759050fc0a50914a0459f05e1f4614087 + sha256sums = c4b18e935815584863e28e4c8707ab0bdd400b35710f586831e441d159e63413 + sha256sums = d7bdbe9bad78e2f376b32804b99970cff53ab168b6754e860ebb453d0032a2ff + sha256sums = 0047b19c4081cc931bd1d972fe03a308e74013a3358e4812b2b11492e9b52e7b + sha256sums = 261214585978122c56f1bde9cd65e327e5c4d9586b136f86269cc63bd502639f + sha256sums = 5871f00e8fc4d5ac541b38f64ead65df6a83db8045191e25cc0edeba3a09714b + sha256sums = eb41dffd799c6e251c22a137f212e919c974bd56613ea5240e8e95bbac79e36b + sha256sums = 5a8c9f0d80feb25d47b2988442386781ccc57c0eac50975be2479526249d29ed + sha256sums = 861c1c133da37ed1a02b5568107a06e5a2d6c1404509f52749c745cca53be3ac + sha256sums = 08153246f687857a1c2f12e48d348a68bdc8157dd5e31a386eac74e1c912c1e8 + sha256sums = c0011ae95b5488d9a934bf65962874b1dbbfe6ee8dbcddeb6f5910d3f6bfb29b sha256sums = a00b952d53df9d3617d93e8fba4146a4d6169ebe79f029b3a55cca68f738d8ea sha256sums = 4912b1319e46ddd6670147f5e878b4aca8bcfbd7b5c852fe11e434e424666365 sha256sums = 9f98765b43f5f31b33ed05f3611508113b02518e680ee82b251de80dae2e141d diff --git a/0001-hid-asus-use-hid-for-brightness-control-on-keyboard.patch b/0001-hid-asus-use-hid-for-brightness-control-on-keyboard.patch deleted file mode 100644 index bbc80ce9d64a..000000000000 --- a/0001-hid-asus-use-hid-for-brightness-control-on-keyboard.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 5ebde6eb9c149a9f1bc97c9bcc2a4512aaad36e8 Mon Sep 17 00:00:00 2001 -From: "Luke D. Jones" <luke@ljones.dev> -Date: Mon, 13 May 2024 19:20:04 +1200 -Subject: [PATCH] hid-asus: use hid for brightness control on keyboard - -Signed-off-by: Luke D. Jones <luke@ljones.dev> ---- - drivers/hid/hid-asus.c | 18 +++++++++++++++++- - drivers/platform/x86/asus-wmi.c | 3 ++- - include/linux/platform_data/x86/asus-wmi.h | 22 ++++++++++++++++++++++ - 3 files changed, 41 insertions(+), 2 deletions(-) - -diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c -index 02de2bf4f790..abb9478c001d 100644 ---- a/drivers/hid/hid-asus.c -+++ b/drivers/hid/hid-asus.c -@@ -101,6 +101,7 @@ struct asus_kbd_leds { - unsigned int brightness; - spinlock_t lock; - bool removed; -+ int report_id; - }; - - struct asus_touchpad_info { -@@ -473,7 +474,7 @@ static enum led_brightness asus_kbd_backlight_get(struct led_classdev *led_cdev) - static void asus_kbd_backlight_work(struct work_struct *work) - { - struct asus_kbd_leds *led = container_of(work, struct asus_kbd_leds, work); -- u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, 0x00 }; -+ u8 buf[] = { led->report_id, 0xba, 0xc5, 0xc4, 0x00 }; - int ret; - unsigned long flags; - -@@ -492,12 +493,18 @@ static void asus_kbd_backlight_work(struct work_struct *work) - */ - static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) - { -+ struct asus_drvdata *drvdata = hid_get_drvdata(hdev); - u32 value; - int ret; - - if (!IS_ENABLED(CONFIG_ASUS_WMI)) - return false; - -+ if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { -+ hid_info(hdev, "using hidraw for asus::kbd_backlight\n"); -+ return !asus_use_hidraw_led(); -+ } -+ - ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, - ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value); - hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value); -@@ -507,6 +514,11 @@ static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) - return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT); - } - -+static bool asus_kbd_is_input_led(void) { -+ return dmi_match(DMI_PRODUCT_NAME, "GU605") -+ || dmi_match(DMI_PRODUCT_NAME, "GA403"); -+} -+ - static int asus_kbd_register_leds(struct hid_device *hdev) - { - struct asus_drvdata *drvdata = hid_get_drvdata(hdev); -@@ -549,6 +561,10 @@ static int asus_kbd_register_leds(struct hid_device *hdev) - if (!drvdata->kbd_backlight) - return -ENOMEM; - -+ drvdata->kbd_backlight->report_id = FEATURE_KBD_REPORT_ID; -+ if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && asus_kbd_is_input_led()) -+ drvdata->kbd_backlight->report_id = FEATURE_KBD_LED_REPORT_ID1; -+ - drvdata->kbd_backlight->removed = false; - drvdata->kbd_backlight->brightness = 0; - drvdata->kbd_backlight->hdev = hdev; -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 3f9b6285c9a6..a58df18a70ad 100644 ---- a/drivers/platform/x86/asus-wmi.c -+++ b/drivers/platform/x86/asus-wmi.c -@@ -1681,7 +1681,8 @@ static int asus_wmi_led_init(struct asus_wmi *asus) - goto error; - } - -- if (!kbd_led_read(asus, &led_val, NULL)) { -+ if (!kbd_led_read(asus, &led_val, NULL) && !asus_use_hidraw_led()) { -+ pr_info("using asus-wmi for asus::kbd_backlight\n"); - asus->kbd_led_wk = led_val; - asus->kbd_led.name = "asus::kbd_backlight"; - asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED; -diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h -index 3eb5cd6773ad..33c5af4a0c9e 100644 ---- a/include/linux/platform_data/x86/asus-wmi.h -+++ b/include/linux/platform_data/x86/asus-wmi.h -@@ -160,4 +160,26 @@ static inline int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, - } - #endif - -+/* To be used by both hid-asus and asus-wmi to determine which controls kbd_brightness */ -+#if IS_REACHABLE(CONFIG_ASUS_WMI) -+static bool asus_use_hidraw_led(void) { -+ const char *product, *board; -+ -+ product = dmi_get_system_info(DMI_PRODUCT_NAME); -+ board = dmi_get_system_info(DMI_PRODUCT_NAME); -+ return !product -+ || strcmp(product, "ROG Zephyrus") -+ || strcmp(product, "ROG Strix") -+ || strcmp(product, "ROG Flow") -+ || strcmp(product, "GA403") -+ || strcmp(product, "GU605") -+ || !board -+ || strcmp(board, "RC71L"); -+} -+#else -+static inline bool asus_use_hidraw_led(void) { -+ return true; -+} -+#endif -+ - #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ --- -2.45.0 - diff --git a/0005-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch b/0003-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch index 4259a3a3aacb..b1c963aa8df0 100644 --- a/0005-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch +++ b/0003-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch @@ -1,7 +1,7 @@ -From 3885da3bcaa9de4d31623ab7ea53bdbbbea1d47c Mon Sep 17 00:00:00 2001 +From fa9c3c9138d014cd99f77a68d8df24382542a076 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Fri, 24 May 2024 10:58:17 +1200 -Subject: [PATCH 5/5] hid-asus: add USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD +Subject: [PATCH 03/12] hid-asus: add USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD Signed-off-by: Luke D. Jones <luke@ljones.dev> --- diff --git a/0003-Debugging.patch b/0004-Debugging.patch index 1f970fcd0249..240fcc7554e7 100644 --- a/0003-Debugging.patch +++ b/0004-Debugging.patch @@ -1,7 +1,7 @@ -From 0c8131397cf7a5e42adc3d89a50273f68b2ae0c4 Mon Sep 17 00:00:00 2001 +From cf35cef6e224cd4c113e3c9ca8cdc6f31180faa0 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Tue, 21 May 2024 18:17:17 +1200 -Subject: [PATCH 3/5] Debugging +Subject: [PATCH 04/12] Debugging sudo mount -t debugfs none /sys/kernel/debug echo 'file asus-wmi.c +p' |sudo tee /sys/kernel/debug/dynamic_debug/control @@ -14,29 +14,21 @@ sudo modprobe hid-asus Signed-off-by: Luke D. Jones <luke@ljones.dev> --- - drivers/platform/x86/asus-wmi.c | 47 ++++++++++++++++++++++++++------- - 1 file changed, 37 insertions(+), 10 deletions(-) + drivers/platform/x86/asus-wmi.c | 46 ++++++++++++++++++++++++++------- + 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index a58df18a70ad..c79e766d1922 100644 +index a58df18a70ad..02a97301ca2e 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c -@@ -11,6 +11,7 @@ - * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru> - */ - -+//#include <cerrno> - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - - #include <linux/acpi.h> -@@ -334,20 +335,26 @@ static int asus_wmi_evaluate_method3(u32 method_id, +@@ -334,20 +334,26 @@ static int asus_wmi_evaluate_method3(u32 method_id, status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id, &input, &output); - if (ACPI_FAILURE(status)) + pr_debug("%s called (0x%08x) with args: 0x%08x, %x, %x\n", __func__, method_id, arg0, arg1, arg2); + if (ACPI_FAILURE(status)) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); return -EIO; + } @@ -52,20 +44,20 @@ index a58df18a70ad..c79e766d1922 100644 - if (tmp == ASUS_WMI_UNSUPPORTED_METHOD) + if (tmp == ASUS_WMI_UNSUPPORTED_METHOD) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -ENODEV); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -ENODEV); return -ENODEV; + } return 0; } -@@ -377,20 +384,26 @@ static int asus_wmi_evaluate_method5(u32 method_id, +@@ -377,20 +383,26 @@ static int asus_wmi_evaluate_method5(u32 method_id, status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id, &input, &output); - if (ACPI_FAILURE(status)) + pr_debug("%s called (0x%08x) with args: 0x%08x, %x, %x, %x, %x\n", __func__, method_id, arg0, arg1, arg2, arg3, arg4); + if (ACPI_FAILURE(status)) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); return -EIO; + } @@ -81,38 +73,38 @@ index a58df18a70ad..c79e766d1922 100644 - if (tmp == ASUS_WMI_UNSUPPORTED_METHOD) + if (tmp == ASUS_WMI_UNSUPPORTED_METHOD) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -ENODEV); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -ENODEV); return -ENODEV; + } return 0; } -@@ -416,8 +429,11 @@ static int asus_wmi_evaluate_method_buf(u32 method_id, +@@ -416,8 +428,11 @@ static int asus_wmi_evaluate_method_buf(u32 method_id, status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id, &input, &output); - if (ACPI_FAILURE(status)) + pr_debug("%s called (0x%08x) with args: 0x%08x, %x\n", __func__, method_id, arg0, arg1); + if (ACPI_FAILURE(status)) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, -EIO); return -EIO; + } obj = (union acpi_object *)output.pointer; -@@ -453,8 +469,10 @@ static int asus_wmi_evaluate_method_buf(u32 method_id, +@@ -453,8 +468,10 @@ static int asus_wmi_evaluate_method_buf(u32 method_id, kfree(obj); - if (err) + if (err) { -+ pr_err("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, err); ++ pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n", __func__, method_id, arg0, err); return err; + } return 0; } -@@ -542,6 +560,7 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id) +@@ -542,6 +559,7 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id) { u32 retval; int status = asus_wmi_get_devstate(asus, dev_id, &retval); @@ -120,7 +112,7 @@ index a58df18a70ad..c79e766d1922 100644 return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT); } -@@ -3559,18 +3578,24 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus) +@@ -3559,18 +3577,24 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus) err = fan_curve_check_present(asus, &asus->cpu_fan_curve_available, ASUS_WMI_DEVID_CPU_FAN_CURVE); @@ -148,7 +140,7 @@ index a58df18a70ad..c79e766d1922 100644 if (!asus->cpu_fan_curve_available && !asus->gpu_fan_curve_available -@@ -4398,8 +4423,10 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, +@@ -4398,8 +4422,10 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, else if (attr == &dev_attr_available_mini_led_mode.attr) ok = asus->mini_led_dev_id != 0; diff --git a/0004-asus-wmi-don-t-error-out-if-platform_profile-already.patch b/0005-asus-wmi-don-t-error-out-if-platform_profile-already.patch index f7308fac12fb..f75f44ac3544 100644 --- a/0004-asus-wmi-don-t-error-out-if-platform_profile-already.patch +++ b/0005-asus-wmi-don-t-error-out-if-platform_profile-already.patch @@ -1,19 +1,19 @@ -From 1e9971b55db184efe938c2dc42a4e7340de17b36 Mon Sep 17 00:00:00 2001 +From ef1ae89af17538f873cc8a57cf1d2191c85b3801 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Fri, 24 May 2024 10:54:36 +1200 -Subject: [PATCH 4/5] asus-wmi: don't error out if platform_profile already +Subject: [PATCH 05/12] asus-wmi: don't error out if platform_profile already registered Signed-off-by: Luke D. Jones <luke@ljones.dev> --- - drivers/platform/x86/asus-wmi.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) + drivers/platform/x86/asus-wmi.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index c79e766d1922..1def9035c165 100644 +index 02a97301ca2e..d59886f714b2 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c -@@ -3825,8 +3825,14 @@ static int platform_profile_setup(struct asus_wmi *asus) +@@ -3824,8 +3824,14 @@ static int platform_profile_setup(struct asus_wmi *asus) asus->platform_profile_handler.choices); err = platform_profile_register(&asus->platform_profile_handler); @@ -29,6 +29,15 @@ index c79e766d1922..1def9035c165 100644 asus->platform_profile_support = true; return 0; +@@ -4701,7 +4707,7 @@ static int asus_wmi_add(struct platform_device *pdev) + throttle_thermal_policy_set_default(asus); + + err = platform_profile_setup(asus); +- if (err) ++ if (err && err != -EEXIST) + goto fail_platform_profile_setup; + + err = asus_wmi_sysfs_init(asus->platform_device); -- 2.45.1 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); diff --git a/0007-asus-wmi-reduce-code-duplication.patch b/0007-asus-wmi-reduce-code-duplication.patch new file mode 100644 index 000000000000..de64f8767e6e --- /dev/null +++ b/0007-asus-wmi-reduce-code-duplication.patch @@ -0,0 +1,278 @@ +From 5633dc55867ce05e0dd3e7953e1d2dbc8108da59 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 00:00:09 +1200 +Subject: [PATCH 07/12] asus-wmi: reduce code duplication + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 219 +++++++------------------------- + 1 file changed, 44 insertions(+), 175 deletions(-) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 116dff177d09..c3d0538ae0b5 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -691,6 +691,35 @@ static ssize_t rog_tunable_store(struct asus_wmi *asus, + return count; + } + ++#define WMI_SIMPLE_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, _max, NULL, _wmi); \ ++} ++ ++#define WMI_SIMPLE_SHOW(_fname, _wmi) \ ++static ssize_t _fname##_show(struct device *dev, \ ++ struct device_attribute *attr, char *buf) \ ++{ \ ++ struct asus_wmi *asus = dev_get_drvdata(dev); \ ++ u32 result; \ ++ asus_wmi_get_devstate(asus, _wmi, &result); \ ++ if (result < 0) \ ++ return result; \ ++ return sysfs_emit(buf, "%d\n", result & ~ASUS_WMI_DSTS_PRESENCE_BIT); \ ++} ++ ++#define WMI_ATTR_SIMPLE_RW(_fname, _minv, _maxv, _wmi) \ ++WMI_SIMPLE_STORE(_fname, _minv, _maxv, _wmi); \ ++WMI_SIMPLE_SHOW(_fname, _wmi); \ ++static DEVICE_ATTR_RW(_fname); ++ ++#define WMI_ATTR_SIMPLE_RO(_fname, _wmi) \ ++WMI_SIMPLE_SHOW(_fname, _wmi); \ ++static DEVICE_ATTR_RO(_fname); ++ + #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) \ +@@ -754,6 +783,21 @@ ROG_ATTR_RW(nv_dynamic_boost, NVIDIA_BOOST_MIN, nv_dynamic_boost_max, ASUS_WMI_D + /* Tunable: NVIDIA temperature target ****************************************/ + ROG_ATTR_RW(nv_temp_target, NVIDIA_TEMP_MIN, nv_temp_target_max, ASUS_WMI_DEVID_NV_THERM_TARGET); + ++/* Ally MCU Powersave ********************************************************/ ++WMI_ATTR_SIMPLE_RW(mcu_powersave, 0, 1, ASUS_WMI_DEVID_MCU_POWERSAVE) ++ ++/* Is eGPU connected? *********************************************************/ ++WMI_ATTR_SIMPLE_RO(egpu_connected, ASUS_WMI_DEVID_EGPU_CONNECTED); ++ ++/* Panel Overdrive ************************************************************/ ++WMI_ATTR_SIMPLE_RW(panel_od, 0, 1, ASUS_WMI_DEVID_PANEL_OD); ++ ++/* Bootup sound ***************************************************************/ ++WMI_ATTR_SIMPLE_RW(boot_sound, 0, 1, ASUS_WMI_DEVID_BOOT_SOUND); ++ ++/* Charging mode, 1=Barrel, 2=USB ******************************************/ ++WMI_ATTR_SIMPLE_RO(charge_mode, ASUS_WMI_DEVID_CHARGE_MODE); ++ + /* Tablet mode ****************************************************************/ + + static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) +@@ -768,22 +812,6 @@ static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) + asus_wmi_tablet_sw_report(asus, result); + } + +-/* Charging mode, 1=Barrel, 2=USB ******************************************/ +-static ssize_t charge_mode_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result, value; +- +- result = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CHARGE_MODE, &value); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", value & 0xff); +-} +- +-static DEVICE_ATTR_RO(charge_mode); +- + /* dGPU ********************************************************************/ + static ssize_t dgpu_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -917,22 +945,6 @@ static ssize_t egpu_enable_store(struct device *dev, + } + static DEVICE_ATTR_RW(egpu_enable); + +-/* Is eGPU connected? *********************************************************/ +-static ssize_t egpu_connected_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} +- +-static DEVICE_ATTR_RO(egpu_connected); +- + /* gpu mux switch *************************************************************/ + static ssize_t gpu_mux_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -1120,53 +1132,6 @@ static const struct attribute_group *kbd_rgb_mode_groups[] = { + NULL, + }; + +-/* Ally MCU Powersave ********************************************************/ +-static ssize_t mcu_powersave_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MCU_POWERSAVE); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} +- +-static ssize_t mcu_powersave_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- int result, err; +- u32 enable; +- +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- result = kstrtou32(buf, 10, &enable); +- if (result) +- return result; +- +- if (enable > 1) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MCU_POWERSAVE, enable, &result); +- if (err) { +- pr_warn("Failed to set MCU powersave: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set MCU powersave (result): 0x%x\n", result); +- return -EIO; +- } +- +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "mcu_powersave"); +- +- return count; +-} +-static DEVICE_ATTR_RW(mcu_powersave); +- + /* Battery ********************************************************************/ + + /* The battery maximum charging percentage */ +@@ -1994,102 +1959,6 @@ static int asus_wmi_rfkill_init(struct asus_wmi *asus) + return result; + } + +-/* Panel Overdrive ************************************************************/ +-static ssize_t panel_od_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_PANEL_OD); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} +- +-static ssize_t panel_od_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- int result, err; +- u32 overdrive; +- +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- result = kstrtou32(buf, 10, &overdrive); +- if (result) +- return result; +- +- if (overdrive > 1) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD, overdrive, &result); +- +- if (err) { +- pr_warn("Failed to set panel overdrive: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set panel overdrive (result): 0x%x\n", result); +- return -EIO; +- } +- +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "panel_od"); +- +- return count; +-} +-static DEVICE_ATTR_RW(panel_od); +- +-/* Bootup sound ***************************************************************/ +- +-static ssize_t boot_sound_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_BOOT_SOUND); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} +- +-static ssize_t boot_sound_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- int result, err; +- u32 snd; +- +- struct asus_wmi *asus = dev_get_drvdata(dev); +- +- result = kstrtou32(buf, 10, &snd); +- if (result) +- return result; +- +- if (snd > 1) +- return -EINVAL; +- +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BOOT_SOUND, snd, &result); +- if (err) { +- pr_warn("Failed to set boot sound: %d\n", err); +- return err; +- } +- +- if (result > 1) { +- pr_warn("Failed to set panel boot sound (result): 0x%x\n", result); +- return -EIO; +- } +- +- sysfs_notify(&asus->platform_device->dev.kobj, NULL, "boot_sound"); +- +- return count; +-} +-static DEVICE_ATTR_RW(boot_sound); +- + /* Mini-LED mode **************************************************************/ + static ssize_t mini_led_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +-- +2.45.1 + diff --git a/0008-asus-wmi-add-panel-fhd.patch b/0008-asus-wmi-add-panel-fhd.patch new file mode 100644 index 000000000000..503ee0f3e66e --- /dev/null +++ b/0008-asus-wmi-add-panel-fhd.patch @@ -0,0 +1,57 @@ +From 62331ee4498d527d12691cd805a029c7486e9a31 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 00:24:51 +1200 +Subject: [PATCH 08/12] asus-wmi: add panel-fhd + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 6 ++++++ + include/linux/platform_data/x86/asus-wmi.h | 1 + + 2 files changed, 7 insertions(+) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index c3d0538ae0b5..f955ee56ce6a 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -798,6 +798,9 @@ WMI_ATTR_SIMPLE_RW(boot_sound, 0, 1, ASUS_WMI_DEVID_BOOT_SOUND); + /* Charging mode, 1=Barrel, 2=USB ******************************************/ + WMI_ATTR_SIMPLE_RO(charge_mode, ASUS_WMI_DEVID_CHARGE_MODE); + ++/* Panel FHD mode **********************************************************/ ++WMI_ATTR_SIMPLE_RO(panel_fhd, ASUS_WMI_DEVID_PANEL_FHD); ++ + /* Tablet mode ****************************************************************/ + + static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) +@@ -4060,6 +4063,7 @@ static struct attribute *platform_attributes[] = { + &dev_attr_mcu_powersave.attr, + &dev_attr_boot_sound.attr, + &dev_attr_panel_od.attr, ++ &dev_attr_panel_fhd.attr, + &dev_attr_mini_led_mode.attr, + &dev_attr_available_mini_led_mode.attr, + NULL +@@ -4131,6 +4135,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, + devid = ASUS_WMI_DEVID_BOOT_SOUND; + else if (attr == &dev_attr_panel_od.attr) + devid = ASUS_WMI_DEVID_PANEL_OD; ++ else if (attr == &dev_attr_panel_fhd.attr) ++ devid = ASUS_WMI_DEVID_PANEL_FHD; + else if (attr == &dev_attr_mini_led_mode.attr) + ok = asus->mini_led_dev_id != 0; + else if (attr == &dev_attr_available_mini_led_mode.attr) +diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h +index c596b6feb2d4..f131887f1efa 100644 +--- a/include/linux/platform_data/x86/asus-wmi.h ++++ b/include/linux/platform_data/x86/asus-wmi.h +@@ -72,6 +72,7 @@ + #define ASUS_WMI_DEVID_LID_FLIP_ROG 0x00060077 + #define ASUS_WMI_DEVID_MINI_LED_MODE 0x0005001E + #define ASUS_WMI_DEVID_MINI_LED_MODE2 0x0005002E ++#define ASUS_WMI_DEVID_PANEL_FHD 0x0005001C + + /* Storage */ + #define ASUS_WMI_DEVID_CARDREADER 0x00080013 +-- +2.45.1 + diff --git a/0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch b/0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch new file mode 100644 index 000000000000..45f04348deab --- /dev/null +++ b/0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch @@ -0,0 +1,57 @@ +From 57db1cf06c182ce1feda105df6ca6335a3fdd4b6 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 00:34:22 +1200 +Subject: [PATCH 09/12] asus-wmi: use WMI_SIMPLE_SHOW in some more places + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 26 ++------------------------ + 1 file changed, 2 insertions(+), 24 deletions(-) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index f955ee56ce6a..5cdb61f2dcc8 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -816,18 +816,7 @@ static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) + } + + /* dGPU ********************************************************************/ +-static ssize_t dgpu_disable_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} ++WMI_SIMPLE_SHOW(dgpu_disable, ASUS_WMI_DEVID_DGPU); + + /* + * A user may be required to store the value twice, typcial store first, then +@@ -881,18 +870,7 @@ static ssize_t dgpu_disable_store(struct device *dev, + static DEVICE_ATTR_RW(dgpu_disable); + + /* eGPU ********************************************************************/ +-static ssize_t egpu_enable_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct asus_wmi *asus = dev_get_drvdata(dev); +- int result; +- +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU); +- if (result < 0) +- return result; +- +- return sysfs_emit(buf, "%d\n", result); +-} ++WMI_SIMPLE_SHOW(egpu_enable, ASUS_WMI_DEVID_EGPU); + + /* The ACPI call to enable the eGPU also disables the internal dGPU */ + static ssize_t egpu_enable_store(struct device *dev, +-- +2.45.1 + diff --git a/0010-asus-wmi-enable-disable-cores.patch b/0010-asus-wmi-enable-disable-cores.patch new file mode 100644 index 000000000000..0efdacf3d40d --- /dev/null +++ b/0010-asus-wmi-enable-disable-cores.patch @@ -0,0 +1,152 @@ +From e790146b27c2ca863771027fe1a4569fdf54d973 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 10:45:52 +1200 +Subject: [PATCH 10/12] asus-wmi: enable/disable cores + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + .../ABI/testing/sysfs-platform-asus-wmi | 19 +++++ + drivers/platform/x86/asus-wmi.c | 69 +++++++++++++++++++ + include/linux/platform_data/x86/asus-wmi.h | 5 ++ + 3 files changed, 93 insertions(+) + +diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentation/ABI/testing/sysfs-platform-asus-wmi +index 28144371a0f1..b4f18c2e1707 100644 +--- a/Documentation/ABI/testing/sysfs-platform-asus-wmi ++++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi +@@ -212,3 +212,22 @@ Description: + Set if the MCU can go in to low-power mode on system sleep + * 0 - False, + * 1 - True ++ ++What: /sys/devices/platform/<platform>/cores_enabled ++Date: Jun 2024 ++KernelVersion: 6.11 ++Contact: "Luke Jones" <luke@ljones.dev> ++Description: ++ Enable/disable efficiency and performance cores. The format is ++ 0x[E][P] where [E] is the efficiency core count, and [P] is ++ the perfromance core count. If the core count is a single digit ++ it is preceded by a 0 such as 0x0406; E=4, P=6, 0x1006; E=10, P=6 ++ ++What: /sys/devices/platform/<platform>/cores_max ++Date: Jun 2024 ++KernelVersion: 6.11 ++Contact: "Luke Jones" <luke@ljones.dev> ++Description: ++ Show the maximum performance and efficiency core countin format ++ 0x[E][P] where [E] is the efficiency core count, and [P] is ++ the perfromance core count. +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 5cdb61f2dcc8..c5997e0907f7 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -801,6 +801,70 @@ WMI_ATTR_SIMPLE_RO(charge_mode, ASUS_WMI_DEVID_CHARGE_MODE); + /* Panel FHD mode **********************************************************/ + WMI_ATTR_SIMPLE_RO(panel_fhd, ASUS_WMI_DEVID_PANEL_FHD); + ++/* Efficency and Performance core control **********************************/ ++static ssize_t cores_enabled_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct asus_wmi *asus = dev_get_drvdata(dev); ++ int err; ++ u32 ret; ++ ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CORES_SET, &ret); ++ if (err < 0) ++ return err; ++ ++ return sysfs_emit(buf, "0x%x\n", ret & ~ASUS_WMI_DSTS_PRESENCE_BIT); ++} ++ ++static ssize_t cores_enabled_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 cores, max; ++ ++ result = kstrtou32(buf, 16, &cores); ++ if (result) ++ return result; ++ ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CORES_MAX, &max); ++ if (err < 0) ++ return err; ++ ++ if (cores > max) { ++ pr_warn("Core count 0x%x exceeds max: 0x%x\n", cores, max); ++ return -EIO; ++ } ++ ++ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_CORES_SET, cores, &result); ++ if (err) { ++ pr_warn("Failed to set cores_enabled: %d\n", err); ++ return err; ++ } ++ ++ pr_info("Enabled core count changed, reboot required\n"); ++ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "cores_enabled"); ++ ++ return count; ++} ++static DEVICE_ATTR_RW(cores_enabled); ++ ++static ssize_t cores_max_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct asus_wmi *asus = dev_get_drvdata(dev); ++ int err; ++ u32 ret; ++ ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CORES_MAX, &ret); ++ if (err < 0) ++ return err; ++ ++ return sysfs_emit(buf, "0x%x\n", ret & ~ASUS_WMI_DSTS_PRESENCE_BIT); ++} ++static DEVICE_ATTR_RO(cores_max); ++ + /* Tablet mode ****************************************************************/ + + static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) +@@ -4042,6 +4106,8 @@ static struct attribute *platform_attributes[] = { + &dev_attr_boot_sound.attr, + &dev_attr_panel_od.attr, + &dev_attr_panel_fhd.attr, ++ &dev_attr_cores_enabled.attr, ++ &dev_attr_cores_max.attr, + &dev_attr_mini_led_mode.attr, + &dev_attr_available_mini_led_mode.attr, + NULL +@@ -4115,6 +4181,9 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, + devid = ASUS_WMI_DEVID_PANEL_OD; + else if (attr == &dev_attr_panel_fhd.attr) + devid = ASUS_WMI_DEVID_PANEL_FHD; ++ else if (attr == &dev_attr_cores_enabled.attr ++ || attr == &dev_attr_cores_max.attr) ++ ok = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CORES_SET); + else if (attr == &dev_attr_mini_led_mode.attr) + ok = asus->mini_led_dev_id != 0; + else if (attr == &dev_attr_available_mini_led_mode.attr) +diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h +index f131887f1efa..c4f9e1f2f08e 100644 +--- a/include/linux/platform_data/x86/asus-wmi.h ++++ b/include/linux/platform_data/x86/asus-wmi.h +@@ -116,6 +116,11 @@ + /* Charging mode - 1=Barrel, 2=USB */ + #define ASUS_WMI_DEVID_CHARGE_MODE 0x0012006C + ++/* Intel E-core and P-core configuration in a format 0x0[E]0[P] */ ++#define ASUS_WMI_DEVID_CORES_SET 0x001200D2 ++ /* Maximum Intel E-core and P-core availability */ ++#define ASUS_WMI_DEVID_CORES_MAX 0x001200D3 ++ + /* MCU powersave mode */ + #define ASUS_WMI_DEVID_MCU_POWERSAVE 0x001200E2 + +-- +2.45.1 + diff --git a/0011-asus-wmi-apu_mem-setting.patch b/0011-asus-wmi-apu_mem-setting.patch new file mode 100644 index 000000000000..10e7a97d149b --- /dev/null +++ b/0011-asus-wmi-apu_mem-setting.patch @@ -0,0 +1,179 @@ +From f463b041b8971eda13547c8048f701c46a7170e5 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 11:39:47 +1200 +Subject: [PATCH 11/12] asus-wmi: apu_mem setting + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + .../ABI/testing/sysfs-platform-asus-wmi | 8 ++ + drivers/platform/x86/asus-wmi.c | 109 ++++++++++++++++++ + include/linux/platform_data/x86/asus-wmi.h | 3 + + 3 files changed, 120 insertions(+) + +diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentation/ABI/testing/sysfs-platform-asus-wmi +index b4f18c2e1707..53ab182e753c 100644 +--- a/Documentation/ABI/testing/sysfs-platform-asus-wmi ++++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi +@@ -231,3 +231,11 @@ Description: + Show the maximum performance and efficiency core countin format + 0x[E][P] where [E] is the efficiency core count, and [P] is + the perfromance core count. ++ ++What: /sys/devices/platform/<platform>/apu_mem ++Date: Jun 2024 ++KernelVersion: 6.11 ++Contact: "Luke Jones" <luke@ljones.dev> ++Description: ++ Set the maximum available system memory for the APU. ++ * Min=0, Max=8 +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index c5997e0907f7..8fef31c6bc6f 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -865,6 +865,112 @@ static ssize_t cores_max_show(struct device *dev, + } + static DEVICE_ATTR_RO(cores_max); + ++/* Device memory available to APU */ ++ ++static ssize_t apu_mem_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct asus_wmi *asus = dev_get_drvdata(dev); ++ int err; ++ u32 mem; ++ ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_APU_MEM, &mem); ++ if (err < 0) ++ return err; ++ ++ switch (mem) ++ { ++ case 256: ++ mem = 0; ++ break; ++ case 258: ++ mem = 1; ++ break; ++ case 259: ++ mem = 2; ++ break; ++ case 260: ++ mem = 3; ++ break; ++ case 261: ++ mem = 4; ++ break; ++ case 262: ++ mem = 8; ++ break; ++ case 263: ++ mem = 5; ++ break; ++ case 264: ++ mem = 6; ++ break; ++ case 265: ++ mem = 7; ++ break; ++ default: ++ mem = 4; ++ break; ++ } ++ ++ return sysfs_emit(buf, "%d\n", mem); ++} ++ ++static ssize_t apu_mem_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 mem; ++ ++ result = kstrtou32(buf, 10, &mem); ++ if (result) ++ return result; ++ ++ switch (mem) ++ { ++ case 0: ++ mem = 0; ++ break; ++ case 1: ++ mem = 258; ++ break; ++ case 2: ++ mem = 259; ++ break; ++ case 3: ++ mem = 260; ++ break; ++ case 4: ++ mem = 261; ++ break; ++ case 5: ++ mem = 263; ++ break; ++ case 6: ++ mem = 264; ++ break; ++ case 7: ++ mem = 265; ++ break; ++ case 8: ++ mem = 262; ++ break; ++ } ++ ++ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_APU_MEM, mem, &result); ++ if (err) { ++ pr_warn("Failed to set apu_mem: %d\n", err); ++ return err; ++ } ++ ++ pr_info("APU memory changed, reboot required\n"); ++ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "apu_mem"); ++ ++ return count; ++} ++static DEVICE_ATTR_RW(apu_mem); ++ + /* Tablet mode ****************************************************************/ + + static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) +@@ -4108,6 +4214,7 @@ static struct attribute *platform_attributes[] = { + &dev_attr_panel_fhd.attr, + &dev_attr_cores_enabled.attr, + &dev_attr_cores_max.attr, ++ &dev_attr_apu_mem.attr, + &dev_attr_mini_led_mode.attr, + &dev_attr_available_mini_led_mode.attr, + NULL +@@ -4184,6 +4291,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, + else if (attr == &dev_attr_cores_enabled.attr + || attr == &dev_attr_cores_max.attr) + ok = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CORES_SET); ++ else if (attr == &dev_attr_apu_mem.attr) ++ ok = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_APU_MEM); + else if (attr == &dev_attr_mini_led_mode.attr) + ok = asus->mini_led_dev_id != 0; + else if (attr == &dev_attr_available_mini_led_mode.attr) +diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h +index c4f9e1f2f08e..30a3a4fdd43e 100644 +--- a/include/linux/platform_data/x86/asus-wmi.h ++++ b/include/linux/platform_data/x86/asus-wmi.h +@@ -121,6 +121,9 @@ + /* Maximum Intel E-core and P-core availability */ + #define ASUS_WMI_DEVID_CORES_MAX 0x001200D3 + ++/* Set the memory available to the APU */ ++#define ASUS_WMI_DEVID_APU_MEM 0x000600C1 ++ + /* MCU powersave mode */ + #define ASUS_WMI_DEVID_MCU_POWERSAVE 0x001200E2 + +-- +2.45.1 + diff --git a/0012-asus-wmi-dgpu-tgp.patch b/0012-asus-wmi-dgpu-tgp.patch new file mode 100644 index 000000000000..6f1d3e10b428 --- /dev/null +++ b/0012-asus-wmi-dgpu-tgp.patch @@ -0,0 +1,71 @@ +From 904b138b305a668adb2920c14b70a46b7c4751ba Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 26 May 2024 16:17:17 +1200 +Subject: [PATCH 12/12] asus-wmi: dgpu tgp + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 11 +++++++++++ + include/linux/platform_data/x86/asus-wmi.h | 3 +++ + 2 files changed, 14 insertions(+) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 8fef31c6bc6f..d4b679decbbf 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -119,6 +119,7 @@ module_param(fnlock_default, bool, 0444); + #define PPT_CPU_MIN 5 + #define PPT_CPU_DEFAULT 80 + #define PPT_CPU_MAX_DEFAULT 100 ++#define NVIDIA_GPU_POWER_MAX 70 + #define NVIDIA_BOOST_MIN 5 + #define NVIDIA_BOOST_MAX_DEFAULT 25 + #define NVIDIA_TEMP_MIN 75 +@@ -783,6 +784,10 @@ ROG_ATTR_RW(nv_dynamic_boost, NVIDIA_BOOST_MIN, nv_dynamic_boost_max, ASUS_WMI_D + /* Tunable: NVIDIA temperature target ****************************************/ + ROG_ATTR_RW(nv_temp_target, NVIDIA_TEMP_MIN, nv_temp_target_max, ASUS_WMI_DEVID_NV_THERM_TARGET); + ++/* dGPU TGP setting **********************************************************/ ++WMI_ATTR_SIMPLE_RO(dgpu_base_tgp, ASUS_WMI_DEVID_DGPU_BASE_TGP); ++WMI_ATTR_SIMPLE_RW(dgpu_set_tgp, 0, NVIDIA_GPU_POWER_MAX, ASUS_WMI_DEVID_DGPU_SET_TGP); ++ + /* Ally MCU Powersave ********************************************************/ + WMI_ATTR_SIMPLE_RW(mcu_powersave, 0, 1, ASUS_WMI_DEVID_MCU_POWERSAVE) + +@@ -4212,6 +4217,8 @@ static struct attribute *platform_attributes[] = { + &dev_attr_boot_sound.attr, + &dev_attr_panel_od.attr, + &dev_attr_panel_fhd.attr, ++ &dev_attr_dgpu_base_tgp.attr, ++ &dev_attr_dgpu_set_tgp.attr, + &dev_attr_cores_enabled.attr, + &dev_attr_cores_max.attr, + &dev_attr_apu_mem.attr, +@@ -4288,6 +4295,10 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, + devid = ASUS_WMI_DEVID_PANEL_OD; + else if (attr == &dev_attr_panel_fhd.attr) + devid = ASUS_WMI_DEVID_PANEL_FHD; ++ else if (attr == &dev_attr_dgpu_base_tgp.attr) ++ devid = ASUS_WMI_DEVID_DGPU_BASE_TGP; ++ else if (attr == &dev_attr_dgpu_set_tgp.attr) ++ ok = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU_SET_TGP); + else if (attr == &dev_attr_cores_enabled.attr + || attr == &dev_attr_cores_max.attr) + ok = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CORES_SET); +diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h +index 30a3a4fdd43e..f9b18934c1ab 100644 +--- a/include/linux/platform_data/x86/asus-wmi.h ++++ b/include/linux/platform_data/x86/asus-wmi.h +@@ -135,6 +135,9 @@ + /* dgpu on/off */ + #define ASUS_WMI_DEVID_DGPU 0x00090020 + ++#define ASUS_WMI_DEVID_DGPU_BASE_TGP 0x00120099 ++#define ASUS_WMI_DEVID_DGPU_SET_TGP 0x00120098 ++ + /* gpu mux switch, 0 = dGPU, 1 = Optimus */ + #define ASUS_WMI_DEVID_GPU_MUX 0x00090016 + #define ASUS_WMI_DEVID_GPU_MUX_VIVO 0x00090026 +-- +2.45.1 + @@ -4,7 +4,7 @@ pkgbase=linux-g14 pkgver=6.9.2.arch1 -pkgrel=1 +pkgrel=2 pkgdesc='Linux-g14' url="https://gitlab.com/dragonn/linux-g14.git" _url='https://github.com/archlinux/linux' @@ -39,8 +39,6 @@ source=( 0027-mt76_-mt7921_-Disable-powersave-features-by-default.patch -# 0001-linux6.8.y-bore5.1.0.patch - 0032-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0f6-for-MT7922.patch 0035-Add_quirk_for_polling_the_KBD_port.patch @@ -48,9 +46,16 @@ source=( 0001-ALSA-PCI-HDA-Adjust-G814JZR-to-use-SPI-init-for-amp.patch 0002-hid-asus-use-hid-for-brightness-control-on-keyboard.patch - 0003-Debugging.patch - 0004-asus-wmi-don-t-error-out-if-platform_profile-already.patch - 0005-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch + 0003-hid-asus-add-USB_DEVICE_ID_ASUSTEK_DUO_KEYBOARD.patch + 0004-Debugging.patch + 0005-asus-wmi-don-t-error-out-if-platform_profile-already.patch + 0006-asus-wmi-min-max-for-ROG-tunables-defaults.patch + 0007-asus-wmi-reduce-code-duplication.patch + 0008-asus-wmi-add-panel-fhd.patch + 0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch + 0010-asus-wmi-enable-disable-cores.patch + 0011-asus-wmi-apu_mem-setting.patch + 0012-asus-wmi-dgpu-tgp.patch 0001-ACPI-resource-Skip-IRQ-override-on-ASUS-TUF-Gaming-A.patch 0002-ACPI-resource-Skip-IRQ-override-on-ASUS-TUF-Gaming-A.patch @@ -102,9 +107,16 @@ sha256sums=('d46c5bdf2c5961cc2a4dedefe0434d456865e95e4a7cd9f93fff054f9090e5f9' '6003eb7821c5df01af93386d82425bb49a0c70c92a8f6eddcdbd625a38b45754' '9152af5811a61dd196c520ac39792aebee325fda093ecf9acd19f80819cf8d7c' '567efcbb400bf2dc7327a790839d2a441bd7ca9fb7f5b2b07591c4abc63554bf' - '6ab14523be3cadf4d495dd13b0ed12a1241118d93d8313f47a8dea6b1bf16df6' - 'c9835e39798d97ba0ca48c0d2353d1182715d4bfc99964051993dacc8f59ba83' - '423380be1902da29e695cb201516751759050fc0a50914a0459f05e1f4614087' + 'c4b18e935815584863e28e4c8707ab0bdd400b35710f586831e441d159e63413' + 'd7bdbe9bad78e2f376b32804b99970cff53ab168b6754e860ebb453d0032a2ff' + '0047b19c4081cc931bd1d972fe03a308e74013a3358e4812b2b11492e9b52e7b' + '261214585978122c56f1bde9cd65e327e5c4d9586b136f86269cc63bd502639f' + '5871f00e8fc4d5ac541b38f64ead65df6a83db8045191e25cc0edeba3a09714b' + 'eb41dffd799c6e251c22a137f212e919c974bd56613ea5240e8e95bbac79e36b' + '5a8c9f0d80feb25d47b2988442386781ccc57c0eac50975be2479526249d29ed' + '861c1c133da37ed1a02b5568107a06e5a2d6c1404509f52749c745cca53be3ac' + '08153246f687857a1c2f12e48d348a68bdc8157dd5e31a386eac74e1c912c1e8' + 'c0011ae95b5488d9a934bf65962874b1dbbfe6ee8dbcddeb6f5910d3f6bfb29b' 'a00b952d53df9d3617d93e8fba4146a4d6169ebe79f029b3a55cca68f738d8ea' '4912b1319e46ddd6670147f5e878b4aca8bcfbd7b5c852fe11e434e424666365' '9f98765b43f5f31b33ed05f3611508113b02518e680ee82b251de80dae2e141d' diff --git a/fix_amd_eDP_HDR_flickering.patch b/fix_amd_eDP_HDR_flickering.patch deleted file mode 100644 index cbeeb2cdb2a0..000000000000 --- a/fix_amd_eDP_HDR_flickering.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -index 4e82ee4d74ac..9ac2c66a96a8 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -6172,7 +6172,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, - mod_build_hf_vsif_infopacket(stream, &stream->vsp_infopacket); - else if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT || - stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST || -- stream->signal == SIGNAL_TYPE_EDP) { -+ stream->link->psr_settings.psr_feature_enabled || -+ stream->link->replay_settings.replay_feature_enabled) { - // - // should decide stream support vsc sdp colorimetry capability - // before building vsc info packet |