ITADN

hp-wmi: add OMEN Slim 16t-an000 (8D40) board support

#157Openotonielgrang 创建于 2026-05-18
O
otonielgrangcommented
# 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 条评论