diff --git a/hosts/neo/dell_pp.patch b/hosts/neo/dell_pp.patch deleted file mode 100644 index 567716f..0000000 --- a/hosts/neo/dell_pp.patch +++ /dev/null @@ -1,572 +0,0 @@ -From 06e080e41fd1472f2c476cbfc100f6b533a6741c Mon Sep 17 00:00:00 2001 -From: Lyndon Sanche -Date: Thu, 9 May 2024 22:33:48 -0600 -Subject: [PATCH v8 1/3] platform/x86: dell-smbios: Add helper for checking - supported class - -Add helper that returns true if smbios command class is supported. - -Signed-off-by: Lyndon Sanche ---- - drivers/platform/x86/dell/dell-smbios-base.c | 9 +++++++++ - drivers/platform/x86/dell/dell-smbios.h | 1 + - 2 files changed, 10 insertions(+) - -diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c -index e61bfaf8b5c4..fbdd12a7cb8d 100644 ---- a/drivers/platform/x86/dell/dell-smbios-base.c -+++ b/drivers/platform/x86/dell/dell-smbios-base.c -@@ -350,6 +350,15 @@ void dell_laptop_call_notifier(unsigned long action, void *data) - } - EXPORT_SYMBOL_GPL(dell_laptop_call_notifier); - -+bool dell_smbios_class_is_supported(u16 class) -+{ -+ /* Classes over 30 always unsupported */ -+ if (class > 30) -+ return false; -+ return da_supported_commands & (1 << class); -+} -+EXPORT_SYMBOL_GPL(dell_smbios_class_is_supported); -+ - static void __init parse_da_table(const struct dmi_header *dm) - { - /* Final token is a terminator, so we don't want to copy it */ -diff --git a/drivers/platform/x86/dell/dell-smbios.h b/drivers/platform/x86/dell/dell-smbios.h -index eb341bf000c6..756c354b1eef 100644 ---- a/drivers/platform/x86/dell/dell-smbios.h -+++ b/drivers/platform/x86/dell/dell-smbios.h -@@ -73,6 +73,7 @@ enum dell_laptop_notifier_actions { - int dell_laptop_register_notifier(struct notifier_block *nb); - int dell_laptop_unregister_notifier(struct notifier_block *nb); - void dell_laptop_call_notifier(unsigned long action, void *data); -+bool dell_smbios_class_is_supported(u16 class); - - /* for the supported backends */ - #ifdef CONFIG_DELL_SMBIOS_WMI --- -2.42.0 - - -From 190f28ff68d9281345c3e7fcc233bda10af383ca Mon Sep 17 00:00:00 2001 -From: Lyndon Sanche -Date: Fri, 17 May 2024 12:23:59 -0600 -Subject: [PATCH v8 2/3] platform/x86: dell-smbios: Move request functions for - reuse - -Move the dell_send_request and dell_fill_request symbols into smbios-base -so that they can be used in multiple modules. - -Signed-off-by: Lyndon Sanche ---- - drivers/platform/x86/dell/dell-laptop.c | 23 ------------------ - drivers/platform/x86/dell/dell-smbios-base.c | 25 ++++++++++++++++++++ - drivers/platform/x86/dell/dell-smbios.h | 5 ++++ - 3 files changed, 30 insertions(+), 23 deletions(-) - -diff --git a/drivers/platform/x86/dell/dell-laptop.c b/drivers/platform/x86/dell/dell-laptop.c -index 42f7de2b4522..6552dfe491c6 100644 ---- a/drivers/platform/x86/dell/dell-laptop.c -+++ b/drivers/platform/x86/dell/dell-laptop.c -@@ -353,29 +353,6 @@ static const struct dmi_system_id dell_quirks[] __initconst = { - { } - }; - --static void dell_fill_request(struct calling_interface_buffer *buffer, -- u32 arg0, u32 arg1, u32 arg2, u32 arg3) --{ -- memset(buffer, 0, sizeof(struct calling_interface_buffer)); -- buffer->input[0] = arg0; -- buffer->input[1] = arg1; -- buffer->input[2] = arg2; -- buffer->input[3] = arg3; --} -- --static int dell_send_request(struct calling_interface_buffer *buffer, -- u16 class, u16 select) --{ -- int ret; -- -- buffer->cmd_class = class; -- buffer->cmd_select = select; -- ret = dell_smbios_call(buffer); -- if (ret != 0) -- return ret; -- return dell_smbios_error(buffer->output[0]); --} -- - /* - * Derived from information in smbios-wireless-ctl: - * -diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c -index fbdd12a7cb8d..515c454acfe6 100644 ---- a/drivers/platform/x86/dell/dell-smbios-base.c -+++ b/drivers/platform/x86/dell/dell-smbios-base.c -@@ -314,6 +314,31 @@ int dell_smbios_call(struct calling_interface_buffer *buffer) - } - EXPORT_SYMBOL_GPL(dell_smbios_call); - -+void dell_fill_request(struct calling_interface_buffer *buffer, -+ u32 arg0, u32 arg1, u32 arg2, u32 arg3) -+{ -+ memset(buffer, 0, sizeof(struct calling_interface_buffer)); -+ buffer->input[0] = arg0; -+ buffer->input[1] = arg1; -+ buffer->input[2] = arg2; -+ buffer->input[3] = arg3; -+} -+EXPORT_SYMBOL_GPL(dell_fill_request); -+ -+int dell_send_request(struct calling_interface_buffer *buffer, -+ u16 class, u16 select) -+{ -+ int ret; -+ -+ buffer->cmd_class = class; -+ buffer->cmd_select = select; -+ ret = dell_smbios_call(buffer); -+ if (ret != 0) -+ return ret; -+ return dell_smbios_error(buffer->output[0]); -+} -+EXPORT_SYMBOL_GPL(dell_send_request); -+ - struct calling_interface_token *dell_smbios_find_token(int tokenid) - { - int i; -diff --git a/drivers/platform/x86/dell/dell-smbios.h b/drivers/platform/x86/dell/dell-smbios.h -index 756c354b1eef..1d6463cca12a 100644 ---- a/drivers/platform/x86/dell/dell-smbios.h -+++ b/drivers/platform/x86/dell/dell-smbios.h -@@ -64,6 +64,11 @@ int dell_smbios_call_filter(struct device *d, - struct calling_interface_buffer *buffer); - int dell_smbios_call(struct calling_interface_buffer *buffer); - -+void dell_fill_request(struct calling_interface_buffer *buffer, -+ u32 arg0, u32 arg1, u32 arg2, u32 arg3); -+int dell_send_request(struct calling_interface_buffer *buffer, -+ u16 class, u16 select); -+ - struct calling_interface_token *dell_smbios_find_token(int tokenid); - - enum dell_laptop_notifier_actions { --- -2.42.0 - - -From a2f629fe50de9fbbd63dc4df57732464d005e33b Mon Sep 17 00:00:00 2001 -From: Lyndon Sanche -Date: Tue, 28 May 2024 12:18:39 -0600 -Subject: [PATCH v8 3/3] platform/x86: dell-pc: Implement platform_profile - -Some Dell laptops support configuration of preset fan modes through -smbios tables. - -If the platform supports these fan modes, set up platform_profile to -change these modes. If not supported, skip enabling platform_profile. - -Signed-off-by: Lyndon Sanche ---- - MAINTAINERS | 6 + - drivers/platform/x86/dell/Kconfig | 13 + - drivers/platform/x86/dell/Makefile | 1 + - drivers/platform/x86/dell/dell-pc.c | 308 +++++++++++++++++++ - drivers/platform/x86/dell/dell-smbios-base.c | 1 + - drivers/platform/x86/dell/dell-smbios.h | 1 + - 6 files changed, 330 insertions(+) - create mode 100644 drivers/platform/x86/dell/dell-pc.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index d6c90161c7bf..09ff0dfd65cb 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -6116,6 +6116,12 @@ F: Documentation/ABI/obsolete/procfs-i8k - F: drivers/hwmon/dell-smm-hwmon.c - F: include/uapi/linux/i8k.h - -+DELL PC DRIVER -+M: Lyndon Sanche -+L: platform-driver-x86@vger.kernel.org -+S: Maintained -+F: drivers/platform/x86/dell/dell-pc.c -+ - DELL REMOTE BIOS UPDATE DRIVER - M: Stuart Hayes - L: platform-driver-x86@vger.kernel.org -diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/Kconfig -index 195a8bf532cc..85a78ef91182 100644 ---- a/drivers/platform/x86/dell/Kconfig -+++ b/drivers/platform/x86/dell/Kconfig -@@ -91,6 +91,19 @@ config DELL_RBTN - To compile this driver as a module, choose M here: the module will - be called dell-rbtn. - -+config DELL_PC -+ tristate "Dell PC Extras" -+ default m -+ depends on ACPI -+ depends on DMI -+ depends on DELL_SMBIOS -+ select ACPI_PLATFORM_PROFILE -+ help -+ This driver adds support for controlling the fan modes via platform_profile -+ on supported Dell systems regardless of formfactor. -+ Module will simply do nothing if thermal management commands are not -+ supported. -+ - # - # The DELL_SMBIOS driver depends on ACPI_WMI and/or DCDBAS if those - # backends are selected. The "depends" line prevents a configuration -diff --git a/drivers/platform/x86/dell/Makefile b/drivers/platform/x86/dell/Makefile -index 8176a257d9c3..79d60f1bf4c1 100644 ---- a/drivers/platform/x86/dell/Makefile -+++ b/drivers/platform/x86/dell/Makefile -@@ -9,6 +9,7 @@ obj-$(CONFIG_DCDBAS) += dcdbas.o - obj-$(CONFIG_DELL_LAPTOP) += dell-laptop.o - obj-$(CONFIG_DELL_RBTN) += dell-rbtn.o - obj-$(CONFIG_DELL_RBU) += dell_rbu.o -+obj-$(CONFIG_DELL_PC) += dell-pc.o - obj-$(CONFIG_DELL_SMBIOS) += dell-smbios.o - dell-smbios-objs := dell-smbios-base.o - dell-smbios-$(CONFIG_DELL_SMBIOS_WMI) += dell-smbios-wmi.o -diff --git a/drivers/platform/x86/dell/dell-pc.c b/drivers/platform/x86/dell/dell-pc.c -new file mode 100644 -index 000000000000..f0c4e64bfa1d ---- /dev/null -+++ b/drivers/platform/x86/dell/dell-pc.c -@@ -0,0 +1,308 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Driver for Dell laptop extras -+ * -+ * Copyright (c) Lyndon Sanche -+ * -+ * Based on documentation in the libsmbios package: -+ * Copyright (C) 2005-2014 Dell Inc. -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "dell-smbios.h" -+ -+ -+static const struct dmi_system_id dell_device_table[] __initconst = { -+ { -+ .ident = "Dell Inc.", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -+ }, -+ }, -+ { -+ .ident = "Dell Computer Corporation", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), -+ }, -+ }, -+ { } -+}; -+MODULE_DEVICE_TABLE(dmi, dell_device_table); -+ -+/* Derived from smbios-thermal-ctl -+ * -+ * cbClass 17 -+ * cbSelect 19 -+ * User Selectable Thermal Tables(USTT) -+ * cbArg1 determines the function to be performed -+ * cbArg1 0x0 = Get Thermal Information -+ * cbRES1 Standard return codes (0, -1, -2) -+ * cbRES2, byte 0 Bitmap of supported thermal modes. A mode is supported if -+ * its bit is set to 1 -+ * Bit 0 Balanced -+ * Bit 1 Cool Bottom -+ * Bit 2 Quiet -+ * Bit 3 Performance -+ * cbRES2, byte 1 Bitmap of supported Active Acoustic Controller (AAC) modes. -+ * Each mode corresponds to the supported thermal modes in -+ * byte 0. A mode is supported if its bit is set to 1. -+ * Bit 0 AAC (Balanced) -+ * Bit 1 AAC (Cool Bottom -+ * Bit 2 AAC (Quiet) -+ * Bit 3 AAC (Performance) -+ * cbRes3, byte 0 Current Thermal Mode -+ * Bit 0 Balanced -+ * Bit 1 Cool Bottom -+ * Bit 2 Quiet -+ * Bit 3 Performanc -+ * cbRes3, byte 1 AAC Configuration type -+ * 0 Global (AAC enable/disable applies to all supported USTT modes) -+ * 1 USTT mode specific -+ * cbRes3, byte 2 Current Active Acoustic Controller (AAC) Mode -+ * If AAC Configuration Type is Global, -+ * 0 AAC mode disabled -+ * 1 AAC mode enabled -+ * If AAC Configuration Type is USTT mode specific (multiple bits may be set), -+ * Bit 0 AAC (Balanced) -+ * Bit 1 AAC (Cool Bottom -+ * Bit 2 AAC (Quiet) -+ * Bit 3 AAC (Performance) -+ * cbRes3, byte 3 Current Fan Failure Mode -+ * Bit 0 Minimal Fan Failure (at least one fan has failed, one fan working) -+ * Bit 1 Catastrophic Fan Failure (all fans have failed) -+ * -+ * cbArg1 0x1 (Set Thermal Information), both desired thermal mode and -+ * desired AAC mode shall be applied -+ * cbArg2, byte 0 Desired Thermal Mode to set -+ * (only one bit may be set for this parameter) -+ * Bit 0 Balanced -+ * Bit 1 Cool Bottom -+ * Bit 2 Quiet -+ * Bit 3 Performance -+ * cbArg2, byte 1 Desired Active Acoustic Controller (AAC) Mode to set -+ * If AAC Configuration Type is Global, -+ * 0 AAC mode disabled -+ * 1 AAC mode enabled -+ * If AAC Configuration Type is USTT mode specific -+ * (multiple bits may be set for this parameter), -+ * Bit 0 AAC (Balanced) -+ * Bit 1 AAC (Cool Bottom -+ * Bit 2 AAC (Quiet) -+ * Bit 3 AAC (Performance) -+ */ -+ -+#define DELL_ACC_GET_FIELD GENMASK(19, 16) -+#define DELL_ACC_SET_FIELD GENMASK(11, 8) -+#define DELL_THERMAL_SUPPORTED GENMASK(3, 0) -+ -+static struct platform_profile_handler *thermal_handler; -+ -+enum thermal_mode_bits { -+ DELL_BALANCED = BIT(0), -+ DELL_COOL_BOTTOM = BIT(1), -+ DELL_QUIET = BIT(2), -+ DELL_PERFORMANCE = BIT(3), -+}; -+ -+static int thermal_get_mode(void) -+{ -+ struct calling_interface_buffer buffer; -+ int state; -+ int ret; -+ -+ dell_fill_request(&buffer, 0x0, 0, 0, 0); -+ ret = dell_send_request(&buffer, CLASS_INFO, SELECT_THERMAL_MANAGEMENT); -+ if (ret) -+ return ret; -+ state = buffer.output[2]; -+ if (state & DELL_BALANCED) -+ return DELL_BALANCED; -+ else if (state & DELL_COOL_BOTTOM) -+ return DELL_COOL_BOTTOM; -+ else if (state & DELL_QUIET) -+ return DELL_QUIET; -+ else if (state & DELL_PERFORMANCE) -+ return DELL_PERFORMANCE; -+ else -+ return -ENXIO; -+} -+ -+static int thermal_get_supported_modes(int *supported_bits) -+{ -+ struct calling_interface_buffer buffer; -+ int ret; -+ -+ dell_fill_request(&buffer, 0x0, 0, 0, 0); -+ ret = dell_send_request(&buffer, CLASS_INFO, SELECT_THERMAL_MANAGEMENT); -+ /* Thermal function not supported */ -+ if (ret == -ENXIO) { -+ *supported_bits = 0; -+ return 0; -+ } -+ if (ret) -+ return ret; -+ *supported_bits = FIELD_GET(DELL_THERMAL_SUPPORTED, buffer.output[1]); -+ return 0; -+} -+ -+static int thermal_get_acc_mode(int *acc_mode) -+{ -+ struct calling_interface_buffer buffer; -+ int ret; -+ -+ dell_fill_request(&buffer, 0x0, 0, 0, 0); -+ ret = dell_send_request(&buffer, CLASS_INFO, SELECT_THERMAL_MANAGEMENT); -+ if (ret) -+ return ret; -+ *acc_mode = FIELD_GET(DELL_ACC_GET_FIELD, buffer.output[3]); -+ return 0; -+} -+ -+static int thermal_set_mode(enum thermal_mode_bits state) -+{ -+ struct calling_interface_buffer buffer; -+ int ret; -+ int acc_mode; -+ -+ ret = thermal_get_acc_mode(&acc_mode); -+ if (ret) -+ return ret; -+ -+ dell_fill_request(&buffer, 0x1, FIELD_PREP(DELL_ACC_SET_FIELD, acc_mode) | state, 0, 0); -+ return dell_send_request(&buffer, CLASS_INFO, SELECT_THERMAL_MANAGEMENT); -+} -+ -+static int thermal_platform_profile_set(struct platform_profile_handler *pprof, -+ enum platform_profile_option profile) -+{ -+ switch (profile) { -+ case PLATFORM_PROFILE_BALANCED: -+ return thermal_set_mode(DELL_BALANCED); -+ case PLATFORM_PROFILE_PERFORMANCE: -+ return thermal_set_mode(DELL_PERFORMANCE); -+ case PLATFORM_PROFILE_QUIET: -+ return thermal_set_mode(DELL_QUIET); -+ case PLATFORM_PROFILE_COOL: -+ return thermal_set_mode(DELL_COOL_BOTTOM); -+ default: -+ return -EOPNOTSUPP; -+ } -+} -+ -+static int thermal_platform_profile_get(struct platform_profile_handler *pprof, -+ enum platform_profile_option *profile) -+{ -+ int ret; -+ -+ ret = thermal_get_mode(); -+ if (ret < 0) -+ return ret; -+ -+ switch (ret) { -+ case DELL_BALANCED: -+ *profile = PLATFORM_PROFILE_BALANCED; -+ break; -+ case DELL_PERFORMANCE: -+ *profile = PLATFORM_PROFILE_PERFORMANCE; -+ break; -+ case DELL_COOL_BOTTOM: -+ *profile = PLATFORM_PROFILE_COOL; -+ break; -+ case DELL_QUIET: -+ *profile = PLATFORM_PROFILE_QUIET; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int thermal_init(void) -+{ -+ int ret; -+ int supported_modes; -+ -+ /* If thermal commands are not supported, exit without error */ -+ if (!dell_smbios_class_is_supported(CLASS_INFO)) -+ return 0; -+ -+ /* If thermal modes are not supported, exit without error */ -+ ret = thermal_get_supported_modes(&supported_modes); -+ if (ret < 0) -+ return ret; -+ if (!supported_modes) -+ return 0; -+ -+ thermal_handler = kzalloc(sizeof(*thermal_handler), GFP_KERNEL); -+ if (!thermal_handler) -+ return -ENOMEM; -+ thermal_handler->profile_get = thermal_platform_profile_get; -+ thermal_handler->profile_set = thermal_platform_profile_set; -+ -+ if (supported_modes & DELL_QUIET) -+ set_bit(PLATFORM_PROFILE_QUIET, thermal_handler->choices); -+ if (supported_modes & DELL_COOL_BOTTOM) -+ set_bit(PLATFORM_PROFILE_COOL, thermal_handler->choices); -+ if (supported_modes & DELL_BALANCED) -+ set_bit(PLATFORM_PROFILE_BALANCED, thermal_handler->choices); -+ if (supported_modes & DELL_PERFORMANCE) -+ set_bit(PLATFORM_PROFILE_PERFORMANCE, thermal_handler->choices); -+ -+ /* Clean up if failed */ -+ ret = platform_profile_register(thermal_handler); -+ if (ret) -+ kfree(thermal_handler); -+ -+ return ret; -+} -+ -+static void thermal_cleanup(void) -+{ -+ if (thermal_handler) { -+ platform_profile_remove(); -+ kfree(thermal_handler); -+ } -+} -+ -+static int __init dell_init(void) -+{ -+ int ret; -+ -+ if (!dmi_check_system(dell_device_table)) -+ return -ENODEV; -+ -+ /* Do not fail module if thermal modes not supported, just skip */ -+ ret = thermal_init(); -+ if (ret) -+ goto fail_thermal; -+ -+ return 0; -+ -+fail_thermal: -+ thermal_cleanup(); -+ return ret; -+} -+ -+static void __exit dell_exit(void) -+{ -+ thermal_cleanup(); -+} -+ -+module_init(dell_init); -+module_exit(dell_exit); -+ -+MODULE_AUTHOR("Lyndon Sanche "); -+MODULE_DESCRIPTION("Dell PC driver"); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c -index 515c454acfe6..d61b33d5af95 100644 ---- a/drivers/platform/x86/dell/dell-smbios-base.c -+++ b/drivers/platform/x86/dell/dell-smbios-base.c -@@ -71,6 +71,7 @@ static struct smbios_call call_blacklist[] = { - /* handled by kernel: dell-laptop */ - {0x0000, CLASS_INFO, SELECT_RFKILL}, - {0x0000, CLASS_KBD_BACKLIGHT, SELECT_KBD_BACKLIGHT}, -+ {0x0000, CLASS_INFO, SELECT_THERMAL_MANAGEMENT}, - }; - - struct token_range { -diff --git a/drivers/platform/x86/dell/dell-smbios.h b/drivers/platform/x86/dell/dell-smbios.h -index 1d6463cca12a..ea0cc38642a2 100644 ---- a/drivers/platform/x86/dell/dell-smbios.h -+++ b/drivers/platform/x86/dell/dell-smbios.h -@@ -19,6 +19,7 @@ - /* Classes and selects used only in kernel drivers */ - #define CLASS_KBD_BACKLIGHT 4 - #define SELECT_KBD_BACKLIGHT 11 -+#define SELECT_THERMAL_MANAGEMENT 19 - - /* Tokens used in kernel drivers, any of these - * should be filtered from userspace access --- -2.42.0 -