]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: alienware-wmi-wmax: Add a DebugFS interface
authorKurt Borja <kuurtb@gmail.com>
Sat, 29 Mar 2025 07:32:26 +0000 (04:32 -0300)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 11 Apr 2025 10:10:06 +0000 (13:10 +0300)
Add a debugfs interface which exposes thermal private data.

Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Link: https://lore.kernel.org/r/20250329-hwm-v7-9-a14ea39d8a94@gmail.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/dell/alienware-wmi-wmax.c

index 6caf3470d7e15e87540b7d933ad74e9877d6ebab..faeddfe3b79e0aa51e7c8c6b23aa4ac5c7218706 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/bitfield.h>
 #include <linux/bitmap.h>
 #include <linux/bits.h>
+#include <linux/debugfs.h>
 #include <linux/dmi.h>
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
@@ -20,6 +21,7 @@
 #include <linux/moduleparam.h>
 #include <linux/platform_profile.h>
 #include <linux/pm.h>
+#include <linux/seq_file.h>
 #include <linux/units.h>
 #include <linux/wmi.h>
 #include "alienware-wmi.h"
@@ -1259,6 +1261,92 @@ static int awcc_platform_profile_init(struct wmi_device *wdev)
        return PTR_ERR_OR_ZERO(priv->ppdev);
 }
 
+/*
+ * DebugFS
+ */
+static int awcc_debugfs_system_description_read(struct seq_file *seq, void *data)
+{
+       struct device *dev = seq->private;
+       struct awcc_priv *priv = dev_get_drvdata(dev);
+
+       seq_printf(seq, "0x%08x\n", priv->system_description);
+
+       return 0;
+}
+
+static int awcc_debugfs_hwmon_data_read(struct seq_file *seq, void *data)
+{
+       struct device *dev = seq->private;
+       struct awcc_priv *priv = dev_get_drvdata(dev);
+       const struct awcc_fan_data *fan;
+       unsigned int bit;
+
+       seq_printf(seq, "Number of fans: %u\n", priv->fan_count);
+       seq_printf(seq, "Number of temperature sensors: %u\n\n", priv->temp_count);
+
+       for (u32 i = 0; i < priv->fan_count; i++) {
+               fan = priv->fan_data[i];
+
+               seq_printf(seq, "Fan %u:\n", i);
+               seq_printf(seq, "  ID: 0x%02x\n", fan->id);
+               seq_printf(seq, "  Related temperature sensors bitmap: %lu\n",
+                          fan->auto_channels_temp);
+       }
+
+       seq_puts(seq, "\nTemperature sensor IDs:\n");
+       for_each_set_bit(bit, priv->temp_sensors, AWCC_ID_BITMAP_SIZE)
+               seq_printf(seq, "  0x%02x\n", bit);
+
+       return 0;
+}
+
+static int awcc_debugfs_pprof_data_read(struct seq_file *seq, void *data)
+{
+       struct device *dev = seq->private;
+       struct awcc_priv *priv = dev_get_drvdata(dev);
+
+       seq_printf(seq, "Number of thermal profiles: %u\n\n", priv->profile_count);
+
+       for (u32 i = 0; i < PLATFORM_PROFILE_LAST; i++) {
+               if (!priv->supported_profiles[i])
+                       continue;
+
+               seq_printf(seq, "Platform profile %u:\n", i);
+               seq_printf(seq, "  ID: 0x%02x\n", priv->supported_profiles[i]);
+       }
+
+       return 0;
+}
+
+static void awcc_debugfs_remove(void *data)
+{
+       struct dentry *root = data;
+
+       debugfs_remove(root);
+}
+
+static void awcc_debugfs_init(struct wmi_device *wdev)
+{
+       struct dentry *root;
+       char name[64];
+
+       scnprintf(name, sizeof(name), "%s-%s", "alienware-wmi", dev_name(&wdev->dev));
+       root = debugfs_create_dir(name, NULL);
+
+       debugfs_create_devm_seqfile(&wdev->dev, "system_description", root,
+                                   awcc_debugfs_system_description_read);
+
+       if (awcc->hwmon)
+               debugfs_create_devm_seqfile(&wdev->dev, "hwmon_data", root,
+                                           awcc_debugfs_hwmon_data_read);
+
+       if (awcc->pprof)
+               debugfs_create_devm_seqfile(&wdev->dev, "pprof_data", root,
+                                           awcc_debugfs_pprof_data_read);
+
+       devm_add_action_or_reset(&wdev->dev, awcc_debugfs_remove, root);
+}
+
 static int alienware_awcc_setup(struct wmi_device *wdev)
 {
        struct awcc_priv *priv;
@@ -1297,6 +1385,8 @@ static int alienware_awcc_setup(struct wmi_device *wdev)
                        return ret;
        }
 
+       awcc_debugfs_init(wdev);
+
        return 0;
 }