All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.