Force a custom EDID on external displays connected to Apple Silicon Macs (M1/M2/M3/M4).
Uses the private IOAVServiceSetVirtualEDIDMode API to dynamically override EDID at runtime — the only method that works on Apple Silicon (file-based plist overrides are ignored).
KVM switches often report fake/limited EDID to macOS, causing external displays to be stuck at 1080p even when they support 4K. This tool lets you apply the monitor's real EDID, unlocking the full resolution.
- Apple Silicon Mac (M1/M2/M3/M4)
- macOS Ventura or later
- Xcode Command Line Tools (
xcode-select --install) - A raw EDID binary file (128 or 256 bytes) from your monitor
clang -framework Foundation -framework IOKit -o force-edid force-edid.m./force-edid /path/to/your-monitor.bin./force-edid --resetAfter applying the EDID, you can use displayplacer to switch to your desired resolution:
# Install displayplacer
brew install displayplacer
# Apply your monitor's EDID
./force-edid /path/to/your-monitor.bin
# Wait for the display to re-negotiate
sleep 3
# Find the external display ID and set HiDPI (4K rendered, looks like 1920x1080)
SCREEN_ID=$(displayplacer list 2>/dev/null | grep -B5 'external screen' | grep 'Persistent' | awk '{print $NF}')
displayplacer "id:$SCREEN_ID res:1920x1080 hz:60 color_depth:8 scaling:on"You can dump the EDID when the monitor is connected directly (without the KVM):
ioreg -l -w0 -r -c IOMobileFramebuffer | grep -A1 "IODisplayEDID" | tail -1 | sed 's/.*<//;s/>//' | xxd -r -p > monitor.binOr use tools like Lunar, AW EDID Editor (Windows), or a hardware EDID reader.
On Apple Silicon, display communication goes through the DCP (Display CoProcessor). Traditional EDID override plists placed in /Library/Displays/Contents/Resources/Overrides/ are ignored. This tool uses the private IOAVServiceSetVirtualEDIDMode function from the IOKit framework to inject a custom EDID at runtime, which triggers a display re-negotiation with the new capabilities.
- The override is not persistent across reboots — you need to reapply it after each restart
- Uses private/undocumented Apple APIs that could break with future macOS updates
- Only works on Apple Silicon Macs (Intel Macs should use the traditional plist override method)
Built with knowledge from:
- IOAVService_Private.h by zhuowei
- Decoding monitor EDID on macOS by Alin Panaitiu
- BetterDisplay discussions on EDID editing