hp-wmi: add OMEN Slim 16t-an000 (8D40) board support
# hp-wmi: add OMEN Slim 16t-an000 (8D40) board support
## Disclaimer
This patch and the entire investigation were produced with **Claude Code** (Anthropic).
I am submitting it for review only — I am not asking you to merge it as-is.
Please treat this as a heads-up that the OMEN Slim 16t-an000 (DMI board `8D40`)
exists in the wild and currently falls through to the generic HP WMI fallback
path, which does not register `platform_profile` for this firmware.
Feel free to take the initiative on the proper fix, rework it, or send it
to `platform-driver-x86@vger.kernel.org` directly. I tested the change on my
own machine; it boots, registers, and switches profiles without errors,
but I am not equipped to maintain it long-term.
## Hardware
- **Product**: HP OMEN Slim Gaming Laptop 16t-an000
- **DMI board name**: `8D40`
- **CPU**: Intel Core Ultra 9 285H
- **GPU**: NVIDIA RTX 5060 Max-Q + Intel Arc Pro 130T/140T (iGPU)
- **BIOS**: F.13 (2026-01-21)
- **Tested on**: Linux 7.0.9-1-cachyos (LTO Clang build)
## Symptom on stock kernel
On unpatched 7.0.x, the board is unknown to `hp-wmi.c`. The driver falls
through to the generic fallback `hp_wmi_platform_profile_ops` which calls
`HPWMI_THERMAL_PROFILE_QUERY` (cmd `0x4c`). That WMI command appears not to
be implemented on this BIOS, so `thermal_profile_get()` returns < 0 and
`thermal_profile_setup()` aborts silently. Result:
- `/sys/firmware/acpi/platform_profile` is **never created**
- No `cool / balanced / performance` switching from userspace
- GNOME Power profiles, `power-profiles-daemon`, etc. cannot drive thermal modes
`hp_wmi` itself loads fine. `hwmon` and the OMEN hotkey input device come up.
Only the platform-profile registration silently fails.
## Approach
Backport of upstream commit `5badf5e` ("Add support for OMEN MAX 16-ak0xxx
(8D87)"), and **add `8D40` to the same `omen_v1_no_ec_thermal_params`
DMI table entry**. The OMEN Slim and OMEN MAX appear to share the same
thermal control protocol: pure WMI (`HPWMI_SET_PERFORMANCE_MODE`, cmd `0x1A`)
with **no EC writes** for the thermal profile — the same reason `8D87` had
to land as `omen_v1_no_ec_thermal_params` rather than the older
`victus_s_thermal_params` (which writes EC offset `0x59`).
The patch:
1. Backports the `HP_NO_THERMAL_PROFILE_OFFSET` sentinel (`= 0x01`)
2. Backports the `omen_v1_no_ec_thermal_params` struct
3. Backports the `8D87` entry in `victus_s_thermal_profile_boards`
4. **Adds `8D40` to the same table with the same params**
5. Backports the two `if`-checks in `platform_profile_victus_s_get_ec`
and `thermal_profile_setup` that recognise the new sentinel
So in mainline-7.1 land this would degenerate to a single one-line patch
adding `8D40`. For CachyOS 7.0.x which is still on the pre-5badf5e codebase,
it is the full backport.
## Test results on this hardware
```
$ uname -r
7.0.9-1-cachyos
$ cat /sys/firmware/acpi/platform_profile_choices
low-power balanced performance
$ cat /sys/firmware/acpi/platform_profile
balanced
$ journalctl -k -b | grep -i "registered as platform"
hp_wmi: Registered as platform profile handler
$ echo performance | sudo tee /sys/firmware/acpi/platform_profile
performance
$ echo low-power | sudo tee /sys/firmware/acpi/platform_profile
low-power
$ echo balanced | sudo tee /sys/firmware/acpi/platform_profile
balanced
```
All three profiles accept writes without error. OMEN hotkey continues
to fire `KEY_PROG2` (scancode `0x21a5`) as before.
I have not yet stress-tested fan curves under load across profiles, so
the *effect* of the WMI write on EC fan behaviour is not yet empirically
verified on this exact board — but the code path is the same as the
already-upstream `8D87` so I expect it to be identical.
## Caveats / things to check before merging
- I cannot verify what HP's Windows OMEN Gaming Hub does on this exact
board. A dual-boot owner could confirm the WMI traffic matches.
- `8D41` is currently mapped to `victus_s_thermal_params` in CachyOS 7.0.x
but upstream has since migrated it to `omen_v1_no_ec_thermal_params`
(commit `c2d4b76`). This patch does **not** migrate `8D41`; that is
a separate cleanup if you want to converge on upstream.
- The patch was generated with `diff -u` and applies clean with `patch -p1`
(no fuzz, no rejects) against `cachyos-7.0.9-1`.
## Patch
[Attach `0001-hp-wmi-add-OMEN-Slim-8D40-and-Max-8D87.patch` here, or
```diff
hp-wmi: add OMEN Slim 16t-an000 (8D40) and OMEN MAX 16-ak0xxx (8D87)
Backport of upstream commit 5badf5e ("Add support for OMEN MAX
16-ak0xxx (8D87)") and extension to also support OMEN Slim Gaming
Laptop 16t-an000 (DMI board 8D40), which uses the same thermal
control protocol: pure WMI (HPWMI_SET_PERFORMANCE_MODE) without
EC writes for the thermal profile.
Introduces:
* HP_NO_THERMAL_PROFILE_OFFSET sentinel
* omen_v1_no_ec_thermal_params struct
* Both boards added to victus_s_thermal_profile_boards table
* Two if-checks extended to recognise the sentinel
---
--- a/drivers/platform/x86/hp/hp-wmi.c 2026-05-17 11:57:02.000000000 -0400
+++ b/drivers/platform/x86/hp/hp-wmi.c 2026-05-17 20:42:36.090141751 -0400
@@ -48,6 +48,7 @@
enum hp_ec_offsets {
HP_EC_OFFSET_UNKNOWN = 0x00,
+ HP_NO_THERMAL_PROFILE_OFFSET = 0x01,
HP_VICTUS_S_EC_THERMAL_PROFILE_OFFSET = 0x59,
HP_OMEN_EC_THERMAL_PROFILE_FLAGS_OFFSET = 0x62,
HP_OMEN_EC_THERMAL_PROFILE_TIMER_OFFSET = 0x63,
@@ -127,6 +128,13 @@
.ec_tp_offset = HP_OMEN_EC_THERMAL_PROFILE_OFFSET,
};
+static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
+ .performance = HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE,
+ .balanced = HP_OMEN_V1_THERMAL_PROFILE_DEFAULT,
+ .low_power = HP_OMEN_V1_THERMAL_PROFILE_DEFAULT,
+ .ec_tp_offset = HP_NO_THERMAL_PROFILE_OFFSET,
+};
+
/*
* A generic pointer for the currently-active board's thermal profile
* parameters.
@@ -227,9 +235,17 @@
.driver_data = (void *)&victus_s_thermal_params,
},
{
+ .matches = { DMI_MATCH(DMI_BOARD_NAME, "8D40") },
+ .driver_data = (void *)&omen_v1_no_ec_thermal_params,
+ },
+ {
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D41") },
.driver_data = (void *)&victus_s_thermal_params,
},
+ {
+ .matches = { DMI_MATCH(DMI_BOARD_NAME, "8D87") },
+ .driver_data = (void *)&omen_v1_no_ec_thermal_params,
+ },
{},
};
@@ -1835,7 +1851,8 @@
const struct thermal_profile_params *params;
params = active_thermal_profile_params;
- if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
+ if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
+ params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
*profile = active_platform_profile;
return 0;
}
@@ -2190,7 +2207,8 @@
* 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) {
+ if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
+ active_thermal_profile_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);
```
2 条评论