Dell XPS 15 9500 fan control

René Kulik on 07.07.2020

A few days ago I bought a new generation Dell XPS 15 9500. My first impression is very positive. The build quality is decent and I had no problems installing and running Linux (Ubuntu 20.04.1) on it.

Still there was one thing which bothered me a lot. When running Ubuntu, the fans constantly turned on and off again in a 3 seconds interval. Regardless of whether something was processed or the laptop was idling.

A research revealed that I was not the only one experiencing this issue. Many people had exactly the same problem with different versions of the Dell XPS. Unfortunately none of the forum- and blogposts I read had the one and only solution.

After some trial and error I managed to fix the issue by disabling the internal Dell BIOS fan control and replacing it with i8kmon.

Here are the steps I took:

Install i8kutils:

$ sudo apt-get install i8kutils

Add i8k at the end of the kernel modules file so it loads at boot time:

$ sudo vim /etc/modules

The modules file should contain a similar content afterwards:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
i8k

Next step would be to reboot your laptop. During the reboot go into your BIOS and make sure the “Secure Boot” option is disabled. Otherwise you will run into problems at the next step.

Finally we disable the Dell BIOS fan control. Therefore we are using dell-bios-fan-control. Clone the repository, run its Makefile and execute sudo ./dell-bios-fan-control 0:

$ git clone https://github.com/TomFreudenberg/dell-bios-fan-control.git
$ cd dell-bios-fan-control
$ make
$ sudo ./dell-bios-fan-control 0

The terminal should show:

BIOS CONTROL DISABLED

Unfortunately we would have to manually execute this binary everytime we reboot our system. To avoid this, we will implement some automation.

First we will make the binary executable without the need of using sudo:

$ sudo chown root.root dell-bios-fan-control
$ sudo chmod 4755 dell-bios-fan-control

After that we make sure the binary will be executed automatically on startup via cron. Execute the following command to open the crontab file and add @reboot /path/to/the/dell-bios-fan-control 0 at the end:

$ crontab -e

The file should look similar to this:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
@reboot /path/to/the/dell-bios-fan-control 0

Save the file to install the crontab (crontab: installing new crontab should be shown in the terminal).

Aaaaaaaand it is done! You replaced your BIOS fan control with i8kmon. For further fan adjustments you can tweak the settings in /etc/i8kmon.conf.

Here is mine as a comparison:

# Sample i8kmon configuration file (/etc/i8kmon.conf, ~/.i8kmon).

# Run as daemon, override with --daemon option
set config(daemon)	0

# Automatic fan control, override with --auto option
set config(auto)	1

# External program to control the fans
set config(i8kfan)	/usr/bin/i8kfan

# Report status on stdout, override with --verbose option
set config(verbose)	0

# Status check timeout (seconds), override with --timeout option
set config(timeout)	2

# Temperature threshold at which the temperature is displayed in red
set config(t_high)	80

# Temperature thresholds: {fan_speeds low_ac high_ac low_batt high_batt}
# These were tested on the I8000. If you have a different Dell laptop model
# you should check the BIOS temperature monitoring and set the appropriate
# thresholds here. In doubt start with low values and gradually rise them
# until the fans are not always on when the cpu is idle.
# set config(0)   {{0 0}  -1  55  -1  60}
# set config(1)   {{1 1}  50  65  55  70}
# set config(2)   {{2 2}  60  75  65  80}
# set config(3)   {{2 2}  70 128  75 128}

set config(0)   {{0 0}  -1  60  -1  60}
set config(1)   {{1 1}  55  70  55  70}
set config(2)   {{2 2}  60  75  60  75}
set config(3)   {{2 2}  70 128  70 128}
# <-  40  45  50  55  60  65  70  75  ->
# 0--------------------0
#                 1------------1
#                     2------------2
#                             3--------3

# Speed values are set here to avoid i8kmon probe them at every time it starts.
set status(leftspeed)	"0 1000 2000 3000"
set status(rightspeed)	"0 1000 2000 3000"

# end of file

I hope this post helps you if you are having the same issue.