* [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
* 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
* [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 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; as well as URLs for NNTP newsgroup(s).