P

Supermicro X9/X10/X11 Fan Speed Control

gyrene2083

New Member
Sep 2, 2019
6
0
1
Hello All,

I have a Supermicro X10DRU-i+, it doesn't have a FANA or FANB, it only has Fans1-8. How would you configure this board that doesn't have those two zones?

Thanks in advance.
 

DaveInTexas

New Member
Oct 28, 2021
17
22
3
@PigLover 's reference document is exceedingly useful, however it's not fully accurate on one point. This supplemental information (below) may help others who are new to manually controlling Supermicro motherboard fan speeds.

1. The description of fan speed step zones is partially incorrect and needs a bit of clarification, IMHO.

"You can also set the PWM duty cycle for each of the fan zones. PWM values are set 64 steps using hex values from 00-FF (ox00 to 0x64). 0x00 is minimum speed, 0x64 is full speed, and 0x32 is 50%, etc."

There are in fact 100 intervals, not 64. Those are hexadecimal values (base-16), and therefore 0x00 - 0x64 is equivalent to 0 - 100 decimal (base-10). In other words, 0x00 - 0x64 (hex) is a range of 100 (decimal) steps, where each step = 1% in fan speed change.

10x = 16
20x = 32
etc.
64x = 100

I don't know what happens if you plug in a value of 0x65 or higher. Out-of-range behavior is likely dependent how any given BMC controller handles such data. Some ignore values out of range and some roll the value over (e.g. 0x65 becomes 0x00).

--------------

2. The information above is true for certain Supermicro motherboards, but not all of them.

The 0x00 - 0x64 step utilization mentioned above works on Supermicro generation X10 and X11 motherboards. The hex value is directly correlated to decimal percentage equivalents, which is nice for humans as it makes it easier for us to do the math. :cool:

In short, X10 and X11 mobos use a literal percentage expression. But, what if you have a Supermicro X9 motherboard?

On X9 boards, you have to convert an 8-bit hexadecimal range (0-FF) into its corresponding decimal range (0-255), and then break that into increments of 1/100 to find the equivalent decimal percentage us humans are used to, expressed as its equivalent hex range.

In order to set your fan speed correctly, you must convert from a 100-point with increments of 1, as a decimal scale, to a 256-point scale divided by increments of 1/100. In other words, you must think of 0-100% stepping along a scale of 0 - 255 ( x00 - xFF ).

For X9 boards you must treat it like a scale, where you are pegging a percentage to the corresponding value along the scale. In human-readable decimal terms, we are talking about a 0 - 100 integer scale (percentage) cross-referenced to an 8-bit hexadecimal scale (00 - FF).

Examples:

00 decimal =0x00 hexadecimal
10 decimal = 0x1A hex (10% of FF or 255 = 25.5 rounded = 26)
25% = 0x40 (25% of 255 is 63.75 = rounded to 64 decimal or x40 hex { 4 x 16 + 0 = 64 decimal }
50% = 0x7F
75% = 0xBF (75% of 255 = 191.25 = rounded to 191 decimal = { 11 x 16 + 15 = 191 decimal }
100% = 0xFF

Basically, for X9 boards you have to convert your desired percentage value from decimal to hexadecimal, while at the same time mapping a decimal value (percentage) to an 8-bit hexadecimal scale equivalent. This is because while 0x00 = 0%, since 0xFF = 100%, it means in order to determine how to set your power percentage for any given fan zone, the formula is:

(( percentage / 100 ) * 255 )

or

(( percentage * 255 ) / 100 )

You then convert the value to hexadecimal. For example, 50% = 0x7F: 7F = 128 = 50% of 256

Note: It's normally good practice to use lowercase letters when expressing hex values in code. They are written in uppercase in this post to make it easier to read. Also, the "0x" preceding each hex value clarifies the value following the "0x" is hexadecimal and not decimal. Not every operating system or programming language supports that syntax, but many do.

--------------

3. FYI: Raw fan speed IPMI commands are different for Supermicro X9 vs. X10/X11 boards:

X9: ipmitool raw 0x30 0x91 0x5A 0x03 "zone" "duty"
X10/X11: ipmitool raw 0x30 0x70 0x66 0x01 "zone" "duty"

where "zone" = 0x00 or 0x01
where "duty" = 0x00 --> 0xFF or 0x00 --> 0x64 depending on mobo gen, as explained above
 
  • Like
Reactions: gseeley

Negative Entropy

New Member
May 20, 2020
20
14
3
Hello All,

I have a Supermicro X10DRU-i+, it doesn't have a FANA or FANB, it only has Fans1-8. How would you configure this board that doesn't have those two zones?

Thanks in advance.
You may be able to get a list of the "sensors" too. That's how I handled it using IPMIUTIL. Each fan header was its own sensor (numbered 41, 42, etc.). This on a shiny new X13 board. Then I could issue commands against that sensor number.
 
  • Like
Reactions: gyrene2083

AveryFreeman

consummate homelabber
Mar 17, 2017
409
52
28
41
Near Seattle
averyfreeman.com
Something I just figured out: you can send the commands directly without ipmitool using the ipmiview app for Android, but when you send the commands they have to omit the 0x bit at the start.

So, for example, this: 0x30 0x70 0x66 0x01 0x00 0x16

Become this: 30 70 66 1 0 16

Which is 25% duty cycle for zone 0 (which is all my board has afaik). Tested on an X10SRW-F which doesn't have "optimal" option available (grr).

Also, not sure if I had to set speed to full before it started working, but I tried that as the first step just in case (will verify later, just so glad rn it's working at all!)

If I remember correctly, full was: 30 45 1 but might need a zone in there if you (unlike me) have a board with more than 1.

I wonder if since these were set directly if they'll survive reboot... Seems like I'm pushing it at this point, just going to enjoy being able to hear myself think for a bit...

Btw Android ipmiview app has a PDF reference that explains how to input the raw commands, Google if interested.

Thanks so much for posting this guidance!

Edit: I am pretty sure this works without having to make it full first (at least on my board) but it resets itself to full on reboot, so even though the commands were sent directly using ipmiview, they are not persistent

Does anyone know of a copy of ipmitool I can put on the efi partition to run at the boot screen? Having to suffer through full fan speed all the way through OS startup would be torturous. At least with the phone I can hit send on the string again as soon as I hear the fans spinning up into the red zone

I'm also replacing my FAN-0126L4 with FAN-0094L4, so maybe they'll be perfectly tolerable at the 50% standard setting. The 0126 is nidec 7000RPM 80mm fans, the San Ace 0094 manages to have more static pressure and move more air (CFM) at 6300RPM. Gotta love progress.

4200 is the 50% duty on my 0126 fans, I'm hoping the 0094s will be true to form and run at 3150. That sounds like a godsend, but knowing this board it'll probably kick them up to 3800 as a matter of tradition.
 
Last edited:

IvanM07

New Member
Aug 28, 2022
1
1
1
I don't know if this will help anyone but this was just a quick script I made for my two ESXi hosts that run on startup in /etc/rc.local.d/ and have worked well so far.

I have 2x 1u X10SRI-f and all fans are 'CPU' fans, so there isn't any finesse to the fan settings in this script.

I didn't like the static settings that SuperMicro had or just setting it to a static setting like 33%, even though 90% of the time i'm under 15% CPU Utilization.


#!/bin/sh
test="$(/opt/ipmitool/ipmitool sensor |cut -d '|' -f2|awk 'NR==1{print $1}')"
test1="${test%\.*}"
while true
do
if [ "$test1" -lt 40 ]; then
/opt/ipmitool/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x18
echo "Fan Speed adjusted 25%"
fi
if [ "$test1" -gt 40 ]; then
/opt/ipmitool/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x24
echo "Fan Speed adjusted 37.5%"
fi
if [ "$test1" -gt 50 ]; then
/opt/ipmitool/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x32
echo "Fan Speed adjusted 50%"
fi
if [ "$test1" -gt 60 ]; then
/opt/ipmitool/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x48
echo "Fan Speed adjusted 75%"
fi
if [ "$test1" -gt 70 ]; then
/opt/ipmitool/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x66
echo "Fan Speed adjusted 100%"
fi
sleep 5
done
 
  • Like
Reactions: AveryFreeman

nickf1227

Active Member
Sep 23, 2015
183
111
43
31
  • Like
Reactions: AveryFreeman

Patrik Dufresne

New Member
Oct 19, 2016
20
1
3
37
@nickf1227

Last time I check, X10 and more recent board doesn't provide access to the BCM using i2c. This make it impossible to control the fan from the operating system.