This problem has been mentioned many times before. E.g.: Xorg-1.16 configuration for 5k (5120 x 2880) display with two DP inputs - Linux - NVIDIA Developer Forums
I also have a 5K Dell UP2715K which is connected via two display ports and is exposed to the X server as two 2560x2880 tiles. (connected to two DP ports of a GTX 1080 card in my case)
Tiled displays turn out to be a real pain in Linux for no good reason. And this problem is not going away as mentioned by X.org developers on their mailing list: How do we want to deal with 4k tiled displays?
Moreover, this problem does not exist in Windows. I tried the same setup in Windows 10 and it just works, the display is exposed as one 5120x2880 panel as it should be. (+ there is this statement which I guess applies to Windows only: https://developer.nvidia.com/4k-ultra-high-resolution-development : āThe NVIDIA driver automatically detects 4K 60Hz tiled format, so no special user set up is required.ā) So, NVIDIA developers, why did you choose to torture us - Linux users - with this? ;)
There is a āsolutionā in X.org and RANDR 1.5 - MST-monitors (see also this page for links to some initial implementation patches and comments: RandR 1.5 Brings Monitor Objects & Tile Support For X.Org - Phoronix ) - which introduced the concept of āMonitorā objects (in addition to all other concepts in RANDR) and exposure of the TILE property from EDID. (and recent NVIDIA drivers started to expose that TILE property to RANDR) Which is a very odd solution in my opinion. Here is why:
- There is no good reason to expose a tiled display as separate displays to X/RANDR. What would be the use cases for this? Why would you want to treat regions of the same physical display as separate entities in the context of RANDR functionality? What purpose would this serve?
- Most applications (window managers / composers, games etc.) which access RANDR extension are still unaware that they should also consider "Monitors" instead of or in addition to "Outputs". (imagine a multiple monitor setup with a mix of tiled and non-tiled displays) And it is unreasonable to expect them all to implement this especially considering that there is no tangible benefits of this "solution" (see the previous point).
- Lower resolution modes of this particular monitor are driven via only one port (see below for details), which further underlines the absurdity of exposing it as two displays merely because its native mode requires data to be sent to two ports due to DP bandwidth restrictions
A proper solution would be if THE DRIVER would combine the two outputs/CRTCs into one logical device and expose that to X/RANDR. (I guess something like this is already implemented in the Windows driver) How to do this? I suspect that the answer is in EDID (a.k.a. DisplayID) data. Here is what it looks like for my monitor:
Left Tile:
$ edid-decode < edid-dfp-3.bin
Extracted contents:
header: 00 ff ff ff ff ff ff 00
serial number: 10 ac b6 40 53 38 35 38 1d 1a
version: 01 04
basic params: b5 3c 22 78 3a
chroma info: 72 25 ac 50 33 b7 26 0b 50 54
established: 00 00 00
standard: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
descriptor 1: 9f 0b 50 a0 30 e0 0e 10 30 20 35 00 55 50 21 00 00 1a
descriptor 2: 00 00 00 ff 00 33 44 38 46 38 36 37 4a 38 35 38 53 0a
descriptor 3: 00 00 00 fc 00 44 45 4c 4c 20 55 50 32 37 31 35 4b 0a
descriptor 4: 00 00 00 fd 00 1d 4b 1f b4 36 01 0a 20 20 20 20 20 20
extensions: 01
checksum: a7
Manufacturer: DEL Model 40b6 Serial Number 943011923
Made week 29 of 2016
EDID version: 1.4
Digital display
10 bits per primary color channel
DisplayPort interface
Maximum image size: 60 cm x 34 cm
Gamma: 2.20
DPMS levels: Off
Supported color formats: RGB 4:4:4, YCrCb 4:4:4, YCrCb 4:2:2
First detailed timing is preferred timing
Established timings supported:
Standard timings supported:
Detailed mode: Clock 29.750 MHz, 597 mm x 336 mm
848 896 928 1008 hborder 0
480 483 488 494 vborder 0
+hsync -vsync
Serial number: 3D8F867J858S
Monitor name: DELL
Monitor ranges (bare limits): 29-75Hz V, 31-180kHz H, max dotclock 540MHz
Has 1 extension blocks
Checksum: 0xa7 (valid)
DisplayID extension block
Extension version: 18
Length 121, version 18, extension count 0
tiled display block: capabilities 0x00000080
num horizontal tiles 2, num vertical tiles 1
tile location (0, 0)
tile dimensions (2560, 2880)
Type 1 detailed timing: aspect: 16:9,
Detailed mode: Clock 238.240 MHz, 0 mm x 0 mm
2559 2606 2637 2718
2879 2881 2890 2919
+hsync -vsync
Type 1 detailed timing: aspect: 16:9,
Detailed mode: Clock 483.240 MHz, 0 mm x 0 mm
2559 2606 2637 2718
2879 2881 2890 2960
+hsync -vsync
EDID block does NOT conform to EDID 1.3!
Detailed block string not properly terminated
Right Tile:
$ edid-decode < edid-dfp-5.bin
Extracted contents:
header: 00 ff ff ff ff ff ff 00
serial number: 10 ac b6 40 53 38 35 38 1d 1a
version: 01 04
basic params: b5 3c 22 78 3a
chroma info: 72 25 ac 50 33 b7 26 0b 50 54
established: 21 08 00
standard: 81 00 b3 00 d1 00 a9 40 81 80 d1 c0 01 01 01 01
descriptor 1: 56 5e 00 a0 a0 a0 29 50 30 20 35 00 55 50 21 00 00 1a
descriptor 2: 00 00 00 ff 00 33 44 38 46 38 36 37 4a 38 35 38 53 0a
descriptor 3: 00 00 00 fc 00 44 45 4c 4c 20 55 50 32 37 31 35 4b 0a
descriptor 4: 00 00 00 fd 00 1d 4b 1f b4 36 01 0a 20 20 20 20 20 20
extensions: 02
checksum: c4
Manufacturer: DEL Model 40b6 Serial Number 943011923
Made week 29 of 2016
EDID version: 1.4
Digital display
10 bits per primary color channel
DisplayPort interface
Maximum image size: 60 cm x 34 cm
Gamma: 2.20
DPMS levels: Off
Supported color formats: RGB 4:4:4, YCrCb 4:4:4, YCrCb 4:2:2
First detailed timing is preferred timing
Established timings supported:
640x480@60Hz
800x600@60Hz
1024x768@60Hz
Standard timings supported:
1280x800@60Hz
1680x1050@60Hz
1920x1200@60Hz
1600x1200@60Hz
1280x1024@60Hz
1920x1080@60Hz
Detailed mode: Clock 241.500 MHz, 597 mm x 336 mm
2560 2608 2640 2720 hborder 0
1440 1443 1448 1481 vborder 0
+hsync -vsync
Serial number: 3D8F867J858S
Monitor name: DELL
Monitor ranges (bare limits): 29-75Hz V, 31-180kHz H, max dotclock 540MHz
Has 2 extension blocks
Checksum: 0xc4 (valid)
CEA extension block
Extension version: 3
8 bytes of CEA data
Audio data block
Linear PCM, max channels 2
Supported sample rates (kHz): 48 44.1 32
Supported sample sizes (bits): 24 20 16
Speaker allocation data block
Speaker map: FL/FR
Underscans PC formats by default
Basic audio support
Supports YCbCr 4:4:4
Supports YCbCr 4:2:2
1 native detailed modes
Detailed mode: Clock 533.250 MHz, 597 mm x 336 mm
3840 3920 3952 4000 hborder 0
2160 2214 2219 2222 vborder 0
-hsync -vsync
Detailed mode: Clock 241.500 MHz, 597 mm x 336 mm
2560 2608 2640 2720 hborder 0
1440 1443 1448 1481 vborder 0
+hsync -vsync
Checksum: 0x34 (valid)
DisplayID extension block
Extension version: 18
Length 121, version 18, extension count 0
tiled display block: capabilities 0x00000082
num horizontal tiles 2, num vertical tiles 1
tile location (1, 0)
tile dimensions (2560, 2880)
Type 1 detailed timing: aspect: 16:9, Preferred
Detailed mode: Clock 533.240 MHz, 0 mm x 0 mm
3839 3886 3917 3998
2159 2161 2165 2220
+hsync -vsync
Type 1 detailed timing: aspect: 16:9,
Detailed mode: Clock 238.240 MHz, 0 mm x 0 mm
2559 2606 2637 2718
2879 2881 2890 2919
+hsync -vsync
Type 1 detailed timing: aspect: 16:9,
Detailed mode: Clock 483.240 MHz, 0 mm x 0 mm
2559 2606 2637 2718
2879 2881 2890 2960
+hsync -vsync
VESA DMT timing block
EDID block does NOT conform to EDID 1.3!
Detailed block string not properly terminated
EDID block does not conform at all!
Impossible extension block count
Errors at the and are obviously due to the fact that the edid-decode utility does not support EDID 1.4 blocks.
I am also attaching the raw binary and textual EDID dumps obtained via NVIDIAās GUI tool.
Here is also somewhat more readable output from xrandr -prop (RANDRās DP-0 corresponds to NVIDIAās DFP-3, DP-2 to DFP-5):
Screen 0: minimum 8 x 8, current 5120 x 2880, maximum 32767 x 32767
DVI-D-0 disconnected (normal left inverted right x axis y axis)
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: TMDS
supported: TMDS
ConnectorType: DVI-D
ConnectorNumber: 0
_ConnectorLocation: 0
HDMI-0 disconnected (normal left inverted right x axis y axis)
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: TMDS
supported: TMDS
ConnectorType: HDMI
ConnectorNumber: 3
_ConnectorLocation: 3
HDMI-1 disconnected (normal left inverted right x axis y axis)
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: TMDS
supported: TMDS
ConnectorType: HDMI
ConnectorNumber: 4
_ConnectorLocation: 4
DP-0 connected primary 2560x2880+0+0 (normal left inverted right x axis y axis) 600mm x 340mm
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
TILE: 453 1 2 1 0 0 2560 2880
EDID:
00ffffffffffff0010acb64053383538
1d1a0104b53c22783a7225ac5033b726
0b505400000001010101010101010101
0101010101019f0b50a030e00e103020
350055502100001a000000ff00334438
463836374a383538530a000000fc0044
454c4c205550323731354b0a000000fd
001d4b1fb436010a20202020202001a7
701279000012001680100000ff093f0b
000000000044454cb640533835380300
28105d0004ff099f002f801f003f0b28
0002000900c4bc0004ff099f002f801f
003f0b51000200090000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000007b90
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: DisplayPort
supported: DisplayPort
ConnectorType: DisplayPort
ConnectorNumber: 2
_ConnectorLocation: 2
848x480 59.74 +
2560x2880 59.98* 29.99
DP-1 disconnected (normal left inverted right x axis y axis)
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: TMDS
supported: TMDS
ConnectorType: DisplayPort
ConnectorNumber: 2
_ConnectorLocation: 2
DP-2 connected 2560x2880+2560+0 (normal left inverted right x axis y axis) 600mm x 340mm
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
TILE: 453 1 2 1 1 0 2560 2880
EDID:
00ffffffffffff0010acb64053383538
1d1a0104b53c22783a7225ac5033b726
0b50542108008100b300d100a9408180
d1c001010101565e00a0a0a029503020
350055502100001a000000ff00334438
463836374a383538530a000000fc0044
454c4c205550323731354b0a000000fd
001d4b1fb436010a20202020202002c4
02030cf123090707830100004dd000a0
f0703e805020650c555021000018565e
00a0a0a029503020350055502100001a
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000034
701279000012001682101000ff093f0b
000000000044454cb640533835380300
3c4cd00084ff0e9f002f801f006f083d
0002000400105d0004ff099f002f801f
003f0b280002000900c4bc0004ff099f
002f801f003f0b51000200090007000a
08810008040004021000000000000000
0000000000000000000000000000c590
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: DisplayPort
supported: DisplayPort
ConnectorType: DisplayPort
ConnectorNumber: 1
_ConnectorLocation: 1
2560x1440 59.95 +
3840x2160 60.00 60.00
2560x2880 59.98* 29.99
1920x1200 59.88
1920x1080 60.00
1680x1050 59.95
1600x1200 60.00
1280x1024 60.02
1280x800 59.81
1024x768 60.00
800x600 60.32
640x480 59.95 59.94
DP-3 disconnected (normal left inverted right x axis y axis)
CscMatrix: 65536 0 0 0 0 65536 0 0 0 0 65536 0
BorderDimensions: 4
supported: 4
Border: 0 0 0 0
range: (0, 65535)
SignalFormat: TMDS
supported: TMDS
ConnectorType: DisplayPort
ConnectorNumber: 1
_ConnectorLocation: 1
So, from what I understand from the above, the native resolution (5120x2880) needs to be driven via the tiled mode which needs to be driven via two DP connectors. The rest of the supported modes should be driven by ONLY ONE of the connectors, as those modesā bandwidth āfitsā into one port. (the driver should request the mode setting on one port and turn off the other port?) In other words, the algorithm to construct the display device (and the list of modes) that should be exposed to X/RANDR should be something like this:
- Parse EDID info of all connected displays
- If there is tile info present, combine the corresponding "displays" into one and expose the result to X/RANDR instead of exposing every device separately
- In order to do this:
- Use the tile info to construct the native mode, look up the corresponding tile's modes to set proper modes on all tiles/ports (i.e. 2560x2800 on two tiles/"displays" in this case)
- Go over the rest of the modes, noting which of the ports should be used to set that mode.
In other words, the driver should construct and maintain some sort of table (or other structure) for connected tiled displays. Something like this:
(left column exposed to X/RANDR, right column used by the driver internally to control the display ports)
5120x2880@60 - [2560x2880@60, 2560x2880@60]
2560x1440@60 - [off , 2560x1440@60]
... etc.
Could you please implement this? I appreciate all the effort the NVIDIA developers invest in maintaining Linux drivers, but could you please show us a little bit more love?
edid-dfp-3.txt (768 Bytes)
edid-dfp-5.txt (1.13 KB)
edid-dfp-3.bin.gz (195 Bytes)
edid-dfp-5.bin.gz (270 Bytes)