summarylogtreecommitdiffstats
path: root/0011-asus-wmi-apu_mem-setting.patch
diff options
context:
space:
mode:
Diffstat (limited to '0011-asus-wmi-apu_mem-setting.patch')
-rw-r--r--0011-asus-wmi-apu_mem-setting.patch179
1 files changed, 179 insertions, 0 deletions
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
+