mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-05-22 09:08:14 +02:00
xf86platformProbeDev didn't check the device path, fix it.
This is a problem when trying to set up a non-PCI device via
explicit xorg.conf.d configuration.
An USB DisplayLink device, being non-PCI was always set up
as a GPU device assigned to screen 0 instead of a regular
framebuffer, potentially having its own dedicated screen,
despite such configuration as below. Only the relevant parts
of the configuration are quoted, it's part of a larger context
with an Intel chip that has 3 outputs:
* DP1 connected to an LCD panel,
* VGA1 connected to an external monitor,
* HDMI1 unconnected and having no user visible connector
Section "ServerFlags"
Option "AutoBindGPU" "false"
EndSection
...
Section "Device"
Identifier "Intel2"
Driver "intel"
BusID "PCI:0:2:0"
Screen 2
Option "Monitor-HDMI1" "HDMI1"
Option "ZaphodHeads" "HDMI1"
EndSection
Section "Device"
Identifier "UDL"
Driver "modesetting"
Option "kmsdev" "/dev/dri/card0"
#BusID "usb:0:1.2:1.0"
Option "Monitor-DVI-I-1" "DVI-I-1"
Option "ShadowFB" "on"
Option "DoubleShadow" "on"
EndSection
...
Section "Screen"
Identifier "SCREEN2"
Option "AutoServerLayout" "on"
Device "UDL"
GPUDevice "Intel2"
Monitor "Monitor-DVI-I-1"
SubSection "Display"
Modes "1024x768"
Depth 24
EndSubSection
EndSection
Section "ServerLayout"
Identifier "LAYOUT"
Option "AutoServerLayout" "on"
Screen 0 "SCREEN"
Screen 1 "SCREEN1" RightOf "SCREEN"
Screen 2 "SCREEN2" RightOf "SCREEN1"
EndSection
On the particular machine I was trying to set up an UDL device,
I found the following structure was being used to match
the device to a platform device while I was debugging the issue:
xf86_platform_devices[0] == Intel, /dev/dri/card1, primary platform device
xf86_platform_devices[1] == UDL, /dev/dri/card0
devList[0] == "Intel0", ZaphodHeads: DP1
devList[1] == "Intel1", ZaphodHeads: VGA1
devList[2] == "UDL"
devList[3] == "Intel2", ZaphodHeads: HDMI1 (intended GPU device to UDL)
When xf86platformProbeDev() matched the UDL device, the BusID
check failed in both cases of:
* BusID "usb:0:1.2:1.0" was specified
* Option "kmsdev" "/dev/dri/card0" was specified
As a result, xf86platformProbeDev() went on to call probeSingleDevice()
with xf86_platform_devices[0] and devList[2], resulting in the
UDL device being set up as a GPU device assigned to the first screen
instead of as a framebuffer on the third screen as the configuration
specified.
Checking Option "kmsdev" in code code may be a layering violation.
But the modesetting driver is actually part of the Xorg sources
instead of being an external driver, so he "kmsdev" path knowledge
may be used here.
Signed-off-by: Böszörményi Zoltán <zboszor@pr.hu>
|
||
|---|---|---|
| .. | ||
| .gitignore | ||
| compiler.h | ||
| dgaproc.h | ||
| extramodes | ||
| fourcc.h | ||
| Makefile.am | ||
| meson.build | ||
| modeline2c.awk | ||
| vesamodes | ||
| xaarop.h | ||
| xf86.h | ||
| xf86AutoConfig.c | ||
| xf86Bus.c | ||
| xf86Bus.h | ||
| xf86cmap.c | ||
| xf86cmap.h | ||
| xf86Config.c | ||
| xf86Config.h | ||
| xf86Configure.c | ||
| xf86Cursor.c | ||
| xf86DGA.c | ||
| xf86DPMS.c | ||
| xf86Events.c | ||
| xf86Extensions.c | ||
| xf86Extensions.h | ||
| xf86fbBus.c | ||
| xf86fbman.c | ||
| xf86fbman.h | ||
| xf86Globals.c | ||
| xf86Helper.c | ||
| xf86Init.c | ||
| xf86InPriv.h | ||
| xf86MatchDrivers.h | ||
| xf86Mode.c | ||
| xf86Module.h | ||
| xf86noBus.c | ||
| xf86Opt.h | ||
| xf86Option.c | ||
| xf86Optionstr.h | ||
| xf86pciBus.c | ||
| xf86pciBus.h | ||
| xf86PciInfo.h | ||
| xf86platformBus.c | ||
| xf86platformBus.h | ||
| xf86PM.c | ||
| xf86Priv.h | ||
| xf86Privstr.h | ||
| xf86RandR.c | ||
| xf86sbusBus.c | ||
| xf86sbusBus.h | ||
| xf86str.h | ||
| xf86VGAarbiter.c | ||
| xf86VGAarbiter.h | ||
| xf86VGAarbiterPriv.h | ||
| xf86VidMode.c | ||
| xf86Xinput.c | ||
| xf86Xinput.h | ||
| xf86xv.c | ||
| xf86xv.h | ||
| xf86xvmc.c | ||
| xf86xvmc.h | ||
| xf86xvpriv.h | ||
| xisb.c | ||
| xisb.h | ||
| xorgHelper.c | ||
| xorgVersion.h | ||