summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaijian2024-05-27 18:25:33 +0200
committerTaijian2024-05-27 18:25:33 +0200
commit76dd32313ff56173f9d02726ae71f8b6ffc5d170 (patch)
treecf0e720c5766d82e140f7b0fba1680b19af66d5f
parent51b8f655f5bebc66fe7ab7f339f1229713167fda (diff)
downloadaur-76dd32313ff56173f9d02726ae71f8b6ffc5d170.tar.gz
add more patches
-rw-r--r--.SRCINFO28
-rw-r--r--0001-hid-asus-use-hid-for-brightness-control-on-keyboard.patch123
-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.patch600
-rw-r--r--0007-asus-wmi-reduce-code-duplication.patch278
-rw-r--r--0008-asus-wmi-add-panel-fhd.patch57
-rw-r--r--0009-asus-wmi-use-WMI_SIMPLE_SHOW-in-some-more-places.patch57
-rw-r--r--0010-asus-wmi-enable-disable-cores.patch152
-rw-r--r--0011-asus-wmi-apu_mem-setting.patch179
-rw-r--r--0012-asus-wmi-dgpu-tgp.patch71
-rw-r--r--PKGBUILD30
-rw-r--r--fix_amd_eDP_HDR_flickering.patch14
14 files changed, 1471 insertions, 187 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 9072af7cba47..298c86da1f6d 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -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
+
diff --git a/PKGBUILD b/PKGBUILD
index 3688d607261d..c1bbf5a3f707 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -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