You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.0 KiB
112 lines
4.0 KiB
6 years ago
|
From ca183b2a3c6e3877b93b6444acb1280356834a04 Mon Sep 17 00:00:00 2001
|
||
|
From: Adam Jackson <ajax@redhat.com>
|
||
|
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 <ajax@redhat.com>
|
||
|
---
|
||
|
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
|
||
|
|