You upgraded Fedora and the desktop feels sluggish
You boot Fedora on a laptop with Ryzen integrated graphics. The desktop loads, but moving windows feels like dragging molasses. Video playback stutters at 1080p. You check the system monitor and see the CPU spiking while the GPU usage sits at zero. The hardware is capable, but the kernel isn't talking to it correctly.
This scenario usually points to missing firmware or disabled power management. Fedora ships the amdgpu driver by default, but the driver needs binary firmware blobs to initialize the display engine. It also needs explicit kernel parameters to enable dynamic clock scaling. Without these, the GPU runs at a fixed low frequency or falls back to software rendering.
What's actually happening
The amdgpu kernel module handles all modern AMD graphics hardware. It relies on two mechanisms to deliver performance. First, the driver loads firmware files from /lib/firmware/amdgpu/ during initialization. These blobs configure the display controller, power domains, and compute units. If the firmware is missing, the driver loads but the hardware remains uninitialized. The system falls back to llvmpipe, a CPU-based software renderer that chokes on 3D workloads.
Second, the kernel controls power management through module parameters. Some laptop BIOS implementations report hardware quirks that make the kernel conservative. The kernel may disable runtime power management to avoid crashes on older firmware. This locks the GPU at a low clock speed. You get stability, but you lose performance. The GPU never boosts when you need it.
Fedora provides the firmware in the linux-firmware package. Minimal installations or older systems might not have this package. The akmod-amdgpu package ensures the driver builds against your specific kernel. Fedora uses akmod to keep out-of-tree modules synchronized with kernel updates. The akmods service rebuilds the driver automatically when the kernel changes.
Reboot after changing kernel parameters. The kernel reads arguments only at startup.
Install the firmware and driver
Verify the firmware package is present and install the driver module if missing. The linux-firmware package contains the binary blobs. The akmod-amdgpu package provides the driver source and build infrastructure.
# Check if the firmware package is installed. The output should show a version number.
# If the package is missing, the GPU cannot initialize properly.
rpm -q linux-firmware
# Install the firmware and the kernel module generator.
# akmod-amdgpu builds the driver against your running kernel automatically.
# linux-firmware provides the binary blobs the GPU needs to initialize.
sudo dnf install akmod-amdgpu linux-firmware
# Rebuild the initramfs so the new firmware is available at boot.
# The initramfs must contain firmware for early hardware initialization.
# This step is essential after adding firmware or kernel modules.
sudo dracut --force
The dracut command regenerates the initial ramdisk for all installed kernels. The initramfs is a temporary root filesystem loaded before the real root. It contains drivers and firmware needed to mount the root disk and initialize hardware. If firmware is missing from the initramfs, the driver loads too late or fails. Running dracut --force embeds the new firmware into the boot image.
Use akmod-amdgpu when you want the driver to rebuild automatically after every kernel update. Use kmod-amdgpu when you are on a locked-down system where building packages from source is prohibited. Stay on akmod for desktop systems. It handles kernel updates without manual intervention.
Enable power management and scaling
Add kernel arguments to enable power management and performance scaling. Fedora uses grubby to manage bootloader configuration. grubby modifies boot entries directly and handles multiple kernels. It is the supported tool for kernel parameters. Editing /etc/default/grub manually can cause drift between the config file and actual boot entries.
# Add kernel arguments to enable power management and performance scaling.
# --update-kernel=ALL applies the change to every installed kernel.
# amdgpu.runpm=1 forces runtime power management on.
# amdgpu.powerplay=1 enables the performance scaling engine.
sudo grubby --update-kernel=ALL --args="amdgpu.runpm=1 amdgpu.powerplay=1"
# Verify the arguments were added correctly.
# The output should list the new flags at the end of the kernel line.
grubby --info=ALL | grep args
The amdgpu.runpm=1 parameter enables runtime power management. The GPU can now clock down when idle and boost under load. The amdgpu.powerplay=1 parameter activates the performance scaling engine. This allows the driver to adjust voltage and frequency based on workload. Without these flags, the GPU may stay at a fixed low frequency.
Check dmesg for firmware errors before reinstalling drivers. The kernel log shows exactly which firmware file failed to load.
Verify the fix
Reboot the system. After login, check that the driver loaded with the correct parameters and hardware acceleration is active.
# Check the kernel log for the amdgpu driver initialization.
# Look for lines mentioning "Power play initialized" or "runpm enabled".
dmesg | grep -i amdgpu | grep -i power
# Verify hardware acceleration is active.
# The renderer should list "AMD Radeon" or a specific chip name like "Renoir".
# If you see "llvmpipe", the system is using software rendering.
glxinfo | grep "OpenGL renderer"
# Check Vulkan support for modern 3D workloads.
# vulkaninfo is verbose. Grep for the device name to confirm the driver.
vulkaninfo | grep -A 2 "deviceName"
The glxinfo output confirms OpenGL acceleration. The renderer string must show the AMD hardware name. llvmpipe indicates software rendering. The vulkaninfo output confirms Vulkan support. Most modern games and applications use Vulkan. The vulkan-radeon package provides the driver. Fedora installs this by default, but verify it is present if you see Vulkan errors.
Run journalctl -xe if the desktop is unstable. The x flag adds explanatory text and the e flag jumps to the end. Look for errors tagged with amdgpu. SELinux denials can also block driver operations. Check journalctl -t setroubleshoot for SELinux messages. Do not disable SELinux. Fix the policy or restore context instead.
Common pitfalls and error patterns
If glxinfo reports llvmpipe, the system is using CPU-based software rendering. This happens when the amdgpu module fails to load or the firmware is missing. Check journalctl -xe for errors tagged with amdgpu. You might see Failed to load firmware amdgpu/.... Ensure linux-firmware is installed and dracut ran successfully.
Secure Boot can block akmod modules. If you enabled Secure Boot, you must enroll the MOK key during the akmod installation. If you skipped the enrollment screen, the module won't load, and you fall back to software rendering. Disable Secure Boot in the BIOS or follow the MOK enrollment process. Fedora's documentation covers MOK enrollment in detail.
Some older laptop models exhibit display corruption or random freezes with aggressive power management. If you encounter these symptoms, disable runtime power management. Add amdgpu.runpm=0 to the kernel arguments. This locks the GPU at a safe frequency. You lose performance scaling, but you gain stability.
The amdgpu driver replaced the old radeon driver years ago. Fedora does not ship radeon. If you see radeon in logs, something is wrong. The system might be trying to load a legacy module. Blacklist radeon if it appears. Use amdgpu for all AMD hardware.
Trust the package manager. Manual file edits drift, snapshots stay.
When to use specific parameters
Use amdgpu.runpm=1 when you want dynamic clock scaling and battery savings on laptops. Use amdgpu.runpm=0 when you encounter display corruption or random freezes on older laptop models. Use amdgpu.powerplay=1 when you need performance scaling for gaming or compute workloads. Use amdgpu.powerplay=0 when the system hangs during suspend or resume cycles. Use amdgpu.gpu_recovery=1 when you experience GPU hangs and want the driver to attempt recovery. Stay on the default kernel parameters if your hardware is recent and stable.