RTX 5090 Xid 79 on idle fix

I run CachyOS btw.

For now it is on kernel 7.2.7-1-cachyos and Nvidia driver 615.71.09

I have RTX 5090 ASUS ROG Astral with Ryzen 9950X3D on ASRock Taichi Lite x870e and the only thing annoying me on this magnificent setup is Xid 79 errors from time to time when the display is idle for 3 or more hours. Xid 79 can happen while idle, or when the display wakes up from idle after a long idle stay.

It looks like eventually I figured out how to fix this. The solution is to disable ASPM, but in the proper way.

I have ASPM disabled in BIOS like this

Advanced->AMD PBS->AMD Common Platform Module->PM L1 SS: Disabled

But it turns out it only disables L1.1 and L1.2 states of ASPM, but not ASPM itself.

Also, the kernel parameter pcie_aspm=off does not disable ASPM, it disables the kernel's ability to manipulate ASPM. If you use this parameter, you have to remove it.

If your GPU is PCI device 01:00.0, you can check ASPM state with this command

sudo lspci -vvv -s 01:00.0 | grep -A3 LnkCtl

We are going to achieve a result like this

LnkCtl: ASPM Disabled; RCB 64 bytes, LnkDisable- CommClk+
    ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- FltModeDis-

To identify which PCI device is your GPU use sudo lspci and look for something like this

01:00.0 VGA compatible controller: NVIDIA Corporation GB202 [GeForce RTX 5090] (rev a1)

And there is a tricky part. We also have to disable ASPM on the upstream PCI bridge. To identify it, use the command lspci -t and look where your GPU is connected.

My GPU is at 01:00.0 — meaning it's on bus 01, device 00, function 0.

-[0000:00]-+-00.0
           +-00.2
           +-01.0
           +-01.1-[01]--+-00.0   <- bus [01] hangs off this port
           |            \-00.1

That means the upstream bridge is 01.1 at root 0000:00 00:01.1 And you can check ASPM state using this command

sudo lspci -vvv -s 00:01.1 | grep -A3 LnkCtl

To disable ASPM use these two commands

sudo setpci -s 00:01.1 CAP_EXP+10.w=0000:0003
sudo setpci -s 01:00.0 CAP_EXP+10.w=0000:0003

But it's better to make it a systemd service

Create the file

sudo nvim /etc/systemd/system/disable-aspm.service

With this content

[Unit]
Description=Disable PCIe ASPM at hardware register level
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/setpci -s 00:01.1 CAP_EXP+10.w=0000:0003
ExecStart=/usr/bin/setpci -s 01:00.0 CAP_EXP+10.w=0000:0003
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Enable and run it

sudo systemctl enable --now disable-aspm.service

Bonus: things that could be connected to stability I achieved

I disabled Dynamic Power Management in nvidia kernel module parameters

Create the file

sudo nvim /etc/modprobe.d/nvidia.conf

With this content

options nvidia NVreg_DynamicPowerManagement=0x00

Regenerate initramfs image

sudo mkinitcpio -P

After reboot check that it was applied with this command

cat /proc/driver/nvidia/params | grep -i DynamicPowerManagement

And undervolt GPU with nvoc

You can install it from AUR paru -S nvoc-cli

I run sudo nvoc -c 800,2900 -o 1000 -m 2000 -p 100 and got almost 100W less under heavy load compared to without it.

Check stability with gpu-burn

Monitor GPU in real time

watch -n 1 nvidia-smi --query-gpu=clocks.gr,clocks.max.gr,power.draw --format=csv

To run it as a systemd service, create the file

sudo nvim /etc/systemd/system/nvidia-clocks.service

With this content

[Unit]
Description=Nvidia GPU clocks
After=systemd-udev-settle.service local-fs.target
Wants=systemd-udev-settle.service

[Service]
Type=oneshot
ExecStart=/usr/bin/nvoc -c 800,2900 -o 1000 -m 2000 -p 100
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Enable and run it

sudo systemctl enable --now nvidia-clocks.service