Skip to content

Instantly share code, notes, and snippets.

@bakman2
Last active July 21, 2026 10:15
Show Gist options
  • Select an option

  • Save bakman2/e801f342aaa7cade62d7bd54fd3eabd8 to your computer and use it in GitHub Desktop.

Select an option

Save bakman2/e801f342aaa7cade62d7bd54fd3eabd8 to your computer and use it in GitHub Desktop.

PWM fan control in Linux with a Gigabyte Aorus motherboard

  • install lm-sensors with your package manager

sensors

If it won't show any fan/speed, continue

sensor-detect

Say YES to at least "Super I/O sensors"

Expected output:

Trying family `ITE'...                                      Yes
Found unknown chip with ID 0x8688

If similar, continue

git clone https://github.com/frankcrawford/it87

cd it87
sudo make clean
sudo make install
sudo modprobe it87 ignore_resource_conflict=1 force_id=0x8622

sensors

The fans should show up now, if yes, continue to make them available at boot:

echo options it87 ignore_resource_conflict=1 force_id=0x8622 > /etc/modprobe.d/it87.conf
echo it87 >> /etc/modules
@kazimurtaza

Copy link
Copy Markdown

Confirmed working on the same family of board: Gigabyte B550 Aorus Elite AX V2, IT8689E rev2, MMIO 0xfe000000, BIOS FGd.

The fix is the workaround curve, with one board-specific gotcha: this BIOS caps the Smart Fan 5 temperature field at 65C (it won't accept 90). Set every temp point to 65. Software control then works below 65C; the BIOS forces 100% above that as a failsafe. For a Ryzen 5700X that peaks around 60C under a full load, the cap never binds in practice.

What worked, per controllable header:

  • A 7-point CURVE, not a fixed/preset mode. A fixed-speed mode rejects pwm_enable=1 (reads back 0) - manual mode is locked out entirely.
  • PWM: 40 40 40 40 40 40 100. Temp: 0 65 65 65 65 65 65. Source: CPU. (65 because that's this BIOS's cap; use 90 where the BIOS allows it.)
  • Pump header stays on Full Speed. Taking the pump channel manual stops it (0 RPM), so never put the pump in fancontrol.

After this, pwm_enable=1 sticks and fancontrol holds through a 6-minute full-CPU-load soak with no re-assertion - the radiator RPM tracks pwm past the ~5-minute point where it used to pin.

Two extras that bit me:

  • Keep the fancontrol write interval at 3s or more. A sub-second "hammer" loop to out-write the EC makes the pwm value stop responding on this chip.
  • The earlier acpi_enforce_resources=lax / ignore_resource_conflict advice was not needed once the MMIO build bound the chip (rev2 binds cleanly at 0xfe000000).

Root cause is the IT8689E's on-die vector (SmartFan) controller staying armed and overriding the duty register - see #114, not the Gigabyte EC. Thanks to @TsunamiMommy for the "every temp point" detail in #96.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment