* [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control
@ 2026-05-20 2:53 Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Radhey Kalra @ 2026-05-20 2:53 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, krishna.chomal108, hansg, Radhey Kalra
Hi,
This is a split version of v3 as requested. Patches 1 and 2 are
no-functional-changes-intended refactors which move the existing
thermal-profile and fan-control decisions into board-specific
.driver_data. Patch 3 fixes the fan-table GPU delta parsing issue
found while testing this board. Patch 4 adds fan-control support for
Victus 15-fb0xxx board 8A3D.
Based on platform-drivers-x86/for-next commit:
165e81354eefd5551358112773f24027aac59d5a
Tested on a Victus by HP Gaming Laptop 15-fb0xxx, board 8A3D, BIOS
F.22. With the series applied, pwm1 and pwm1_enable are exposed and
the EC-layout warning is not emitted for 8A3D.
Radhey Kalra (4):
platform/x86: hp-wmi: Introduce board-specific feature data
platform/x86: hp-wmi: Drive fan control from board data
platform/x86: hp-wmi: Skip zero GPU RPM rows for fan speed delta
platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control
---
Changes in v4:
- Split v3 into two no-functional-changes-intended refactors, one
fan-table parsing fix, and one 8A3D support patch.
- Rebase on platform-drivers-x86/for-next commit 165e81354eefd555.
- Move revision notes to the cover letter.
Changes in v3:
- Rebase on platform-drivers-x86/for-next commit 165e81354eefd555.
- Keep the v2 board-data approach and 8A3D fan-control-only handling.
Changes in v2:
- Use real name in Signed-off-by.
- Replace the ad-hoc fan-control DMI table with board data in
.driver_data.
- Keep 8A3D fan-control-only instead of enabling Victus S thermal
profiles.
- Use the fixed fan-table parser path and derive gpu_delta from the
first non-zero GPU row.
drivers/platform/x86/hp/hp-wmi.c | 197 +++++++++++++++++++++----------
1 file changed, 136 insertions(+), 61 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data
2026-05-20 2:53 [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
@ 2026-05-20 2:53 ` Radhey Kalra
2026-05-20 11:35 ` Ilpo Järvinen
2026-05-20 2:53 ` [PATCH v4 2/4] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Radhey Kalra @ 2026-05-20 2:53 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, krishna.chomal108, hansg, Radhey Kalra
The victus_s_thermal_profile_boards DMI table is about to carry more than
thermal-profile data. Replace the direct thermal_profile_params
.driver_data pointers with hp_wmi_board_params and rename the table/setup
helper accordingly.
No functional changes intended.
Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
---
drivers/platform/x86/hp/hp-wmi.c | 82 ++++++++++++++++++--------------
1 file changed, 47 insertions(+), 35 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index d1cc6e7..b226695 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -133,11 +133,29 @@ static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
.ec_tp_offset = HP_NO_THERMAL_PROFILE_OFFSET,
};
-/*
- * A generic pointer for the currently-active board's thermal profile
- * parameters.
- */
-static struct thermal_profile_params *active_thermal_profile_params;
+static const struct thermal_profile_params *active_thermal_profile_params;
+
+struct hp_wmi_board_params {
+ const struct thermal_profile_params *thermal_profile;
+};
+
+static const struct hp_wmi_board_params victus_s_board_params = {
+ .thermal_profile = &victus_s_thermal_params,
+};
+
+static const struct hp_wmi_board_params omen_v1_board_params = {
+ .thermal_profile = &omen_v1_thermal_params,
+};
+
+static const struct hp_wmi_board_params omen_v1_legacy_board_params = {
+ .thermal_profile = &omen_v1_legacy_thermal_params,
+};
+
+static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
+ .thermal_profile = &omen_v1_no_ec_thermal_params,
+};
+
+static const struct hp_wmi_board_params *active_board_params;
/* DMI board names of devices that should use the omen specific path for
* thermal profiles.
@@ -187,67 +205,67 @@ static const char * const victus_thermal_profile_boards[] = {
"8A25",
};
-/* DMI Board names of Victus 16-r and Victus 16-s laptops */
-static const struct dmi_system_id victus_s_thermal_profile_boards[] __initconst = {
+/* DMI board-specific feature data for Omen and Victus laptops. */
+static const struct dmi_system_id hp_wmi_feature_boards[] __initconst = {
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8A44") },
- .driver_data = (void *)&omen_v1_legacy_thermal_params,
+ .driver_data = (void *)&omen_v1_legacy_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8A4D") },
- .driver_data = (void *)&omen_v1_legacy_thermal_params,
+ .driver_data = (void *)&omen_v1_legacy_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BAB") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BBE") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCA") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCD") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD4") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD5") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C76") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C77") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C78") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C99") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C9C") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D41") },
- .driver_data = (void *)&victus_s_thermal_params,
+ .driver_data = (void *)&victus_s_board_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D87") },
- .driver_data = (void *)&omen_v1_no_ec_thermal_params,
+ .driver_data = (void *)&omen_v1_no_ec_board_params,
},
{},
};
@@ -1904,7 +1922,7 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
static int platform_profile_victus_s_set_ec(enum platform_profile_option profile)
{
- struct thermal_profile_params *params;
+ const struct thermal_profile_params *params;
bool gpu_ctgp_enable, gpu_ppab_enable;
u8 gpu_dstate; /* Test shows 1 = 100%, 2 = 50%, 3 = 25%, 4 = 12.5% */
int err, tp;
@@ -2673,23 +2691,20 @@ static int hp_wmi_hwmon_init(void)
return 0;
}
-static void __init setup_active_thermal_profile_params(void)
+static void __init setup_active_board_params(void)
{
const struct dmi_system_id *id;
- /*
- * Currently only victus_s devices use the
- * active_thermal_profile_params
- */
- id = dmi_first_match(victus_s_thermal_profile_boards);
+ id = dmi_first_match(hp_wmi_feature_boards);
if (id) {
+ active_board_params = id->driver_data;
+ active_thermal_profile_params = active_board_params->thermal_profile;
/*
* Marking this boolean is required to ensure that
* is_victus_s_thermal_profile() behaves like a valid
* wrapper.
*/
is_victus_s_board = true;
- active_thermal_profile_params = id->driver_data;
if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
dmi_get_system_info(DMI_BOARD_NAME));
@@ -2724,11 +2739,8 @@ static int __init hp_wmi_init(void)
goto err_destroy_input;
}
- /*
- * Setup active board's thermal profile parameters before
- * starting platform driver probe.
- */
- setup_active_thermal_profile_params();
+ /* Setup active board feature data before starting platform driver probe. */
+ setup_active_board_params();
err = platform_driver_probe(&hp_wmi_driver, hp_wmi_bios_setup);
if (err)
goto err_unregister_device;
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 2/4] platform/x86: hp-wmi: Drive fan control from board data
2026-05-20 2:53 [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
@ 2026-05-20 2:53 ` Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 3/4] platform/x86: hp-wmi: Skip zero GPU RPM rows for fan speed delta Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
3 siblings, 0 replies; 7+ messages in thread
From: Radhey Kalra @ 2026-05-20 2:53 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, krishna.chomal108, hansg, Radhey Kalra
Use the board-specific .driver_data to describe fan-control support and
fan-speed read callbacks. Existing boards keep the same Victus fan-control
path, but the hwmon code no longer hardcodes that decision through
is_victus_s_thermal_profile().
No functional changes intended.
Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
---
drivers/platform/x86/hp/hp-wmi.c | 79 ++++++++++++++++++++++++++------
1 file changed, 64 insertions(+), 15 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index b226695..465ad8e 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -135,24 +135,41 @@ static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
static const struct thermal_profile_params *active_thermal_profile_params;
+struct hp_wmi_fan_profile_params {
+ int (*get_fan_speed)(int fan);
+ bool fan_table;
+};
+
struct hp_wmi_board_params {
const struct thermal_profile_params *thermal_profile;
+ const struct hp_wmi_fan_profile_params *fan_profile;
+};
+
+static int hp_wmi_get_fan_speed_victus_s(int fan);
+
+static const struct hp_wmi_fan_profile_params victus_s_fan_profile_params = {
+ .get_fan_speed = hp_wmi_get_fan_speed_victus_s,
+ .fan_table = true,
};
static const struct hp_wmi_board_params victus_s_board_params = {
.thermal_profile = &victus_s_thermal_params,
+ .fan_profile = &victus_s_fan_profile_params,
};
static const struct hp_wmi_board_params omen_v1_board_params = {
.thermal_profile = &omen_v1_thermal_params,
+ .fan_profile = &victus_s_fan_profile_params,
};
static const struct hp_wmi_board_params omen_v1_legacy_board_params = {
.thermal_profile = &omen_v1_legacy_thermal_params,
+ .fan_profile = &victus_s_fan_profile_params,
};
static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
.thermal_profile = &omen_v1_no_ec_thermal_params,
+ .fan_profile = &victus_s_fan_profile_params,
};
static const struct hp_wmi_board_params *active_board_params;
@@ -1787,6 +1804,38 @@ static bool is_victus_s_thermal_profile(void)
return is_victus_s_board;
}
+static const struct hp_wmi_fan_profile_params *hp_wmi_fan_profile(void)
+{
+ if (!active_board_params)
+ return NULL;
+
+ return active_board_params->fan_profile;
+}
+
+static bool hp_wmi_fan_control_supported(void)
+{
+ const struct hp_wmi_fan_profile_params *params = hp_wmi_fan_profile();
+
+ return params && params->get_fan_speed;
+}
+
+static bool hp_wmi_fan_table_supported(void)
+{
+ const struct hp_wmi_fan_profile_params *params = hp_wmi_fan_profile();
+
+ return params && params->fan_table;
+}
+
+static int hp_wmi_get_active_fan_speed(int fan)
+{
+ const struct hp_wmi_fan_profile_params *params = hp_wmi_fan_profile();
+
+ if (!params || !params->get_fan_speed)
+ return -EOPNOTSUPP;
+
+ return params->get_fan_speed(fan);
+}
+
static int victus_s_gpu_thermal_profile_get(bool *ctgp_enable,
bool *ppab_enable,
u8 *dstate,
@@ -2398,7 +2447,7 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
switch (priv->mode) {
case PWM_MODE_MAX:
- if (is_victus_s_thermal_profile()) {
+ if (hp_wmi_fan_control_supported()) {
ret = hp_wmi_get_fan_count_userdefine_trigger();
if (ret < 0)
return ret;
@@ -2410,7 +2459,7 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
secs_to_jiffies(KEEP_ALIVE_DELAY_SECS));
return 0;
case PWM_MODE_MANUAL:
- if (!is_victus_s_thermal_profile())
+ if (!hp_wmi_fan_control_supported())
return -EOPNOTSUPP;
ret = hp_wmi_fan_speed_set(priv, pwm_to_rpm(priv->pwm, priv));
if (ret < 0)
@@ -2419,7 +2468,7 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
secs_to_jiffies(KEEP_ALIVE_DELAY_SECS));
return 0;
case PWM_MODE_AUTO:
- if (is_victus_s_thermal_profile()) {
+ if (hp_wmi_fan_control_supported()) {
ret = hp_wmi_get_fan_count_userdefine_trigger();
if (ret < 0)
return ret;
@@ -2443,12 +2492,12 @@ static umode_t hp_wmi_hwmon_is_visible(const void *data,
{
switch (type) {
case hwmon_pwm:
- if (attr == hwmon_pwm_input && !is_victus_s_thermal_profile())
+ if (attr == hwmon_pwm_input && !hp_wmi_fan_control_supported())
return 0;
return 0644;
case hwmon_fan:
- if (is_victus_s_thermal_profile()) {
- if (hp_wmi_get_fan_speed_victus_s(channel) >= 0)
+ if (hp_wmi_fan_control_supported()) {
+ if (hp_wmi_get_active_fan_speed(channel) >= 0)
return 0444;
} else {
if (hp_wmi_get_fan_speed(channel) >= 0)
@@ -2472,8 +2521,8 @@ static int hp_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
priv = dev_get_drvdata(dev);
switch (type) {
case hwmon_fan:
- if (is_victus_s_thermal_profile())
- ret = hp_wmi_get_fan_speed_victus_s(channel);
+ if (hp_wmi_fan_control_supported())
+ ret = hp_wmi_get_active_fan_speed(channel);
else
ret = hp_wmi_get_fan_speed(channel);
if (ret < 0)
@@ -2482,10 +2531,10 @@ static int hp_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
return 0;
case hwmon_pwm:
if (attr == hwmon_pwm_input) {
- if (!is_victus_s_thermal_profile())
+ if (!hp_wmi_fan_control_supported())
return -EOPNOTSUPP;
- rpm = hp_wmi_get_fan_speed_victus_s(channel);
+ rpm = hp_wmi_get_active_fan_speed(channel);
if (rpm < 0)
return rpm;
*val = rpm_to_pwm(rpm / 100, priv);
@@ -2519,7 +2568,7 @@ static int hp_wmi_hwmon_write(struct device *dev, enum hwmon_sensor_types type,
switch (type) {
case hwmon_pwm:
if (attr == hwmon_pwm_input) {
- if (!is_victus_s_thermal_profile())
+ if (!hp_wmi_fan_control_supported())
return -EOPNOTSUPP;
/* PWM input is invalid when not in manual mode */
if (priv->mode != PWM_MODE_MANUAL)
@@ -2536,13 +2585,13 @@ static int hp_wmi_hwmon_write(struct device *dev, enum hwmon_sensor_types type,
priv->mode = PWM_MODE_MAX;
return hp_wmi_apply_fan_settings(priv);
case PWM_MODE_MANUAL:
- if (!is_victus_s_thermal_profile())
+ if (!hp_wmi_fan_control_supported())
return -EOPNOTSUPP;
/*
* When switching to manual mode, set fan speed to
* current RPM values to ensure a smooth transition.
*/
- rpm = hp_wmi_get_fan_speed_victus_s(channel);
+ rpm = hp_wmi_get_active_fan_speed(channel);
if (rpm < 0)
return rpm;
priv->pwm = rpm_to_pwm(rpm / 100, priv);
@@ -2608,8 +2657,8 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)
/* Default behaviour on hwmon init is automatic mode */
priv->mode = PWM_MODE_AUTO;
- /* Bypass all non-Victus S devices */
- if (!is_victus_s_thermal_profile())
+ /* Bypass devices without fan control support. */
+ if (!hp_wmi_fan_table_supported())
return 0;
ret = hp_wmi_perform_query(HPWMI_VICTUS_S_GET_FAN_TABLE_QUERY,
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 3/4] platform/x86: hp-wmi: Skip zero GPU RPM rows for fan speed delta
2026-05-20 2:53 [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 2/4] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
@ 2026-05-20 2:53 ` Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
3 siblings, 0 replies; 7+ messages in thread
From: Radhey Kalra @ 2026-05-20 2:53 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, krishna.chomal108, hansg, Radhey Kalra
Some Victus fan tables start with a CPU RPM value while the GPU RPM field
is zero. On board 8A3D the first row is cpu=23, gpu=0, noise=25, followed
by cpu=24, gpu=22, noise=26.
Derive gpu_delta from the first row that contains a non-zero GPU RPM
instead of unconditionally using row 0.
Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
---
drivers/platform/x86/hp/hp-wmi.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index 465ad8e..9d2966e 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -2652,6 +2652,7 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)
u8 min_rpm, max_rpm;
u8 cpu_rpm, gpu_rpm, noise_db;
int gpu_delta, i, num_entries, ret;
+ bool gpu_delta_found = false;
size_t header_size, entry_size;
/* Default behaviour on hwmon init is automatic mode */
@@ -2692,12 +2693,15 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)
min_rpm = cpu_rpm;
if (cpu_rpm > max_rpm)
max_rpm = cpu_rpm;
+ if (!gpu_delta_found && gpu_rpm > 0) {
+ gpu_delta = gpu_rpm - cpu_rpm;
+ gpu_delta_found = true;
+ }
}
- if (min_rpm == U8_MAX || max_rpm == 0)
+ if (min_rpm == U8_MAX || max_rpm == 0 || !gpu_delta_found)
return -EINVAL;
- gpu_delta = fan_table->entries[0].gpu_rpm - fan_table->entries[0].cpu_rpm;
priv->min_rpm = min_rpm;
priv->max_rpm = max_rpm;
priv->gpu_delta = gpu_delta;
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control
2026-05-20 2:53 [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
` (2 preceding siblings ...)
2026-05-20 2:53 ` [PATCH v4 3/4] platform/x86: hp-wmi: Skip zero GPU RPM rows for fan speed delta Radhey Kalra
@ 2026-05-20 2:53 ` Radhey Kalra
2026-05-20 11:50 ` Ilpo Järvinen
3 siblings, 1 reply; 7+ messages in thread
From: Radhey Kalra @ 2026-05-20 2:53 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, krishna.chomal108, hansg, Radhey Kalra
HP Victus 15-fb0xxx board 8A3D exposes the Victus fan table and accepts
the existing Victus fan-speed WMI control path. Add it as a
fan-control-only board so the hwmon PWM interface is enabled without
forcing Victus S thermal-profile handling on this model.
Tested on a Victus by HP Gaming Laptop 15-fb0xxx, board 8A3D, BIOS F.22.
The fan table query succeeded and returned rows including cpu=23/gpu=0
followed by cpu=24/gpu=22. With 8A3D enabled in the fan-control path, pwm1
and pwm1_enable were exposed through hwmon.
Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
---
drivers/platform/x86/hp/hp-wmi.c | 28 +++++++++++++++++++---------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index 9d2966e..514c28c 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -172,6 +172,10 @@ static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
.fan_profile = &victus_s_fan_profile_params,
};
+static const struct hp_wmi_board_params victus_8a3d_board_params = {
+ .fan_profile = &victus_s_fan_profile_params,
+};
+
static const struct hp_wmi_board_params *active_board_params;
/* DMI board names of devices that should use the omen specific path for
@@ -224,6 +228,10 @@ static const char * const victus_thermal_profile_boards[] = {
/* DMI board-specific feature data for Omen and Victus laptops. */
static const struct dmi_system_id hp_wmi_feature_boards[] __initconst = {
+ {
+ .matches = { DMI_MATCH(DMI_BOARD_NAME, "8A3D") },
+ .driver_data = (void *)&victus_8a3d_board_params,
+ },
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8A44") },
.driver_data = (void *)&omen_v1_legacy_board_params,
@@ -2752,15 +2760,17 @@ static void __init setup_active_board_params(void)
if (id) {
active_board_params = id->driver_data;
active_thermal_profile_params = active_board_params->thermal_profile;
- /*
- * Marking this boolean is required to ensure that
- * is_victus_s_thermal_profile() behaves like a valid
- * wrapper.
- */
- is_victus_s_board = true;
- if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
- pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
- dmi_get_system_info(DMI_BOARD_NAME));
+ if (active_thermal_profile_params) {
+ /*
+ * Marking this boolean is required to ensure that
+ * is_victus_s_thermal_profile() behaves like a valid
+ * wrapper.
+ */
+ is_victus_s_board = true;
+ if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
+ pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
+ dmi_get_system_info(DMI_BOARD_NAME));
+ }
}
}
}
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data
2026-05-20 2:53 ` [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
@ 2026-05-20 11:35 ` Ilpo Järvinen
0 siblings, 0 replies; 7+ messages in thread
From: Ilpo Järvinen @ 2026-05-20 11:35 UTC (permalink / raw)
To: Radhey Kalra; +Cc: platform-driver-x86, krishna.chomal108, Hans de Goede
On Wed, 20 May 2026, Radhey Kalra wrote:
> The victus_s_thermal_profile_boards DMI table is about to carry more than
> thermal-profile data. Replace the direct thermal_profile_params
> .driver_data pointers with hp_wmi_board_params and rename the table/setup
> helper accordingly.
>
> No functional changes intended.
>
> Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
> ---
> drivers/platform/x86/hp/hp-wmi.c | 82 ++++++++++++++++++--------------
> 1 file changed, 47 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index d1cc6e7..b226695 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -133,11 +133,29 @@ static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
> .ec_tp_offset = HP_NO_THERMAL_PROFILE_OFFSET,
> };
>
> -/*
> - * A generic pointer for the currently-active board's thermal profile
> - * parameters.
> - */
> -static struct thermal_profile_params *active_thermal_profile_params;
> +static const struct thermal_profile_params *active_thermal_profile_params;
> +
> +struct hp_wmi_board_params {
> + const struct thermal_profile_params *thermal_profile;
> +};
> +
> +static const struct hp_wmi_board_params victus_s_board_params = {
> + .thermal_profile = &victus_s_thermal_params,
> +};
> +
> +static const struct hp_wmi_board_params omen_v1_board_params = {
> + .thermal_profile = &omen_v1_thermal_params,
> +};
> +
> +static const struct hp_wmi_board_params omen_v1_legacy_board_params = {
> + .thermal_profile = &omen_v1_legacy_thermal_params,
> +};
> +
> +static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
> + .thermal_profile = &omen_v1_no_ec_thermal_params,
> +};
> +
> +static const struct hp_wmi_board_params *active_board_params;
>
> /* DMI board names of devices that should use the omen specific path for
> * thermal profiles.
> @@ -187,67 +205,67 @@ static const char * const victus_thermal_profile_boards[] = {
> "8A25",
> };
>
> -/* DMI Board names of Victus 16-r and Victus 16-s laptops */
> -static const struct dmi_system_id victus_s_thermal_profile_boards[] __initconst = {
> +/* DMI board-specific feature data for Omen and Victus laptops. */
> +static const struct dmi_system_id hp_wmi_feature_boards[] __initconst = {
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8A44") },
> - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> + .driver_data = (void *)&omen_v1_legacy_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8A4D") },
> - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> + .driver_data = (void *)&omen_v1_legacy_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BAB") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BBE") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCA") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCD") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD4") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD5") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8C76") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8C77") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8C78") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8C99") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8C9C") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8D41") },
> - .driver_data = (void *)&victus_s_thermal_params,
> + .driver_data = (void *)&victus_s_board_params,
> },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8D87") },
> - .driver_data = (void *)&omen_v1_no_ec_thermal_params,
> + .driver_data = (void *)&omen_v1_no_ec_board_params,
> },
> {},
> };
> @@ -1904,7 +1922,7 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
>
> static int platform_profile_victus_s_set_ec(enum platform_profile_option profile)
> {
> - struct thermal_profile_params *params;
> + const struct thermal_profile_params *params;
> bool gpu_ctgp_enable, gpu_ppab_enable;
> u8 gpu_dstate; /* Test shows 1 = 100%, 2 = 50%, 3 = 25%, 4 = 12.5% */
> int err, tp;
> @@ -2673,23 +2691,20 @@ static int hp_wmi_hwmon_init(void)
> return 0;
> }
>
> -static void __init setup_active_thermal_profile_params(void)
> +static void __init setup_active_board_params(void)
> {
> const struct dmi_system_id *id;
>
> - /*
> - * Currently only victus_s devices use the
> - * active_thermal_profile_params
> - */
> - id = dmi_first_match(victus_s_thermal_profile_boards);
> + id = dmi_first_match(hp_wmi_feature_boards);
> if (id) {
> + active_board_params = id->driver_data;
> + active_thermal_profile_params = active_board_params->thermal_profile;
Is the second variable necessary anymore? Can't we always deref it from
active_board_params?
Using drvdata, however, would be generally preferred over globals but
that's a pre-existing problem in this driver (as with many other
platform drivers).
> /*
> * Marking this boolean is required to ensure that
> * is_victus_s_thermal_profile() behaves like a valid
> * wrapper.
> */
> is_victus_s_board = true;
> - active_thermal_profile_params = id->driver_data;
> if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
> pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
> dmi_get_system_info(DMI_BOARD_NAME));
> @@ -2724,11 +2739,8 @@ static int __init hp_wmi_init(void)
> goto err_destroy_input;
> }
>
> - /*
> - * Setup active board's thermal profile parameters before
> - * starting platform driver probe.
> - */
> - setup_active_thermal_profile_params();
> + /* Setup active board feature data before starting platform driver probe. */
Keep comments limited to <= 80 cols (long lines are hard to read).
This only applies to comments, the for code the limit is 100 columns where
it helps to make the code cleaner.
> + setup_active_board_params();
> err = platform_driver_probe(&hp_wmi_driver, hp_wmi_bios_setup);
> if (err)
> goto err_unregister_device;
>
--
i.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control
2026-05-20 2:53 ` [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
@ 2026-05-20 11:50 ` Ilpo Järvinen
0 siblings, 0 replies; 7+ messages in thread
From: Ilpo Järvinen @ 2026-05-20 11:50 UTC (permalink / raw)
To: Radhey Kalra; +Cc: platform-driver-x86, krishna.chomal108, Hans de Goede
On Wed, 20 May 2026, Radhey Kalra wrote:
> HP Victus 15-fb0xxx board 8A3D exposes the Victus fan table and accepts
> the existing Victus fan-speed WMI control path. Add it as a
> fan-control-only board so the hwmon PWM interface is enabled without
> forcing Victus S thermal-profile handling on this model.
I think it would make sense to split these two changes to own patch to
have both focus on a single thing.
> Tested on a Victus by HP Gaming Laptop 15-fb0xxx, board 8A3D, BIOS F.22.
> The fan table query succeeded and returned rows including cpu=23/gpu=0
> followed by cpu=24/gpu=22. With 8A3D enabled in the fan-control path, pwm1
> and pwm1_enable were exposed through hwmon.
>
> Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
> ---
> drivers/platform/x86/hp/hp-wmi.c | 28 +++++++++++++++++++---------
> 1 file changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index 9d2966e..514c28c 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -172,6 +172,10 @@ static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
> .fan_profile = &victus_s_fan_profile_params,
> };
>
> +static const struct hp_wmi_board_params victus_8a3d_board_params = {
> + .fan_profile = &victus_s_fan_profile_params,
> +};
> +
> static const struct hp_wmi_board_params *active_board_params;
>
> /* DMI board names of devices that should use the omen specific path for
> @@ -224,6 +228,10 @@ static const char * const victus_thermal_profile_boards[] = {
>
> /* DMI board-specific feature data for Omen and Victus laptops. */
> static const struct dmi_system_id hp_wmi_feature_boards[] __initconst = {
> + {
> + .matches = { DMI_MATCH(DMI_BOARD_NAME, "8A3D") },
> + .driver_data = (void *)&victus_8a3d_board_params,
> + },
> {
> .matches = { DMI_MATCH(DMI_BOARD_NAME, "8A44") },
> .driver_data = (void *)&omen_v1_legacy_board_params,
> @@ -2752,15 +2760,17 @@ static void __init setup_active_board_params(void)
> if (id) {
> active_board_params = id->driver_data;
> active_thermal_profile_params = active_board_params->thermal_profile;
> - /*
> - * Marking this boolean is required to ensure that
> - * is_victus_s_thermal_profile() behaves like a valid
> - * wrapper.
> - */
> - is_victus_s_board = true;
> - if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
> - pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
> - dmi_get_system_info(DMI_BOARD_NAME));
> + if (active_thermal_profile_params) {
> + /*
> + * Marking this boolean is required to ensure that
> + * is_victus_s_thermal_profile() behaves like a valid
> + * wrapper.
> + */
> + is_victus_s_board = true;
> + if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
> + pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
> + dmi_get_system_info(DMI_BOARD_NAME));
> + }
> }
> }
> }
>
--
i.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-05-20 11:50 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-20 2:53 [PATCH v4 0/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 1/4] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
2026-05-20 11:35 ` Ilpo Järvinen
2026-05-20 2:53 ` [PATCH v4 2/4] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 3/4] platform/x86: hp-wmi: Skip zero GPU RPM rows for fan speed delta Radhey Kalra
2026-05-20 2:53 ` [PATCH v4 4/4] platform/x86: hp-wmi: Add Victus 15-fb0xxx fan control Radhey Kalra
2026-05-20 11:50 ` Ilpo Järvinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox