# Gunter Monitor Boot Issues ## Problem Description Two of the four monitors on gunter (desktop) intermittently fail to work on startup. The affected monitors are always the two Samsung LS27A600U displays, which are connected via DisplayPort daisy-chaining (MST - Multi-Stream Transport). Power cycling the monitors typically resolves the issue until the next reboot. ## System Configuration - **GPU**: NVIDIA GeForce RTX 3080 Ti - **Driver**: NVIDIA proprietary driver 590.48.01 (beta) - **Kernel**: 6.18.12 - **Compositor**: Hyprland - **Open driver**: `false` (switched from open to proprietary 2026-02-21) - **Initrd nvidia modules**: `nvidia`, `nvidia_modeset`, `nvidia_uvm`, `nvidia_drm` ### Monitor Setup | Port | Monitor | Resolution | Connection | |-------|--------------------------|----------------|---------------| | DP-1 | Acer XB271HU (center) | 2560x1440@120Hz | Direct | | DP-3 | BenQ G2420HDBL (top) | 1920x1080@60Hz | Direct | | DP-4 | Samsung LS27A600U (right)| 2560x1440@75Hz | Daisy-chained | | DP-5 | Samsung LS27A600U (left) | 2560x1440@75Hz | Daisy-chained | The GPU only has 3 DisplayPort outputs, so one Samsung monitor is connected to the other via DP daisy-chaining (MST). ## Diagnostic Findings ### Kernel Errors The following errors appear in the kernel log during boot: ``` [drm:nv_drm_dev_load [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000100] Failed to add connector for NvKmsKapiDisplay 0x00000800 [drm:nv_drm_dev_load [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000100] Failed to get dynamic displays ``` "Dynamic displays" in NVIDIA terminology refers to MST-connected monitors. These errors indicate the driver is failing to enumerate the daisy-chained displays during initialization. ### Root Cause Analysis 1. **MST timing issues** - The downstream Samsung monitor isn't ready when the driver tries to enumerate the daisy chain during boot. The MST topology hasn't been negotiated yet when the driver first probes, regardless of how early or late it loads. 2. **Power sequencing** - The monitors may need more time to negotiate the MST link during cold boot ## Changes Made ### 2026-02-21: Switch to proprietary driver + initrd loading **Change 1: `hardware.nvidia.open = false`** (previously `true`) With the open driver, boot produced 7 errors including flip event timeouts and kernel WARNING stack traces: ``` Failed to add connector for NvKmsKapiDisplay 0x00000800 Failed to get dynamic displays Flip event timeout on head 0 Flip event timeout on head 1 Failed to add encoder for NvKmsKapiDisplay 0x00000001 WARNING: CPU: 5 PID: 1169 at nvidia-drm/nvidia-drm-crtc.h:328 __nv_drm_handle_flip_event (x2) ``` With the proprietary driver, only the 2 MST enumeration errors remain. The flip timeouts and kernel warnings are gone. The driver handles the MST failure much more gracefully. **Change 2: Load nvidia modules in initrd** (`boot.initrd.kernelModules`) Without initrd loading, the nvidia driver took ~22 seconds to initialize (11s to first error, 10 more to give up on dynamic displays). During this time monitors lost signal and went to sleep. With initrd loading, the driver loads and initializes in under 1 second. However, the same two MST errors still occur - the MST topology simply isn't ready yet regardless of timing. **Result**: Subjectively improved - monitors now typically recover after a single power cycle instead of requiring multiple attempts. The boot process is also faster with no 20+ second black screen hang. ## Remaining Solutions to Try 1. **Display rescan service** - Create a systemd service that triggers the nvidia driver to re-enumerate displays a few seconds after boot. This could auto-detect MST monitors without manual power cycling. 2. **Remove `quiet splash`** from kernel params - Keeps console output active during boot, which maintains an active DP signal through the UEFI-to-kernel transition and may help keep the MST link alive. 3. **Check monitor firmware** - Samsung LS27A600U monitors have had MST firmware updates. Updating could improve MST link negotiation reliability. 4. **Reduce initial link rate** - Lower refresh rate to 60Hz initially to reduce DP bandwidth requirements during MST negotiation, potentially making link training more reliable. ## Useful Diagnostic Commands ### Kernel logs for display/nvidia issues ```bash journalctl -k --no-pager | grep -iE '(nvidia|drm|display|edid|dp|hdmi|monitor)' ``` ### Kernel errors and warnings ```bash journalctl -k --no-pager | grep -iE '(error|fail|warn)' ``` ### Current monitor state (Hyprland) ```bash hyprctl monitors all ``` ### DRM connector status ```bash cat /sys/class/drm/*/status ls -la /sys/class/drm/ ``` ### GPU and driver info ```bash nvidia-smi --query-gpu=name,driver_version --format=csv,noheader ``` ### Check EDID data for each connector ```bash for f in /sys/class/drm/card1-DP-*/; do echo "=== $(basename $f) ==="; cat "$f/enabled" 2>/dev/null; cat "$f/edid" 2>/dev/null | xxd | head -5; done ``` ## Related Configuration Files - `hosts/gunter/configuration.nix` - NVIDIA driver settings - `home/hosts/gunter/default.nix` - Hyprland monitor configuration