forked from pool/xorg-x11-server
e2ca29cba8
Copy from X11:XOrg/xorg-x11-server based on submit request 22138 from user sndirsch OBS-URL: https://build.opensuse.org/request/show/22138 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xorg-x11-server?expand=0&rev=146
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
|
|
|