⚠️ At your own risk. Editing an EDID can leave you with a black or green screen. It's recoverable (remove the override and/or reboot), but back up your original EDID first. No warranty, you break it you keep both pieces, etc.
LG UltraGear 4K monitors that reach 240 Hz over DisplayPort 1.4 with DSC advertise these 4K refresh rates in their DisplayID block:
3840x2160 @ 240 Hz
3840x2160 @ 144 Hz
3840x2160 @ 95 Hz
Notice what's missing: 120 Hz. And 120 is the one you actually want for mixed video, because it's the only rate here that divides the common frame rates cleanly:
| content | ÷ 120 | ÷ 144 |
|---|---|---|
| 24 fps | 5 ✅ | 6 ✅ |
| 30 fps | 4 ✅ | 4.8 ❌ |
| 60 fps | 2 ✅ | 2.4 ❌ |
144 Hz judders on 30 and 60 fps; 95 Hz is useless for everything. So the goal is simple: replace the dead 95 Hz timing with 120 Hz.
4K @ 120 Hz needs a pixel clock around 1.1 GHz. The legacy 18-byte Detailed Timing Descriptor used in the base EDID block can only encode a pixel clock up to 655.35 MHz, so 4K@120 physically cannot live there. That's why these high-rate modes sit in the DisplayID extension block instead (it uses a 3-byte pixel-clock field). The patch therefore edits the DisplayID block directly.
macOS (BetterDisplay): select the monitor → find the EDID section → Export EDID to a .bin. Keep this file — it's your backup / revert.
Linux: read it straight from the kernel (pick the right connector):
ls /sys/class/drm/ # find your card*-DP-* connector
cat /sys/class/drm/card1-DP-1/edid > monitor-original.binGrab patch_lg_edid.py from this gist. It auto-locates the ~95 Hz 4K timing in the DisplayID block, rewrites it to exactly 120 Hz (keeping the same blanking, just a new pixel clock), and recomputes both the DisplayID and EDID-extension checksums.
python3 patch_lg_edid.py monitor-original.bin monitor-4k120.binExample output:
DisplayID Type-I timings found:
3840x2160 @ 240.08 Hz
3840x2160 @ 144.05 Hz
3840x2160 @ 95.03 Hz <- replacing with 120 Hz
Wrote 4K@120 (pclk 1084.32 MHz) over the 95 Hz slot.
After patch:
3840x2160 @ 240.08 Hz
3840x2160 @ 144.05 Hz
3840x2160 @ 120.00 Hz
(You can also pass --b64 'AP///...' to work from a base64 string and print one back.)
macOS (BetterDisplay): select the monitor → EDID section → Override / Import EDID → choose monitor-4k120.bin. It re-handshakes the display (may blink). If it doesn't take, toggle the override off/on or unplug/replug.
Linux (kernel EDID firmware override):
sudo cp monitor-4k120.bin /usr/lib/firmware/edid/lg-4k120.bin
# add a kernel boot parameter (per-connector form shown):
# drm.edid_firmware=DP-1:edid/lg-4k120.bin
# rebuild initramfs if your distro needs the firmware baked in, then reboot.(Linux override method adapted from kj800x's EDID gist.)
Select 3840×2160 @ 120 Hz.
One important nuance on macOS: the OS only turns DSC on when a mode won't fit uncompressed. 4K@120 at 8-bit just barely fits DP 1.4 without compression — so macOS will run it DSC-off, consuming the whole link. That's fine for a single monitor. But if you drive a second display off the same DisplayPort link, the uncompressed 4K@120 hogs the bandwidth and starves the other monitor. To force DSC and free that bandwidth, enable HDR for the monitor (10-bit pushes the mode past the uncompressed limit → macOS engages DSC). Then both displays fit.
- Verify: the refresh list now shows 60 / 120 / 144 / 240 with the 95 Hz gone, and 120 Hz applies cleanly.
- Revert: remove the override (macOS) or drop the boot parameter (Linux), or re-import your
monitor-original.bin. A reboot also clears a bad override.
DisplayID Type-I Detailed Timing pixel-clock encoding (3 bytes, little-endian):
pclk_khz = 10 × (1 + byte0 + byte1·256 + byte2·65536)
refresh = pclk_khz × 1000 / (htotal × vtotal)
To turn the 95 Hz timing into 120 Hz, keep its htotal/vtotal and set:
pclk_khz = htotal × vtotal × 120 / 1000
then re-encode those 3 bytes and fix the two checksums (DisplayID section checksum, then the EDID extension-block checksum so each block sums to 0 mod 256). That's all the script does.
Tested on an LG UltraGear 31.5" 4K 240 Hz panel over DP 1.4 (DSC) on macOS. Should apply to any LG UltraGear that exposes the 4K 240/144/95 DisplayID timing set in DSC mode. YMMV on other models — read the script's printout before trusting it.