You are not logged in.

#1 2019-08-16 21:49:28

Registered: 2017-11-04
Posts: 4

Thinkpad dock external display broken since linux 5.2

Connecting to an external display through a Thinkpad dock is broken on recent versions of linux. I first noticed this when updating to linux 5.2.5. I just updated to 5.2.8 and it is still broken.

In particular, I can still see and connect to the monitor through xrandr; nothing in the xrandr output indicates anything is wrong. However, the external monitor reports no input and remains blank.

Others on reddit have reported experiencing the same problem: … ux_update/

I am using a Thinkpad T480 laptop and Thinkpad Ultra Docking Station (US model), but from the reddit thread it appears this issue affects other models as well.

The thinkpad dock works fine on the linux-lts kernel.

I feel like I should make a bug report somewhere, but am not sure whether to do so at the arch linux package, or somewhere upstream.

I have saved some dmesg output here: … 1e54c5a5da
The line that starts with "[  174.329323]" indicates when I plugged in the Thinkpad dock.
The following line in particular looks intriguing/relevant:

[  175.382231] typec_displayport port1-partner.0: failed to enter mode

Last edited by snackattack (2019-09-04 00:57:19)


#2 2019-08-16 22:56:17

Registered: 2014-03-06
Posts: 8,436

Re: Thinkpad dock external display broken since linux 5.2

Welcome to the arch linux forums snackattack. In … 4#p1857864 I provided instructions to bisect between 5.2.4 and 5.2.5 which coincidentally should also locate the source of your issue.
You can then report the issue upstream to the kernel developers.


#3 2019-08-18 21:26:01

Registered: 2017-11-04
Posts: 4

Re: Thinkpad dock external display broken since linux 5.2

This issue has been fixed in the most recent update to linux-firmware (20190815).

Thanks for the help anyway smile


#4 2019-08-19 17:47:05

Registered: 2017-11-04
Posts: 4

Re: Thinkpad dock external display broken since linux 5.2

Sorry, I was mistaken. When I was debugging at home this weekend, the issue seemed to have been solved by the update, but today in the office it's still broken -- might be related to my office monitor as well as the Thinkpad dock. I will update again when I've had a chance to git bisect the kernel (though having to do it while I'm at work might slow me down a bit...)

Last edited by snackattack (2019-08-19 17:51:15)


#5 2019-09-04 01:04:15

Registered: 2017-11-04
Posts: 4

Re: Thinkpad dock external display broken since linux 5.2

My initial post seems incorrect -- it looks like the external display has been broken since linux 5.2, not 5.2.5. I've updated the title to reflect this.

I've been following loq's directions to compile linux through makepkg, and noticed that all linux versions I tried since 5.2 are broken, but 5.1.16 works.

Not sure how I got confused into think the breakage happened on 5.2.5. It's possible I just didn't update enough to notice. In my /var/cache/pacman/pkg, I have versions 5.1.16, 5.2.3, then 5.2.5, so I definitely missed a few updates. Or perhaps there is some bad interaction with another package going on here.

Should I proceed to git bisect between 5.2 and 5.1.16? The git log graph beneath 5.2 looks a bit daunting, so I'm not sure if this is a reasonable approach -- I've never tried to git bisect such a large graph, and it also takes a while to compile/test each commit.


#6 2019-09-06 22:06:26

Registered: 2014-03-06
Posts: 8,436

Re: Thinkpad dock external display broken since linux 5.2

Sorry for the late response,  the following is the modified instructions for between 5.1 and 5.2.
5.1.16 is branched from 5.2 so the bisection would take you up to 5.1 where the branches meet.
Bisecting between 5.1 and 5.2 should save a bisection step of having to build 5.1.16.

The following assumes the base-devel group and git are installed and I recomend enabling Makepkg#Parallel_compilation to reduce build times

$ git clone git:// --single-branch --branch "packages/linux"
$ cd packages/trunk
$ git checkout 752f19a3aeb77684fb3915a8958a8615c64fde37 #5.1.16.arch1-1
$ cd ../..
$ cp -r packages/trunk linux-git
$ rm -rf packages
$ cd linux-git
# Edit replace the PKGBUILD and 90-linux.hook with the ones below
$ makepkg -rsi #This is to confirm 5.1 as built on your system does not have the issue.  Update bootloader for new kernel if needed

$ cd linux-git/src/linux
$ git checkout v5.2
$ cd ../..
$ makepkg -ersi #This is to confirm 5.2 as built on your system does have the issue select the default option for all prompted options

$ cd linux-git/src/linux/
$ git bisect start
$ git bisect good v5.1
$ git bisect bad v5.2
$ cd ../..
$ makepkg -ersif

$ cd linux-git/src/linux/
$ git bisect $result #Substitue good or bad here
$ cd ../..
$ makepkg -ersif #Repeat these four lines and test the generated kernel until git has found the bad commit


# Maintainer: Boohbah <boohbah at>
# Contributor: Tobias Powalowski <>
# Contributor: Thomas Baechler <>
# Contributor: Jonathan Chan <>
# Contributor: misc <>
# Contributor: NextHendrix <cjones12 at>

makedepends=('kmod' 'inetutils' 'bc' 'libelf')
  'config'   # the main kernel config file
  '60-linux.hook'  # pacman hook for depmod
  '90-linux.hook'  # pacman hook for initramfs regeneration
  'linux.preset'   # standard config files for mkinitcpio ramdisk


: ${_kernelname:=-ARCH}

pkgver() {
  cd "${_srcname}"

  git describe --long | sed -E 's/^v//;s/([^-]*-g)/r\1/;s/-/./g;s/\.rc/rc/'

prepare() {
  cd ${_srcname}

  cp -Tf ../config .config

  # set localversion to git commit
  sed -i "s|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION=\"${_kernelname}\"|g" ./.config

  # don't run depmod on 'make install'. We'll do this ourselves in packaging
#  git tracks scripts/ so do not change it when using the existing source dir for bisection
#  sed -i '2iexit 0' scripts/

  # get kernel version
  make prepare

  # load configuration
  # Configure the kernel. Replace the line below with one of your choice.
  #make menuconfig # CLI menu for configuration
  #make nconfig # new CLI menu for configuration
  #make xconfig # X-based configuration
  #make oldconfig # using old config from previous kernel version
  make olddefconfig # old config from previous kernel, defaults for new options
  # ... or manually edit .config

build() {
  cd ${_srcname}

  make bzImage modules

_package() {
  pkgdesc="The Linux kernel and modules (git version)"
  depends=('coreutils' 'linux-firmware' 'kmod' 'mkinitcpio>=0.7')
  optdepends=('crda: to set the correct wireless channels of your country')

  cd ${_srcname}

  # get kernel version
  _kernver="$(make kernelrelease)"
  _kernver=${_kernver%-dirty} #
  _basekernel="$(make kernelversion)"

  mkdir -p "${pkgdir}"/{boot,usr/lib/modules}
  make INSTALL_MOD_PATH="${pkgdir}/usr" modules_install
  cp arch/x86/boot/bzImage "${pkgdir}/boot/vmlinuz-${pkgbase}"

  # make room for external modules
  local _extramodules="extramodules-${_basekernel}${_kernelname}"
  ln -s "../${_extramodules}" "${pkgdir}/usr/lib/modules/${_kernver}/extramodules"

  # add real version for building modules and running depmod from hook
  echo "${_kernver}" |
    install -Dm644 /dev/stdin "${pkgdir}/usr/lib/modules/${_extramodules}/version"

  # remove build and source links
  rm "${pkgdir}"/usr/lib/modules/${_kernver}/{source,build}

  # now we call depmod...
  depmod -b "${pkgdir}/usr" -F "${_kernver}"

  # add vmlinux
  install -Dt "${pkgdir}/usr/lib/modules/${_kernver}/build" -m644 vmlinux

  # sed expression for following substitutions
  local _subst="

  # hack to allow specifying an initially nonexisting install file
  sed "${_subst}" "${startdir}/${install}" > "${startdir}/${install}.pkg"
  true && install=${install}.pkg

  # install mkinitcpio preset file
  sed "${_subst}" ../linux.preset |
    install -Dm644 /dev/stdin "${pkgdir}/etc/mkinitcpio.d/${pkgbase}.preset"

  # install pacman hooks
  sed "${_subst}" ../60-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/60-${pkgbase}.hook"
  sed "${_subst}" ../90-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook"

_package-headers() {
  pkgdesc="Header files and scripts for building modules for Linux kernel (git version)"

  cd ${_srcname}
  local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"

  install -Dt "${_builddir}" -m644 Makefile .config Module.symvers
  install -Dt "${_builddir}/kernel" -m644 kernel/Makefile

  mkdir "${_builddir}/.tmp_versions"

  cp -t "${_builddir}" -a include scripts

  install -Dt "${_builddir}/arch/x86" -m644 arch/x86/Makefile
  install -Dt "${_builddir}/arch/x86/kernel" -m644 arch/x86/kernel/asm-offsets.s

  cp -t "${_builddir}/arch/x86" -a arch/x86/include

  install -Dt "${_builddir}/drivers/md" -m644 drivers/md/*.h
  install -Dt "${_builddir}/net/mac80211" -m644 net/mac80211/*.h

  install -Dt "${_builddir}/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h

  install -Dt "${_builddir}/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
  install -Dt "${_builddir}/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
  install -Dt "${_builddir}/drivers/media/tuners" -m644 drivers/media/tuners/*.h

  # add xfs and shmem for aufs building
  mkdir -p "${_builddir}"/{fs/xfs,mm}

  # copy in Kconfig files
  find . -name Kconfig\* -exec install -Dm644 {} "${_builddir}/{}" \;

  # add objtool for external module building and enabled VALIDATION_STACK option
  install -Dt "${_builddir}/tools/objtool" tools/objtool/objtool

  # remove unneeded architectures
  local _arch
  for _arch in "${_builddir}"/arch/*/; do
    [[ ${_arch} == */x86/ ]] && continue
    rm -r "${_arch}"

  # remove files already in linux-docs package
  rm -r "${_builddir}/Documentation"

  # remove now broken symlinks
  find -L "${_builddir}" -type l -printf 'Removing %P\n' -delete

  # Fix permissions
  chmod -R u=rwX,go=rX "${_builddir}"

  # strip scripts directory
  local _binary _strip
  while read -rd '' _binary; do
    case "$(file -bi "${_binary}")" in
      *application/x-sharedlib*)  _strip="${STRIP_SHARED}"   ;; # Libraries (.so)
      *application/x-archive*)    _strip="${STRIP_STATIC}"   ;; # Libraries (.a)
      *application/x-executable*) _strip="${STRIP_BINARIES}" ;; # Binaries
      *) continue ;;
    /usr/bin/strip ${_strip} "${_binary}"
  done < <(find "${_builddir}/scripts" -type f -perm -u+w -print0 2>/dev/null)

_package-docs() {
  pkgdesc="Kernel hackers manual - HTML documentation that comes with the Linux kernel (git version)"

  cd ${_srcname}
  local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"

  mkdir -p "${_builddir}"
  cp -t "${_builddir}" -a Documentation

  # Fix permissions
  chmod -R u=rwX,go=rX "${_builddir}"

pkgname=("${pkgbase}" "${pkgbase}-headers" "${pkgbase}-docs")
for _p in ${pkgname[@]}; do
  eval "package_${_p}() {
    $(declare -f "_package${_p#${pkgbase}}")

# vim:set ts=8 sts=2 sw=2 et:


Type = File
Operation = Install
Operation = Upgrade
Target = boot/vmlinuz-%PKGBASE%
Target = usr/lib/initcpio/*

Description = Updating %PKGBASE% initcpios...
When = PostTransaction
Exec = /usr/bin/mkinitcpio -p %PKGBASE%

Last edited by loqs (2019-09-06 22:06:45)


Board footer

Powered by FluxBB