* [PATCH v9 0/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support
@ 2026-06-06 8:01 Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Radhey Kalra @ 2026-06-06 8:01 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, hansg, krishna.chomal108, Radhey Kalra
Hi,
This is a split version of the Victus 15-fb0xxx support change. 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 adds support for Victus 15-fb0xxx board 8A3D.
v9 keeps the gpu_delta fan-table parsing fix out of this series. Ilpo
suggested postponing that part to the other GPU fan series, so this
version keeps only the board-data and 8A3D support pieces.
The last public review discussion was on the earlier v6 0/4 thread. This
series follows up on that by dropping the gpu_delta patch from this
series, testing the Victus S thermal-profile path on 8A3D, and keeping
8A3D on the Victus S thermal-profile and fan-control data.
v9 is a resend after one week with no review comments. There are no code
changes from v8 because platform-drivers-x86/review-ilpo-next and
for-next have not moved since v8. v8 already rebased the v7 series from
commit 5fdac9983681 to a167ae8eace5, preserving the newer 8902 board
entry and the system_dfl_wq delayed-work change.
I accidentally sent the corrected 3-patch version as v6 after an earlier
v6 had already been sent. v7 fixed the version number for that
corrected structure.
v9 is based on platform-drivers-x86/review-ilpo-next commit
a167ae8eace52dd6c80438b77d92450fe12cd4be, which is still current on
review-ilpo-next and for-next. It preserves the newer 8902 hp-wmi board
entry.
8A3D is added with both the Victus S thermal-profile data and the Victus
fan-control data. The existing generic platform-profile sysfs path on
8A3D accepts writes/readbacks without hp_wmi errors, and the Victus fan
table/control path exposes working PWM control.
Tested on a Victus by HP Gaming Laptop 15-fb0xxx, board 8A3D, BIOS
F.22. With the series applied, the platform-profile choices are
low-power, balanced, and performance. Writes to all three profiles
succeeded and read back the selected value. In a CPU stress test with
powerprofilesctl held at performance, low-power reduced CPU package
power to about 30 W, while balanced and performance both ran at about
47 W. In a light PRIME offload test, low-power also kept the NVIDIA GPU
at lower clocks and power than the other profiles. pwm1 and pwm1_enable
are exposed through hwmon.
Radhey Kalra (3):
platform/x86: hp-wmi: Introduce board-specific feature data
platform/x86: hp-wmi: Drive fan control from board data
platform/x86: hp-wmi: Add Victus 15-fb0xxx support
drivers/platform/x86/hp/hp-wmi.c | 209 ++++++++++++++++++++++---------
1 file changed, 150 insertions(+), 59 deletions(-)
---
Changes in v9:
- Resend after one week with no review comments.
- Clarify that the series follows up on the earlier v6 0/4 review by
dropping the gpu_delta patch and using the tested Victus S path.
- No code changes from v8 because the target platform-drivers-x86 branch
has not moved since v8.
- Recheck that platform-drivers-x86/review-ilpo-next and for-next still
point at commit a167ae8eace5.
Changes in v8:
- Resend after one week with no review comments.
- Rebase on platform-drivers-x86/review-ilpo-next commit
a167ae8eace5 to preserve the newer 8902 hp-wmi board entry.
- Keep the gpu_delta fan-table parser fix out of this series; it can be
handled with the other GPU fan series.
- Add Hans de Goede to Cc per MAINTAINERS for X86 PLATFORM DRIVERS.
Changes in v7:
- Bump the version because v6 was already sent.
- Note that the corrected 3-patch version was accidentally sent as v6
after an earlier v6 had already been sent.
- Keep the gpu_delta fan-table parser fix out of this series; it can be
handled with the other GPU fan series.
- Keep 8A3D on the Victus S thermal-profile path after testing profile
writes/readbacks, CPU package power, and light PRIME offload behavior.
Changes in v6:
- Drop the gpu_delta fan-table parser fix for now; it can be handled
with the other GPU fan series.
- Rebase on platform-drivers-x86/for-next commit 5fdac9983681.
- Preserve the recently added 8BC2 board entry.
- Preserve the 8D41 switch to omen_v1_no_ec_thermal_params.
- Add 8A3D with Victus S thermal-profile data and Victus fan-control
data.
Changes in v5:
- Drop the active_thermal_profile_params global and dereference the
thermal-profile data through active_board_params.
- Move the generic fan-only board handling into patch 1, keeping the
final 8A3D patch focused on adding the board data and DMI match.
- Wrap the setup comment added in patch 1 to stay under 80 columns.
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.
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data
2026-06-06 8:01 [PATCH v9 0/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
@ 2026-06-06 8:01 ` Radhey Kalra
2026-06-10 9:22 ` Ilpo Järvinen
2026-06-06 8:01 ` [PATCH v9 2/3] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2 siblings, 1 reply; 10+ messages in thread
From: Radhey Kalra @ 2026-06-06 8:01 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, hansg, krishna.chomal108, Radhey Kalra
The hp_wmi 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 | 121 ++++++++++++++++++++-----------
1 file changed, 77 insertions(+), 44 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index 48292cc..4a795e6 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -133,11 +133,35 @@ 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;
+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;
+
+static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
+{
+ if (!active_board_params)
+ return NULL;
+
+ return active_board_params->thermal_profile;
+}
/* DMI board names of devices that should use the omen specific path for
* thermal profiles.
@@ -187,75 +211,75 @@ 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, "8902") },
- .driver_data = (void *)&omen_v1_legacy_thermal_params,
+ .driver_data = (void *)&omen_v1_legacy_board_params,
},
{
.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, "8BC2") },
- .driver_data = (void *)&omen_v1_thermal_params,
+ .driver_data = (void *)&omen_v1_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 *)&omen_v1_no_ec_thermal_params,
+ .driver_data = (void *)&omen_v1_no_ec_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,
},
{},
};
@@ -1862,7 +1886,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
u8 current_dstate, current_gpu_slowdown_temp, tp;
const struct thermal_profile_params *params;
- params = active_thermal_profile_params;
+ params = hp_wmi_thermal_profile();
+ if (!params)
+ return -ENODEV;
+
if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
*profile = active_platform_profile;
@@ -1874,10 +1901,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
return ret;
/*
- * We cannot use active_thermal_profile_params here, because boards
- * like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
- * it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
- * Gaming Hub on windows. Hence accept both of these values.
+ * Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
+ * but logically it should have tp == 0x30 || tp == 0x31, as
+ * corrected by the Omen Gaming Hub on windows. Hence accept both
+ * of these values.
*/
if (tp == victus_s_thermal_params.performance ||
tp == omen_v1_thermal_params.performance) {
@@ -1912,12 +1939,12 @@ 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;
- params = active_thermal_profile_params;
+ params = hp_wmi_thermal_profile();
if (!params)
return -ENODEV;
@@ -2183,6 +2210,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
static int thermal_profile_setup(struct platform_device *device)
{
const struct platform_profile_ops *ops;
+ const struct thermal_profile_params *params;
int err, tp;
if (is_omen_thermal_profile()) {
@@ -2214,13 +2242,17 @@ static int thermal_profile_setup(struct platform_device *device)
ops = &platform_profile_victus_ops;
} else if (is_victus_s_thermal_profile()) {
+ params = hp_wmi_thermal_profile();
+ if (!params)
+ return -ENODEV;
+
/*
* For an unknown EC layout board, platform_profile_victus_s_get_ec(),
* behaves like a wrapper around active_platform_profile, to avoid using
* uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
*/
- if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
- active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
+ if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
+ params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
active_platform_profile = PLATFORM_PROFILE_BALANCED;
} else {
err = platform_profile_victus_s_get_ec(&active_platform_profile);
@@ -2681,24 +2713,25 @@ 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;
+ const struct thermal_profile_params *params;
- /*
- * 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;
+ params = hp_wmi_thermal_profile();
+ if (!params)
+ return;
+
/*
* 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) {
+ if (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));
}
@@ -2733,10 +2766,10 @@ static int __init hp_wmi_init(void)
}
/*
- * Setup active board's thermal profile parameters before
- * starting platform driver probe.
+ * Setup active board feature data before starting platform
+ * driver probe.
*/
- setup_active_thermal_profile_params();
+ 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] 10+ messages in thread
* [PATCH v9 2/3] platform/x86: hp-wmi: Drive fan control from board data
2026-06-06 8:01 [PATCH v9 0/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
@ 2026-06-06 8:01 ` Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2 siblings, 0 replies; 10+ messages in thread
From: Radhey Kalra @ 2026-06-06 8:01 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, hansg, krishna.chomal108, 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 4a795e6..91578e7 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -133,24 +133,41 @@ static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
.ec_tp_offset = HP_NO_THERMAL_PROFILE_OFFSET,
};
+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;
@@ -1801,6 +1818,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,
@@ -2420,7 +2469,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;
@@ -2432,7 +2481,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)
@@ -2441,7 +2490,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;
@@ -2465,12 +2514,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)
@@ -2494,8 +2543,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)
@@ -2504,10 +2553,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);
@@ -2541,7 +2590,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)
@@ -2558,13 +2607,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);
@@ -2630,8 +2679,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] 10+ messages in thread
* [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support
2026-06-06 8:01 [PATCH v9 0/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 2/3] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
@ 2026-06-06 8:01 ` Radhey Kalra
2026-06-10 9:21 ` Ilpo Järvinen
2 siblings, 1 reply; 10+ messages in thread
From: Radhey Kalra @ 2026-06-06 8:01 UTC (permalink / raw)
To: platform-driver-x86; +Cc: ilpo.jarvinen, hansg, krishna.chomal108, Radhey Kalra
HP Victus 15-fb0xxx board 8A3D exposes the Victus fan table and accepts
the existing Victus fan-speed WMI control path. Add board data for the
Victus S thermal-profile path and fan-control support.
Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
---
drivers/platform/x86/hp/hp-wmi.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
index 91578e7..c124ad0 100644
--- a/drivers/platform/x86/hp/hp-wmi.c
+++ b/drivers/platform/x86/hp/hp-wmi.c
@@ -170,6 +170,11 @@ 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 = {
+ .thermal_profile = &victus_s_thermal_params,
+ .fan_profile = &victus_s_fan_profile_params,
+};
+
static const struct hp_wmi_board_params *active_board_params;
static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
@@ -230,6 +235,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, "8902") },
.driver_data = (void *)&omen_v1_legacy_board_params,
--
2.54.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support
2026-06-06 8:01 ` [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
@ 2026-06-10 9:21 ` Ilpo Järvinen
2026-06-10 10:18 ` Radhey Kalra
0 siblings, 1 reply; 10+ messages in thread
From: Ilpo Järvinen @ 2026-06-10 9:21 UTC (permalink / raw)
To: Radhey Kalra; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
On Sat, 6 Jun 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 board data for the
> Victus S thermal-profile path and fan-control support.
>
> Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
> ---
> drivers/platform/x86/hp/hp-wmi.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index 91578e7..c124ad0 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -170,6 +170,11 @@ 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 = {
> + .thermal_profile = &victus_s_thermal_params,
> + .fan_profile = &victus_s_fan_profile_params,
> +};
> +
> static const struct hp_wmi_board_params *active_board_params;
>
> static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> @@ -230,6 +235,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, "8902") },
Lets try to keep these in order (8902 < 8A3D).
> .driver_data = (void *)&omen_v1_legacy_board_params,
>
--
i.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data
2026-06-06 8:01 ` [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
@ 2026-06-10 9:22 ` Ilpo Järvinen
2026-06-10 10:18 ` Radhey Kalra
0 siblings, 1 reply; 10+ messages in thread
From: Ilpo Järvinen @ 2026-06-10 9:22 UTC (permalink / raw)
To: Radhey Kalra; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
On Sat, 6 Jun 2026, Radhey Kalra wrote:
> The hp_wmi 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 | 121 ++++++++++++++++++++-----------
> 1 file changed, 77 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index 48292cc..4a795e6 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -133,11 +133,35 @@ 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;
> +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;
> +
> +static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> +{
> + if (!active_board_params)
> + return NULL;
> +
> + return active_board_params->thermal_profile;
> +}
>
> /* DMI board names of devices that should use the omen specific path for
> * thermal profiles.
> @@ -187,75 +211,75 @@ 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, "8902") },
> - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> + .driver_data = (void *)&omen_v1_legacy_board_params,
> },
> {
> .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, "8BC2") },
> - .driver_data = (void *)&omen_v1_thermal_params,
> + .driver_data = (void *)&omen_v1_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 *)&omen_v1_no_ec_thermal_params,
> + .driver_data = (void *)&omen_v1_no_ec_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,
> },
> {},
> };
Could you do a rebase for this as there are a few ID additions in the
for-next branch so I don't need to handle the conversion myself.
> @@ -1862,7 +1886,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> u8 current_dstate, current_gpu_slowdown_temp, tp;
> const struct thermal_profile_params *params;
>
> - params = active_thermal_profile_params;
> + params = hp_wmi_thermal_profile();
> + if (!params)
> + return -ENODEV;
> +
> if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> *profile = active_platform_profile;
> @@ -1874,10 +1901,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> return ret;
>
> /*
> - * We cannot use active_thermal_profile_params here, because boards
> - * like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
> - * it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
> - * Gaming Hub on windows. Hence accept both of these values.
> + * Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
> + * but logically it should have tp == 0x30 || tp == 0x31, as
> + * corrected by the Omen Gaming Hub on windows. Hence accept both
> + * of these values.
> */
> if (tp == victus_s_thermal_params.performance ||
> tp == omen_v1_thermal_params.performance) {
> @@ -1912,12 +1939,12 @@ 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;
>
> - params = active_thermal_profile_params;
> + params = hp_wmi_thermal_profile();
> if (!params)
> return -ENODEV;
>
> @@ -2183,6 +2210,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
> static int thermal_profile_setup(struct platform_device *device)
> {
> const struct platform_profile_ops *ops;
> + const struct thermal_profile_params *params;
> int err, tp;
>
> if (is_omen_thermal_profile()) {
> @@ -2214,13 +2242,17 @@ static int thermal_profile_setup(struct platform_device *device)
>
> ops = &platform_profile_victus_ops;
> } else if (is_victus_s_thermal_profile()) {
> + params = hp_wmi_thermal_profile();
> + if (!params)
> + return -ENODEV;
> +
> /*
> * For an unknown EC layout board, platform_profile_victus_s_get_ec(),
> * behaves like a wrapper around active_platform_profile, to avoid using
> * uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
> */
> - if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> - active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> + if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> + params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> active_platform_profile = PLATFORM_PROFILE_BALANCED;
> } else {
> err = platform_profile_victus_s_get_ec(&active_platform_profile);
> @@ -2681,24 +2713,25 @@ 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;
> + const struct thermal_profile_params *params;
>
> - /*
> - * 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;
> + params = hp_wmi_thermal_profile();
> + if (!params)
> + return;
> +
> /*
> * 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) {
> + if (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));
> }
> @@ -2733,10 +2766,10 @@ static int __init hp_wmi_init(void)
> }
>
> /*
> - * Setup active board's thermal profile parameters before
> - * starting platform driver probe.
> + * Setup active board feature data before starting platform
> + * driver probe.
> */
> - setup_active_thermal_profile_params();
> + 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] 10+ messages in thread
* Re: [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data
2026-06-10 9:22 ` Ilpo Järvinen
@ 2026-06-10 10:18 ` Radhey Kalra
2026-06-10 10:31 ` Ilpo Järvinen
0 siblings, 1 reply; 10+ messages in thread
From: Radhey Kalra @ 2026-06-10 10:18 UTC (permalink / raw)
To: Ilpo Järvinen; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
Hi Ilpo,
Will do. I'll rebase this series against for-next and send v10 shortly.
Thanks, Radhey
On Wed, Jun 10, 2026 at 2:53 PM Ilpo Järvinen
<ilpo.jarvinen@linux.intel.com> wrote:
>
> On Sat, 6 Jun 2026, Radhey Kalra wrote:
>
> > The hp_wmi 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 | 121 ++++++++++++++++++++-----------
> > 1 file changed, 77 insertions(+), 44 deletions(-)
> >
> > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> > index 48292cc..4a795e6 100644
> > --- a/drivers/platform/x86/hp/hp-wmi.c
> > +++ b/drivers/platform/x86/hp/hp-wmi.c
> > @@ -133,11 +133,35 @@ 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;
> > +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;
> > +
> > +static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> > +{
> > + if (!active_board_params)
> > + return NULL;
> > +
> > + return active_board_params->thermal_profile;
> > +}
> >
> > /* DMI board names of devices that should use the omen specific path for
> > * thermal profiles.
> > @@ -187,75 +211,75 @@ 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, "8902") },
> > - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> > + .driver_data = (void *)&omen_v1_legacy_board_params,
> > },
> > {
> > .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, "8BC2") },
> > - .driver_data = (void *)&omen_v1_thermal_params,
> > + .driver_data = (void *)&omen_v1_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 *)&omen_v1_no_ec_thermal_params,
> > + .driver_data = (void *)&omen_v1_no_ec_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,
> > },
> > {},
> > };
>
> Could you do a rebase for this as there are a few ID additions in the
> for-next branch so I don't need to handle the conversion myself.
>
> > @@ -1862,7 +1886,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > u8 current_dstate, current_gpu_slowdown_temp, tp;
> > const struct thermal_profile_params *params;
> >
> > - params = active_thermal_profile_params;
> > + params = hp_wmi_thermal_profile();
> > + if (!params)
> > + return -ENODEV;
> > +
> > if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > *profile = active_platform_profile;
> > @@ -1874,10 +1901,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > return ret;
> >
> > /*
> > - * We cannot use active_thermal_profile_params here, because boards
> > - * like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
> > - * it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
> > - * Gaming Hub on windows. Hence accept both of these values.
> > + * Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
> > + * but logically it should have tp == 0x30 || tp == 0x31, as
> > + * corrected by the Omen Gaming Hub on windows. Hence accept both
> > + * of these values.
> > */
> > if (tp == victus_s_thermal_params.performance ||
> > tp == omen_v1_thermal_params.performance) {
> > @@ -1912,12 +1939,12 @@ 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;
> >
> > - params = active_thermal_profile_params;
> > + params = hp_wmi_thermal_profile();
> > if (!params)
> > return -ENODEV;
> >
> > @@ -2183,6 +2210,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
> > static int thermal_profile_setup(struct platform_device *device)
> > {
> > const struct platform_profile_ops *ops;
> > + const struct thermal_profile_params *params;
> > int err, tp;
> >
> > if (is_omen_thermal_profile()) {
> > @@ -2214,13 +2242,17 @@ static int thermal_profile_setup(struct platform_device *device)
> >
> > ops = &platform_profile_victus_ops;
> > } else if (is_victus_s_thermal_profile()) {
> > + params = hp_wmi_thermal_profile();
> > + if (!params)
> > + return -ENODEV;
> > +
> > /*
> > * For an unknown EC layout board, platform_profile_victus_s_get_ec(),
> > * behaves like a wrapper around active_platform_profile, to avoid using
> > * uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
> > */
> > - if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > - active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > + if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > + params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > active_platform_profile = PLATFORM_PROFILE_BALANCED;
> > } else {
> > err = platform_profile_victus_s_get_ec(&active_platform_profile);
> > @@ -2681,24 +2713,25 @@ 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;
> > + const struct thermal_profile_params *params;
> >
> > - /*
> > - * 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;
> > + params = hp_wmi_thermal_profile();
> > + if (!params)
> > + return;
> > +
> > /*
> > * 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) {
> > + if (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));
> > }
> > @@ -2733,10 +2766,10 @@ static int __init hp_wmi_init(void)
> > }
> >
> > /*
> > - * Setup active board's thermal profile parameters before
> > - * starting platform driver probe.
> > + * Setup active board feature data before starting platform
> > + * driver probe.
> > */
> > - setup_active_thermal_profile_params();
> > + 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] 10+ messages in thread
* Re: [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support
2026-06-10 9:21 ` Ilpo Järvinen
@ 2026-06-10 10:18 ` Radhey Kalra
0 siblings, 0 replies; 10+ messages in thread
From: Radhey Kalra @ 2026-06-10 10:18 UTC (permalink / raw)
To: Ilpo Järvinen; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
Hi Ilpo,
Got it. I'll re-sort them to ensure 8902 comes before 8A3D in the final series.
Thanks, Radhey
On Wed, Jun 10, 2026 at 2:51 PM Ilpo Järvinen
<ilpo.jarvinen@linux.intel.com> wrote:
>
> On Sat, 6 Jun 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 board data for the
> > Victus S thermal-profile path and fan-control support.
> >
> > Signed-off-by: Radhey Kalra <radheykalra901@gmail.com>
> > ---
> > drivers/platform/x86/hp/hp-wmi.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> > index 91578e7..c124ad0 100644
> > --- a/drivers/platform/x86/hp/hp-wmi.c
> > +++ b/drivers/platform/x86/hp/hp-wmi.c
> > @@ -170,6 +170,11 @@ 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 = {
> > + .thermal_profile = &victus_s_thermal_params,
> > + .fan_profile = &victus_s_fan_profile_params,
> > +};
> > +
> > static const struct hp_wmi_board_params *active_board_params;
> >
> > static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> > @@ -230,6 +235,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, "8902") },
>
> Lets try to keep these in order (8902 < 8A3D).
>
> > .driver_data = (void *)&omen_v1_legacy_board_params,
> >
>
> --
> i.
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data
2026-06-10 10:18 ` Radhey Kalra
@ 2026-06-10 10:31 ` Ilpo Järvinen
2026-06-10 10:34 ` Radhey Kalra
0 siblings, 1 reply; 10+ messages in thread
From: Ilpo Järvinen @ 2026-06-10 10:31 UTC (permalink / raw)
To: Radhey Kalra; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
[-- Attachment #1: Type: text/plain, Size: 13642 bytes --]
On Wed, 10 Jun 2026, Radhey Kalra wrote:
> Hi Ilpo,
>
> Will do. I'll rebase this series against for-next and send v10 shortly.
It seems I had a problem in my end, so all the ID changes are only now in
for-next. I'm sorry about the extra hassle.
--
i.
> Thanks, Radhey
>
>
> On Wed, Jun 10, 2026 at 2:53 PM Ilpo Järvinen
> <ilpo.jarvinen@linux.intel.com> wrote:
> >
> > On Sat, 6 Jun 2026, Radhey Kalra wrote:
> >
> > > The hp_wmi 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 | 121 ++++++++++++++++++++-----------
> > > 1 file changed, 77 insertions(+), 44 deletions(-)
> > >
> > > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> > > index 48292cc..4a795e6 100644
> > > --- a/drivers/platform/x86/hp/hp-wmi.c
> > > +++ b/drivers/platform/x86/hp/hp-wmi.c
> > > @@ -133,11 +133,35 @@ 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;
> > > +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;
> > > +
> > > +static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> > > +{
> > > + if (!active_board_params)
> > > + return NULL;
> > > +
> > > + return active_board_params->thermal_profile;
> > > +}
> > >
> > > /* DMI board names of devices that should use the omen specific path for
> > > * thermal profiles.
> > > @@ -187,75 +211,75 @@ 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, "8902") },
> > > - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> > > + .driver_data = (void *)&omen_v1_legacy_board_params,
> > > },
> > > {
> > > .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, "8BC2") },
> > > - .driver_data = (void *)&omen_v1_thermal_params,
> > > + .driver_data = (void *)&omen_v1_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 *)&omen_v1_no_ec_thermal_params,
> > > + .driver_data = (void *)&omen_v1_no_ec_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,
> > > },
> > > {},
> > > };
> >
> > Could you do a rebase for this as there are a few ID additions in the
> > for-next branch so I don't need to handle the conversion myself.
> >
> > > @@ -1862,7 +1886,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > > u8 current_dstate, current_gpu_slowdown_temp, tp;
> > > const struct thermal_profile_params *params;
> > >
> > > - params = active_thermal_profile_params;
> > > + params = hp_wmi_thermal_profile();
> > > + if (!params)
> > > + return -ENODEV;
> > > +
> > > if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > *profile = active_platform_profile;
> > > @@ -1874,10 +1901,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > > return ret;
> > >
> > > /*
> > > - * We cannot use active_thermal_profile_params here, because boards
> > > - * like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
> > > - * it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
> > > - * Gaming Hub on windows. Hence accept both of these values.
> > > + * Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
> > > + * but logically it should have tp == 0x30 || tp == 0x31, as
> > > + * corrected by the Omen Gaming Hub on windows. Hence accept both
> > > + * of these values.
> > > */
> > > if (tp == victus_s_thermal_params.performance ||
> > > tp == omen_v1_thermal_params.performance) {
> > > @@ -1912,12 +1939,12 @@ 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;
> > >
> > > - params = active_thermal_profile_params;
> > > + params = hp_wmi_thermal_profile();
> > > if (!params)
> > > return -ENODEV;
> > >
> > > @@ -2183,6 +2210,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
> > > static int thermal_profile_setup(struct platform_device *device)
> > > {
> > > const struct platform_profile_ops *ops;
> > > + const struct thermal_profile_params *params;
> > > int err, tp;
> > >
> > > if (is_omen_thermal_profile()) {
> > > @@ -2214,13 +2242,17 @@ static int thermal_profile_setup(struct platform_device *device)
> > >
> > > ops = &platform_profile_victus_ops;
> > > } else if (is_victus_s_thermal_profile()) {
> > > + params = hp_wmi_thermal_profile();
> > > + if (!params)
> > > + return -ENODEV;
> > > +
> > > /*
> > > * For an unknown EC layout board, platform_profile_victus_s_get_ec(),
> > > * behaves like a wrapper around active_platform_profile, to avoid using
> > > * uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
> > > */
> > > - if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > - active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > + if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > + params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > active_platform_profile = PLATFORM_PROFILE_BALANCED;
> > > } else {
> > > err = platform_profile_victus_s_get_ec(&active_platform_profile);
> > > @@ -2681,24 +2713,25 @@ 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;
> > > + const struct thermal_profile_params *params;
> > >
> > > - /*
> > > - * 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;
> > > + params = hp_wmi_thermal_profile();
> > > + if (!params)
> > > + return;
> > > +
> > > /*
> > > * 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) {
> > > + if (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));
> > > }
> > > @@ -2733,10 +2766,10 @@ static int __init hp_wmi_init(void)
> > > }
> > >
> > > /*
> > > - * Setup active board's thermal profile parameters before
> > > - * starting platform driver probe.
> > > + * Setup active board feature data before starting platform
> > > + * driver probe.
> > > */
> > > - setup_active_thermal_profile_params();
> > > + 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] 10+ messages in thread
* Re: [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data
2026-06-10 10:31 ` Ilpo Järvinen
@ 2026-06-10 10:34 ` Radhey Kalra
0 siblings, 0 replies; 10+ messages in thread
From: Radhey Kalra @ 2026-06-10 10:34 UTC (permalink / raw)
To: Ilpo Järvinen; +Cc: platform-driver-x86, Hans de Goede, krishna.chomal108
No problem, I understand.
On Wed, Jun 10, 2026 at 4:02 PM Ilpo Järvinen
<ilpo.jarvinen@linux.intel.com> wrote:
>
> On Wed, 10 Jun 2026, Radhey Kalra wrote:
>
> > Hi Ilpo,
> >
> > Will do. I'll rebase this series against for-next and send v10 shortly.
>
> It seems I had a problem in my end, so all the ID changes are only now in
> for-next. I'm sorry about the extra hassle.
>
> --
> i.
>
> > Thanks, Radhey
> >
> >
> > On Wed, Jun 10, 2026 at 2:53 PM Ilpo Järvinen
> > <ilpo.jarvinen@linux.intel.com> wrote:
> > >
> > > On Sat, 6 Jun 2026, Radhey Kalra wrote:
> > >
> > > > The hp_wmi 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 | 121 ++++++++++++++++++++-----------
> > > > 1 file changed, 77 insertions(+), 44 deletions(-)
> > > >
> > > > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> > > > index 48292cc..4a795e6 100644
> > > > --- a/drivers/platform/x86/hp/hp-wmi.c
> > > > +++ b/drivers/platform/x86/hp/hp-wmi.c
> > > > @@ -133,11 +133,35 @@ 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;
> > > > +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;
> > > > +
> > > > +static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
> > > > +{
> > > > + if (!active_board_params)
> > > > + return NULL;
> > > > +
> > > > + return active_board_params->thermal_profile;
> > > > +}
> > > >
> > > > /* DMI board names of devices that should use the omen specific path for
> > > > * thermal profiles.
> > > > @@ -187,75 +211,75 @@ 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, "8902") },
> > > > - .driver_data = (void *)&omen_v1_legacy_thermal_params,
> > > > + .driver_data = (void *)&omen_v1_legacy_board_params,
> > > > },
> > > > {
> > > > .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, "8BC2") },
> > > > - .driver_data = (void *)&omen_v1_thermal_params,
> > > > + .driver_data = (void *)&omen_v1_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 *)&omen_v1_no_ec_thermal_params,
> > > > + .driver_data = (void *)&omen_v1_no_ec_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,
> > > > },
> > > > {},
> > > > };
> > >
> > > Could you do a rebase for this as there are a few ID additions in the
> > > for-next branch so I don't need to handle the conversion myself.
> > >
> > > > @@ -1862,7 +1886,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > > > u8 current_dstate, current_gpu_slowdown_temp, tp;
> > > > const struct thermal_profile_params *params;
> > > >
> > > > - params = active_thermal_profile_params;
> > > > + params = hp_wmi_thermal_profile();
> > > > + if (!params)
> > > > + return -ENODEV;
> > > > +
> > > > if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > > params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > > *profile = active_platform_profile;
> > > > @@ -1874,10 +1901,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
> > > > return ret;
> > > >
> > > > /*
> > > > - * We cannot use active_thermal_profile_params here, because boards
> > > > - * like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
> > > > - * it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
> > > > - * Gaming Hub on windows. Hence accept both of these values.
> > > > + * Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
> > > > + * but logically it should have tp == 0x30 || tp == 0x31, as
> > > > + * corrected by the Omen Gaming Hub on windows. Hence accept both
> > > > + * of these values.
> > > > */
> > > > if (tp == victus_s_thermal_params.performance ||
> > > > tp == omen_v1_thermal_params.performance) {
> > > > @@ -1912,12 +1939,12 @@ 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;
> > > >
> > > > - params = active_thermal_profile_params;
> > > > + params = hp_wmi_thermal_profile();
> > > > if (!params)
> > > > return -ENODEV;
> > > >
> > > > @@ -2183,6 +2210,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
> > > > static int thermal_profile_setup(struct platform_device *device)
> > > > {
> > > > const struct platform_profile_ops *ops;
> > > > + const struct thermal_profile_params *params;
> > > > int err, tp;
> > > >
> > > > if (is_omen_thermal_profile()) {
> > > > @@ -2214,13 +2242,17 @@ static int thermal_profile_setup(struct platform_device *device)
> > > >
> > > > ops = &platform_profile_victus_ops;
> > > > } else if (is_victus_s_thermal_profile()) {
> > > > + params = hp_wmi_thermal_profile();
> > > > + if (!params)
> > > > + return -ENODEV;
> > > > +
> > > > /*
> > > > * For an unknown EC layout board, platform_profile_victus_s_get_ec(),
> > > > * behaves like a wrapper around active_platform_profile, to avoid using
> > > > * uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
> > > > */
> > > > - if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > > - active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > > + if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
> > > > + params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
> > > > active_platform_profile = PLATFORM_PROFILE_BALANCED;
> > > > } else {
> > > > err = platform_profile_victus_s_get_ec(&active_platform_profile);
> > > > @@ -2681,24 +2713,25 @@ 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;
> > > > + const struct thermal_profile_params *params;
> > > >
> > > > - /*
> > > > - * 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;
> > > > + params = hp_wmi_thermal_profile();
> > > > + if (!params)
> > > > + return;
> > > > +
> > > > /*
> > > > * 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) {
> > > > + if (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));
> > > > }
> > > > @@ -2733,10 +2766,10 @@ static int __init hp_wmi_init(void)
> > > > }
> > > >
> > > > /*
> > > > - * Setup active board's thermal profile parameters before
> > > > - * starting platform driver probe.
> > > > + * Setup active board feature data before starting platform
> > > > + * driver probe.
> > > > */
> > > > - setup_active_thermal_profile_params();
> > > > + 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] 10+ messages in thread
end of thread, other threads:[~2026-06-10 10:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-06 8:01 [PATCH v9 0/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 1/3] platform/x86: hp-wmi: Introduce board-specific feature data Radhey Kalra
2026-06-10 9:22 ` Ilpo Järvinen
2026-06-10 10:18 ` Radhey Kalra
2026-06-10 10:31 ` Ilpo Järvinen
2026-06-10 10:34 ` Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 2/3] platform/x86: hp-wmi: Drive fan control from board data Radhey Kalra
2026-06-06 8:01 ` [PATCH v9 3/3] platform/x86: hp-wmi: Add Victus 15-fb0xxx support Radhey Kalra
2026-06-10 9:21 ` Ilpo Järvinen
2026-06-10 10:18 ` Radhey Kalra
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.