I am struggling to use an external monitor with a laptop and its docking station. Lots of internet research didn’t get me to a solution for Tumbleweed yet.
My things in short:
- Laptop: HP EliteBook 8570w - old but reliable
- Docking station: The dedicated HP one, passing the laptop’s Display Port through
- External monitor: Dell S2421HSX, hooked up to the Display Port of the dock
- Tumbleweed, zipper dup‘ed to 20250414, kernel 6.14.1
- KDE Plasma v 6.3.4, standard, i.e. with nouveau, Xorg and sddm
For details, cf. the inxi below. I think the not exactly current TW and Plasma don’t matter.
I want to be able to run in three scenarios:
- Laptop in standalone, lid open, just using its built-in display
- Laptop in docking station, lid CLOSED, external monitor being the only monitor; use power button on dock to turn on and boot
- Laptop in docking station, lid OPEN, external monitor being the primary, built-in display being the secondary; use power button either on laptop or on dock to turn on and boot
My current results on Tumbleweed are:
- Scenarios 1 and 3 do work,
- but I can’t get Scenario 2 to work.
Please help!
In more detail:
To get such things working under Windows is just easy …
I got all scenarios to work under Linux Mint (22.1 Ubuntu edition) and under Ubuntu Desktop (24.04.2 LTS). In Mint, I added a script to LightDM which executes a xrandr command to output to the external monitor and make it the primary. However, for unknown reasons this did not work while still having the default nouveau graphics driver in place; I installed the relevant NVIDIA driver (as still supplied by Ubuntu) - works fine then. In Ubuntu Desktop, I also installed the NVIDIA driver instead of nouveau, which made it work for all three scenarios as well.
Now let me turn to my openSUSE Tumbleweed case.
Here is my configuration as per inxi:
System:
Host: susytmblwdke8570 Kernel: 6.14.1-1-default arch: x86_64 bits: 64
compiler: gcc v: 14.2.1 clocksource: tsc avail: hpet,acpi_pm
parameters: BOOT_IMAGE=/boot/vmlinuz-6.14.1-1-default
root=UUID=6e7baa28-7f1c-4b33-bee8-83cb4b269d85 splash=silent
resume=/dev/disk/by-uuid/bbb15c93-390b-4bbc-bbd9-5f57da5c06b4
mitigations=auto quiet security=apparmor
Desktop: KDE Plasma v: 6.3.4 tk: Qt v: N/A info: frameworks v: 6.12.0
wm: kwin_x11 tools: avail: xscreensaver vt: 2 dm: SDDM Distro: openSUSE
Tumbleweed 20250414
Machine:
Type: Laptop System: Hewlett-Packard product: HP EliteBook 8570w
v: A1028C1100 serial: <superuser required> Chassis: type: 10
serial: <superuser required>
Mobo: Hewlett-Packard model: 176B v: KBC Version 50.1F
serial: <superuser required> part-nu: A7C38AV uuid: <superuser required>
UEFI: Hewlett-Packard v: 68IAV Ver. F.71 date: 04/19/2019
Memory:
System RAM: total: 16 GiB available: 15.55 GiB used: 2.57 GiB (16.5%)
Message: For most reliable report, use superuser + dmidecode.
Array-1: capacity: 32 GiB slots: 4 modules: 4 EC: None
max-module-size: 8 GiB note: est.
Device-1: Bottom-Slot 2(right) type: DDR3 detail: synchronous size: 4 GiB
speed: 1600 MT/s volts: N/A width (bits): data: 64 total: 64
manufacturer: Ramaxel part-no: RMT3160ED58E9W1600 serial: 4360AA78
Device-2: Top - Slot 2 (under) type: DDR3 detail: synchronous size: 4 GiB
speed: 1600 MT/s volts: N/A width (bits): data: 64 total: 64
manufacturer: Ramaxel part-no: RMT3160ED58E9W1600 serial: 07E0AC1D
Device-3: Bottom-Slot 1(left) type: DDR3 detail: synchronous size: 4 GiB
speed: 1600 MT/s volts: N/A width (bits): data: 64 total: 64
manufacturer: Ramaxel part-no: RMT3160ED58E9W1600 serial: 4353AA78
Device-4: Top - Slot 1 (top) type: DDR3 detail: synchronous size: 4 GiB
speed: 1600 MT/s volts: N/A width (bits): data: 64 total: 64
manufacturer: Ramaxel part-no: RMT3160ED58E9W1600 serial: 437FAA78
PCI Slots:
Permissions: Unable to run dmidecode. Root privileges required.
CPU:
Info: model: Intel Core i7-3720QM bits: 64 type: MT MCP arch: Ivy Bridge
gen: core 3 level: v2 built: 2012-15 process: Intel 22nm family: 6
model-id: 0x3A (58) stepping: 9 microcode: 0x21
Topology: cpus: 1x dies: 1 clusters: 4 cores: 4 threads: 8 tpc: 2
smt: enabled cache: L1: 256 KiB desc: d-4x32 KiB; i-4x32 KiB L2: 1024 KiB
desc: 4x256 KiB L3: 6 MiB desc: 1x6 MiB
Speed (MHz): avg: 1200 min/max: 1200/3600 scaling: driver: intel_cpufreq
governor: schedutil cores: 1: 1200 2: 1200 3: 1200 4: 1200 5: 1200 6: 1200
7: 1200 8: 1200 bogomips: 41502
Flags: acpi aes aperfmperf apic arat arch_perfmon avx bts clflush cmov
constant_tsc cpuid cpuid_fault cx16 cx8 de ds_cpl dtes64 dtherm dts epb
ept erms est f16c flexpriority flush_l1d fpu fsgsbase fxsr ht ibpb ibrs
ida lahf_lm lm mca mce md_clear mmx monitor msr mtrr nonstop_tsc nopl nx
pae pat pbe pcid pclmulqdq pdcm pebs pge pln pni popcnt pse pse36 pti pts
rdrand rdtscp rep_good sep smep smx ss ssbd sse sse2 sse4_1 sse4_2 ssse3
stibp syscall tm tm2 tpr_shadow tsc tsc_deadline_timer vme vmx vnmi vpid
x2apic xsave xsaveopt xtopology xtpr
Graphics:
Device-1: NVIDIA GK107GLM [Quadro K1000M] vendor: Hewlett-Packard
driver: nouveau v: kernel non-free: series: 470.xx+
status: legacy-active (EOL~2024-09-xx) arch: Kepler-2 code: GKxxx
process: TSMC 28nm built: 2012-2018 pcie: gen: 1 speed: 2.5 GT/s lanes: 16
link-max: gen: 3 speed: 8 GT/s ports: active: DP-1,LVDS-1 empty: DP-2,
DP-3, VGA-1, eDP-1 bus-ID: 01:00.0 chip-ID: 10de:0ffc class-ID: 0300
temp: 44.0 C
Display: x11 server: X.Org v: 21.1.15 with: Xwayland v: 24.1.6
compositor: kwin_x11 driver: X: loaded: modesetting unloaded: vesa
alternate: fbdev,nouveau,nv,nvidia dri: nouveau gpu: nouveau
display-ID: :0 screens: 1
Screen-1: 0 s-res: 3520x1080 s-dpi: 96 s-size: 931x285mm (36.65x11.22")
s-diag: 974mm (38.33")
Monitor-1: DP-1 pos: primary,left model: Dell S2421HSX serial: 7D15CH3
built: 2022 res: mode: 1920x1080 hz: 60 scale: 100% (1) dpi: 93 gamma: 1.2
chroma: red: x: 0.655 y: 0.333 green: x: 0.329 y: 0.612 blue: x: 0.149
y: 0.059 white: x: 0.314 y: 0.329 size: 527x296mm (20.75x11.65")
diag: 604mm (23.8") ratio: 16:9 modes: 1920x1080, 1600x900, 1280x1024,
1152x864, 1280x720, 1024x768, 800x600, 720x576, 720x480, 640x480, 720x400
Monitor-2: LVDS-1 pos: right model: Seiko Epson 0x3659 built: 2012 res:
mode: 1600x900 hz: 60 scale: 100% (1) dpi: 118 gamma: 1.2 chroma: red:
x: 0.600 y: 0.341 green: x: 0.310 y: 0.561 blue: x: 0.149 y: 0.129 white:
x: 0.314 y: 0.329 size: 344x194mm (13.54x7.64") diag: 395mm (15.5")
ratio: 16:9 modes: 1600x900, 1152x864, 1024x768, 800x600, 640x480,
720x400, 640x400, 640x350
EDID-Warnings: 1: parse_edid: unknown flag 2
API: EGL v: 1.5 hw: drv: nvidia nouveau platforms: device: 0 drv: nouveau
device: 1 drv: swrast gbm: drv: nouveau surfaceless: drv: nouveau x11:
drv: nouveau inactive: wayland
API: OpenGL v: 4.5 compat-v: 4.3 vendor: mesa v: 25.0.3 glx-v: 1.4
direct-render: yes renderer: NVE7 device-ID: 10de:0ffc memory: 1.94 GiB
unified: no
API: Vulkan v: 1.4.309 layers: 1 device: 0 type: cpu name: llvmpipe (LLVM
20.1.2 256 bits) driver: N/A device-ID: 10005:0000 surfaces: xcb,xlib
Info: Tools: api: eglinfo, glxinfo, vulkaninfo
de: kscreen-console,kscreen-doctor wl: wayland-info
x11: xdpyinfo, xprop, xrandr
Repos:
Packages: pm: rpm pkgs: 2983 libs: 1412 tools: yast,zypper pm: flatpak
pkgs: 0
Active zypp repos in: /etc/zypp/repos.d/NVIDIA:repo-non-free.repo
1: NVIDIA:repo-non-free ~ https://download.nvidia.com/opensuse/tumbleweed
Active zypp repos in: /etc/zypp/repos.d/openSUSE:repo-non-oss.repo
1: openSUSE:repo-non-oss ~ http://cdn.opensuse.org/tumbleweed/repo/non-oss
Active zypp repos in: /etc/zypp/repos.d/openSUSE:repo-openh264.repo
1: openSUSE:repo-openh264 ~ http://codecs.opensuse.org/openh264/openSUSE_Tumbleweed
No active zypp repos in: /etc/zypp/repos.d/openSUSE:repo-oss-debug.repo
No active zypp repos in: /etc/zypp/repos.d/openSUSE:repo-oss-source.repo
Active zypp repos in: /etc/zypp/repos.d/openSUSE:repo-oss.repo
1: openSUSE:repo-oss ~ http://cdn.opensuse.org/tumbleweed/repo/oss
Active zypp repos in: /etc/zypp/repos.d/openSUSE:update-tumbleweed.repo
1: openSUSE:update-tumbleweed ~ http://cdn.opensuse.org/update/tumbleweed
Processes:
CPU top: 5 of 251
1: cpu: 11.9% command: firefox pid: 6089 mem: 343.9 MiB (2.1%)
2: cpu: 10.3% command: firefox pid: 5924 mem: 543.8 MiB (3.4%)
3: cpu: 4.1% command: Xorg.bin pid: 1773 mem: 96.1 MiB (0.6%)
4: cpu: 3.6% command: [kworker/u32:7-events_unbound] pid: 73
mem: 0.00 MiB (0.0%)
5: cpu: 2.9% command: [kworker/u32:1-events_unbound] pid: 6871
mem: 0.00 MiB (0.0%)
Memory top: 5 of 251
1: mem: 543.8 MiB (3.4%) command: firefox pid: 5924 cpu: 10.3%
2: mem: 364.9 MiB (2.2%) command: baloo_file pid: 2424 cpu: 0.9%
3: mem: 343.9 MiB (2.1%) command: firefox pid: 6089 cpu: 11.9%
4: mem: 329.2 MiB (2.0%) command: firefox pid: 6110 cpu: 0.5%
5: mem: 319.3 MiB (2.0%) command: plasmashell pid: 2570 cpu: 0.4%
Info:
Processes: 251 Power: uptime: 0h 41m states: freeze,mem,disk suspend: deep
avail: s2idle wakeups: 0 hibernate: platform avail: shutdown, reboot,
suspend, test_resume image: 6.19 GiB services: org_kde_powerdevil,upowerd
Init: systemd v: 257 default: graphical tool: systemctl
Compilers: N/A Shell: Bash v: 5.2.37 running-in: konsole inxi: 3.3.37
Regarding the three scenarios above, here is what I get for Tumbleweed as of now:
Scenario 1: Works perfectly well (of course)
Scenario 3: This one works well, too. GRUB output up to the “booting ramdisk …” appears on the laptop screen, plymouth and sddm greeter appear on both screens, keyboard input of password gets accepted
Scenario 2: I can’t get it to work! GRUB output up to the “booting ramdisk …” appears on the external monitor, fine. But then the monitor goes blank and does not return, i.e. no sddm greeter / password input, nothing. I can open the laptop lid, do a CTRL-ALT-F3 to get onto a tty and shut the laptop down.
Following the Arch Wiki for sddm, I added a line for the Xsetup script in /etc/sddm.conf.d/sddm.conf:
File /etc/sddm.conf.d/sddm.conf:
[X11]
# Path to a script to execute when starting the display server
DisplayCommand=/usr/share/sddm/scripts/Xsetup
My Xsetup script is as follows - please forgive me for its verbosity for debugging purposes. The core statements are:
File /usr/share/sddm/scripts/Xsetup - abridged
xrandr --output "$MONITOR_EXTRNL" --primary --auto
xrandr --output "$MONITOR_INTRNL" --off
The full script file:
File /usr/share/sddm/scripts/Xsetup:
#!/bin/sh
# Xsetup - run as root before the login dialog appears
# Script for Tumbleweed on HP 8570w with nouveau driver and Xorg
# Make external monitor primary if present
# Last update 05/05/2025
# Function to get system uptime
xsetup_uptime () {
sed 's/\([[:blank:]]\).*//' <<< cat /proc/uptime
}
# Logging goes to log file
xsetup_logfile="/tmp/test.log"
# Record the initial status to log file
echo "["$( xsetup_uptime )"]"" ""========== Starting /usr/share/sddm/scripts/Xsetup, running as "$(whoami)" ==========" >> $xsetup_logfile
echo "["$( xsetup_uptime )"]"" "$(date) >> $xsetup_logfile
echo "["$( xsetup_uptime )"]"" ""Output of initial xrandr --listmonitors, before eventually switching monitors:" >> $xsetup_logfile
xrandr --listmonitors >> $xsetup_logfile
echo "["$( xsetup_uptime )"]"" ""Output of initial xrandr --query, before eventually switching monitors:" >> $xsetup_logfile
xrandr --query >> $xsetup_logfile
# xrandr names for the monitors
# HP 8570w in docking station, external monitor on dock's Display Port, nouveau driver
MONITOR_EXTRNL="DP-1"
MONITOR_INTRNL="LVDS-1"
# Check for connected monitors
# Bail out if external monitor not found
xsetup_monint_conn=$(xrandr --query | grep -c "^$MONITOR_INTRNL connected")
xsetup_monext_conn=$(xrandr --query | grep -c "^$MONITOR_EXTRNL connected")
if [[ $xsetup_monint_conn -eq 0 ]]; then
echo "["$( xsetup_uptime )"]"" ""Internal monitor """$MONITOR_INTRNL""" not connected" >> $xsetup_logfile
else
echo "["$( xsetup_uptime )"]"" ""Internal monitor """$MONITOR_INTRNL""" connected" >> $xsetup_logfile
fi
if [[ $xsetup_monext_conn -eq 0 ]]; then
echo "["$( xsetup_uptime )"]"" ""External monitor """$MONITOR_EXTRNL""" not connected" >> $xsetup_logfile
echo "["$( xsetup_uptime )"]"" ""========== Exiting /usr/share/sddm/scripts/Xsetup before switching monitors ==========" >> $xsetup_logfile
exit 1
else
echo "["$( xsetup_uptime )"]"" ""External monitor """$MONITOR_EXTRNL""" connected" >> $xsetup_logfile
fi
# Do the actual switching
# Come here only when external monitor is connected!
# Make external monitor the primary one if connected
xrandr --output "$MONITOR_EXTRNL" --primary --auto
# Make internal monitor the secondary one if connected
if [[ $xsetup_monint_conn -eq 0 ]]; then
xrandr --output "$MONITOR_INTRNL" --off
else
xrandr --output "$MONITOR_INTRNL" --noprimary --right-of "$MONITOR_EXTRNL"
fi
# Record the final status to log file
echo "["$( xsetup_uptime )"]"" ""Output of final xrandr --query, after switching monitors:" >> $xsetup_logfile
xrandr --query >> $xsetup_logfile
echo "["$( xsetup_uptime )"]"" ""========== Exiting /usr/share/sddm/scripts/Xsetup normally ==========" >> $xsetup_logfile
Here is my own log file from Xsetup for Scenario 2:
[12.73] ========== Starting /usr/share/sddm/scripts/Xsetup, running as root ==========
[12.74] Mon May 5 14:20:04 CEST 2025
[12.74] Output of initial xrandr --listmonitors, before eventually switching monitors:
Monitors: 1
0: +DP-1 1920/527x1080/296+0+0 DP-1
[12.92] Output of initial xrandr --query, before eventually switching monitors:
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
LVDS-1 unknown connection primary (normal left inverted right x axis y axis)
1600x900 60.00 + 59.99 59.94 59.95 59.82 40.00
... abridged
DP-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
1920x1080 60.00*+ 74.97 59.96 50.00 59.94 59.93
... abridged
DP-2 disconnected (normal left inverted right x axis y axis)
eDP-1 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
VGA-1 disconnected (normal left inverted right x axis y axis)
[13.19] Internal monitor LVDS-1 not connected
[13.19] External monitor DP-1 connected
[13.20] Output of final xrandr --query, after switching monitors:
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
LVDS-1 unknown connection (normal left inverted right x axis y axis)
1600x900 60.00 + 59.99 59.94 59.95 59.82 40.00
... abridged
DP-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
1920x1080 60.00*+ 74.97 59.96 50.00 59.94 59.93
... abridged
DP-2 disconnected (normal left inverted right x axis y axis)
eDP-1 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
VGA-1 disconnected (normal left inverted right x axis y axis)
[13.29] ========== Exiting /usr/share/sddm/scripts/Xsetup normally ==========
Anything suspicious?
I could also supply my Xorg log file for Scenario 2; please let me know when you need it to understand what’s going on. (How can I upload a .txt file?)
Please, could somebody try to help me?
As a final remark, I should mention that I have tried to install an NVIDIA driver on my Tumbleweed as well, version G05 should work for my graphics card. However, no matter what method I tried, it did bork my system completely. I did follow the openSUSE documentation. Thus, I would 95% definitely stick to the nouveau driver, at least for now. No fun doing a Clonezilla many times … (all my partitions are ext4).