Skip to content

Instantly share code, notes, and snippets.

@cretudorin
Last active October 24, 2026 14:16
Show Gist options
  • Select an option

  • Save cretudorin/23ae354f41cc89f641d674b9948d66c5 to your computer and use it in GitHub Desktop.

Select an option

Save cretudorin/23ae354f41cc89f641d674b9948d66c5 to your computer and use it in GitHub Desktop.
DisplayLink.sh
@trey-a-12

Copy link
Copy Markdown

Update 2026-07-04: I had to reapply the script, but it worked instantly (not even a reboot was needed this time)! You've really done it!

System details:

Operating System: SteamOS 3.8.14 Build: 20260703.1
KDE Plasma Version: 6.4.3
KDE Frameworks Version: 6.16.0
Qt Version: 6.9.1
Kernel Version: 6.16.12-valve24.4-1-neptune-616-gfe145653a794 (64-bit)
Graphics Platform: Wayland
Partition: A
Processors: 8 × AMD Custom APU 0405
Memory: 17 GB of RAM (15.5 GB usable)
Graphics Processor 1: AMD Custom GPU 0405
Graphics Processor 2: AMD Custom GPU 0405
Manufacturer: Valve
Product Name: Jupiter
System Version: 1

@cretudorin

Copy link
Copy Markdown
Author

@trey-a-12 well, you will have to run the script after every steamOs update. AFAIK they push full os images and reenable read only every time

@trey-a-12

Copy link
Copy Markdown

Yes, that much is known, I was just clarifying that it truly does not persist even after minor ZZ (assuming X.Y.ZZ) updates, but that it does let you set it right back up in under 2 minutes! Thanks again!

@cretudorin

Copy link
Copy Markdown
Author

@gordonhimoura

Copy link
Copy Markdown

after the September update. it does not work again.

@gordonhimoura

Copy link
Copy Markdown

Loaded your script on another AI and tried to make it work again:

Root cause:
EVDI 1.14.10 was registered with DKMS but could not compile against the SteamOS 6.18.50 kernel.
Because evdi.ko was never installed, displaylink.service failed at ExecStartPre=/sbin/modprobe evdi.
evdi-dkms provides the required EVDI module and supports the 6.18 kernel series.
A stale unowned /usr/lib/libevdi.so.1 can also stop the package transaction, so the script now preserves it before installation.
The service is started only after modprobe evdi succeeds.

#!/usr/bin/env bash

set -Eeuo pipefail

echo "=== DisplayLink on SteamOS / Neptune Setup ==="
echo

# Verify we're running on SteamOS
if ! command -v steamos-readonly >/dev/null 2>&1; then
    echo "This does not appear to be SteamOS."
    exit 1
fi

echo "WARNING: This script will disable SteamOS read-only mode."
echo "This modifies the base operating system and may be overwritten by SteamOS updates."
echo

read -r -p "Type Y to continue: " CONFIRM </dev/tty

if [ "$CONFIRM" != "Y" ]; then
    echo "Aborted."
    exit 0
fi

echo "=== Disabling SteamOS read-only mode ==="
sudo steamos-readonly disable

echo "=== Initializing pacman keys ==="
sudo pacman-key --init
sudo pacman-key --populate archlinux
sudo pacman-key --populate holo

echo "=== Updating package database ==="
sudo pacman -Sy --noconfirm

echo "=== Installing Plymouth ==="
sudo pacman -S --needed --noconfirm plymouth

echo "=== Discovering current linux-neptune kernel ==="

KERNEL_RELEASE="$(uname -r)"
KERNEL_VARIANT="$(sed -n 's/.*-neptune-\([0-9][0-9]*\)-.*/\1/p' <<< "$KERNEL_RELEASE")"

if [[ -z "$KERNEL_VARIANT" ]]; then
    echo "Unable to determine the Neptune kernel variant from: $KERNEL_RELEASE"
    exit 1
fi

KERNEL_PKG="linux-neptune-${KERNEL_VARIANT}"

echo "Running kernel: $KERNEL_RELEASE"
echo "Using kernel package: $KERNEL_PKG"

echo "=== Installing kernel and matching headers ==="
sudo pacman -S --needed --noconfirm \
    "$KERNEL_PKG" \
    "${KERNEL_PKG}-headers"

echo "=== Installing build dependencies ==="
sudo pacman -S --needed --noconfirm \
    python \
    python-setuptools \
    linux-api-headers \
    glibc \
    pybind11 \
    base-devel \
    dkms \
    libdrm \
    libusb \
    gawk \
    grep \
    git

WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT

# Preserve an unowned library left by an earlier DisplayLink installation.
EVDI_LIBRARY="/usr/lib/libevdi.so.1"

if [[ -e "$EVDI_LIBRARY" || -L "$EVDI_LIBRARY" ]]; then
    if ! sudo pacman -Qo "$EVDI_LIBRARY" >/dev/null 2>&1; then
        EVDI_BACKUP="${EVDI_LIBRARY}.displaylink-backup.$(date +%Y%m%d%H%M%S)"
        echo "Preserving unowned EVDI library as: $EVDI_BACKUP"
        sudo mv "$EVDI_LIBRARY" "$EVDI_BACKUP"
    fi
fi

echo "=== Building and installing EVDI DKMS ==="
cd "$WORKDIR"

# evdi-dkms provides the evdi dependency and supports Linux kernel 6.18.
git clone https://aur.archlinux.org/evdi-dkms.git
cd evdi-dkms
makepkg -si --noconfirm

echo "=== Building EVDI for the running kernel ==="
sudo dkms autoinstall -k "$KERNEL_RELEASE"
sudo depmod -a "$KERNEL_RELEASE"

if ! sudo modprobe evdi; then
    echo "EVDI failed to load. Recent DKMS build output:"
    sudo find /var/lib/dkms/evdi -name make.log -print -exec tail -n 100 {} \; || true
    exit 1
fi

if ! lsmod | grep -q '^evdi'; then
    echo "EVDI did not appear in the loaded kernel modules."
    exit 1
fi

echo "=== Building and installing DisplayLink ==="
cd "$WORKDIR"

sudo rm -rf /opt/displaylink

git clone https://aur.archlinux.org/displaylink.git
cd displaylink
makepkg -si --noconfirm

echo "=== Enabling DisplayLink service ==="
sudo systemctl enable --now displaylink.service

if ! systemctl is-active --quiet displaylink.service; then
    systemctl status displaylink.service --no-pager -l || true
    exit 1
fi

echo
echo "=== Installation complete ==="
echo "EVDI is loaded and the DisplayLink service is active."
echo "A reboot is recommended."
echo

dkms status | grep evdi || true


script above solved it for me. .

@cretudorin

Copy link
Copy Markdown
Author

This script is no longer maintained, moved to
https://github.com/cretudorin/SteamdeckDisplayLink

@cretudorin

Copy link
Copy Markdown
Author

@gordonhimoura updated main repo based on your script, I hope that's ok with you.
Thanks

@gordonhimoura

gordonhimoura commented Oct 9, 2026 •

Copy link
Copy Markdown

@cretudorin by all means yes. I don't know how this (github) works but I would suggest a documentation what script works for specific kernels. The one that I happy shared is for SteamOS 6.18.50 kernel. Great work here. I hope you continue to look into this. I will always share if I fix things until my steamdeck dies.

@gordonhimoura

Copy link
Copy Markdown

Steam Deck DisplayLink Environment Fix

A comprehensive troubleshooting guide and one-line setup solution for enabling DisplayLink docks (such as the Dell Universal Dock D6000) on modern SteamOS installations.

Tested System Environment

  • Operating System: SteamOS 3.9.5 (Holo) [Build 20261023.100]
  • Kernel Version: 7.2.7-valve2-2-neptune-72-g31504582a073
  • Target Hardware: Steam Deck (LCD/OLED) + DisplayLink Video Hubs

What Broke (The Environmental Root Cause)

To optimize local storage performance, Valve designs SteamOS by stripping out standard developer tracking headers, runtime layouts, and compilation definitions from the default image.

When attempting to build the evdi display driver module and its Python bindings (pyevdi) on this kernel environment, the compilation process crashes due to missing architectural dependencies:

  1. fatal error: stdint.h: No such file or directory (Core C compilation toolchain missing)
  2. Package libdrm was not found in the pkg-config search path (Stripped display runtime development paths)
  3. fatal error: Python.h: No such file or directory (Missing Python C++ binding layouts)

The Fix

This workaround bypasses SteamOS package-tracking placeholder flags, manually forces the re-population of complete development components via pacman, and streams the deployment utility without triggering standard keyboard/input terminal crashes.

One-Line Combined Installation Script

Copy and paste this exact command block into your Konsole while in Desktop Mode. The layout runs dependencies safely in order, and the terminal window remains open so you can audit the complete installation status:

sudo pacman -Syy && \
sudo pacman -S --needed --noconfirm glibc base-devel linux-api-headers && \
sudo pacman -S --overwrite "*" linux-api-headers glibc libdrm python --noconfirm && \
rm -rf evdi-dkms/ displaylink/ && \
curl -fsSL https://raw.githubusercontent.com/cretudorin/SteamdeckDisplayLink/refs/heads/main/DisplayLink.sh | bash && \
read -p "Press Enter to exit..."

Important Maintenance Notes

  • SteamOS Updates: Major system updates pushed by Valve will re-lock your file system and clear out non-standard driver layers. Keep this script handy to re-apply your build parameters if your monitors drop signal after an update.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment