How to make laptop in dock work with external monitor - Tumbleweed, nouveau, Plasma, sddm

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:

  1. Laptop in standalone, lid open, just using its built-in display
  2. Laptop in docking station, lid CLOSED, external monitor being the only monitor; use power button on dock to turn on and boot
  3. 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 … :wink:

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).

@111MilesToGo Hi, check the BIOS for any lid switch options or display settings that can set to boot with lid closed or ignore… For your desktop environment, check settings to disable the lid switch or look in /etc/systemd/logind.conf to disable the lid switch.

I forgot to mention the BIOS: There is nothing like that available, unfortunately.

@111MilesToGo what about display selection?

There is no file logind.conf anywhere in /etc/systemd.

Sorry, I don’t understand your “display selection” question …

@111MilesToGo In the BIOS, how does the laptop select the internal display vs the external display (when docked) maybe it’s set to eDP as the primary, likely need to set to auto. Also check HP support for updated BIOS etc.

@111MilesToGo my bad it’s moved /usr/lib/systemd/logind.conf create an overrides file or pop a conf file into /etc/systemd/logind.conf.d/ containing your changes.

You can try HandleLidSwitch settings in logind.conf

HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore
  • HandleLidSwitch: instances when the laptop is operating on battery power
  • HandleLidSwitchExternalPower: scenarios where the laptop is connected to a power outlet
  • HandleLidSwitchDocked: situations when the laptop is linked to a docking station

Source: https://www.baeldung.com/linux/disable-suspend-lid-close

Did this, unfortunately it does not help (rebooted, of course …).

My full systemd login.conf is as follows, where the drop-in file has the three HandleLidSwitch lines active now:

Command: systemd-analyze cat-config systemd/logind.conf

# /usr/lib/systemd/logind.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/logind.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/logind.conf' to display the full config.
#
# See logind.conf(5) for details.

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#UserStopDelaySec=10
#SleepOperation=suspend-then-hibernate suspend
#HandlePowerKey=poweroff
#HandlePowerKeyLongPress=ignore
#HandleRebootKey=reboot
#HandleRebootKeyLongPress=poweroff
#HandleSuspendKey=suspend
#HandleSuspendKeyLongPress=hibernate
#HandleHibernateKey=hibernate
#HandleHibernateKeyLongPress=ignore
#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend
#HandleLidSwitchDocked=ignore
#HandleSecureAttentionKey=secure-attention-key
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#RebootKeyIgnoreInhibited=no
#HoldoffTimeoutSec=30s
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RuntimeDirectoryInodesMax=
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#StopIdleSessionSec=infinity
#DesignatedMaintenanceTime=

# /etc/systemd/logind.conf.d/logind.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/logind.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/logind.conf' to display the full config.
#
# See logind.conf(5) for details.

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#UserStopDelaySec=10
#SleepOperation=suspend-then-hibernate suspend
#HandlePowerKey=poweroff
#HandlePowerKeyLongPress=ignore
#HandleRebootKey=reboot
#HandleRebootKeyLongPress=poweroff
#HandleSuspendKey=suspend
#HandleSuspendKeyLongPress=hibernate
#HandleHibernateKey=hibernate
#HandleHibernateKeyLongPress=ignore
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore
#HandleSecureAttentionKey=secure-attention-key
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#RebootKeyIgnoreInhibited=no
#HoldoffTimeoutSec=30s
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RuntimeDirectoryInodesMax=
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#StopIdleSessionSec=infinity
#DesignatedMaintenanceTime=

Regarding the BIOS again: I have the latest BIOS for my ancient HP laptop, cf. the inxi above.
But I do not know how the laptop selects internal versus external display when undocked/docked. I need to revisit the BIOS settings, but I am afraid there is nothing (???).

With the three HandleLidSwitch lines active now, the following procedure works:

Boot laptop with lid open, in dock, external monitor connected
As mentioned above as Scenario 3, after logging in the external monitor is the primary, the internal the secondary; both displays work
When closing and opening the lid now, the external = primary monitor remains on, and the internal laptop monitor turns off and on

I think that works as it should.

But with the lid closed all the time, things don’t work: The machine boots, but the sddm greeter does not show up as the external monitor goes blank after showing the GRUB and “booting ramdisk” stuff.

Re-checked all BIOS settings. There is literally nothing regarding displays. My HP BIOS (UEFI) is the 68IAV F.71 from 2019, the latest one available for HP EliteBook 8570w.

I also revisited my Plasma settings. Energy management has “Do nothing” when “Closing the lid” in all mains/battery cases.

@111MilesToGo you could try adding fbdev=1 nouveau.modeset=1 to the kernel boot options and see if that helps. @mrmazda may have some ideas…

Even though my NVidia experience exclusively involves FOSS, and only single GPU per PC, none of it involves a hands-on with a laptop or dock. I do have (continuing) bad experience with a GK107 GT 640 documented here and here that I would think could be related, but for OP’s good experiences with Windows, Mint and Ubuntu. I have Noble/24.04 along with TW, Leap, Debian and Mageia on that PC, but not Mint, all exhibiting the same black screen

DRM: DDC responded, but no EDID for DVI

problem with every kernel newer than 6.6.x. Does that message show up in any of OP’s logs?

Re #2 problem: At what point bringing lid from full open to fully closed does the external go black? Would it be of any use as a workaround to mirror the laptop display to the external display with xrandr and leave the lid open as much as required to keep external working?

If #2 is normally to arise on a fresh boot each time, it may be that a video= cmdline option could function as a workaround, such as I need to use here, in a custom Grub stanza used just for those boots.

@mrmazda, wrt your suggestions and your observations:

Yes, in Scenario #2, it seems possible to use your proposed workaround. The laptop is to be placed in a rack, ideally with lid closed of course. But I can open the lid just barely wide enough to turn the internal monitor on. Booting will show the GRUB stuff on the internal monitor only, but I can select the desired entry blindly; then the sddm greeter shows up on the external monitor. From there on, logging in and doing all work is possible on the external monitor. I can leave the lid open or close it, whatever I like; the external monitor stays. This workaround is not really nice, but it works, as long as Tumbleweed remains the only one of my OS’s requiring this.

Regarding your own observed failures with old NVIDIA graphics cards plus nouveau, here is my /var/log/Xorg.0.log file, grep’ed for nouveau:

grep -i nouveau "250505 Xorg-0_log v01 TwoMonitors.txt"

[    11.339] (==) Matched nouveau as autoconfigured driver 1
[    11.340] (II) LoadModule: "nouveau"
[    11.340] (WW) Warning, couldn't open module nouveau
[    11.340] (EE) Failed to load module "nouveau" (module does not exist, 0)
[    11.845] (II) modeset(0): [DRI2]   DRI driver: nouveau
[    11.845] (II) modeset(0): [DRI2]   VDPAU driver: nouveau
[    11.847] (EE) AIGLX error: dlopen of /usr/lib64/dri/nouveau_dri.so failed (/usr/lib64/dri/nouveau_dri.so: cannot open shared object file: No such file or directory)
[    11.847] (EE) AIGLX error: unable to load driver nouveau

Such lines are identical for the cases of having two monitors (int+ext) and just having the int one. I don’t know whether that makes sense … For reference, please take a look at my inxi again (first post here). I am not exactly sure whether my Tumbleweed installation is as it should be with respect nouveau - but it is installed exactly as it came out of the box in May 2024 with kernel 6.8.8. “Exactly” means no changes of mine wrt graphics driver and X11, just following the customary zypper ref/dup’s.

grep’ing that Xorg log file for EDID yields:

grep EDID "250505 Xorg-0_log v01 TwoMonitors.txt"

[    11.770] (II) modeset(0): EDID for output LVDS-1
[    11.770] (II) modeset(0): EDID Version: 1.4
[    11.770] (II) modeset(0): EDID (in hex):
[    11.788] (II) modeset(0): EDID for output DP-1
[    11.788] (II) modeset(0): EDID Version: 1.4
[    11.788] (II) modeset(0): Number of EDID sections to follow: 1
[    11.788] (II) modeset(0): EDID (in hex):
[    11.789] (II) modeset(0): EDID for output DP-2
[    11.789] (II) modeset(0): EDID for output eDP-1
[    11.789] (II) modeset(0): EDID for output DP-3
[    11.801] (II) modeset(0): EDID for output VGA-1
[    12.445] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    12.531] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    12.621] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    12.713] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    12.802] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    12.956] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    26.549] (II) modeset(0): EDID vendor "SEC", prod id 13913
[    27.009] (II) modeset(0): EDID vendor "SEC", prod id 13913

grep’ing it for DRM or DVI yields nothing.

Should I try to find your error message DRM: DDC responded, but no EDID for DVI in any other logs of mine, and how, @mrmazda?

Thus I am not getting any further right now. I will try to live with the a.m. workaround for the time being.

If you have further ideas, remarks, requests for logs, or questions, please let me know.

# grep RETT /etc/os-release
PRETTY_NAME="openSUSE Leap 15.6"
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
# grep \(EE /var/log/Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[    10.256] (EE) Failed to load module "intel" (module does not exist, 0)
#
***
# grep RETT /etc/os-release
PRETTY_NAME="openSUSE Tumbleweed"
 # lspci | grep VGA
04:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] RV730 PRO [Radeon HD 4650]
# grep \(EE /var/log/Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[    80.306] (EE) Failed to load module "fbdev" (module does not exist, 0)
***
# grep RETT /etc/os-release
PRETTY_NAME="Fedora Linux 42 (Adams)"
# lspci | grep VGA
00:01.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Kaveri [Radeon R7 Graphics] (rev d7)
# grep \(EE /var/log/Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[    32.654] (EE) Failed to load module "ati" (module does not exist, 0)
[    32.661] (EE) Failed to load module "fbdev" (module does not exist, 0)
[    32.661] (EE) Failed to load module "vesa" (module does not exist, 0)
***
# grep RETT /etc/os-release
PRETTY_NAME="openSUSE Tumbleweed"
# lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GF119 [NVS 310] (rev a1)
# grep \(EE /var/log/Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[    11.334] (EE) Failed to load module "nvidia" (module does not exist, 0)
[    11.335] (EE) Failed to load module "nouveau" (module does not exist, 0)
[    11.335] (EE) Failed to load module "nv" (module does not exist, 0)
[    11.336] (EE) Failed to load module "fbdev" (module does not exist, 0)
[    11.336] (EE) Failed to load module "vesa" (module does not exist, 0)
***
# grep RETT /etc/os-release
PRETTY_NAME="openSUSE Tumbleweed"
# lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GK208B [GeForce GT 720] (rev a1)
 # grep \(EE /var/log/Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[    13.694] (EE) Failed to load module "nvidia" (module does not exist, 0)
[    13.694] (EE) Failed to load module "nouveau" (module does not exist, 0)
[    13.694] (EE) Failed to load module "nv" (module does not exist, 0)
[    13.745] (EE) open /dev/fb0: No such file or directory
# zypper --no-refresh se -s xf86-video-nouveau | grep -v '32bit|debug|devel|srcp|openSUSE-20' | egrep 'x86|noarch'| sort -f
 l | xf86-video-nouveau | package | 1.0.18-1.3 | x86_64 | OSS
#

As you can see from my own greps, it is absolutely normal for Xorg.0.log files to contain (EE) lines reporting “Failed to load module”, and consequent “No such file”. Absent a configuration demanding a specific use of some particular display driver, X attempts to load every driver that could conceivably apply to the GPU(s) present. Upon determining an optimal selection, all that succeeded to load, except for the optimal, get unloaded. It’s unfortunate log noise that cannot be avoided without preconfiguring a specific display driver.

# grep -i drm /var/log/Xorg.0.log
[    11.312] (II) xfree86: Adding drm device (/dev/dri/card0)
[    11.312] (II) Platform probe for /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0

Grep is case sensitive unless the -i switch is used. DVI won’t appear when the kernel doesn’t find any “DVI” outputs. It’s common that physical DVI outputs are mapped (listed by the kernel) to HDMI crtcs. :stuck_out_tongue: The only difference between HDMI and DVI electrically is DVI normally lacks audio.

# ls -gG /sys/class/drm
total 0
lrwxrwxrwx 1    0 May  6 22:11 card1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1
lrwxrwxrwx 1    0 May  6 22:11 card1-DP-1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-1
lrwxrwxrwx 1    0 May  6 22:11 card1-DP-2 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-DP-2
lrwxrwxrwx 1    0 May  6 22:11 card1-HDMI-A-1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-HDMI-A-1
lrwxrwxrwx 1    0 May  6 22:11 card1-HDMI-A-2 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-HDMI-A-2
lrwxrwxrwx 1    0 May  6 22:11 card1-HDMI-A-3 -> ../../devices/pci0000:00/0000:00:02.0/drm/card1/card1-HDMI-A-3
lrwxrwxrwx 1    0 May  6 22:11 renderD128 -> ../../devices/pci0000:00/0000:00:02.0/drm/renderD128
-r--r--r-- 1 4096 May  6 22:12 version
#

Here we are shown 5 outputs supported by the hardware. The actual hardware connectors existing are 4: DisplayPort, HDMI, DVI, and VGA. DP-2 is mapped to the VGA connector. HDMI-A-2 is mapped to the DVI connector. I haven’t found any way for software to explicitly show when such mapping occurs.

It’s an error message, so you don’t want to find it anywhere. Other than journal, dmesg or Xorg.?.log*, the only other place I might expect to find it would be in ~/.xsession-errors.

IMO, your experience warrants a bug report. If you write one, be sure to reference this thread there.

I filed a bug report to the openSUSE Bugzilla:
https://bugzilla.opensuse.org/show_bug.cgi?id=1243073
Thanks to all, in particular to you, @mrmazda.

In your bug report I noted:

DisplayCommand=/usr/share/sddm/scripts/Xsetup

Admin overrides and customization do not belong anywhere in /usr/, with the exception of /usr/local/. Changes made there will be overwritten by package updates and upgrades. Instead, use /etc/. For SDDM I cannot be specific, as I’ve purged it in favor of LightDM, TDM or KDM3 on virtually all installations here, even Neon. The fact that you customize in /usr/ may result in reported bugs being resolved invalid.

Before usrmove, openSUSE had /etc/X11/xdm/Xsetup, which is still present in Leap 15.6. Mageia 9 provides /etc/X11/xsetup.d/. openSUSE and Fedora provide or provided /etc/X11/xinit/xinitrc.d/, which is where I keep my xrandr startup scripts for them.

Take a look here to see if any error messages there also apply attempting to use scenario #2.