Puppy head scratches
My puppy nearly drifted off while I scratched his head, during his most energetic evening hours.
My puppy nearly drifted off while I scratched his head, during his most energetic evening hours.
I had a lot of trouble getting this setup working, so I wanted to share what eventually worked for me, in case it is useful to others.
My eGPU is connected to a Strix Halo system through the USB4 v2/TB5 port on a Minisforum DEG2 eGPU enclosure. I experienced random crashes with both Pop!_OS and Fedora 44, and finally CachyOS. Ultimately, I made the following changes to my system to make it work.
Here is the configuration and workaround that finally worked for me:
iommu=pt
thunderbolt.clx=0
thunderbolt.host_reset=0
pcie_ports=native
pcie_aspm.policy=performance
blacklist nvidia
blacklist nvidia_uvm
install nvidia_drm /bin/false
install nvidia_modeset /bin/false
This keeps GNOME and the desktop on the AMD Strix Halo GPU. It also prevents the NVIDIA GPU from becoming a DRM/KMS display device when no monitor is attached.
A previous configuration allowed /usr/bin/gnome-shell to appear as a graphics process on the NVIDIA GPU, even with Disp.A: Off. Blocking nvidia_drm and nvidia_modeset fixed that. CUDA still works because the compute modules are loaded separately.
When the NVIDIA GPU appears, a udev rule starts a systemd service. The service:
Waits for the PCIe endpoint.
Dynamically finds the NVIDIA GPU address.
Applies the PCIe link-control fix:
setpci -s <GPU_BDF> CAP_EXP+30.w=0020:0020
Loads the compute modules:
modprobe nvidia
modprobe nvidia_uvm
The setpci address must be determined dynamically. On this system, the GPU was 0000:95:00.0; other systems will have a different address.
The important ordering is:
USB4 tunnel up
→ GPU PCIe endpoint appears
→ PCIe link-control setting applied
→ NVIDIA compute modules loaded
Loading NVIDIA before applying the link fix caused the GPU to initialize at 2.5 GT/s x4 and eventually fall off the bus with Xid 79.
nvidia-smi -pm 1
This is now run automatically by the hotplug handler after loading the driver. On this system, persistence mode allowed the GPU to transition correctly to P8 instead of remaining in P0 at roughly 50–90 W while idle.
The working configuration was verified with:
GPU: 0000:95:00.0
PCIe link: 16.0 GT/s x4
nvidia-smi: working
GPU utilization: 0%
Idle state: P8
Idle power: approximately 8 W
The desktop remains on the AMD GPU, while the NVIDIA GPU is reserved for CUDA/compute workloads.
I am able to switch on/off the DEG2 at random without crashes. Ultimately I want to keep my system w/ Strix Halo constantly on, but use the eGPU whenever I need it remotely through a smart plug the Stix Halo can control.