The scenario
You boot Fedora and the desktop flickers violently, or you see purple squares tearing across the screen while scrolling a web page. The system remains responsive, but the display is unusable. This happens most often after a kernel update or a fresh install on newer AMD hardware. The open-source driver is loaded, but the power management or display engine is misbehaving.
Check the logs. The kernel usually warns before the display breaks.
What is happening
The amdgpu kernel module handles communication between the OS and your AMD graphics card. It manages memory, rendering, and power states. Artifacts usually mean the GPU is writing to the wrong memory address or the display controller is losing sync. Flickering often points to power management issues where the GPU drops to a low-power state too aggressively and fails to wake up cleanly.
Think of it like a car engine that stalls every time you take your foot off the gas. The hardware is fine, but the control logic is too eager to save fuel. Fedora ships with the amdgpu driver enabled by default. It is the only supported path for AMD GPUs. There is no proprietary AMD driver for Linux. The fix involves ensuring the driver matches the kernel, then tuning the power management parameters if the default behavior is too aggressive for your specific silicon.
Fedora uses akmod packages to build kernel modules dynamically. The akmod-amdgpu package contains the source code. When you install a new kernel, the system compiles the amdgpu module against that kernel automatically. If this process fails, the driver falls back to a generic mode or fails to load, causing display corruption.
The hardware is stable. The driver logic is the variable.
Apply the fix
Start by ensuring the system has the latest kernel and the dynamic kernel module infrastructure is present. Run the update command with the refresh flag to force metadata synchronization. This prevents stale package lists from hiding the latest fixes.
sudo dnf upgrade --refresh # Refresh metadata to catch the latest packages immediately
sudo dnf install akmod-amdgpu # Install the dynamic module builder for amdgpu
sudo reboot # Reboot to load the new kernel and compiled modules
The akmod service runs during boot. If the module is missing, it compiles it on the fly. This ensures the driver always matches the running kernel. If you see Error: Transaction test error during the update, a dependency conflict is blocking the transaction. Run dnf upgrade --refresh again. The conflict usually resolves once the metadata is fully synchronized.
If the screen still flickers after the update, disable runtime power management. This forces the GPU to stay in a stable performance state. The grubby tool is the Fedora standard for modifying kernel boot parameters. It updates all installed kernels, so you do not have to worry about the next update breaking the fix.
sudo grubby --update-kernel=ALL --args="amdgpu.runpm=0" # Disable runtime power management for all kernels
sudo reboot # Reboot to apply the kernel parameter change
The amdgpu.runpm=0 flag tells the driver to skip dynamic power gating. This increases power consumption slightly but eliminates the state transitions that cause flickering on some chips. Never edit /etc/default/grub manually on Fedora. The grubby tool manages kernel arguments. Manual edits drift and get lost during updates. Always use grubby --update-kernel=ALL --args="...".
If the graphical interface is completely frozen, switch to a text console to apply fixes. The TTY session runs independently of the display server.
# Press Ctrl+Alt+F3 to switch to TTY3
# Login with your username and password
sudo grubby --update-kernel=ALL --args="amdgpu.runpm=0" # Apply fix from TTY
sudo reboot # Reboot to restore display
Reboot immediately. Parameters do not apply to a running kernel.
Verify the result
Confirm the driver is loaded and the parameter is active. The dmesg command shows kernel ring buffer messages. Filter for amdgpu to see initialization status. The sysfs interface exposes kernel parameters as files. Reading the file shows the current value.
dmesg | grep amdgpu | head -n 10 # Check kernel logs for driver initialization messages
cat /sys/module/amdgpu/parameters/runpm # Verify the power management flag is set to N
The dmesg output should show amdgpu initializing without errors. Look for lines containing amdgpu: amdgpu kernel modesetting enabled. If you see amdgpu: probe of 0000:03:00.0 failed with error -22, the driver rejected the hardware. This usually means the kernel is too old for the GPU generation. Run dnf upgrade again and reboot.
The runpm file should return N if the parameter is applied. If it returns Y, the parameter did not stick. Check grubby output for errors. The journalctl -xe command provides a readable view of boot logs with explanatory text. Use it if dmesg is unclear.
journalctl -xeu systemd-modules-load.service # Check if module loading service failed
Trust sysfs. Logs can be stale, sysfs reflects current state.
Common pitfalls
If you see [drm:amdgpu_dm_atomic_check] *ERROR* Invalid stream in the logs, the display configuration is broken. This often happens with multi-monitor setups. Disconnect all monitors except one and test. If the flickering stops, the issue is a specific output port or cable, not the driver.
Firmware mismatches can cause artifacts. The linux-firmware package contains binary blobs required by the GPU. Ensure it is up to date.
sudo dnf install linux-firmware # Install the latest firmware package
sudo reboot # Reboot to load new firmware into initramfs
The akmod build process requires development headers. If the module fails to compile, the gcc and make packages are missing. Install the development tools group.
sudo dnf groupinstall "Development Tools" # Install compilers and build utilities
sudo dnf reinstall akmod-amdgpu # Trigger a rebuild of the module
sudo reboot # Reboot to load the newly compiled module
If the system fails to boot entirely, use the nomodeset parameter to disable GPU acceleration. This forces the system to use basic framebuffer graphics. It is slow but allows access to the disk for recovery.
# Boot into the GRUB menu
# Press 'e' to edit the boot entry
# Add nomodeset to the line starting with linux
# Press Ctrl+X to boot
Use grubby. Manual edits vanish on the next update.
Decision matrix
Use amdgpu.runpm=0 when flickering occurs only during idle periods or when the screen dims. Use amdgpu.dc=0 when the display engine crashes entirely and the screen goes black. Use amdgpu.gpu_recovery=1 when you encounter hard hangs that require a power cycle. Use nomodeset when the system fails to boot and you need to access the disk to recover data. Stay on default settings if the system is stable and power efficiency is the priority.
Pick the parameter that matches the symptom. Guessing wastes time.