Comment 3 for bug 1091380

Revision history for this message
In , Xorgbugs (xorgbugs) wrote :

The FireMV 2400 card is a PCI card with two Radeon M9 chips connected via a PLX
PCI-PCI bridge. The system BIOS only initializes the first M9 but the driver
needs to initialize the second M9, this worked in Xorg 7.0 but doesn't work
anymore in 7.1. The result is the second M9 is completely un initialized and
will hard hang the system as soon as someone tries to access it (like moving the
mouse from screen 2 to 3).

The cause seems that Xorg 7.1 does a better job in detecting PCI-ROMs and finds
the PCI-ROM of the second chip (that is only 2k in size and does not hold the
BIOS, but probably just the chip settings), because it finds the ROM it does not
check if it is a multi device card, and so never initializes the second M9.

The diff shows a way to work around this problem on my (and only my) system, by
checking for the PCI-ID (2:5.0) of the second M9 and skip the BIOS detection
code and directly go to the multi device detection code. With this patch my card
works correctly. Of course this is no real sollution , it jsut shows that the
card does work, and where to look for a possible real solution.

diff -ru xorg-server-1.1.0.orig/hw/xfree86/os-support/bus/Pci.c
xorg-server-1.1.0.er/hw/xfree86/os-support/bus/Pci.c
--- xorg-server-1.1.0.orig/hw/xfree86/os-support/bus/Pci.c 2006-05-19
01:51:34.000000000 +0200
+++ xorg-server-1.1.0.er/hw/xfree86/os-support/bus/Pci.c 2006-06-29
00:25:52.000000000 +0200
@@ -1305,16 +1305,21 @@
   PCITAG *pTag;
   int i;

- /* fall back to the old code if the OS code fails */
- if (pciOSHandleBIOS) {
- n = pciOSHandleBIOS(Tag, basereg, buf, len);
- if (n)
- return n;
- }
+ /* MEGA DIRTY FOR ME ONLY TEST HACK */
+
+ if ( !((PCI_BUS_FROM_TAG(Tag) == 2) && (PCI_DEV_FROM_TAG(Tag) == 5) &&
(PCI_FUNC_FROM_TAG(Tag) == 0))) {
+ /* fall back to the old code if the OS code fails */
+ if (pciOSHandleBIOS) {
+ n = pciOSHandleBIOS(Tag, basereg, buf, len);
+ if (n)
+ return n;
+ }

- n = handlePciBIOS( Tag, basereg, buf, len );
- if (n)
- return n;
+ n = handlePciBIOS( Tag, basereg, buf, len );
+ if (n)
+ return n;
+
+ }

   num = pciTestMultiDeviceCard(PCI_BUS_FROM_TAG(Tag),
                               PCI_DEV_FROM_TAG(Tag),