Message ID | 20250305-hwm-v3-9-395e7a1407e2@gmail.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | platform/x86: alienware-wmi-wmax: HWMON support + DebugFS + Improvements | expand |
Am 06.03.25 um 01:57 schrieb Kurt Borja: > Add a debugfs interface which exposes thermal private data. > > Signed-off-by: Kurt Borja <kuurtb@gmail.com> > --- > drivers/platform/x86/dell/alienware-wmi-wmax.c | 92 ++++++++++++++++++++++++++ > 1 file changed, 92 insertions(+) > > diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c > index de4e8f177aadc9552b05cc732e41ee458b761143..23f8680a212fb9ef2a6f23aafcc2d25738ae4364 100644 > --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c > +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c > @@ -11,6 +11,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> > @@ -18,6 +19,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" > @@ -1343,6 +1345,94 @@ 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); > + struct awcc_fan_data *fan_data; > + u8 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_data = priv->fan_data[i]; > + > + seq_printf(seq, "Fan %u:\n", i); > + seq_printf(seq, " ID: 0x%02x\n", fan_data->id); > + seq_printf(seq, " Related temperature sensors: "); > + for_each_set_bit(bit, fan_data->related_temps, priv->temp_sensors_size) > + seq_printf(seq, "0x%02x ", bit); > + seq_puts(seq, "\n"); > + } > + > + seq_puts(seq, "\n"); > + > + seq_printf(seq, "Temperature sensor IDs:\n"); > + for_each_set_bit(bit, priv->temp_sensors, priv->temp_sensors_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; > + > + root = debugfs_create_dir("alienware-wmi", NULL); Please use a unique name for each driver instance. You can do this by combining the WMI device name with the driver name. With that being fixed: Reviewed-by: Armin Wolf <W_Armin@gmx.de> > + > + 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; > @@ -1381,6 +1471,8 @@ static int alienware_awcc_setup(struct wmi_device *wdev) > return ret; > } > > + awcc_debugfs_init(wdev); > + > return 0; > } > >
diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c index de4e8f177aadc9552b05cc732e41ee458b761143..23f8680a212fb9ef2a6f23aafcc2d25738ae4364 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -11,6 +11,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> @@ -18,6 +19,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" @@ -1343,6 +1345,94 @@ 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); + struct awcc_fan_data *fan_data; + u8 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_data = priv->fan_data[i]; + + seq_printf(seq, "Fan %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", fan_data->id); + seq_printf(seq, " Related temperature sensors: "); + for_each_set_bit(bit, fan_data->related_temps, priv->temp_sensors_size) + seq_printf(seq, "0x%02x ", bit); + seq_puts(seq, "\n"); + } + + seq_puts(seq, "\n"); + + seq_printf(seq, "Temperature sensor IDs:\n"); + for_each_set_bit(bit, priv->temp_sensors, priv->temp_sensors_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; + + root = debugfs_create_dir("alienware-wmi", 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; @@ -1381,6 +1471,8 @@ static int alienware_awcc_setup(struct wmi_device *wdev) return ret; } + awcc_debugfs_init(wdev); + return 0; }
Add a debugfs interface which exposes thermal private data. Signed-off-by: Kurt Borja <kuurtb@gmail.com> --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 92 ++++++++++++++++++++++++++ 1 file changed, 92 insertions(+)