Date: 2026-05-09
Keywords: gpd win max 2 2023, oculink egpu, rx 6700 xt, navi 22, amdgpu reset, ring gfx_0.0.0 timeout, sdma timeout, gamescope, nobara linux, fedora, ppfeaturemask, pcie_gen_cap, opengamepadui, tekken 8 black screen, gravitymark device lost, kwin pageflip timed out, osmeta eg01m, gzosmeta v491.
The final working profile on this machine:
Kernel args (apply via grubby on Nobara/Fedora):
amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x40004
Gamescope/eGPU env:
DRI_PRIME=1002:73df!
MESA_VK_DEVICE_SELECT=1002:73df!
VULKAN_ADAPTER=1002:73df
RADV_DEBUG=nohiz,nodcc
ENABLE_GAMESCOPE_WSI=0
Gamescope display:
eGPU output only, fixed 2560x1600@60, VRR/HDR/adaptive sync off while stabilizing.
Steam/Game Mode:
Use Nobara/OpenGamepadUI session wrapper and SteamOS-style flags.
Do not use -cef-disable-gpu-compositing by default.
Confirmed after the fix:
10-minute nested Gamescope + GravityMark RT: pass
Tekken 8 in Gamescope: 3 matches pass
Steam overlay in-game: pass
Switch to Desktop: pass
Current-boot AMDGPU reset/ring-timeout/AER/flip_done sweep: clean
The single most-load-bearing change was amdgpu.pcie_gen_cap=0x40004 (Gen3-only). Before that the laptop-to-dock OCuLink root span could negotiate to a broken 2.5 GT/s x4 state. After: stable 8.0 GT/s x4. GPD Win Max 2 2023 OCuLink is electrically Gen3 anyway; clamping AMDGPU's expectation to match physical reality fixed link training.
The rest of this doc explains why simpler profiles (amdgpu.runpm=0, amdgpu.aspm=0, pcie_port_pm=off, pcie_gen_cap=0x70007) made things worse here, plus the Gamescope/KWin routing fixes needed alongside the kernel args.
This is a field report and recovery note for a Nobara handheld/laptop eGPU setup that repeatedly hit AMDGPU resets, black screens, Steam Game Mode failures, and Tekken 8 freezes. The final configuration is not guaranteed to be universal, but it turned this machine from "crashes within minutes" into a usable Gamescope/Tekken setup.
- Laptop: GPD Win Max 2 2023
- APU/iGPU: Ryzen 7 7840U / Radeon 780M, AMD device ID
1002:15bf - eGPU dock: GZOSMETA / OSMETA EG01M OCuLink dock, PCB rev V4.91
- eGPU: MSI Radeon RX 6700 XT MECH 2X 12G, Navi 22, AMD device ID
1002:73df - External display: 2560x1600 portable HDMI display
- OS: Nobara Linux, Fedora-based, KDE Plasma
- Kernel at time of fix:
7.0.1-200.nobara.fc43.x86_64 - Mesa at time of fix:
26.0.5 - Gamescope at time of fix:
3.16.19-1.git.20251226.c3cc9b8.fc43
The machine was intentionally configured to work like Windows docked mode:
- If the RX 6700 XT eGPU is connected, prefer it for Plasma/KWin, normal apps, Flatpaks, Steam, Gamescope, and games.
- If the eGPU is absent, fall back to the Radeon 780M iGPU.
- In Steam Gamescope/Game Mode, use only the external eGPU HDMI/DP output. Do not keep the laptop eDP panel in the Gamescope output list.
The failure was initially blamed on Tekken 8, but that was incomplete.
Observed failures:
- Tekken 8 could launch, then black-screen or freeze after roughly 30 seconds to a few minutes.
- Steam overlay or volume/menu actions could trigger a black screen while the game audio/UI sounds continued.
- Xwayland sometimes aborted after the AMDGPU reset.
- Gamescope could flicker on the external display when it selected the wrong mode/path.
- Game Mode could become extremely laggy with the wrong Steam WebHelper flags.
- Switch to Desktop could hang with direct
steam -gamepaduiunder Gamescope.
Important kernel/user-space signatures seen during failures:
amdgpu 0000:03:00.0: device lost from bus!
amdgpu_job_timedout ring gfx_0.0.0 timeout
amdgpu_job_timedout ring sdma0 timeout
amdgpu_job_timedout ring sdma1 timeout
amdgpu: GPU reset begin!
amdgpu: GPU Recovery Failed: -121
[drm] device wedged, but recovered through reset
[CRTC:*] flip_done timed out
Pageflip timed out! This is a bug in the amdgpu kernel driver
Processes named in stuck queues included:
Tekken's GameThread / vkd3d_queue
GravityMark.x64
steamwebhelper
kwin_wayland
Xwayland coredumps showed Mesa/RADV context reset fallout, with stack frames around:
amdgpu_ctx_set_sw_reset_status
amdgpu_cs_submit_ib
xwl_glamor_get_fence
xwl_present_flush_fenced
eglCreateSyncKHR
Native GPU smoke tests were clean:
vkmarkon the RX 6700 XT for 5 minutes: passed, no kernel errors.glmark2on the RX 6700 XT for 5 minutes: passed, no kernel errors.- Power during smoke tests was around 150 W and the eGPU link did not immediately fall over.
But a real heavy Vulkan RT workload reproduced the same class of failure:
- GravityMark 1.72 Vulkan RT, visible window, RX 6700 XT selected.
- 1,000,000 asteroids at 1920x1200.
- About 99% GPU busy and 150-166 W.
- Failed after about 5m13s with:
VK::error(): device lost
ring gfx_0.0.0 timeout
AMDGPU coredump
device wedged, but recovered through reset
That proved the problem was not Tekken-specific. Tekken was just a good reproducer for a bad Navi22/eGPU/OCuLink/Gamescope/Proton path.
The working profile has two layers:
- Boot-level AMDGPU/PCIe profile:
amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x40004
- Gamescope/Steam session profile:
DRI_PRIME=1002:73df!
MESA_VK_DEVICE_SELECT=1002:73df!
VULKAN_ADAPTER=1002:73df
RADV_DEBUG=nohiz,nodcc
ENABLE_GAMESCOPE_WSI=0
Plus Gamescope output constraints:
- Prefer the connected eGPU output only.
- Do not include
eDP-1in the eGPU Gamescope output path. - Force 2560x1600 at 60 Hz.
- Disable VRR/HDR/adaptive sync during stabilization.
- Use Nobara's OpenGamepadUI wrapper and SteamOS-style Game Mode flags.
- Do not use
-cef-disable-gpu-compositingor-cef-disable-gpuby default.
Use grubby on Nobara/Fedora:
sudo grubby --update-kernel=ALL --remove-args="amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x70007 pcie_port_pm=off amdgpu.runpm=0 amdgpu.aspm=0"
sudo grubby --update-kernel=ALL --args="amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x40004"
sudo rebootAfter reboot:
cat /proc/cmdlineExpected:
amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x40004
Why this mattered here:
- Before this, the laptop-to-dock OCuLink/root span could negotiate unstable states.
- One bad diagnostic state showed the root span at
2.5 GT/s x4. - The successful profile put the root OCuLink span at
8.0 GT/s x4. - After that, GravityMark RT passed 10 minutes and Tekken 8 passed multiple matches.
Check the link:
sudo lspci -vv -s 00:01.1 | grep -E "LnkCap|LnkSta"
sudo lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
sudo lspci -vv -s 03:00.0 | grep -E "LnkCap|LnkSta"On this machine the important laptop-to-dock/root span was 8.0 GT/s x4 after the fix. The GPU endpoint behind the dock can still report a different internal dock/GPU link, for example 16.0 GT/s x16; do not confuse that with the external OCuLink span.
This avoids hardcoding current /dev/dri/cardN numbers and avoids the KWin colon parsing trap from PCI by-path names.
File:
~/.config/plasma-workspace/env/10-egpu-prefer.sh
Content:
#!/bin/sh
find_amd_card_by_device_id() {
wanted_device="$1"
for drm_sys_path in /sys/class/drm/card[0-9]*; do
[ -r "$drm_sys_path/device/vendor" ] || continue
[ -r "$drm_sys_path/device/device" ] || continue
vendor="$(cat "$drm_sys_path/device/vendor" 2>/dev/null)"
device="$(cat "$drm_sys_path/device/device" 2>/dev/null)"
if [ "$vendor" = "0x1002" ] && [ "$device" = "$wanted_device" ]; then
card_name="${drm_sys_path##*/}"
card_node="/dev/dri/$card_name"
if [ -e "$card_node" ]; then
printf '%s\n' "$card_node"
return 0
fi
fi
done
return 1
}
egpu_card="$(find_amd_card_by_device_id 0x73df || true)"
igpu_card="$(find_amd_card_by_device_id 0x15bf || true)"
if [ -n "$egpu_card" ]; then
if [ -n "$igpu_card" ] && [ "$igpu_card" != "$egpu_card" ]; then
export KWIN_DRM_DEVICES="$egpu_card:$igpu_card"
else
export KWIN_DRM_DEVICES="$egpu_card"
fi
export DRI_PRIME=1002:73df!
export MESA_VK_DEVICE_SELECT=1002:73df!
export VULKAN_ADAPTER=1002:73df
fiImportant: do not build KWIN_DRM_DEVICES from unescaped /dev/dri/by-path/pci-0000:03:00.0-card paths. KWin uses : as the device-list separator. On this system, that mistake produced a black screen because KWin split the PCI path into nonsense segments and then found no suitable DRM device.
File:
~/.config/gamescope-session-plus/sessions.d/steam
Relevant working content:
# Prefer the OCuLink RX 6700 XT eGPU and its external output for Steam
# Gamescope sessions when the eGPU is connected. If absent, fall back to the
# internal panel.
find_amd_card_by_device_id() {
wanted_device="$1"
for drm_sys_path in /sys/class/drm/card[0-9]*; do
[ -r "$drm_sys_path/device/vendor" ] || continue
[ -r "$drm_sys_path/device/device" ] || continue
vendor="$(cat "$drm_sys_path/device/vendor" 2>/dev/null)"
device="$(cat "$drm_sys_path/device/device" 2>/dev/null)"
if [ "$vendor" = "0x1002" ] && [ "$device" = "$wanted_device" ]; then
card_name="${drm_sys_path##*/}"
printf '%s\n' "/dev/dri/$card_name"
return 0
fi
done
return 1
}
find_connected_connector_for_card() {
card_name="$1"
for connector in HDMI-A-1 DP-1 DP-2 DP-3 HDMI-A-2 DP-4 DP-5 DP-6 DP-7 DP-8 DP-9; do
status_file="/sys/class/drm/${card_name}-${connector}/status"
[ -r "$status_file" ] || continue
if [ "$(cat "$status_file" 2>/dev/null)" = "connected" ]; then
printf '%s\n' "$connector"
return 0
fi
done
return 1
}
egpu_card="$(find_amd_card_by_device_id 0x73df || true)"
if [ -n "$egpu_card" ]; then
egpu_card_name="${egpu_card##*/}"
egpu_connector="$(find_connected_connector_for_card "$egpu_card_name" || true)"
if [ -n "$egpu_connector" ]; then
export OUTPUT_CONNECTOR="${egpu_connector}"
else
export OUTPUT_CONNECTOR="HDMI-A-1,DP-1,DP-2,DP-3"
fi
export DRM_MODE=fixed
export CUSTOM_REFRESH_RATES=60
export STEAM_DISPLAY_REFRESH_LIMITS=60,60
export SCREEN_WIDTH=2560
export SCREEN_HEIGHT=1600
export INTERNAL_WIDTH=2560
export INTERNAL_HEIGHT=1600
export FORCE_COMPOSITION=1
export STEAM_GAMESCOPE_VRR_SUPPORTED=0
export STEAM_GAMESCOPE_HDR_SUPPORTED=0
unset ADAPTIVE_SYNC
export GAMESCOPECMD="/usr/bin/gamescope -W 2560 -H 1600 -w 2560 -h 1600 -r 60 --framerate-limit 60 --generate-drm-mode fixed --force-composition --disable-layers --disable-color-management --custom-refresh-rates 60 --prefer-output ${OUTPUT_CONNECTOR} --prefer-vk-device 1002:73df --xwayland-count 2 --default-touch-mode 4 --hide-cursor-delay 3000 --fade-out-duration 200 --steam"
export VULKAN_ADAPTER=1002:73df
export DRI_PRIME=1002:73df!
export MESA_VK_DEVICE_SELECT=1002:73df!
export RADV_DEBUG="${RADV_DEBUG:-nohiz,nodcc}"
export ENABLE_GAMESCOPE_WSI=0
export STEAM_ENABLE_VOLUME_HANDLER=0
steam_gamepad_cmd="steam -steamdeck -steamos3 -steampal -steamdeck -gamepadui"
if [ -x /usr/share/opengamepadui/opengamepad-ui.x86_64 ]; then
export CLIENTCMD="/usr/share/opengamepadui/opengamepad-ui.x86_64 --overlay-mode -- ${steam_gamepad_cmd}"
else
export CLIENTCMD="${steam_gamepad_cmd}"
fi
else
export OUTPUT_CONNECTOR=eDP-1
unset GAMESCOPECMD
unset VULKAN_ADAPTER
unset DRI_PRIME
unset MESA_VK_DEVICE_SELECT
export STEAM_ENABLE_VOLUME_HANDLER=0
steam_gamepad_cmd="steam -steamdeck -steamos3 -steampal -steamdeck -gamepadui"
if [ -x /usr/share/opengamepadui/opengamepad-ui.x86_64 ]; then
export CLIENTCMD="/usr/share/opengamepadui/opengamepad-ui.x86_64 --overlay-mode -- ${steam_gamepad_cmd}"
else
export CLIENTCMD="${steam_gamepad_cmd}"
fi
fiDo not assume these are bad everywhere, but they were bad on this machine.
The aggressive profile:
amdgpu.ppfeaturemask=0xfffd3fff amdgpu.aspm=0 amdgpu.runpm=0 pcie_aspm=off
made the desktop eGPU display immediately hit repeated KWin pageflip stalls:
Pageflip timed out! This is a bug in the amdgpu kernel driver
flip_done timed out
That profile was rolled back.
This did not fix the later RX 6700 XT failures. Previous boot logs still showed SDMA timeouts and GPU reset failure.
This initially looked promising, but a later nested Gamescope/GravityMark run showed the laptop-to-dock span in a bad 2.5 GT/s x4 state. The Gen3-only mask 0x40004 was the one that produced the stable 8.0 GT/s x4 root span here.
Direct Big Picture under Gamescope caused Switch to Desktop to hang on this Nobara setup. Keeping the OpenGamepadUI wrapper plus Nobara/SteamOS-style Steam flags made Switch to Desktop work again.
This was tested to avoid Steam WebHelper GLX/SteamUI overlay problems. It made Game Mode very laggy, and Switch to Desktop hung. Steam logs explicitly said WebHelper disabled GPU acceleration due to the flag.
The working setup does not use:
-cef-disable-gpu-compositing
-cef-disable-gpu
After applying:
amdgpu.ppfeaturemask=0xfffd3fff pcie_aspm=off amdgpu.pcie_gen_cap=0x40004
and using:
RADV_DEBUG=nohiz,nodcc
ENABLE_GAMESCOPE_WSI=0
the following passed:
- Nested Gamescope + GravityMark RT for 10 minutes at about 99% GPU busy.
- Root OCuLink span stayed at
8.0 GT/s x4. - GravityMark RT run had no
VK::error(): device lost. - Kernel logs had no AMDGPU coredump, no
ring .*timeout, nodevice wedged. - Tekken 8 in Steam Gamescope/Game Mode ran for 3 matches.
- Steam overlay worked in-game.
- Game Mode UI was no longer laggy.
- Switch to Desktop worked.
Post-test kernel check:
journalctl -k -b --no-pager | grep -Ei "ring .*timeout|gpu reset|device wedged|device lost|flip_done|AER:|D3cold|GPU Recovery Failed|amdgpu.*page fault"Expected after the successful run: no real errors. Benign boot-time lines saying PME supports D3cold are not the same thing as a failed D3cold wake.
Run these after a crash, especially after rebooting from a hard freeze:
cat /proc/cmdline
journalctl -k -b --no-pager | grep -Ei "amdgpu|gpu reset|ring gfx|ring sdma|aspm|aer|d3cold|flip_done|device lost|device wedged|GPU Recovery Failed" | tail -200
journalctl -k -b -1 --no-pager | grep -Ei "amdgpu|gpu reset|ring gfx|ring sdma|aspm|aer|d3cold|flip_done|device lost|device wedged|GPU Recovery Failed" | tail -200
sudo lspci -vv -s 00:01.1 | grep -E "LnkCap|LnkSta"
sudo lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
sudo lspci -vv -s 03:00.0 | grep -E "LnkCap|LnkSta"Interpretation:
ring gfx_0.0.0 timeoutplusvkd3d_queue,GameThread, orGravityMark.x64: real GPU workload hang.ring sdma0orring sdma1 timeout: can be part of the same AMDGPU reset/failure chain.device lost from bus: stronger evidence of PCIe/eGPU link or power-management trouble.AER: Corrected errorrapidly increasing: suspect OCuLink signal integrity, cable seating, dock, or port.Unable to change power state from D3cold to D0: runtime PM problem.flip_done timed outor KWin pageflip storms at idle: the boot profile may be too aggressive for the display path.- Root span falling to
2.5 GT/sorWidth x1/x2: suspect link training/cable/dock/port behavior.
This setup may expose several overlapping bugs or fragile interactions:
- Navi22/RADV heavy Vulkan RT or VKD3D workloads can trigger
gfx_0.0.0timeouts on this eGPU path. - The same card can pass simple Vulkan/OpenGL smoke tests, so a short
vkmarkpass is not enough. - Forcing the AMDGPU PCIe generation capability to Gen3-only with
amdgpu.pcie_gen_cap=0x40004changed the observed root span from broken/unstable training to stable8.0 GT/s x4. - The aggressive
amdgpu.runpm=0 amdgpu.aspm=0profile caused KWin pageflip/flip_done failures here, even though it is commonly suggested for eGPU runtime-PM problems. - Gamescope's Vulkan WSI hook layer was an instability multiplier here;
ENABLE_GAMESCOPE_WSI=0was part of the working setup. - Direct
steam -gamepaduiunder Gamescope can hang Switch to Desktop; this matches existing Steam/Game Mode reports. - Disabling Steam CEF GPU compositing can hide one class of WebHelper issue but made Game Mode slow and unreliable here.
- AMDGPU kernel module parameters: https://docs.kernel.org/gpu/amdgpu/module-parameters.html
- Steam stuck at Switching to Desktop when launched in Big Picture under Gamescope: ValveSoftware/steam-for-linux#11749
- eGPU.io report thread with GPD Win Max 2 + OSMETA OCuLink + AMD eGPU driver timeouts: https://egpu.io/forums/builds/2023-gpd-win-max-2-dgpu-7k-8c-u-radeon-7900-xtx-64gbps-osmeta-gk01-oculink-windows-11-22h2/paged/4/
- AMD Community thread with GPD Win Max 2 + OCuLink eGPU driver timeouts: https://community.amd.com/t5/pc-drivers-software/constant-drivers-timeout-rx-9070xt-oculink-egpu/td-p/752998
(See TL;DR at the top of this doc for the final working recipe and validation results.)