Minisforum BD790i X3D: PBO, Curve Optimizer and a Fan Curve That Doesn’t Drive Me Mad

I’m using a Minisforum BD790i X3D motherboard with an AMD Ryzen 9 7945HX3D. My system is running Bazzite Linux.

The board is a pretty interesting little package: a 16-core Zen 4 X3D mobile CPU soldered directly onto a Mini-ITX board, with a surprisingly capable integrated cooling solution. Out of the box, though, I had one thing that annoyed me quite a bit: the CPU fan seemed to know exactly two speeds: Almost silent. And jet engine.

The default BIOS fan settings caused it to sit at very low RPM for quite a while, then suddenly jump to maximum as soon as the CPU hit one of its normal short temperature spikes. At the same time, I wanted to see how much performance I could get out of the 7945HX3D without turning this into some hardcore overclocking project. My goal was basically:

Get the CPU running as efficiently as possible, keep the sensible factory power limits, and make the fan curve behave like an actual curve.

This is where I ended up.


Part 1: Optimizing the Ryzen 9 7945HX3D

I deliberately did not start by raising power limits. The cooling system on this board is good for what it is, but there is little point in throwing another 20 or 30 watts at the CPU if the result is just more heat and thermal throttling. I let AMD and Minisforum keep their normal power limits, but use Curve Optimizer to see whether the CPU can achieve higher clocks at the same power.

Curve Optimizer testing

I tested an all-core negative Curve Optimizer at C0 to C-20. For repeatable load testing I used stress-ng --cpu 32 and monitored clocks and package power with turbostat.

At roughly the same 100 W package power, I got approximately:

CO 0:    ~4.50 GHz all-core   ~84 °C
CO -10:  ~4.60 GHz all-core   ~85 °C
CO -15:  ~4.61 GHz            diminishing returns
CO -20:  ~4.63 GHz            ~88.5 °C

That made the decision fairly easy.

-10 gave me most of the useful improvement. Going further still increased clocks slightly, but the gains became tiny while temperatures moved much closer to the CPU’s thermal limit.


Part 2: Fixing the Fan Curve

Before getting into my settings, it helps to understand what Minisforum’s BIOS options actually mean. That's what I found out:

What the MINISFORUM BIOS fan settings mean

Fan Off Temperature

This is the lower threshold where the fan is allowed to enter its off or minimum state.

Importantly, this is not the same thing as Fan Start Temperature.

That explains something that confused me at first: my fan was happily spinning at around 500 RPM while the CPU was below the configured Start Temperature.

Fan Start Temperature

This defines where the active fan-control range begins when coming out of the low/off state. Think of it as the lower temperature anchor of the automatic fan curve rather than an on/off switch.

Start PWM

This is the PWM level used at the beginning of the active curve. Increasing this moves the lower part of the entire fan curve upward. This one made a surprisingly big difference in my system.

With the original lower value, the fan spent too long at roughly 350–450 RPM. The CPU would heat up quickly, and the fan then had to catch up instantaniously.

Changing Start PWM to 80 resulted in an idle fan speed of roughly ~500 RPM and an idle temperature below 50 °C.

That gave the cooling system a much better starting point without making the machine noticeably louder.

PWM Slope

Temperature vs. CPU Fan RPM

Temperature (left) vs. CPU fan RPM (right): Idle, semi, full load (peaks)

This is the most important setting. PWM Slope controls how quickly fan PWM increases as temperature rises above the Start Temperature.

And the number shown in the BIOS has a slightly unusual encoding. The BIOS itself explains it like this:

Upper 4 bits = integer
Lower 4 bits = fraction in eighths

So:

10 = 1 + 0/8 = 1.000
14 = 1 + 4/8 = 1.500

20 = 2 + 0/8 = 2.000

53 = 5 + 3/8 = 5.375

This also means that values such as 18 or 19 do not really make sense in this format. After 17, the next sensible value is 20.

A higher Slope makes the fan accelerate more aggressively as temperature increases. This turned out to be the setting that fixed the annoying jump-to-full-speed behavior. With a low slope, I had situations like:

82 °C   ~850 RPM
83 °C   ~950 RPM
84 °C   ~1500 RPM

The fan curve itself simply never got anywhere near maximum PWM before reaching the separate Full Speed threshold.

After increasing the slope substantially, the fan started doing useful work much earlier.

 

Full Speed Temperature

This is the hard upper temperature threshold. Once the CPU reaches it, the controller simply commands full fan speed. It is therefore not just another point on the gradual curve.

Delta

This setting is still the least clearly documented one. At first I assumed a Delta of 3 meant that the controller would only update the fan every 3 °C.

That is clearly not what happens. Watching fan speed live, I can see individual RPM changes as the CPU temperature changes. The controller adjusts extremely smoothly.

So whatever Delta does internally, most likely some form of control deadband/hysteresis, it does not mean “only recalculate every three degrees. I currently leave it at 3 because the resulting control behavior is stable.

My Current Fan Settings

This is where I ended up:

Fan Start Temperature:       55 °C
Start PWM:                   80
PWM Slope:                   53   (= 5.375)
Full Speed Temperature:      83 °C
Delta:                        3

With these values I currently see roughly:

Idle:
~48 °C
~500 RPM

2 stress-ng workers:
~62 °C
~930 RPM

4 workers:
~70 °C
~1100 RPM

8 workers:
fan reaches maximum
~88 °C sustained

32 threads:
~4.53 GHz
~86 °C
maximum fan

For me, this is much nicer than the default behavior. The system stays cooler during light and medium workloads because the fan starts doing useful work earlier. 

The fan now actually follows the CPU temperature instead of waiting until the last possible moment.


Reading the Miniforum CPU Fan Sensors Under Linux

There is one additional annoyance with this board under Linux: The BD790i X3D uses an ITE IT8613E Super-I/O controller for the motherboard sensors and fan tachometers.

sensors-detect finds it as ITE IT8613E Super IO Sensors

but the normal Linux it87 driver currently does not expose the sensors properly on my system.

This patched driver adds IT8613E support: https://github.com/shauno8/it87

Build it with:

git clone https://github.com/shauno8/it87.git
cd it87
make

Then load its dependency:

sudo modprobe hwmon-vid

and load the compiled driver:

sudo insmod ./it87.ko

After that, sensors shows something like:

it8613-isa-0a30
Adapter: ISA adapter
...
fan4: 500 RPM

On my board, fan4 is the CPU fan.


 

Final Thoughts

The biggest surprise for me was that I did not need more CPU power to get noticeably better performance.

The 7945HX3D already sits right around what this small cooling solution can sensibly handle. Curve Optimizer gave me roughly another 100 MHz at the same ~100 W power limit, while raising the actual power limits would mostly have bought me more heat.

And the fan problem turned out not to be a bad fan at all.

The controller is actually capable of extremely fine RPM control. The default curve was simply configured in a way that kept the fan too slow for too long and then hit the hard Full Speed threshold.

With a higher starting PWM and a much steeper slope, the machine is now both cooler and less annoying.

Which is pretty much exactly what I wanted.

This article was updated on