From ca183b2a3c6e3877b93b6444acb1280356834a04 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 | 16 ---------------- hw/xfree86/fbdevhw/fbdevhw.c | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c index d463e91..5adff0b 100644 --- a/hw/xfree86/common/xf86Bus.c +++ b/hw/xfree86/common/xf86Bus.c @@ -548,22 +548,6 @@ xf86PostProbe(void) { int i; - 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"); - for (i = 0; i < xf86NumEntities; i++) if (xf86Entities[i]->entityInit) xf86Entities[i]->entityInit(i, xf86Entities[i]->private); diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c index cbb4093..657fc49 100644 --- a/hw/xfree86/fbdevhw/fbdevhw.c +++ b/hw/xfree86/fbdevhw/fbdevhw.c @@ -347,7 +347,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); @@ -361,16 +361,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.1.0