Linux (Ubuntu 24.04/26.04) auf einem alten Dell XPS 2720
Diese Anleitung beschreibt zwei Anpassungen, die nach einer frischen Installation von Ubuntu 26.04 auf dem All-in-One-Rechner Dell XPS 2720 nötig sind:
- den Nouveau-Treiber für die NVidia-GPU deaktivieren, damit das System stabil startet, und
- die native Bildschirmauflösung von 2560x1440 freischalten.
Die Anleitungen kann man auch für anderen Linux-Distros verwenden. Getestet hab ich das auch unter Ubuntu 24.04.
Insgesamt wird die alte Dell-Kiste noch echt rundum unterstützt:
- Sound
- Webcam
- WLAN, Bluetooth, LAN
- Kartenleser
- DVD
- Intel GPU und Touch-Monitor (aber hier braucht man ein paar Tricks, siehe Beschreibungen unten)
1. Nouveau-Treiber deaktivieren (Blacklist)
Warum?
Der XPS 2720 hat neben der in die Intel-CPU integrierten Grafik (iGPU) eine zusätzliche NVidia-GPU. Lädt man dafür den freien Treiber Nouveau, etwa mit sudo modprobe nouveau modeset=1, stürzt das System ab, weil die Firmware einen ungültigen Rückgabewert liefert. Der alte proprietäre Legacy-Treiber von NVidia läuft unter aktuellen Kerneln ebenfalls nicht mehr.
Es bleibt also nur, auf die NVidia-GPU zu verzichten und ausschließlich die Intel-Grafik zu verwenden. Damit Nouveau beim Booten nicht automatisch geladen wird, setzt man den Treiber auf eine Blacklist.
Vorgehen
Die Datei /etc/modprobe.d/blacklist-nouveau.conf mit folgendem Inhalt anlegen:
1
2
blacklist nouveau
options nouveau modeset=0
Danach die initramfs neu erzeugen, damit die Blacklist schon in der frühen Bootphase greift:
1
sudo update-initramfs -u
Nach einem Neustart prüfen, dass Nouveau nicht geladen ist (der folgende Befehl darf nichts ausgeben):
1
lsmod | grep nouveau
2. Native Auflösung 2560x1440 freischalten
Warum?
Direkt nach der Installation lässt sich in den Bildschirmeinstellungen höchstens 1920x1080 (Full HD) auswählen, obwohl das Panel 2560x1440 darstellen kann.
Ursache: Das Panel hängt intern über HDMI (Anschluss HDMI-A-1) an der Intel-iGPU. Seine EDID ( Extended Display Identification Data ), also die Selbstbeschreibung des Monitors, enthält den Modus 2560x1440 durchaus. Dieser Modus benötigt einen Pixeltakt von 241,5 MHz. Der HDMI-Block der EDID begrenzt den maximalen TMDS-Takt aber auf 225 MHz. Der Linux-Treiber i915 hält sich an diese Grenze und verwirft den Modus. Windows ignoriert sie dagegen, weshalb die volle Auflösung dort funktioniert.
Die Lösung: Man stellt dem Kernel eine korrigierte EDID mit höherem Taktlimit (300 MHz) zur Verfügung. Das ist auch technisch unbedenklich, denn der HDMI-Ausgang der Haswell-iGPU unterstützt bis zu 300 MHz, und das Panel bekommt exakt dasselbe 241,5-MHz-Signal wie unter Windows.
Gepatchte EDID erstellen
Die fertige Datei kann hier heruntergeladen werden: xps2720.bin. Wer sie selbst erzeugen möchte, geht so vor.
1. Original-EDID auslesen. Der Kernel stellt die EDID des angeschlossenen Panels im sysfs bereit:
1
cat /sys/class/drm/card*-HDMI-A-1/edid > xps2720_orig.bin
Die Datei ist 256 Byte groß: ein 128-Byte-Basisblock und ein 128-Byte-CEA-Erweiterungsblock. Mit edid-decode (Paket edid-decode) kann man sie lesbar anzeigen und findet darin den Modus 2560x1440 mit 241,5 MHz sowie im HDMI Vendor-Specific Data Block den Eintrag „Maximum TMDS clock: 225 MHz“.
2. Die relevanten Bytes finden. Der HDMI Vendor-Specific Data Block beginnt im Erweiterungsblock bei Offset 0x92 mit den Bytes
1
67 03 0c 00 10 00 38 2d
Dabei steht 67 für den Block-Typ (Vendor-Specific, Länge 7) und 03 0c 00 für die HDMI-Kennung (IEEE OUI). Das letzte Byte (Offset 0x99) ist der maximale TMDS-Takt in Schritten von 5 MHz: 0x2d = 45 × 5 MHz = 225 MHz.
3. Patchen. Zwei Bytes werden geändert:
| Offset | Bedeutung | Original | Neu |
|---|---|---|---|
0x99 |
max. TMDS-Takt | 0x2d (225 MHz) |
0x3c (300 MHz) |
0xff |
Prüfsumme des Erweiterungsblocks | 0x1b |
0x0c |
Die Prüfsumme ist so gewählt, dass die Summe aller 128 Bytes des Blocks modulo 256 null ergibt. Weil das Taktbyte um 15 (0x0f) steigt, muss die Prüfsumme um 15 sinken.
Mit Python geht das so (die Prüfsumme wird dabei neu berechnet statt fest eingetragen):
1
2
3
4
5
6
7
8
python3 - <<'EOF'
d = bytearray(open('xps2720_orig.bin', 'rb').read())
i = d.find(bytes.fromhex('67030c00'), 128) # HDMI-VSDB im Erweiterungsblock
assert i > 0, 'HDMI-VSDB nicht gefunden'
d[i + 7] = 300 // 5 # max. TMDS-Takt: 300 MHz
d[255] = (-sum(d[128:255])) % 256 # Prüfsumme neu berechnen
open('xps2720.bin', 'wb').write(d)
EOF
4. Kontrollieren. Der Vergleich darf nur die beiden Bytes zeigen, und edid-decode darf keine Prüfsummenfehler melden:
1
2
cmp -l xps2720_orig.bin xps2720.bin # Offsets dezimal, Werte oktal
edid-decode xps2720.bin | grep -i -e tmds -e checksum
Gepatchte EDID installieren
Die folgenden Befehle im Verzeichnis ausführen, in dem xps2720.bin liegt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. EDID-Datei in das Firmware-Verzeichnis kopieren
sudo mkdir -p /lib/firmware/edid
sudo cp xps2720.bin /lib/firmware/edid/
# 2. Datei in die initramfs aufnehmen (i915 wird schon dort geladen
# und muss die EDID zu diesem Zeitpunkt finden)
sudo tee /etc/initramfs-tools/hooks/edid >/dev/null <<'EOF'
#!/bin/sh
[ "$1" = prereqs ] && exit 0
. /usr/share/initramfs-tools/hook-functions
mkdir -p "$DESTDIR/lib/firmware/edid"
cp /lib/firmware/edid/xps2720.bin "$DESTDIR/lib/firmware/edid/"
EOF
sudo chmod +x /etc/initramfs-tools/hooks/edid
sudo update-initramfs -u
# 3. Dem Kernel per Boot-Parameter mitteilen, dass er für HDMI-A-1
# diese EDID verwenden soll (Ergänzung in GRUB_CMDLINE_LINUX_DEFAULT
# in /etc/default/grub)
sudo sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT="/&drm.edid_firmware=HDMI-A-1:edid\/xps2720.bin /' /etc/default/grub
sudo update-grub
Nach einem Neustart lässt sich unter Einstellungen → Bildschirme die Auflösung 2560x1440 auswählen.
Unter GNOME mit Wayland funktionieren Tricks wie
xrandr --newmodenicht. Deshalb muss die Korrektur über den Kernel erfolgen.
Rückgängig machen
Bleibt der Bildschirm nach dem Neustart schwarz:
- Im GRUB-Menü
Escdrücken (falls das Menü nicht erscheint, beim StartEscbzw.Shiftgedrückt halten). - Auf dem Booteintrag
edrücken, den Teildrm.edid_firmware=…aus der Zeile mitlinuxlöschen und mitStrg+Xstarten. - Im laufenden System den Parameter auch aus
/etc/default/grubentfernen undsudo update-grubausführen.
Optional können anschließend /etc/initramfs-tools/hooks/edid und /lib/firmware/edid/xps2720.bin gelöscht und die initramfs mit sudo update-initramfs -u neu erzeugt werden.