1

I'm running Pop!_OS 21.04 (Nvidia) on my Lenovo Legion 5 laptop. I want to reduce the screen refresh rate down to 60hz from its usual 144. I am able to do this in Display Settings on Windows, however, I can't seem to do so with Linux. Running xrandr shows that the only option I have is for 144 hertz.

jeff@pop-os:~/.local/share/applications$ xrandr
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-4 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 381mm x 214mm
   1920x1080    144.00*+

Things I have tried:

  • Going to Displays and changing the rate to 60hz, however the only option on the dropdown menu is 144.

  • Entering BIOS and attempting to change the refresh rate, however there is no option to do so.

  • Manually setting the refresh rate on Windows, then booting back into Linux, however the refresh rate is always stuck on 144 on Linux.

  • Running xrandr -r 60 and other variations and nearby values, but it always says that Rate 60.00 Hz not available for this size, even though I am able to do so on Windows.

  • Running xrandr --output DP-4 --mode 1920x1080 --refresh 60, however there is no output and nothing seems to change.

  • Editing ~/.config/monitors.xml, however the file does not exist on my system.

  • Saving x configuration to /etc/X11/xorg.conf and changing the refresh rate to 60, however this does not seem to have an effect.

  • Doing the following to try to add a custom resolution + refresh rate: xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync, however I get

    X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 18 (RRAddOutputMode) Serial number of failed request: 39 Current serial number in output stream: 40

(the numbers are taken from the output of cvt 1920 1080 60).

I am out of ideas now, I tried all the solutions I found online and none of them worked. Could someone please help me lower the monitor refresh rate?

1 Answer 1

1

After a few days of trying to do this, I've finally found a solution on my Legion 5 by modifying the EDID. In case you're unaware, a display's EDID is what the graphics driver accesses to determine what video modes are supported.

The EDID defines values like the range of refresh rates and pixel clocks, but it also reports specific video modes that are supported. I found that both xrandr and Nvidia X Server Settings are only able to use modes that are explicitly defined, and rejects all other modes, even those that are valid. Here's how I got around that.

  1. Open Nvidia X Server Settings, and select the built-in display on the left under GPU 0. In the bottom right, there is an "Acquire Edid..." button. Click that to get an EDID.bin file (which is just a dump of your display's EDID).
  2. Somehow, you need to get that file to Windows, because you're going to modify it using Custom Resolution Utility. Open CRU, and click the "Import" button. You should see at least one "detailed mode" in the top right box, with the desired resolution and the native refresh rate. Highlight it and click "Edit...," and write down all the values that are not grayed out, without changing any of them.
  3. Still in CRU, add a new "Detailed" resolution. Set all of the values to be exactly the same as the ones you found in the pre-existing mode, but change the refresh rate to what you want it to be (60hz).
  4. Click "export" in the bottom right corner of CRU, and save it with an easy name like "60edid.bin."
  5. Get that file back on Linux and store it somewhere convenient. In my case, I saved it in /home/my_name/.60edid.bin.
  6. Open xorg.conf, and add the following to it (I'm using "DP-4" as the connector name, but switch it out for whatever it is on your machine according to xrandr):
Section "Device"

...

Option "CustomEDID" "DP-4:/path/to/60edid.bin"

Option "IgnoreEDID" "false"

Option "UseEDID"    "true"

...

EndSection
  1. Save xorg.conf and reboot. Open Nvidia X Server Settings, select your display, and change the resolution to 1920x1080. 60hz should now be available as a refresh rate option. Make sure to click "Save to X Configuration File" after selecting it!

Note that even after doing all this, it still wasn't persistent. To make it persistent, I created the following script and call it in my .profile as a background process (eg. . myscript.sh &):

sleep 3s
xrandr --output DP-4 --mode 1920x1080 --rate 60
3
  • xrandr --output DP-4 --mode 1920x1080 --rate 60 This is the real reason why it's now "persistent". You're just forcing the mode and refresh rate after you login via a command. All that other stuff is irrelevant and unnecessary if you perform that xrandr command on each login. Hope that makes sense.
    – Victor
    Commented Apr 28, 2023 at 13:50
  • 1
    As mentioned in my post, this is actually not the case. According to the spec this should work the way you described, but in reality, this command simply does not work at all unless the EDID explicitly specifies a 1920x1080@60hz mode (which was exactly the problem in the first place). Some monitors probably specify that mode explicitly, in which case it would work fine. My laptop's monitor only specifies it implicitly and refuses to change refresh rates without loading a custom EDID. I guess it's possible that this bug was fixed since I wrote this, but if it was, I don't know about it. Commented Apr 29, 2023 at 14:48
  • Ah okay, I understand. Apologies for the noise! :-)
    – Victor
    Commented May 2, 2023 at 6:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .