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
@mupuf Thank you for the prompt and informative response! ❤️
Is the status on Windows 10 different? Or is it leveraging the same efforts being done for Linux?
Is that the only(or current) benefit from HuC? The official Intel page on the firmware states:
I thought it might have been for more than just encoding video, perhaps decoding as well. I've heard of the Intel Media Driver and VA-API support provided through that, and it seems to handle encoding as well. The HuC is an improvement on that requiring less power to encode video but not decode?
Meanwhile until a later date, the GuC has nothing to offer beyond enabling HuC, but may lead to improved power savings eventually, which will be automatically available via kernel like past features(PSR/FBC) when ready?
Thanks for clearing those two up! There's quite a few users and wiki's stating otherwise(albeit lacking sources to the claims).
That's awesome! :)
So
xf86-video-intel
should be avoided with Gen 9+ products and modesetting preferred instead?Will do, Comet Lake system will be arriving this week.
That's just a guess/question on my end from those that have stated Vulkan support is only available with the
xf86-video-ddx
driver instead of modesetting, which if true somehow, would have meant no support without X11. Glad that's not the case!