From 3c12c28f448fa76d17e9009995c89f56cccb0abb Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Tue, 5 Aug 2014 12:16:31 -0400 Subject: [PATCH] xfree86: Allow mixed fbdev and pci setups You'd like to be able to do this because (for example) that way you'd be able to drive both intel and udlfb at once. There's no fundamental reason why that can't work, so just delete the check in PostProbe that forbids it. Also in the fbdev driver, we're now actually passing the PCI device in at init time, so we can look up the device node sanely. That almost works! Except then you break HyperV, because hyperv_fb binds to the vmbus device, not the PCI device, because why the hell not. So then the PCI probe path fails (because we try to find the fbdev node under the PCI device tree, and fail), but the legacy probe path succeeds; but then Init fails because we don't preserve that fd (or even which /dev node we opened!), and since it _is_ a PCI device we try fbdev_open_pci and that fails like it did during PCI probe. "I know", you think, "I'll just record the choice made at probe time", and then you remember you have nowhere to hang it. So, whatever. If we make it to Init we know Probe succeeded one way or the other, so just fall back from pci-style to handwave-style in Init once if it seem appropriate. And in all cases, use the explicit-device open path even for PCI devices so that Option "fbdev" actually takes effect. I think this is the best you can do without breaking the Probe interface, though admittedly burning this all to the ground is a noble goal. Signed-off-by: Adam Jackson --- hw/xfree86/common/xf86Bus.c | 15 --------------- hw/xfree86/fbdevhw/fbdevhw.c | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c index 6bbf489..3186478 100644 --- a/hw/xfree86/common/xf86Bus.c +++ b/hw/xfree86/common/xf86Bus.c @@ -536,21 +536,6 @@ xf86GetDevFromEntity(int entityIndex, int instance) void xf86PostProbe(void) { - if (fbSlotClaimed && ( -#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) - sbusSlotClaimed || -#endif -#ifdef XSERVER_PLATFORM_BUS - platformSlotClaimed || -#endif -#ifdef XSERVER_LIBPCIACCESS - pciSlotClaimed -#else - TRUE -#endif - )) - FatalError("Cannot run in framebuffer mode. Please specify busIDs " - " for all framebuffer devices\n"); } int diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c index 0bd77df..a2cf78f 100644 --- a/hw/xfree86/fbdevhw/fbdevhw.c +++ b/hw/xfree86/fbdevhw/fbdevhw.c @@ -351,7 +351,7 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) { int fd; - if (pPci) + if (pPci && !device) fd = fbdev_open_pci(pPci, namep); else fd = fbdev_open(-1, device, namep); @@ -365,16 +365,28 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) Bool fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device *pPci, char *device) { + static Bool been_here; fbdevHWPtr fPtr; fbdevHWGetRec(pScrn); fPtr = FBDEVHWPTR(pScrn); /* open device */ - if (pPci) + if (pPci && !device) fPtr->fd = fbdev_open_pci(pPci, NULL); else - fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); + fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); + + if (pPci && fPtr->fd == -1) { + if (been_here != serverGeneration) { + fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); + been_here = serverGeneration; + } else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Please specify Option \"fbdev\" to use this device\n"); + } + } + if (-1 == fPtr->fd) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to open framebuffer device, consult warnings" -- 2.17.0