2016-02-13

Multiple monitors without EDID on Linux

I've been wanting to make this work for a long time, but the two times I tried to configure it I gave up because I just didn't know what else to do. This time I sat down and didn't get up until it worked. I worked on the xorg.conf several times before, so I know my way around it. It was still quite a puzzle for me to get working.

If you want to know how to configure a display without EDID on Linux, click here.

First I tried using the X way. Multiple Monitors with a Screen each, using one Device, put together in a ServerLayout. That didn't work for me. I changed it up a lot, and the best result I got was a native resolution with too high of a refresh rate and a distorted display. I was unable to manipulate this via xrandr.

I then read about a method that utilizes the NVIDIA driver called TwinView. This ended up working after a little tweaking. I also consulted the driver's manual to check what the X options and parameters thereof are. I think that manual might be a little outdated, but it gave me some of the right information.

Okay, so short interlude. My primary monitor doesn't supply EDID information, so I had to configure the xorg.conf manually to operate Debian. I had to fill in horizontal sync, vertical refresh, display size, a mode line. The additional monitor does not need any special configuration, so I thought.. Hey, I just need to configure the first monitor with the UseEDID options and the second one will work just like that! Well... no. Maybe it's possible somehow, but I couldn't get it working.

Here's the working config.

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "QNIX"
    ModelName      "QX2710"
    HorizSync       89.52 - 160.0
    VertRefresh     59.96 - 120.0
    DisplaySize     597 336 
    Modeline       "2560x1440_60.00"  312.25  2560 2752 3024 3488  1440 1443 1448 1493 -hsync +vsync
    Option         "DPMS"
EndSection

Section "Monitor"
    Identifier     "Monitor1"
    VendorName     "Samsung"
    ModelName      "SyncMaster 2253LW"
    HorizSync       31.469 - 79.976
    VertRefresh     59.883 - 75.062
    DisplaySize     467 295
    Modeline       "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
    Option         "DPMS"
EndSection


Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 480"
    Option         "NoLogo"

    Option         "UseEDID" "False"
    Option         "UseEDIDDPI" "False"
    Option         "UseEDIDFreqs" "False"
    Option         "ExactModeTimingsDVI" "True"

    Option         "TwinView"
    Option         "HorizSync"      "DVI-I-2: 89.52 - 160.0; DVI-I-3: 31.469 - 79.976"
    Option         "VertRefresh"    "DVI-I-2: 59.96 - 120.0; DVI-I-3: 59.883 - 75.062"
    Option         "MetaModes"      "DVI-I-2: 2560x1440_60.00 +0+0, DVI-I-3: 1680x1050_60.00 +2560+390"

EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection


Additional to the definitions in the Monitor sections, I added the HorizSync, VertRefresh and Metamode values to the Device section. If you need the output device names, you can use xrandr without parameters.