drivers/platform/x86/dell/alienware-wmi-wmax.c | 100 ++++++++++++++++--------- 1 file changed, 63 insertions(+), 37 deletions(-)
Add known fan type IDs and match them to an appropriate label in
awcc_hwmon_read_string().
Additionally, add the AWCC_TEMP_SENSOR_FRONT type, which was inferred
from it's related fan type in supported systems.
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
---
drivers/platform/x86/dell/alienware-wmi-wmax.c | 100 ++++++++++++++++---------
1 file changed, 63 insertions(+), 37 deletions(-)
diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c
index c42f9228b0b255fe962b735ac96486824e83945f..b25eb3225d8e5385384880a9cb480aaf3cb4d0a8 100644
--- a/drivers/platform/x86/dell/alienware-wmi-wmax.c
+++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c
@@ -273,9 +273,29 @@ enum AWCC_SPECIAL_THERMAL_CODES {
enum AWCC_TEMP_SENSOR_TYPES {
AWCC_TEMP_SENSOR_CPU = 0x01,
+ AWCC_TEMP_SENSOR_FRONT = 0x03,
AWCC_TEMP_SENSOR_GPU = 0x06,
};
+enum AWCC_FAN_TYPES {
+ AWCC_FAN_CPU_1 = 0x32,
+ AWCC_FAN_GPU_1 = 0x33,
+ AWCC_FAN_PCI = 0x34,
+ AWCC_FAN_MID = 0x35,
+ AWCC_FAN_TOP_1 = 0x36,
+ AWCC_FAN_SIDE = 0x37,
+ AWCC_FAN_U2_1 = 0x38,
+ AWCC_FAN_U2_2 = 0x39,
+ AWCC_FAN_FRONT_1 = 0x3A,
+ AWCC_FAN_CPU_2 = 0x3B,
+ AWCC_FAN_GPU_2 = 0x3C,
+ AWCC_FAN_TOP_2 = 0x3D,
+ AWCC_FAN_TOP_3 = 0x3E,
+ AWCC_FAN_FRONT_2 = 0x3F,
+ AWCC_FAN_BOTTOM_1 = 0x40,
+ AWCC_FAN_BOTTOM_2 = 0x41,
+};
+
enum awcc_thermal_profile {
AWCC_PROFILE_USTT_BALANCED,
AWCC_PROFILE_USTT_BALANCED_PERFORMANCE,
@@ -314,7 +334,6 @@ struct wmax_u32_args {
struct awcc_fan_data {
unsigned long auto_channels_temp;
- const char *label;
u32 min_rpm;
u32 max_rpm;
u8 suspend_cache;
@@ -896,6 +915,9 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
case AWCC_TEMP_SENSOR_CPU:
*str = "CPU";
break;
+ case AWCC_TEMP_SENSOR_FRONT:
+ *str = "Front";
+ break;
case AWCC_TEMP_SENSOR_GPU:
*str = "GPU";
break;
@@ -906,7 +928,46 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
break;
case hwmon_fan:
- *str = priv->fan_data[channel]->label;
+ switch (priv->fan_data[channel]->id) {
+ case AWCC_FAN_CPU_1:
+ case AWCC_FAN_CPU_2:
+ *str = "CPU Fan";
+ break;
+ case AWCC_FAN_GPU_1:
+ case AWCC_FAN_GPU_2:
+ *str = "GPU Fan";
+ break;
+ case AWCC_FAN_PCI:
+ *str = "PCI Fan";
+ break;
+ case AWCC_FAN_MID:
+ *str = "Mid Fan";
+ break;
+ case AWCC_FAN_TOP_1:
+ case AWCC_FAN_TOP_2:
+ case AWCC_FAN_TOP_3:
+ *str = "Top Fan";
+ break;
+ case AWCC_FAN_SIDE:
+ *str = "Side Fan";
+ break;
+ case AWCC_FAN_U2_1:
+ case AWCC_FAN_U2_2:
+ *str = "U.2 Fan";
+ break;
+ case AWCC_FAN_FRONT_1:
+ case AWCC_FAN_FRONT_2:
+ *str = "Front Fan";
+ break;
+ case AWCC_FAN_BOTTOM_1:
+ case AWCC_FAN_BOTTOM_2:
+ *str = "Bottom Fan";
+ break;
+ default:
+ *str = "Unknown Fan";
+ break;
+ }
+
break;
default:
return -EOPNOTSUPP;
@@ -1051,40 +1112,6 @@ static int awcc_hwmon_temps_init(struct wmi_device *wdev)
return 0;
}
-static char *awcc_get_fan_label(unsigned long *fan_temps)
-{
- unsigned int temp_count = bitmap_weight(fan_temps, AWCC_ID_BITMAP_SIZE);
- char *label;
- u8 temp_id;
-
- switch (temp_count) {
- case 0:
- label = "Independent Fan";
- break;
- case 1:
- temp_id = find_first_bit(fan_temps, AWCC_ID_BITMAP_SIZE);
-
- switch (temp_id) {
- case AWCC_TEMP_SENSOR_CPU:
- label = "Processor Fan";
- break;
- case AWCC_TEMP_SENSOR_GPU:
- label = "Video Fan";
- break;
- default:
- label = "Unknown Fan";
- break;
- }
-
- break;
- default:
- label = "Shared Fan";
- break;
- }
-
- return label;
-}
-
static int awcc_hwmon_fans_init(struct wmi_device *wdev)
{
struct awcc_priv *priv = dev_get_drvdata(&wdev->dev);
@@ -1138,7 +1165,6 @@ static int awcc_hwmon_fans_init(struct wmi_device *wdev)
fan_data->id = id;
fan_data->min_rpm = min_rpm;
fan_data->max_rpm = max_rpm;
- fan_data->label = awcc_get_fan_label(fan_temps);
bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE);
bitmap_copy(&fan_data->auto_channels_temp, gather, BITS_PER_LONG);
priv->fan_data[i] = fan_data;
---
base-commit: 9c96808f10d84156b5e98e16176b725ec5a1386f
change-id: 20250528-awcc-labels-372162572ad7
--
~ Kurt
On Wed, 28 May 2025 07:47:22 -0300, Kurt Borja wrote:
> Add known fan type IDs and match them to an appropriate label in
> awcc_hwmon_read_string().
>
> Additionally, add the AWCC_TEMP_SENSOR_FRONT type, which was inferred
> from it's related fan type in supported systems.
>
>
> [...]
Thank you for your contribution, it has been applied to my local
review-ilpo-next branch. Note it will show up in the public
platform-drivers-x86/review-ilpo-next branch only once I've pushed my
local branch there, which might take a while.
The list of commits applied:
[1/1] platform/x86: alienware-wmi-wmax: Add appropriate labels to fans
commit: 844d8e4c7f9a3eeb681493f12c55de0392510fe3
--
i.
Am 28.05.25 um 12:47 schrieb Kurt Borja:
> Add known fan type IDs and match them to an appropriate label in
> awcc_hwmon_read_string().
>
> Additionally, add the AWCC_TEMP_SENSOR_FRONT type, which was inferred
> from it's related fan type in supported systems.
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
> Signed-off-by: Kurt Borja <kuurtb@gmail.com>
> ---
> drivers/platform/x86/dell/alienware-wmi-wmax.c | 100 ++++++++++++++++---------
> 1 file changed, 63 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c
> index c42f9228b0b255fe962b735ac96486824e83945f..b25eb3225d8e5385384880a9cb480aaf3cb4d0a8 100644
> --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c
> +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c
> @@ -273,9 +273,29 @@ enum AWCC_SPECIAL_THERMAL_CODES {
>
> enum AWCC_TEMP_SENSOR_TYPES {
> AWCC_TEMP_SENSOR_CPU = 0x01,
> + AWCC_TEMP_SENSOR_FRONT = 0x03,
> AWCC_TEMP_SENSOR_GPU = 0x06,
> };
>
> +enum AWCC_FAN_TYPES {
> + AWCC_FAN_CPU_1 = 0x32,
> + AWCC_FAN_GPU_1 = 0x33,
> + AWCC_FAN_PCI = 0x34,
> + AWCC_FAN_MID = 0x35,
> + AWCC_FAN_TOP_1 = 0x36,
> + AWCC_FAN_SIDE = 0x37,
> + AWCC_FAN_U2_1 = 0x38,
> + AWCC_FAN_U2_2 = 0x39,
> + AWCC_FAN_FRONT_1 = 0x3A,
> + AWCC_FAN_CPU_2 = 0x3B,
> + AWCC_FAN_GPU_2 = 0x3C,
> + AWCC_FAN_TOP_2 = 0x3D,
> + AWCC_FAN_TOP_3 = 0x3E,
> + AWCC_FAN_FRONT_2 = 0x3F,
> + AWCC_FAN_BOTTOM_1 = 0x40,
> + AWCC_FAN_BOTTOM_2 = 0x41,
> +};
> +
> enum awcc_thermal_profile {
> AWCC_PROFILE_USTT_BALANCED,
> AWCC_PROFILE_USTT_BALANCED_PERFORMANCE,
> @@ -314,7 +334,6 @@ struct wmax_u32_args {
>
> struct awcc_fan_data {
> unsigned long auto_channels_temp;
> - const char *label;
> u32 min_rpm;
> u32 max_rpm;
> u8 suspend_cache;
> @@ -896,6 +915,9 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
> case AWCC_TEMP_SENSOR_CPU:
> *str = "CPU";
> break;
> + case AWCC_TEMP_SENSOR_FRONT:
> + *str = "Front";
> + break;
> case AWCC_TEMP_SENSOR_GPU:
> *str = "GPU";
> break;
> @@ -906,7 +928,46 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
>
> break;
> case hwmon_fan:
> - *str = priv->fan_data[channel]->label;
> + switch (priv->fan_data[channel]->id) {
> + case AWCC_FAN_CPU_1:
> + case AWCC_FAN_CPU_2:
> + *str = "CPU Fan";
> + break;
> + case AWCC_FAN_GPU_1:
> + case AWCC_FAN_GPU_2:
> + *str = "GPU Fan";
> + break;
> + case AWCC_FAN_PCI:
> + *str = "PCI Fan";
> + break;
> + case AWCC_FAN_MID:
> + *str = "Mid Fan";
> + break;
> + case AWCC_FAN_TOP_1:
> + case AWCC_FAN_TOP_2:
> + case AWCC_FAN_TOP_3:
> + *str = "Top Fan";
> + break;
> + case AWCC_FAN_SIDE:
> + *str = "Side Fan";
> + break;
> + case AWCC_FAN_U2_1:
> + case AWCC_FAN_U2_2:
> + *str = "U.2 Fan";
> + break;
> + case AWCC_FAN_FRONT_1:
> + case AWCC_FAN_FRONT_2:
> + *str = "Front Fan";
> + break;
> + case AWCC_FAN_BOTTOM_1:
> + case AWCC_FAN_BOTTOM_2:
> + *str = "Bottom Fan";
> + break;
> + default:
> + *str = "Unknown Fan";
> + break;
> + }
> +
> break;
> default:
> return -EOPNOTSUPP;
> @@ -1051,40 +1112,6 @@ static int awcc_hwmon_temps_init(struct wmi_device *wdev)
> return 0;
> }
>
> -static char *awcc_get_fan_label(unsigned long *fan_temps)
> -{
> - unsigned int temp_count = bitmap_weight(fan_temps, AWCC_ID_BITMAP_SIZE);
> - char *label;
> - u8 temp_id;
> -
> - switch (temp_count) {
> - case 0:
> - label = "Independent Fan";
> - break;
> - case 1:
> - temp_id = find_first_bit(fan_temps, AWCC_ID_BITMAP_SIZE);
> -
> - switch (temp_id) {
> - case AWCC_TEMP_SENSOR_CPU:
> - label = "Processor Fan";
> - break;
> - case AWCC_TEMP_SENSOR_GPU:
> - label = "Video Fan";
> - break;
> - default:
> - label = "Unknown Fan";
> - break;
> - }
> -
> - break;
> - default:
> - label = "Shared Fan";
> - break;
> - }
> -
> - return label;
> -}
> -
> static int awcc_hwmon_fans_init(struct wmi_device *wdev)
> {
> struct awcc_priv *priv = dev_get_drvdata(&wdev->dev);
> @@ -1138,7 +1165,6 @@ static int awcc_hwmon_fans_init(struct wmi_device *wdev)
> fan_data->id = id;
> fan_data->min_rpm = min_rpm;
> fan_data->max_rpm = max_rpm;
> - fan_data->label = awcc_get_fan_label(fan_temps);
> bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE);
> bitmap_copy(&fan_data->auto_channels_temp, gather, BITS_PER_LONG);
> priv->fan_data[i] = fan_data;
>
> ---
> base-commit: 9c96808f10d84156b5e98e16176b725ec5a1386f
> change-id: 20250528-awcc-labels-372162572ad7
© 2016 - 2025 Red Hat, Inc.