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
@apalazzi

Copy link
Copy Markdown

On Gigabyte Aorus Elite X570 works with just modprobe it87, no parameters needed. Thanks.

@indiv0

indiv0 commented Feb 2, 2026

Copy link
Copy Markdown

On Gigabyte Aorus Elite X570 works with just modprobe it87, no parameters needed. Thanks.

For those curious, this is because on Gigabyte Aorus Elite X570 there is only the it8688 chip, no it8792. Gigabyte Aorus Master X570 however has both, and can be made to work with options it87 mmio=1.

@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