Skip to content
Sam Pavlovic edited this page Dec 10, 2022 · 22 revisions

Cameras not working

Cameras (both front and rear) are not working. This issue is being tracked here: https://github.com/linux-surface/linux-surface/issues/209

Touchscreen driver (surface3-spi)

This driver is supported upstream, but known to be broken on some kernel config setup:

The workaround is already available on this repo (surface3-spi.patch ).

See also: https://github.com/linux-surface/linux-surface/issues/76

Internal sound card

For the internal sound card to work, PulseAudio v11.99.1 or later is required (and to do so, upgrading your distribution to the latest stable version may be the best option).

See also: https://github.com/linux-surface/linux-surface/issues/60

On newer kernels (after 5.6 or so) you may need the sof-firmware package to make the correct audio device appear. Try installing it if the rt5645 device is missing.

The SOF driver may cause an issue where the audio output is replaced by a single tone, see this bug report. It can possibly be resolved by changing back to the older HDA driver using the kernel option 'snd_intel_dspcfg.dsp_driver=2' (see the Fedora wiki).

Battery status reading

It's supported by linux-surface kernel (surface3-power.patch). But it seems that the relatively recent UEFI fiwmware is required

See also: https://github.com/linux-surface/linux-surface/issues/60

2020-06-28 Update

The driver is now upstream on v5.7 (https://github.com/torvalds/linux/blob/master/drivers/platform/x86/surface3_power.c)

LTE models

Works fine, but modem won't even show up unless you have a simcard inserted, and you need to reboot your system once you insert the sim card, this is a limitation from the Intel modem used by MSFT - @samzanemesis

"OEMB issue"

If your Surface 3 contains OEMB strings in DMI table as following, it means that DMI table of your Surface 3 is broken:

$ grep . /sys/devices/virtual/dmi/id/* 2>/dev/null | grep OEM | grep -v -e modalias -e uevent
/sys/devices/virtual/dmi/id/board_name:OEMB
/sys/devices/virtual/dmi/id/board_vendor:OEMB
/sys/devices/virtual/dmi/id/chassis_vendor:OEMB
/sys/devices/virtual/dmi/id/product_name:OEMB
/sys/devices/virtual/dmi/id/sys_vendor:OEMB

In such a case, sound and surface3-wmi drivers will not work with the upstream kernel. The workaround is available on the linux-surface kernel (surface3-oemb.patch).

See also: https://github.com/linux-surface/kernel/pull/29

Updating firmware with DMI-broken Surface 3

On Windows, firmware updates are usually done via Windows Update. However, DMI-broken Surface 3 will be recognized as "OEMB", not "Surface 3". Therefore, it can't be updated in the usual way.

Get firmware update MSI installer from Microsoft:

At this point, you can't pass the product name check (it shows something like "your device is not Surface 3"). Edit the MSI installer. Using InstEd here.

  • InstEd->Tables->Property->InstallPrerequisites
# original string:
-OSVersion=Win10;ProductName=Surface 3;SystemSKU=;OSBuild=18362;SystemModels=;SystemSKUs=Surface_3_ROW;PreventBitLockerNoSecureBoot=0

# Replace `Surface 3` with `OEMB` and set `SystemSKUs` to empty.
# So, it will look like this:
+OSVersion=Win10;ProductName=OEMB;SystemSKU=;OSBuild=18362;SystemModels=;SystemSKUs=;PreventBitLockerNoSecureBoot=0

(Display backlight adjustment): BYT/CHT: pwm vs i915 driver initialization order when i915 is builtin

click to expand

When i915 driver is built-in, display backlight adjustment is broken (always maximum brightness). To avoid this issue, if you build kernels yourself with config other than the one from distros supported by linux-surface (Arch/Debian/Fedora), check if i915 is enabled as module (CONFIG_DRM_I915=m) until this issue is fixed.

For reference, on 5.6.13-arch1-1-surface where adjustment works, the related kernel config that is pointed out [1] is like this:

CONFIG_PWM=y
CONFIG_PWM_CRC=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y
CONFIG_I2C_DESIGNWARE_PCI=m
CONFIG_INTEL_SOC_PMIC=y
CONFIG_DRM_I915=m

(CONFIG_I2C_DESIGNWARE_PCI is m but still works)

[1] https://gitlab.freedesktop.org/drm/intel/issues/26

S0ix states

click to expand

S0ix states on suspend (s2idle) works since v4.20 (and after v4.19.36 regarding v4.19 series).
For example, after suspend:

$ cat /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us
30

$ sudo cat /sys/kernel/debug/pmc_atom/sleep_state
S0IR Residency:32us
S0I1 Residency:11456us
S0I2 Residency:96us
S0I3 Residency:7991840us
S0   Residency:135887456us

Related commits:

(There is the other enhancement for some Cherry Trail devices on v4.20:)

  • torvalds/linux@1688c8717118f3 ("pwm: lpss: Add ACPI HID for second PWM controller on Cherry Trail devices")
    But turned out that this commit is not needed for Surface 3. For details, take a look at this comment.

References:

(OLD) Internal display not configurable other than by xrandr on kernels below v4.19.13

click to expand

The internal display shows up on xrandr, but not on GNOME settings Display section. What is worse, Chromium OS can't use it on kernels below v4.19.13.

This issue was fixed exactly after v4.19.13. Now it appears on GNOME settings Display section. Chromium OS can now use it correctly. I am not sure what commit fixed this issue; if you know, edit here!

Clone this wiki locally