Tuning Intel Skylake and beyond for optimal performance and feature level support on Linux:
Note that on Skylake, Kabylake (and the now cancelled "Broxton") SKUs, functionality such as power saving, GPU scheduling and HDMI audio have been moved onto binary-only firmware, and as such, the GuC and the HuC blobs must be loaded at run-time to access this functionality.
Enabling GuC and HuC on Skylake and above requires a few extra parameters be passed to the kernel before boot.
Instructions provided for both Fedora and Ubuntu (including Debian):
Note that the firmware for these GPUs is often packaged by your distributor, and as such, you can confirm the firmware blob's availability by running:
1. On Fedora:
rpm -ql linux-firmware | fgrep i915
Sample output:
/usr/lib/firmware/i915
/usr/lib/firmware/i915/bxt_dmc_ver1_07.bin
/usr/lib/firmware/i915/kbl_dmc_ver1.bin
/usr/lib/firmware/i915/kbl_dmc_ver1_01.bin
/usr/lib/firmware/i915/skl_dmc_ver1_23.bin
/usr/lib/firmware/i915/skl_guc_ver1.bin
/usr/lib/firmware/i915/skl_guc_ver4.bin
/usr/lib/firmware/i915/skl_guc_ver6.bin
/usr/lib/firmware/i915/skl_guc_ver6_1.bin
/usr/share/doc/linux-firmware/LICENSE.i915
2. On Ubuntu:
dpkg -L linux-firmware | fgrep i915
It may be wise to install the linux-firmware-nonfree
package as it may contain extra firmware blobs on Ubuntu releases prior to 16.04LTS. Don't install this on 16.04LTS and above.
Now, to the real meat:
See the supported module options:
Let's see if the features we're after are supported:
sudo modinfo i915 | egrep -i "guc|huc|dmc"
firmware: i915/bxt_dmc_ver1_07.bin
firmware: i915/skl_dmc_ver1_27.bin
firmware: i915/kbl_dmc_ver1_04.bin
firmware: i915/glk_dmc_ver1_04.bin
firmware: i915/cnl_dmc_ver1_07.bin
firmware: i915/icl_dmc_ver1_07.bin
firmware: i915/kbl_guc_ver9_39.bin
firmware: i915/bxt_guc_ver9_29.bin
firmware: i915/skl_guc_ver9_33.bin
firmware: i915/kbl_huc_ver02_00_1810.bin
firmware: i915/bxt_huc_ver01_8_2893.bin
firmware: i915/skl_huc_ver01_07_1398.bin
parm: enable_guc:Enable GuC load for GuC submission and/or HuC load. Required functionality can be selected using bitmask values. (-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load) (int)
parm: guc_log_level:GuC firmware logging level. Requires GuC to be loaded. (-1=auto [default], 0=disable, 1..4=enable with verbosity min..max) (int)
parm: guc_firmware_path:GuC firmware path to use instead of the default one (charp)
parm: huc_firmware_path:HuC firmware path to use instead of the default one (charp)
parm: dmc_firmware_path:DMC firmware path to use instead of the default one (charp)
Note: The intel_pstate driver
is the default since Linux 4.10 on SKL+. Thanks for the updates on this @pcordes and the correction on module options syntax in /etc/modprobe.d/i915.conf
, @vinzent. Gr33ts ;-)
Then, update grub on Fedora:
(Run commands as root):
For EFI boot (More common):
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
And if you're still booting up in legacy BIOS mode on an MBR-style partitioning scheme or with CSM enabled on Fedora for whatever reason:
grub2-mkconfig -o /boot/grub2/grub.cfg
Then rebuild initramfs:
On Fedora:
dracut --force
On Debian-based distributions:
Simply run:
sudo update-initramfs
update-grub
Then reboot.
Your modern Intel HD Graphics processor graphics will work just fine.
You can also add this to: /etc/modprobe.d/i915.conf
In the following syntax:
options i915 enable_guc=3
Other safe options to pass are enable_fbc=1
.
Reference:
See modinfo output for i915 for available GuC options:
modinfo i915 | grep guc
Further notes:
A list of all options along with short descriptions and default values can be generated with the following command:
$ modinfo -p i915
To check which options are currently enabled, run:
# systool -m i915 -av
You will note that many options default to -1, resulting in per-chip power-saving defaults. It is however possible to configure more aggressive powersaving by using module options. Warning: Diverting from the defaults will mark the kernel as tainted from Linux 3.18 onwards. This basically implies using other options than the per-chip defaults is considered experimental and not supported by the developers.
The following set of options should be generally safe to enable:
/etc/modprobe.d/i915.conf
options i915 enable_fbc=1 enable_guc=3
On Linux 4.16+, GuC firmware loading and submission is now handled by the enable_guc
parameter in place of the former enable_guc_loading=1
and enable_guc_submission=1
parameters. Adjust as needed.
RC6 sleep modes (enable_rc6
):
You can experiment with higher values for enable_rc6, but your GPU may not support them or the activation of the other options:
The available enable_dc
values are a bitmask with bit values RC6=1
, RC6p=2
, RC6pp=4[4]
- where "RC6p
" and "RC6pp
" are lower power states.
To confirm the current running RC6 level, you can look in sysfs:
# cat /sys/class/drm/card0/power/rc6_enable
If the value read is a lower number than expected, the other RC6 level are probably not supported. Passing drm.debug=0xe
to the kernel boot options will add DRM debugging information to the kernel log - possibly including a line like this:
[drm:sanitize_rc6_option] Adjusting RC6 mask to 1 (requested 7, valid 1)
Framebuffer compression (enable_fbc
):
Framebuffer compression may be unreliable or unavailable on Intel GPU generations before Sandy Bridge (generation 6). This results in messages logged to the system journal similar to this one:
kernel: drm: not enough stolen space for compressed buffer, disabling.
Tear-free video:
With the SNA acceleration method enabled, tearing may be observed. To fix this, enable the "TearFree
" option in the driver by adding the following line to your xorg.conf (or ideally, a sub-configuration file under xorg.conf.d) configuration file:
Option "TearFree" "true"
This is not needed on server-grade SKUs where Xorg is unwelcome.
Debugging:
Simply inspect dmesg:
dmesg | grep drm
And also look at the output of:
journalctl -b -o short-monotonic -k
To confirm that the settings you wanted have been applied, run:
dmesg | grep -iE "huc|guc|dmc"
Output may look like this:
[ 2.014699] Setting dangerous option enable_guc - tainting kernel
[ 2.019971] [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4)
[ 2.030651] [drm] HuC: Loaded firmware i915/kbl_huc_ver02_00_1810.bin (version 2.0)
[ 2.040648] [drm] GuC: Loaded firmware i915/kbl_guc_ver9_39.bin (version 9.39)
[ 2.051850] i915 0000:00:02.0: GuC firmware version 9.39
[ 2.051850] i915 0000:00:02.0: GuC submission enabled
[ 2.051851] i915 0000:00:02.0: HuC enabled
Which means you're good to go.
You can also take a look at:
- GuC load status:
sudo cat /sys/kernel/debug/dri/0/i915_guc_load_status
GuC firmware: i915/kbl_guc_ver9_39.bin
status: fetch SUCCESS, load SUCCESS
version: wanted 9.39, found 9.39
header: offset 0, size 128
uCode: offset 128, size 147392
RSA: offset 147520, size 256
GuC status 0x800330ec:
Bootrom status = 0x76
uKernel status = 0x30
MIA Core status = 0x3
Scratch registers:
0: 0xf0000000
1: 0x1
2: 0xc
3: 0x0
4: 0x2
5: 0x0
6: 0x7f2000
7: 0x8
8: 0x3
9: 0x403240
10: 0x0
11: 0x0
12: 0x0
13: 0x0
14: 0x0
15: 0x0
- HuC load status:
sudo cat /sys/kernel/debug/dri/0/i915_huc_load_status
HuC firmware: i915/kbl_huc_ver02_00_1810.bin
status: fetch SUCCESS, load SUCCESS
version: wanted 2.0, found 2.0
header: offset 0, size 128
uCode: offset 128, size 218304
RSA: offset 218432, size 256
HuC status 0x00006080:
Also see: https://01.org/linuxgraphics/downloads/firmware
Screen corruption observed when waking up from suspend
This is often observed as font and screen corruption in GTK+ applications (missing glyphs after suspend/resume).
Should you experience missing font glyphs in GTK+ applications, the following workaround might help. Edit /etc/environment
to add the following line:
/etc/environment
COGL_ATLAS_DEFAULT_BLIT_MODE=framebuffer
See this bug here for more details.
Thanks and regards,
Brainiarc7