So this is Burrs' TV gaming setup now. Was a fun Project - GPD Win 4 2024, Ryzen 7 8840U, 32GB RAM, 4TB NVMe. RX 9070 XT over OCuLink on a Minisforum DEG1 dock. Bazzite.

Getting it here meant writing systemd services to kill PCIe power management before it killed the oculink connection, udev rules to keep OpenRGB from raving on every wake cycle, and a lot of dmesg. Junction temps sit at 60C under load.

For reference, a PS5 Pro runs a Zen 2 CPU from 2020, 16GB RAM, and 2TB of storage. This is a current-gen Zen 4, 32GB RAM, 16GB VRAM, 4TB, an RDNA 4 GPU with roughly 3x the graphics muscle of the PS5 Pro, and the full Switch library. Undocked it's a handheld. Docked it's this science-projecty, but pretty cool little thing.

#Linux #Bazzite #eGPU #OCuLink #GPDWin4 #RDNA4 #RX9070XT #AMD #LinuxGaming #HandheldPC #PCGaming #FOSS #Fediverse

@LeoBurr When I first saw the picture I thought that was a PSP.! Neat rig!
@xoagray It has PS Vita/PSP vibes. The screen slides up to reveal a keyboard as well.
@LeoBurr Very cool! :)
@xoagray It's been fun. Writing a script to disable wireless when ethernet through the dock is detected as well. Rather than just having the handheld sitting there and needing a PC or console on the TV, it makes sense to just have this thing do double duty.
@LeoBurr Makes sense to me. It's basically doing what a Steam Deck or Switch does but with more horsepower. :)
@LeoBurr ooo. What udev rules do you use for openRGB? I have issues with the vomit of colour at startup as well o.o

@Jencen

It's a few pieces working together.

The udev rule watches for the eGPU on the PCIe bus and triggers a systemd service. The service loads i2c-dev, waits for the GPU to fully initialize, then runs OpenRGB AppImage with --noautoconnect -d 0 --mode static --color 000044. There's also a matching sleep hook in /etc/systemd/system-sleep/ that does the same on wake, since the GPU resets its RGB every time it loses power. (Mine is just continually powered on, but this is a just-in-case thing)

The udev rule (appended to whatever rules file you're already using for the GPU):

ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x7550", TAG+="systemd", ENV{SYSTEMD_WANTS}+="egpu-rgb.service"

The service at /etc/systemd/system/egpu-rgb.service:

[Unit]
Description=Set eGPU RGB to dark blue
After=multi-user.target

[Service]
Type=oneshot
WorkingDirectory=/tmp
ExecStartPre=/sbin/modprobe i2c-dev
ExecStartPre=/bin/sleep 20
ExecStart=/usr/local/bin/OpenRGB.AppImage --noautoconnect -d 0 --mode static --color 000044
RemainAfterExit=yes

The sleep hook at /etc/systemd/system-sleep/egpu-rgb-wake.sh:

#!/bin/sh
case $1 in
post)
if lspci -d 1002:7550 | grep -q .; then
/sbin/modprobe i2c-dev && sleep 5 && cd /tmp && /usr/local/bin/OpenRGB.AppImage --noautoconnect -d 0 --mode static --color 000044
fi
;;
esac

Couple of gotchas to be aware of: OpenRGB AppImage crashes if it can't write to ./logs (this is Bazzite), so WorkingDirectory=/tmp is important. The sleep in the service gives the eGPU time to come up on i2c before OpenRGB tries to talk to it. And the lspci check in the wake hook means it won't error out if you're running undocked with a device like mine.

Swap the vendor/device IDs and the color for your card and you're set.