Skip to content
Johan Hovold edited this page Apr 29, 2024 · 42 revisions

Lenovo ThinkPad X13s

This page aims to provide an overview of the current status of Linux support for the X13s laptop.

For some background on this project and further details, see my presentation at Kernel Recipes 2023:

https://kernel-recipes.org/en/2023/schedule/the-arm-laptop-project/

Work-in-progress branches

Important fixes and support for new features (once stable enough) can be found in my X13s (sc8280xp) wip branches, for example:

https://github.com/jhovold/linux/tree/wip/sc8280xp-6.9-rc6

These branches also include a minimal (but functional) johan_defconfig that serves as documentation for the configuration options that need to be enabled for the X13s.

Mainline feature support

Feature Status
Audio 6.5
Backlight 6.0
Battery 6.3
Bluetooth 6.4
Camera started
CPUfreq 6.0
Display 6.3
EFI variables 6.7
Fingerprint reader wip branch
GPU 6.5
Hibernation -
Keyboard 6.0
Keyboard special keys -
Modem 6.2
NVMe SSD 6.2
PCIe (x4) 6.2
Remoteproc 6.0
RTC 6.4
Suspend 6.1
Thermal sensors 6.2
Touchpad (alternate) 6.0 (6.4)
Touchscreen 6.0
TPM -
USB 6.0
USB-PD started
USB-C DisplayPort Alt Mode 6.3
Video acceleration wip branch
Virtualisation -
Watchdog 6.0
Wi-Fi 6.4

Kernel command line

To boot Linux the following kernel parameters need to be provided:

clk_ignore_unused pd_ignore_unused arm64.nopauth efi=noruntime

due to a generic resource handover issue and a couple of firmware bugs, respectively.

With recent UEFI firmware efi=noruntime can be left out when the Linux Boot option is enabled.

Userspace dependencies

  • alsa-ucm-conf 1.2.11
  • linux-firmware-20230919
    • also video acceleration firmware (qcvss8280.mbn) with WIP branch
  • Mesa 23.1.4
  • ModemManager 1.20 + fcc-unlock symlink (and qmicli)
  • Qualcomm protection-domain mapper daemon (pd-mapper)

Known issues

Audio

  • Active speaker protection not enabled, volume limited for now
  • DisplayPort output not enabled
  • Pipewire playback and capture issues (switch to Pulseaudio as workaround)
    • Reducing quantum size appears to help with playback issues
    • pw-metadata -n settings 0 clock.max-quantum 1024
  • Pops and clicks
  • Speaker digital gain changed by codec driver (fixed in 6.8-rc3, 6.7.4, 6.6.16)
    • Can result in too quiet or distorted playback
    • Install alsa-ucm-conf 1.2.11 and remove old state to restore default settings
    • systemctl stop alsa-restore; rm /var/lib/alsa/asound.state; reboot

Bluetooth

  • Connectivity issues due to missing board-specific firmware (e.g. very limited range)
  • Device address needs to be set manually for now
    • btmgmt --index 0 public-addr 00:11:22:33:44:55
    • Address needs to be set in reverse (little-endian) order (fixed in 6.9-rc3, 6.8.5, 6.6.26)
  • Probe failure due to command timeouts (infrequent)

Display

  • Link training fails during resume (very infrequent)

External display

Keyboard special keys

  • Support for some functions like mic mute is missing

Modem

  • ModemManager 1.20 and 1.21 require a fcc-unlock symlink directly to the vendor script
    ln -sf /usr/share/ModemManager/fcc-unlock.available.d/105b /etc/ModemManager/fcc-unlock.d/105b\:e0c3
    

Remoteproc

  • aDSP fails to register its services (e.g. sound, battery, USB-C orientation) (very infrequent)

Suspend

  • All displays fail to resume if suspending with external display connected (fixed in 6.8)
  • All displays fail to resume if suspending after disconnecting external display in X
  • Crash on resume if disconnecting external display while suspended
  • Not yet hitting deepest low-power state during suspend
  • USB disconnect triggers wakeup (disconnect before suspending as workaround)
  • Wi-Fi suspend issues (fixed in linux-firmware-20240220)
    • Firmware wakes system up immediately or crashes on resume in some setups

Thermal

  • GPU throttling not implemented

Touchscreen

  • Fails to probe due to missing post-reset delay, trigger reprobe as workaround (fixed in wip branch)
    • echo 4-0010 > /sys/bus/i2c/drivers/i2c_hid_of/bind

USB

  • Display driver does not yet support 4-lane DisplayPort Alt Mode
  • USB Power Delivery (USB-PD) not fully implemented
    • Some adapters (e.g. docking stations) may fail to charge battery
  • USB-C coldplug orientation detection not working (flip cable as workaround)

Wi-Fi

  • MAC address not static, can be worked around using udev (e.g. in /etc/udev/rules.d/90-net-address.rules)
    ACTION=="add", SUBSYSTEM=="net", KERNELS=="0006:01:00.0", RUN+="/usr/bin/ip link set dev $name address xx:xx:xx:xx:xx:xx"  
    
  • Wi-Fi breaks due to ring-buffer corruption (infrequent)