fix: recognize Turbo profile and enable manual fans on PHN16S-71 - #5
Open
Philippe-Augusto wants to merge 1 commit into
Open
Conversation
The Predator PHN16S-71 (board FTYPE_ARX) reads back firmware profile code 0x02, which wasn't in the known Acer profile table, so the gaming_profile sysfs group was never created and Profiles showed Unavailable in the GUI. Confirmed via a Windows/PredatorSense correlation (no profile write in between) that 0x02 is Turbo. Added the mapping scoped to this exact model (dmi_match on the product name, matching the existing per-model quirk pattern in this file), since Acer's per-board WMI profile codes aren't guaranteed identical across the Predator lineup and only this one has been verified. Turbo is exposed read-only (ProfileChoice.selectable = false): attempting to write it back through the same WMI SET method was rejected by the firmware with a remote I/O error on this hardware, so the GUI shows it as informational only instead of offering a control that reliably fails. Manual fan mode was unavailable because discover_gaming_wmi_fan_interface gates it on a readable Acer-branded hwmon device for CPU/GPU temperature (the thermal watchdog's safety precondition), and this board registers none. Added a narrow, exact-model fallback (TemperatureSource::AcpiThermalZones) that reads the same information from generic ACPI thermal zones already exposed by the firmware (TCPU for CPU, SEN4 for GPU), verified live against coretemp and nvidia-smi. Every other board keeps its existing hwmon-only behavior unchanged. Both fixes tested live: Manual mode now offers independent CPU/GPU percent sliders and applies successfully; Turbo now decodes correctly instead of showing Unavailable, with no working button that could fail. Related: fladirm#1 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes two of the gaps reported in #1 on my own Predator PHN16S-71 (board FTYPE_ARX, BIOS V1.26). Both were tested live on the exact hardware from that report.
Profiles were entirely unavailable. The firmware reads back profile code
0x02, which wasn't in the known Acer profile table, soasense_profile_by_value()returned NULL,rgb->profile_availablestayed false, and thegaming_profilesysfs group was never created. I confirmed0x02is Turbo by reading it on Linux immediately before a reboot into Windows, where PredatorSense opened with Turbo already the active mode (no profile write happened in between). Mapped it inkernel/asense_rgb.c, scoped to this exact model viadmi_match(same pattern as the existingasense_zoned_quirks/asense_reference_modelquirks) rather than the shared table, since Acer's per-board WMI profile codes aren't guaranteed identical across the whole Predator lineup and only this one has been verified. Turbo is exposed read-only (ProfileChoice.selectable = false): writing it back through the same WMI SET method was rejected by the firmware with a remote I/O error on this hardware, so the GUI shows it as informational only instead of offering a control that reliably fails.Manual fan mode was unavailable, only Auto/Maximum showed.
discover_gaming_wmi_fan_interfacegates Manual on a readable Acer-branded (acer/acer-wmi) hwmon device for CPU/GPU temperature — that's the thermal watchdog's safety precondition before allowing a user-set low speed. This board registers no such hwmon device at all. Added a narrow, exact-model fallback (TemperatureSource::AcpiThermalZones) that reads the same information from generic ACPI thermal zones the firmware already exposes (TCPUfor CPU,SEN4for GPU) — verified live againstcoretempandnvidia-smiat the same instant, including a load spike whereTCPUandacpitz/coretempall jumped to 93°C together. Every other board keeps its existing hwmon-only behavior unchanged; this only activates when the exact product string matches and the branded hwmon device is absent.Also worth a maintainer look, not fixed here (didn't want to scope-creep this PR):
asense probe) can showdaemon: error(protocol/timeout)simply because the GUI already holds the single control-socket connection open — the daemon serves one client at a time (serve_clientinsrc/daemon.rs), so a second client just hangs until the first disconnects. Every capture attached to Compatibility Report: Predator Helios Neo 16 (PHN16S-71) - RGB and Fan Control working, but RPM and Profiles are missing #1 hit this, which is why they all showed a blanket timeout instead of the real per-field state.fans.control.modes.manual = trueeven though the real, safety-gated capability used by the GUI correctly said Manual wasn't available (this is what led me to it) — the probe should reflect what the GUI will actually allow, not just what the WMI transport structurally accepts.balanced-performanceandperformanceboth display as "Performance" for non-reference models (profile_from_raw_for_machineinsrc/app.rs), and the passive diagnostics decoder doesn't yet recognize"turbo"as a valid canonical choice string.ASENSE_FAN_SPEED_GETreply, and the undocumented multi-bank embedded-controller query behindASENSE_GAMING_SYS_INFO_GET, found by decompiling the live DSDT). Both ruled out by live comparison against an audible Auto/Maximum fan-speed change — neither value moves at all. Real tachometer data would need actual EC firmware disassembly to find, which felt out of scope for a compatibility fix.Test plan
cargo test --release --no-default-features --lib— 162 passed, 0 failed (including the existinggaming_wmi_manual_requires_both_watchdog_temperaturessafety test, unmodified)cargo build --release --bin asensed --no-default-featuresand kernel module built clean viamakeinkernel/Predator PHN16S-71product string (both new code paths are gated behind an exact DMI product match before doing anything)