If you’re running a Samsung 49-inch Odyssey G9 with an AMD GPU on Linux, you’ve likely experienced the monitor flickering on and off every few seconds. I discovered a fix while using Manjaro (with GRUB). The fix worked nicely, but after switching to CachyOS, I ran into some roadblocks before getting my monitor back up and running.
The Problem
According to this AMD driver issue, the problem stems from Display Stream Compression (DSC). As other users experienced, my monitor works fine when driven at 60Hz or 120Hz, but not 240Hz. Now, I paid for 240Hz, so I want the monitor to work at 240Hz. In the comments, Robert Swiecki figured out that adjusting the PixelClock will stabilize the monitor. He provided a modified EDID firmware file. The only problem is that Robert’s solution does not support VRR. Fortunately, GitHub user vpraion has created a modified EDID that supports these features.
Despite this, the provided guides are GRUB-specific, and don’t cover systemd-boot which this guide addresses.
Prerequisites
This guide assumes you’re running a systemd-boot distro (such as CachyOS), systemd-boot, an AMD GPU, and a Samsung Odyssey G9 (tested on LC49G95T).
The Solution
Download the EDID
Grab the EDID from the repo. At the time of writing, it’s the LC49G95.bin file in the edids folder. Copy this file to the firmware directory:
sudo mkdir -p /usr/lib/firmware/edid
sudo cp LC49G95.bin /usr/lib/firmware/edid/LC49G95.bin
Configure initramfs
Edit your initramfs configuration file.
sudo nano /etc/mkinitcpio.conf
Locate the array called FILES. Add the path to the EDID here.
# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
FILES=(/usr/lib/firmware/edid/LC49G95.bin)
Regenerate your initramfs:
sudo mkinitcpio -P
Find your display port
The firmware needs to know which port your display is using. Use xrandr to find the port ID:
xrandr -q
Screen 0: minimum 16 x 16, current 5120 x 1440, maximum 32767 x 32767
DP-1 connected primary 5120x1440+0+0 (normal left inverted right x axis y axis) 1193mm x 336mm
My display is connected to DP-1. Yours might be different, so take note and ensure you replace any future occurrences of DP-1 with your port ID.
Configure sdboot-manage
The entries in the bootloader are automatically generated using sdboot-manage. To ensure your custom firmware persists between updates, modify sdboot-manage.conf.
sudo nano /etc/sdboot-manage.conf
You’ll see a variable called LINUX_OPTIONS. Add drm.edid_firmware=DP-1:edid/LC49G95.bin to the end of the line.
LINUX_OPTIONS="zswap.enabled=0 nowatchdog splash drm.edid_firmware=DP-1:edid/LC49G95.bin"
Save the file and regenerate your boot entries:
sudo sdboot-manage gen
Done!
At this point, everything is in its place. Reboot, and the flickering should be gone.
Conclusion
This monitor has its quirks, but with the flickering resolved, the OLED panel and 240Hz refresh rate make it worth the trouble. I hope this guide helped.