From 23372e96f5ac3a794885abd56ac25296ce21915b Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 21 Oct 2026 00:05:17 -0700 Subject: [PATCH] fix(niri): pin the ultrawide to the 180 Hz mode its EDID actually offers desk-1-home.kdl asked the Sceptre M34 for 3440x1440@239.999, a mode the panel has never offered. niri does not reject an unavailable mode: it logs "configured mode ... could not be found, falling back to preferred" and drives the EDID preferred mode - 60 Hz - on every connector event, which is why the monitor looked like it was dying rather than misconfigured. Read live with `niri msg outputs`, the mode list tops out at 180. Also destroys the copies of the phantom number: displays.md carried 239.999 in its diagram, its panel table and its copy-paste pattern block, and its rule 4 claimed an impossible mode leaves the output dark. Rule 4 now states the real failure mode, a new section separates config / DP-link / amdgpu-driver faults by log signature, and wlr-randr is corrected to not-installed (three pages claimed it; `pacman -Qs wlr` matches nothing). Applied live with `niri msg output mode ` - the temporary per-output path, so no config reload and no logged-out session - verified at 3440x1440 @ 180.000 Hz with the compositor PID unchanged. Refs #58 --- .../niri/.config/niri/cfg/desk-1-home.kdl | 8 ++- omp-docs/log.md | 29 ++++++++- omp-docs/tools/applications.md | 1 - omp-docs/tools/cachyos.md | 1 - omp-docs/tools/niri/displays.md | 65 ++++++++++++++++--- 5 files changed, 90 insertions(+), 14 deletions(-) diff --git a/dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl b/dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl index 8bf4a0f..96a4bcd 100644 --- a/dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl +++ b/dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl @@ -7,8 +7,12 @@ // requires: Lenovo Group Limited 0x40A9 Unknown // optional: HDMI-A-1 (PM1601, dock-dependent) +// This panel's EDID tops out at 3440x1440@180 (read live from niri: no 240 Hz mode +// exists). Ask for a mode the panel does not offer and niri does not fail — it logs +// "could not be found, falling back to preferred" and drops to 60 Hz on every +// reconnect. Keep 180 here unless a re-read EDID says otherwise. output "Sceptre Tech Inc Sceptre M34 Unknown" { - mode "3440x1440@239.999" + mode "3440x1440@180.000" scale 1 transform "normal" position x=1581 y=-600 @@ -47,7 +51,7 @@ output "eDP-1" { position x=-339 y=-240 } output "DP-1" { - mode "3440x1440@120.000" + mode "3440x1440@180.000" scale 1.0 diff --git a/omp-docs/log.md b/omp-docs/log.md index 0223a9e..5f9f27d 100644 --- a/omp-docs/log.md +++ b/omp-docs/log.md @@ -6,7 +6,7 @@ tags: - okf - maintenance - changelog -timestamp: 2026-10-19 +timestamp: 2026-10-21 --- # Bundle Change Log @@ -20,6 +20,33 @@ This page is the bundle's **only** work log: one file, at the root. Never start second one in a subdirectory or under another name — `scripts/kb-lint.sh` reports any `log.md` that is not this one. +## 2026-10-21 — a documented mode the panel never had + +The home ultrawide had been running at 60 Hz for weeks while `desk-1-home.kdl` +asked for `3440x1440@239.999`. The page that owns that file documented the same +phantom mode, so every reader — including tonight's inspection — trusted it. +`niri msg outputs` says the Sceptre M34's EDID tops out at 180 Hz; there is no +240 Hz mode to ask for. + +Laws, now on [tools/niri/displays](tools/niri/displays.md): + +- **An impossible mode does not fail, it falls back.** niri logs + `configured mode … could not be found, falling back to preferred` and drives + the EDID preferred mode — 60 Hz here. A config typo therefore looks like a + dying monitor, and every connector drop re-enacts it. +- **Three layers, three signatures:** config fallback, DP link drops, and + amdgpu `DMCUB` errors with `EINVAL` page flips after s2idle. Only the first + yields to a file edit; only the last yields to a reboot. Triage table and + probes are on the page. +- **A number in a page is a claim, not a measurement.** Modes, refresh rates and + tool availability were wrong on four pages at once — `wlr-randr` was listed as + installed while `pacman -Qs wlr` matches nothing. Read the hardware before + writing a mode into a runbook, and destroy the stale copies. + +Fix: `desk-1-home.kdl` 239.999 → 180.000 on the identity block and both legacy +connector blocks, applied live with `niri msg output mode ` — the +temporary per-output path, so no config reload and no logged-out session. + ## 2026-10-20 — one work log per bundle The bundle had two: this page and `core/log.md`, created "for tracking core diff --git a/omp-docs/tools/applications.md b/omp-docs/tools/applications.md index e4c39e4..3802392 100644 --- a/omp-docs/tools/applications.md +++ b/omp-docs/tools/applications.md @@ -33,7 +33,6 @@ Applications that ship with or are configured on CachyOS with Niri on the workst | **Noctalia Shell** | 4.7.7 | Desktop shell (launcher, wallpaper, session menu) | | **Shelly Notifications** | — | Notification daemon | | **pavucontrol** | — | Audio mixer | -| **wlr-randr** | — | Display management | ## Screenshot and Recording diff --git a/omp-docs/tools/cachyos.md b/omp-docs/tools/cachyos.md index 4315b2a..28e0310 100644 --- a/omp-docs/tools/cachyos.md +++ b/omp-docs/tools/cachyos.md @@ -95,7 +95,6 @@ CachyOS with Niri ships with a curated set of applications: - **wf-recorder** — Screen recording - **hyprpicker** — Color picker - **wl-clipboard** — Clipboard management -- **wlr-randr** — Display management - **NetworkManager** — Network management - **BlueZ** — Bluetooth - **pavucontrol** — Audio mixer diff --git a/omp-docs/tools/niri/displays.md b/omp-docs/tools/niri/displays.md index e686f5b..5de8498 100644 --- a/omp-docs/tools/niri/displays.md +++ b/omp-docs/tools/niri/displays.md @@ -1,14 +1,14 @@ --- type: reference title: Display Configuration -description: Niri output configuration on blankpad — EDID-identity-keyed desk profiles, hotplug auto-switching, portrait transforms, position pinning, and GPU notes (AMD Cezanne now; Intel Arc render-node pin is dankware-legacy). +description: Niri output configuration on blankpad — EDID-identity-keyed desk profiles, hotplug auto-switching, portrait transforms, position pinning, the phantom-mode fallback trap, and GPU notes (AMD Cezanne now; Intel Arc render-node pin is dankware-legacy). tags: - niri - display - monitors - rotation - desk-profiles -verified: 2026-10-09 +verified: 2026-10-21 --- # Display Configuration @@ -24,7 +24,11 @@ active profile (`desk-1-home.kdl`, `desk-2-portable.kdl`, …). `config.kdl` includes it with `include optional=true` so a missing link is a warning, not a parse failure. **Probe:** `niri msg outputs` is authoritative (connector, full EDID long -name, modes, transform, scale, position, VRR). `wlr-randr` remains available. +name, modes, transform, scale, position, VRR). Per-output changes go live with +`niri msg output ` and are +temporary — never written to the config file. `wlr-randr` is **not installed** +on blankpad (`pacman -Qs wlr` matches nothing, verified 2026-10-21); pages that +list it as an installed tool are stale. --- @@ -33,7 +37,7 @@ name, modes, transform, scale, position, VRR). `wlr-randr` remains available. ``` ┌──────────────┬──────────────────────────────┬──────────┐ │ PM1601 │ Sceptre M34 ultrawide │ eDP-1 │ -│ portrait │ 3440x1440 @ 239.999 │ 1920x1080│ +│ portrait │ 3440x1440 @ 180.000 │ 1920x1080│ │ 1200x1920 │ landscape, scale 1 │ scale 1 │ │ rot 90 │ position 1581,-600 │ 5021,-240│ └──────────────┴──────────────────────────────┴──────────┘ @@ -42,7 +46,7 @@ name, modes, transform, scale, position, VRR). `wlr-randr` remains available. | Panel | EDID long name | Keyed by | Notes | |-------|----------------|----------|-------| -| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@239.999"`, `focus-at-startup` | +| Sceptre M34 ultrawide | `Sceptre Tech Inc Sceptre M34 Unknown` | identity | `mode "3440x1440@180.000"` — the EDID maximum; no 240 Hz mode exists — `focus-at-startup` | | PM1601 portrait | *not captured* | connector `HDMI-A-1` | dock-dependent; run `desk.sh capture` when plugged in, then re-key | | eDP-1 laptop panel | `Lenovo Group Limited 0x40A9 Unknown` | identity | scale **1.0** (deliberate; Ghostty grid at 1.25 rejected 2026-10-09), second `focus-at-startup` | @@ -84,7 +88,7 @@ graph LR ```kdl // desk-1-home.kdl — one block per panel, keyed by identity output "Sceptre Tech Inc Sceptre M34 Unknown" { - mode "3440x1440@239.999" + mode "3440x1440@180.000" scale 1 transform "normal" position x=1581 y=-600 @@ -98,6 +102,10 @@ Four rules learned the hard way: name *and* long name) fight over properties — transform reverts are the classic symptom. Desk profiles are self-contained: a panel's identity, mode, transform, **and** position live in exactly one block per file. + `desk-1-home.kdl` still carries legacy connector-keyed `DP-1` / `DP-2` + blocks next to the identity block. Their modes were aligned to 180 Hz on + 2026-10-21 so a connector-named reconnect cannot drop the panel to 120, but + they belong folded into the identity block. 2. **Key by EDID identity, not connector.** Connector names swap between docks; the EDID long name travels with the panel. Serials on these panels read `Unknown`, so the full long name (manufacturer model serial) is the @@ -105,8 +113,47 @@ Four rules learned the hard way: 3. **Positions are absolute, not relational.** A disconnected panel leaves a hole; that is exactly why positions belong to the *desk profile*, not a global file. -4. **Modes must match what the panel reports** (`niri msg outputs` → - `Mode: current …`). A mode the panel cannot drive leaves the output dark. +4. **Ask only for modes the panel reports** (`niri msg outputs` → `Mode:` list). + A mode the panel never offered does **not** leave the output dark: niri logs + `configured mode … could not be found, falling back to preferred` and quietly + drives the panel at its EDID *preferred* mode — **60 Hz** on the M34. Nothing + looks broken except the refresh rate, and every reconnect repeats the + fallback. Check Hz, not just resolution, after any "monitor is acting up". + +## "The monitors are broken" — three layers, three signatures + +A display complaint belongs to one of three layers. Sort it before editing +config, because the config is usually innocent — and when it is guilty, the +guilt may have been copied from this page. + +| Layer | Log signature | Reality | Move | +|-------|---------------|---------|------| +| Config | `configured mode … could not be found, falling back to preferred` | a mode/scale the panel never offered | re-read the mode list with `niri msg outputs` and correct the file; do **not** trust a documented mode | +| Link | `disconnecting connector: "DP-1"` followed seconds later by `new connector: DP-1`, recurring | the DP link itself dropping — cable, dock, the monitor's DP-version/DSC setting, or panel power saving | every drop re-runs mode selection, so a config error is re-enacted in public; swap the cable before blaming the compositor | +| Driver | `Page flip commit failed … (Invalid argument)` plus kernel `*ERROR* … DMCUB error` | amdgpu's display engine wedged, typically after an s2idle resume | survives until a reboot; niri keeps running while the panel keeps dropping. No config edit clears it | + +Probes, in this order: + +```bash +niri msg outputs # connector, EDID long name, real mode list, current mode +journalctl --user -b | grep -E 'disconnecting connector|Page flip commit failed|falling back to preferred' +journalctl -k -b | grep -iE 'amdgpu.*(ERROR|DMCUB)|PM: suspend exit' +``` + +Correlate the drop timestamps against `PM: suspend exit` first. A resume a +minute before the first drop is the cause; the config file is not. + +To fix a refresh rate without disturbing the session, use the temporary +per-output path — it touches one output, applies no config, reloads nothing: + +```bash +niri msg output "Sceptre Tech Inc Sceptre M34 Unknown" mode "3440x1440@180.000" +``` + +It is temporary by design, so correct the profile too and let the next +reconnect or `load-config-file` make it permanent. With the display engine +already throwing `EINVAL`, prefer the per-output path over a full config +reload; on a healthy machine either is fine. ## GPU assignment @@ -132,4 +179,4 @@ symlink matrix]]). - [Niri](/tools/niri/index.md) — compositor overview and config layout - [[tips|tips]] — reload path, `niri msg layers/casts`, includes - [[noctalia-shell|noctalia-shell]] — notification shown on desk switch -- [[cachyos|cachyos]] — operating system, including `wlr-randr` +- [[cachyos|cachyos]] — operating system -- 2.54.0