docs(desktop): document compute-only Thunderbolt eGPU configuration

This commit is contained in:
Prad Nukala committed 2026-10-17 12:40:33 -04:00
1 parent 4e04722185
commit 4afde52bc8
3 files changed
+20 -1

No files matched your search

+1 -1
View File
@@ -128,7 +128,7 @@ Omarchy's stock fade (0.985 active / 0.96 inactive) is kept. Terminals get their
`~/.config/uwsm/env-hyprland` (source `dot_config/uwsm/env-hyprland`, Linux desktop/laptop only) is sourced by uwsm before Hyprland starts. It sets `AQ_DRM_DEVICES` to the AMD iGPU, resolved from `/dev/dri/by-path/pci-0000:c4:00.0-card`, so Hyprland never opens the Thunderbolt eGPU (RTX 5060 Ti, compute only: AI models, CUDA). Every display, the Samsung ultrawide included, hangs off the iGPU. It leaves the variable unset if that path is missing. It also sets `__EGL_VENDOR_LIBRARY_FILENAMES` to Mesa's `50_mesa.json`, so neither Hyprland nor session apps load `libEGL_nvidia` and hold `/dev/nvidiactl`; CUDA does not use EGL. `~/.config/uwsm/env-hyprland` (source `dot_config/uwsm/env-hyprland`, Linux desktop/laptop only) is sourced by uwsm before Hyprland starts. It sets `AQ_DRM_DEVICES` to the AMD iGPU, resolved from `/dev/dri/by-path/pci-0000:c4:00.0-card`, so Hyprland never opens the Thunderbolt eGPU (RTX 5060 Ti, compute only: AI models, CUDA). Every display, the Samsung ultrawide included, hangs off the iGPU. It leaves the variable unset if that path is missing. It also sets `__EGL_VENDOR_LIBRARY_FILENAMES` to Mesa's `50_mesa.json`, so neither Hyprland nor session apps load `libEGL_nvidia` and hold `/dev/nvidiactl`; CUDA does not use EGL.
Outside chezmoi, `/etc/modprobe.d/thunderbolt-egpu.conf` sets `options thunderbolt host_reset=0`. By default the thunderbolt driver resets the USB4 host router at boot, dropping the firmware-built PCIe tunnel while the early-loaded `nvidia` driver initialises the eGPU (Xid 79, GPU stuck until reboot). The system side (kernel cmdline, `nvidia` without KMS, `thunderbolt host_reset=0`) lives outside chezmoi, see [Thunderbolt eGPU](/desktop#thunderbolt-egpu-compute-only).
## hyprsunset and portal ## hyprsunset and portal
+18
View File
@@ -34,3 +34,21 @@ Three Wayland compositors are configured side by side. niri is the original setu
| `[cachyos]` repo, when configured | `umbriel`, `xdg-desktop-portal-umbriel` | | `[cachyos]` repo, when configured | `umbriel`, `xdg-desktop-portal-umbriel` |
AUR names that an installed package already provides are skipped; with no `yay` or `paru` the script bootstraps `yay` first. strata, the default file manager, comes from its own installer in [15-tools](/chezmoi/scripts#15-tools). Hyprland, Waybar, and the `omarchy-*` commands that the scripts call (`omarchy-menu`, `omarchy-launch-or-focus`, and others) come from an Omarchy install. This repo does not install them. See [chezmoi scripts](/chezmoi/scripts) for the full install flow and [packages.yaml](/chezmoi/data#packagesyaml) for the complete lists. AUR names that an installed package already provides are skipped; with no `yay` or `paru` the script bootstraps `yay` first. strata, the default file manager, comes from its own installer in [15-tools](/chezmoi/scripts#15-tools). Hyprland, Waybar, and the `omarchy-*` commands that the scripts call (`omarchy-menu`, `omarchy-launch-or-focus`, and others) come from an Omarchy install. This repo does not install them. See [chezmoi scripts](/chezmoi/scripts) for the full install flow and [packages.yaml](/chezmoi/data#packagesyaml) for the complete lists.
## Thunderbolt eGPU (compute only)
The RTX 5060 Ti in a USB4 enclosure (Minisforum `TBGAA`, bolt policy `iommu`) is for CUDA only: AI models, never displays or rendering. Every display hangs off the Radeon 8060S iGPU (PCI `c4:00.0`). Packages: `linux-cachyos-nvidia-open`, `nvidia-utils`, `cuda`, `opencl-nvidia`. Nothing in this section is managed by chezmoi except the session environment.
| File | Setting | Why |
| --- | --- | --- |
| `/etc/default/limine` | no `pci=nommconf`, no `pcie_aspm=off` | Either one makes Linux skip the PCIe `_OSC` control request (`not requesting OS control; OS requires [ExtendedConfig ASPM …]`). Then `pciehp` never binds the USB4 bridges `00:01.1`/`00:01.2`, and the enclosure authorizes while the GPU never shows up in `lspci`. Run `limine-update` after editing. |
| `/etc/modprobe.d/nvidia-egpu.conf` | `install nvidia_drm /bin/true`, `install nvidia_modeset /bin/true`, `NVreg_DynamicPowerManagement=0x00`, `NVreg_PreserveVideoMemoryAllocations=0` | Without `nvidia_drm` there is no `/dev/dri` node for the eGPU, so no compositor, GBM, or VA-API driver can open it. CUDA needs only `nvidia` and `nvidia_uvm`. `nvidia-suspend.service` is not enabled, and with `PreserveVideoMemoryAllocations=1` suspend fails while the eGPU is bound. |
| `/etc/modprobe.d/thunderbolt-egpu.conf` | `options thunderbolt host_reset=0` | Keeps the firmware-built PCIe tunnel at boot. With the default reset the tunnel drops while `nvidia` initialises the card (Xid 79, GPU stuck until reboot). |
| `/etc/udev/rules.d/61-nvidia-compute.rules` | `nvidia-modprobe -c0 -u` when the `nvidia` module loads | `nvidia-utils`' own rule creates `/dev/nvidia*` when `nvidia_drm` loads, and that module never loads here. |
| no `/etc/modules-load.d` entry | none | udev loads `nvidia` by modalias when the GPU reaches the bus, at boot or on hotplug. |
`nouveau` is blacklisted by `nvidia-utils` (`/usr/lib/modprobe.d/nvidia-utils.conf`). Without that blacklist, nouveau binds the card, the NVIDIA driver reports `GPU … is already bound to nouveau`, and a link drop deadlocks `pciehp` in nouveau's GSP teardown.
Session side: `conf.d/10-env.fish` sets `__EGL_VENDOR_LIBRARY_FILENAMES` (Mesa) and `VK_DRIVER_FILES` (RADV), see [fish](/shell/fish#10-envfish). niri and Umbriel both start through a fish login shell, so the compositor, Noctalia, and every app inherit them. Without them, glvnd and the Vulkan loader load the NVIDIA vendor libraries into every process, and those processes hold `/dev/nvidiactl`. Hyprland gets the same pins from `~/.config/uwsm/env-hyprland`, see [Hyprland](/desktop/hyprland#monitors).
Check: `nvidia-smi` lists the card, and `fuser -v /dev/nvidia*` shows only CUDA processes.
+1
View File
@@ -74,6 +74,7 @@ Runs for every shell, including non-interactive ones, so scripts get the same `P
| `FISH_BOTTOM_PROMPT` | `0` unless inherited. `1` pins the prompt to the bottom row | | `FISH_BOTTOM_PROMPT` | `0` unless inherited. `1` pins the prompt to the bottom row |
| `HSA_OVERRIDE_GFX_VERSION` | `11.5.0` (ROCm) | | `HSA_OVERRIDE_GFX_VERSION` | `11.5.0` (ROCm) |
| `ROCR_VISIBLE_DEVICES`, `HIP_VISIBLE_DEVICES` | `0` | | `ROCR_VISIBLE_DEVICES`, `HIP_VISIBLE_DEVICES` | `0` |
| `__EGL_VENDOR_LIBRARY_FILENAMES`, `VK_DRIVER_FILES` | Mesa's `50_mesa.json` and RADV's `radeon_icd.json`, only when `/dev/dri/by-path/pci-0000:c4:00.0-render` (the Strix Halo iGPU) exists. Keeps the session off the compute-only eGPU, see [Thunderbolt eGPU](/desktop#thunderbolt-egpu-compute-only) |
| `EGET_BIN` | `~/.local/bin` | | `EGET_BIN` | `~/.local/bin` |
| `GHQ_ROOT`, `CODE_ROOT` | `~/Code` | | `GHQ_ROOT`, `CODE_ROOT` | `~/Code` |
| `ANDROID_HOME`, `ANDROID_SDK_ROOT` | `~/.local/share/android` | | `ANDROID_HOME`, `ANDROID_SDK_ROOT` | `~/.local/share/android` |