forked from pool/xorg-x11-server
76 lines
2.5 KiB
Diff
76 lines
2.5 KiB
Diff
|
From 35540106538b24ca1765e752fe9d6efc968a88fa Mon Sep 17 00:00:00 2001
|
||
|
From: Egbert Eich <eich@linux-p1mv.site>
|
||
|
Date: Wed, 7 Oct 2009 16:31:44 +0200
|
||
|
Subject: [PATCH] Check harder for primary PCI device.
|
||
|
|
||
|
Primary PCI devices are identified by checking for an 'PCIINFOCLASSES'
|
||
|
device which is VGA and has access to the memory bars enabled.
|
||
|
If there should be more than one device for which this is true
|
||
|
redo the check and also check if IO resoures are also enabled,
|
||
|
if this still doesn't turn up a unique result also check for
|
||
|
the presence of a BIOS rom.
|
||
|
---
|
||
|
hw/xfree86/common/xf86pciBus.c | 46 +++++++++++++++++++++++++++++++++++++--
|
||
|
1 files changed, 43 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
|
||
|
index 25b553b..18b9782 100644
|
||
|
--- a/hw/xfree86/common/xf86pciBus.c
|
||
|
+++ b/hw/xfree86/common/xf86pciBus.c
|
||
|
@@ -390,9 +390,49 @@ xf86PciProbe(void)
|
||
|
primaryBus.type = BUS_PCI;
|
||
|
primaryBus.id.pci = info;
|
||
|
} else {
|
||
|
- xf86Msg(X_NOTICE,
|
||
|
- "More than one possible primary device found\n");
|
||
|
- primaryBus.type ^= (BusType)(-1);
|
||
|
+ /*
|
||
|
+ * Ok, we found more than one possible primary device with this heuristic
|
||
|
+ * Now also check if IO is enabled.
|
||
|
+ */
|
||
|
+ int j;
|
||
|
+
|
||
|
+ primaryBus.type = BUS_NONE;
|
||
|
+ for (j = 0; j < num; j++) {
|
||
|
+ info = xf86PciVideoInfo[j];
|
||
|
+ pci_device_cfg_read_u16(info, & command, 4);
|
||
|
+
|
||
|
+ if ((command & PCI_CMD_MEM_ENABLE)
|
||
|
+ && (command & PCI_CMD_IO_ENABLE)
|
||
|
+ && (IS_VGA(info->device_class))) {
|
||
|
+ if (primaryBus.type == BUS_NONE) {
|
||
|
+ primaryBus.type = BUS_PCI;
|
||
|
+ primaryBus.id.pci = info;
|
||
|
+ } else {
|
||
|
+ primaryBus.type = BUS_NONE;
|
||
|
+ for (j = 0; j < num; j++) {
|
||
|
+ info = xf86PciVideoInfo[j];
|
||
|
+ pci_device_cfg_read_u16(info, & command, 4);
|
||
|
+
|
||
|
+ if ((command & PCI_CMD_MEM_ENABLE)
|
||
|
+ && (command & PCI_CMD_IO_ENABLE)
|
||
|
+ && (IS_VGA(info->device_class))
|
||
|
+ && info->rom_size) {
|
||
|
+ if (primaryBus.type == BUS_NONE) {
|
||
|
+ primaryBus.type = BUS_PCI;
|
||
|
+ primaryBus.id.pci = info;
|
||
|
+ } else {
|
||
|
+ xf86Msg(X_NOTICE,
|
||
|
+ "More than one possible primary device found\n");
|
||
|
+ primaryBus.type ^= (BusType)(-1);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
--
|
||
|
1.6.4.2
|
||
|
|