Julius am :
Vielen Dank dir für die sehr gut geschriebene Anleitung!
Unter Windows lassen sich relativ einfach die FreeSync-Grenzwerte von Monitoren anpassen. Unter Linux geht das auch, aber es ist weniger einfach – und bei mir war es auch nicht erfolgreich. Trotzdem hier der Zusammenschrieb, für einen erneuten Versuch in der Zukunft.
Im Grunde kann man in großen Teilen dieser Anleitung folgen (die ich leider erst jetzt fand), aber ich musste zusätzlich mit dracut arbeiten um die neue Konfiguration beim Booten laden zu können.
Wie man FreeSync überhaupt aktiviert habe ich in einem früheren Artikel schonmal beschrieben.
Die Anpassung sollte harmlos sein, aber garantieren kann das niemand. Und selbst wenn sie nur nicht erfolgreich ist, kann nach den folgenden Änderungen der Monitor unter X auch ganz ausbleiben, sodass dann die Konfiguration in der Konsole zurückgestellt werden oder der Monitor solange an einen anderen Grafikkartenanschluss muss. Man sei sich dem bewusst.
Die EDID ist eine Datei mit den Metadaten des Monitors. In ihr steht auch die FreeSync-Konfiguration. Sie wird beim Starten des Grafiktreibers geladen. Normalerweise läuft das automatisch, aber wir können sie abfangen.
xbps-install read-edid sudo modprobe i2c-dev sudo get-edid > edid.bin
xbps-install
ist der Paketmanager unter void, unter Ubuntu ersetzt man das mit apt install
.
Die soeben erstellte edid.bin kann wxedid nun editieren. Bei mir war das Programm nicht in den Quellen. Daher musste ich manuell ein Release von SourceForge herunterladen, entpacken und kompilieren:
./configure make ./wxedid
Mit dem Programm lässt sich jetzt die edid.bin öffnen. Der für uns interessante Reiter ist "MRL: Monitor Range Limits". Der Eintrag min_vFreq ist die Untergrenze, max_vFreq die Obergrenze. Die jetzt editieren, danach die Datei neu exportieren.
Verschiebe diese neue Datei nun nach /lib/firmware/edid/new_edid.bin
Die EDID lässt sich bei NVIDIA-Treibern per xorg.conf laden, wie das Arch-Wiki beschreibt. Falls noch nicht vorhanden, erstelle dir einen Screen-Konfigurationsblock, z.B. unter /usr/share/X11/xorg.conf.d/20-screen.conf:
Section "Screen" Identifier "Screen0" Device "nvidia" # könnte auch anders heißen Option "CustomEDID" "$MONITOR:/lib/firmware/edid/new_edid.bin" EndSection
$MONITOR muss noch mit der richtigen ID des Monitors ersetzt werden. Die findet sich per xrandr
, war bei mir wie oben zu sehen also DisplayPort-1.
Das sollte es für NVIDIA-Nutzer auch schon gewesen sein. Da ich eine Grafikkarte von AMD benutze konnte ich das aber nicht richtig testen.
Der amdgpu-Treiber kennt CustomEDID aber nicht, deshalb da der folgende Ansatz.
Es kann sein, dass es bei deinem System für diesen Schritt ausreichte die Datei nach /lib/firmware/edid/ zu verschieben.
Bei mir reichte das nicht, wohl weil die initramfs die EDID laden würde, sie aber auf diesen Ordner keinen Zugriff hat. Ich bekam dann später nach Setzen des Bootparameters diese Fehlermeldung:
*ERROR* Requesting EDID firmware new_edid.bin failed (err=-2)
Mit dracut ändert man das so:
sudo dracut -i /lib/firmware /lib/firmware --force
Der Befehl bläst die initramfs leider sehr auf und man müsste das regelmäßig machen, wenn ich herausfinde wie man das richtig konfiguriert und zielgerichtet nur die EDID-Datei hinzufügt wird dieser Artikel editiert. Aber zum Testen reicht es.
Allerdings benutzt nicht jede Distribution dracut. Dieser Launchpadbug beschreibt eine Lösung für Ubuntus initramfs-tools, was die meisten anderen Distributionen abdecken dürfte.
Um die EDID dann auch wirklich zu laden setzt man in der /etc/default/grub den Parameter drm.edid_firmware:
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=4 … drm.edid_firmware=DP-2:edid/new_edid.bin"
DP-2 ist systemabhängig und folgt nicht der gleichen Nummerierung wie xrandr. Die richtige findet man mit
grep . /sys/class/drm/card-/status
Nicht vergessen die neue grub-Konfiguration auch anzuwenden:
sudo update-grub
Beim nächsten Neustart sollte der Treiber den Monitor nun gemäß der neuen EDID ansprechen. Zum Testen empfehle ich wieder VRRTest.
Für meinen Acer CB242Y hat die ganze Aktion nichts gebracht. Erhöhe ich die obere Grenze, wird alle paar Sekunden der Bildschirm schwarz. Senke ich die untere Grenze, wird der Bildschirm schwarz sobald die FPS unter 48 fallen.
Ich fand ein paar Kommentare von Nutzern, bei denen diese Freesync-Anpassung unter Windows ging, aber unter Linux nicht. Es kann durchaus sein, dass die anderen Treiber da mehr herausholen können, oder dass die unter Windows benutzte Software wie CRU beim Editieren der EDID noch weitere Tricks draufhat. Vielleicht geht da also später noch was, vielleicht wird es irgendwann auch komfortabler und der Treiber kann die Freesync-Range ohne den Umweg über die EDID anpassen.