Setting up Intel GPU HuC & GuC on Pop!_OS 19.04

1 minute read

The intel i915 driver does not load the GuC and HuC binary blobs automatically due to previous issues / security concerns with the binary blobs.

However, without loading these blobs, more of the processing is performed on the CPU.

I use a Dell XPS 9360 as my portable laptop, and its CPU isn’t aging well with only the dual core processors (plus HT). I use PoP! OS as my main linux OS on all of my machines, however this same process should work the same for Ubuntu and family.

1. Setup update-initramfs to include the binaries

Note that during the creation of these notes, the latest guc version was 9.39. If when running these the version is newer, you just need to update the firmware version where documented and re-run the steps.

You can try and check what the latest version is by running the command :

sudo cat /sys/kernel/debug/dri/0/i915_guc_load_status

Take note of what GuC firmware file is listed as the wanted version.

Create the script to include the guc firmware

Create /etc/initramfs-tools/hooks/i915_add_kbl_guc and fill it with:

#!/bin/sh

PREREQ=""
prereqs()
{
   echo "$PREREQ"
}

case $1 in
prereqs)
   prereqs
   exit 0
   ;;
esac

. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line

copy_file firmware /lib/firmware/i915/kbl_guc_ver9_39.bin /lib/firmware/i915/kbl_guc_ver9_39.bin
exit 0

Make the file executable (chmod +x /etc/initramfs-tools/hooks/i915_add_kbl_guc)

Rebuild the initramfs

After setting up the script, rebuild the initramfs to include the required firmware

sudo update-initramfs -k all -u
sudo update-grub

Setup the i915 module

Create the file /etc/modprobe.d/i915.conf

Set the following concents :

options i915 enable_fbc=1 enable_guc=3

This enables frame buffer compression (which generally works really well), and enables the GuC and HuC being loaded (3 is a bitmask 0b11).

Reboot

Reboot the device to restart the module and check it picks up the firmware.

Check

You can check the loading worked by reading these two files:

/sys/kernel/debug/dri/1/i915_guc_load_status

/sys/kernel/debug/dri/1/i915_huc_load_status

fetch and load fields should read SUCCESS. If you got this right, enjoy that extra bit of diminishing returns in your integrated GPU performance!