Surface Laptop 4 - linux-surface/linux-surface GitHub Wiki

AMD

See Supported-Devices-and-Features for current feature matrix.

Kernel

The linux-surface kernel is currently required for the Surface Laptop 4 AMD 15" to function.

Details of patches

The following patches are required for surface modules to load:

The following patches are required for additional functionality:

Issues and Workarounds

Screen freezes with corruption on boot

Currently, as of Linux 5.15, the system cannot load the amdgpu module with the IOMMU enabled and in passthrough mode, this results in the screen locking up and likely displaying some graphics corruption when the amdgpu module loads. This is caused by the IOMMU blocking the PSP loading the firmware required for operation.ref.

Example IOMMU error output
iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=03:00.0 pasid=0x00000 address=0x11e880000 flags=0x0180]
AMD-Vi: DTE[0]: 6010000000000003
AMD-Vi: DTE[1]: 0000000100000005
AMD-Vi: DTE[2]: 200000010d09e013
AMD-Vi: DTE[3]: 0000000000000000
[drm] failed to load ucode SDMA0(0x0) 
[drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xF)
iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=03:00.0 pasid=0x00000 address=0x11e885000 flags=0x0180]
AMD-Vi: DTE[0]: 6010000000000003
AMD-Vi: DTE[1]: 0000000100000005
AMD-Vi: DTE[2]: 200000010d09e013
AMD-Vi: DTE[3]: 0000000000000000
[drm] failed to load ucode CP_CE(0x8) 
[drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xF)
iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=03:00.0 pasid=0x00000 address=0x11e888000 flags=0x0180]
AMD-Vi: DTE[0]: 6010000000000003
AMD-Vi: DTE[1]: 0000000100000005
AMD-Vi: DTE[2]: 200000010d09e013
AMD-Vi: DTE[3]: 0000000000000000
[drm] failed to load ucode CP_PFP(0x9) 
[drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xF)
iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=03:00.0 pasid=0x00000 address=0x11e88e000 flags=0x0180]
AMD-Vi: DTE[0]: 6010000000000003
AMD-Vi: DTE[1]: 0000000100000005
AMD-Vi: DTE[2]: 200000010d09e013
AMD-Vi: DTE[3]: 0000000000000000
[drm] failed to load ucode CP_ME(0xA) 
[drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xF)
iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=03:00.0 pasid=0x00000 address=0x11e893000 flags=0x0180]
AMD-Vi: DTE[0]: 6010000000000003
AMD-Vi: DTE[1]: 0000000100000005
AMD-Vi: DTE[2]: 200000010d09e013
AMD-Vi: DTE[3]: 0000000000000000
[drm] failed to load ucode CP_MEC1(0xB) 
[drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xF)

The current workaround that seems to be stable for this issue is to set amd_iommu=off iommu=off to disable the IOMMU.

Setting amd_iommu=force_isolation results in the IOMMU being configured to translation mode instead of passthrough, and the system will boot and load the amdgpu module, however the long term stability of this is unknown, with some reports of this still resulting in lockups.

Alternatively, nomodeset will cause the amdgpu driver to be prevented from loading.

Quiet static instead of audio

It has been observed that this occurs if Windows is booted before rebooting to Linux. Fully turn off the system and boot directly into Linux and try again.

Backlight control not working

This is reportedly no longer required on the latest kernels (v6.2 and upwards).

On older kernels, ACPI backlight control (/sys/class/backlight/acpi_video0) does not seem to be working. You can try adding acpi_backlight=vendor to the kernel parameters. This will remove the ACPI backlight device and should leave the amdgpu_bl0 device, which should be functional.

On newer kernels, however, adding this parameter may break the backlight. If you encounter any issues, please make sure to test both variations with the same kernel version. In particular, try removing the option if you have it set already and are experiencing this problem after an update.

Using the Built-In Keyboard with Disk Encryption

See Disk Encryption.

Intel

⚠️ **GitHub.com Fallback** ⚠️