Cant change refresh rate on my laptop screen on Ubuntu

Hey!

I set up a dual boot environment with Ubuntu 22.04.3 and Windows 11. Im still new to Ubuntu.

My laptop screen goes to 165Hz.

I tried to change my laptop screen refresh rate on Ubuntu by going to the display settings and trying to change them manually. There was only 1option which was 60Hz. All my other resolutions with other different scaling settings also only had the 60Hz option.

Then I installed all my NVIDIA drivers using the sudo ubuntu-drivers install command on the terminal. I restarted my laptop and I opened NVIDIA X Server settings.

Then I went to the terminal, wrote xrandr to see my display name and resolution options + refresh rate. Here’s what it said:

xrandr Screen 0: minimum 320 x 200, current 4096 x 2560, maximum 16384 x 16384 eDP-1 connected primary 4096x2560+0+0 (normal left inverted right x axis y axis) 344mm x 215mm 2560x1600 60.00*+ 60.00 2560x1440 60.00 2048x1536 60.00 1920x1440 60.00 1856x1392 60.00 1792x1344 60.00 2048x1152 60.00 1920x1200 60.00 1920x1080 60.00 1600x1200 60.00 1680x1050 60.00 1400x1050 60.00 1600x900 60.00 1280x1024 60.00 1400x900 60.00 1280x960 60.00 1440x810 60.00 1368x768 60.00 1280x800 60.00 1280x720 60.00 1024x768 60.00 960x720 60.00 928x696 60.00 896x672 60.00 1024x576 60.00 960x600 60.00 960x540 60.00 800x600 60.00 840x525 60.00 864x486 60.00 700x525 60.00 800x450 60.00 640x512 60.00 700x450 60.00 640x480 60.00 720x405 60.00 684x384 60.00 640x360 60.00 512x384 60.00 512x288 60.00 480x270 60.00 400x300 60.00 432x243 60.00 320x240 60.00 360x202 60.00 320x180 60.00 HDMI-1 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) DP-4 disconnected (normal left inverted right x axis y axis) DP-1-0 disconnected (normal left inverted right x axis y axis) DP-1-1 disconnected (normal left inverted right x axis y axis) DP-1-2 disconnected (normal left inverted right x axis y axis) DP-1-3 disconnected (normal left inverted right x axis y axis) HDMI-1-0 disconnected (normal left inverted right x axis y axis)

I found it weird not having any option with a higher refresh rate than 60Hz. I wrote on the terminal xrandr --output eDP-1 --rate 165 and I had no error but still, it didnt change anything. Also tried with several different refresh rates but also didnt change anything.

I also found it weird that on my NVIDIA X Server settings there wasnt any option to change the resolution or any settings and I had no X Server Display Configuration like other people, as you can see here.

Here’s also a screenshot of my ‘Software & Updates’ showing that im using the supposed Nvidia 535 driver for my NVIDIA RTX 3050 Ti GPU.

Im a bit lost on what to do now since I searched for other posts that could have similar problems but didnt find any solution.

Would appreciate any help! Thanks in advance for any reply!

FIXED IT ON MY COMPUTER!

QUICK SOLUTION: Go into BIOS and switch to dGPU only. Less battery life.

FULL SOLUTION: Yoink sections of EDID file I had in Windows

ROOT PROBLEM: Laptop display’s EDID file’s 360Hz extension section had a bad checksum.

MY SPECS: Arch Linux, version 6.15.9-arch1-1. reFIND bootloader. NVIDIA driver 575.64.05. 3070. 360hz. Nvidia Optimus. Razer Blade 15 2021.


STEP BY STEP (ask a chatbot to tailor it to you):

RB15 (2021) — Internal Panel 1080p @ 360 Hz on Linux via EDID Override

Target: Razer Blade 15 (2021), hybrid/Optimus (Intel i915 drives eDP).
Goal: Make the built‑in 1920×1080 panel expose 360 Hz on Linux by overriding EDID.
Bootloader: rEFInd (steps for mkinitcpio; dracut variant included).

Why this works: the panel’s base EDID only advertises 1080p60. The 360 Hz timing lives in the DisplayID block, which some units expose with a bad checksum. Exporting a clean EDID (with 1080p360) and telling the kernel to use it makes the 360 Hz mode appear.


Part A — Build a clean EDID in Windows (CRU)

  1. Install & launch CRU and select the internal panel (e.g., TMX1560 – TL156VDXP02-0).

  2. In Extension blocks, double‑click DisplayID 1.x.

  3. Double‑click Detailed resolutions ….

  4. Select the desired resolution(s) and press OK to exit `Detailed Resolutions`. For me, the 360.000 Hz row should be BLUE, NOT white as shown in the below image. DO NOT select undesired resolutions.

  5. Ensure there is exactly one entry:
    1920x1080 @ 360.000 Hz (799.92 MHz) and Timing = CVT‑RB2.

    • If missing → Add… → Detailed resolution → set 1920×1080 @ 360.000 → Timing: CVT‑RB2.

    • The header should read “1 data block, 1 resolution” (or at least include the 360 Hz line).

    • OK → OK.

  6. The number of resolutions, indicated by the arrow, should be the exact number of rows you selected, nothing more. For me, it should say 1 resolution.

  7. Click Export… → File… and save as rb15_1080_360.bin.

  8. Google edid decode online and upload your rb15_1080_360.bin

  9. You should NOT see:

    Checksum: 0x97 (should be 0x83)
    Checksum: 0x7c
    

    I only got that when exporting with 2 resolutions, as described in step 5.

    It’s OKAY to see:

    Failures:
    
    Block 0, Base EDID:Detailed Timing Descriptor #1: Mismatch of image size 480x270 mm vs display size 340x190 mm.Block 1, DisplayID Extension Block:DisplayID Base Block has no product type.EDID:DisplayID: Missing DisplayID Product Identification Data Block.
    
    EDID conformity: FAIL
    
  10. Store the rb15_1080_360.bin in a place you can access it from Linux, like Google Drive.


Part B — Install the EDID on Linux (rEFInd)

Shell notes: if your default shell is fish, run globbing commands via bash -lc '…' as shown.

1) Place the EDID where the kernel can find it

sudo install -D ~/Downloads/rb15_1080_360.bin /usr/lib/firmware/edid/rb15_1080_360.bin

2) Pack it into your initramfs (mkinitcpio)

Edit and ensure these lines exist:

sudo nano /etc/mkinitcpio.conf
# Add/confirm:
# FILES=(/usr/lib/firmware/edid/rb15_1080_360.bin)
# HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck)

Rebuild:

sudo mkinitcpio -P
# Sanity check:
lsinitrd /boot/initramfs-linux.img | grep rb15_1080_360.bin

If you use dracut instead of mkinitcpio:

echo 'install_items+=" /usr/lib/firmware/edid/rb15_1080_360.bin "' | sudo tee /etc/dracut.conf.d/edid.conf
sudo dracut -f --regenerate-all

3) Add kernel options to rEFInd

Edit /boot/refind_linux.conf and append to the stanza you actually boot (same line):

drm.edid_firmware=eDP-1:edid/rb15_1080_360.bin drm_kms_helper.edid_firmware=eDP-1:edid/rb15_1080_360.bin video=eDP-1:1920x1080@360 i915.enable_dsc=1

Confirm your connector name:

kscreen-doctor -o   # look for e.g. eDP-1

4) Reboot and verify

# Arg present:
cat /proc/cmdline | tr ' ' '\n' | grep -E 'edid_firmware|video=eDP'

# Kernel loaded EDID:
sudo dmesg | grep -i edid

# 360 Hz now advertised:
cat /sys/class/drm/card*-eDP-*/modes

5) Switch the built-in display to 360 Hz (Plasma)

kscreen-doctor -o
kscreen-doctor output.eDP-1.mode.1920x1080@360   # adjust eDP-1 if different

Part C — Runtime test (no reboot)

# Mount debugfs
sudo mount -t debugfs debugfs /sys/kernel/debug

# Find edid_override path (use bash so * expands):
sudo bash -lc 'printf "%s\n" /sys/kernel/debug/dri/*/eDP-*/edid_override'

# Write the EDID (replace path with what you printed):
sudo bash -lc 'cat /usr/lib/firmware/edid/rb15_1080_360.bin > /sys/kernel/debug/dri/1/eDP-1/edid_override'

# Bounce the output:
kscreen-doctor output.eDP-1.disable; sleep 1; kscreen-doctor output.eDP-1.enable

# Check modes again:
cat /sys/class/drm/card*-eDP-*/modes

Part D — Rollback

If the panel blanks or won’t light: edit /boot/refind_linux.conf and remove the drm*.edid_firmware/video= params for one boot (or choose your “minimal” entry).


Quick Troubleshooting

  • No “loading firmware …” line in dmesg: the EDID file wasn’t in the initramfs → repeat Part B‑2.

  • Still only 60 Hz in modes: the EDID is still the broken one; rebuild in CRU and re‑export; ensure DisplayID → Detailed resolutions contains 1920×1080 @ 360 (CVT‑RB2) and export again.

  • fish shell errors: wrap wildcard commands with bash -lc '…'.

  • Connector name mismatch: use the exact name from kscreen-doctor -o in both the kernel video= arg and kscreen-doctor commands.


*Generated 2025-08-11 01:52 *