Package: xserver-xfree86
Version: 4.3.0-7

The code in xc/programs/Xserver/xfree86/hw/xfree86/os-support/bus/linuxPci.c
doesn't handle PCI Domains, so the X server fails to find the entry for the
video card under /proc.

This problem manifests itself with kernel 2.6.x.

Here's a simple patch to fix it, it first tries the old-style /proc/bus/pci
access, then tries to access it with the PCI Domain information as well.

I've only tested this on an Ultra 5 workstation with the testing distro.

---- begin patch ----
--- xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c.orig       
2004-04-30 22:07:52.572277727 -0700
+++ xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c    2004-04-30 
22:13:59.599136716 -0700
@@ -101,23 +101,34 @@
 static int
 linuxPciOpenFile(PCITAG tag)
 {
-       static int      lbus,ldev,lfunc,fd = -1;
-       int             bus, dev, func;
-       char            file[32];
+       static int      lbus,ldev,ldom,lfunc,fd = -1;
+       int             bus, dev, dom, func;
+       char            file[32], file2[32];
 
        bus  = PCI_BUS_FROM_TAG(tag);
        dev  = PCI_DEV_FROM_TAG(tag);
+       dev  = PCI_DOM_FROM_TAG(tag);
        func = PCI_FUNC_FROM_TAG(tag);
-       if (fd == -1 || bus != lbus || dev != ldev || func != lfunc) {
+       if (fd == -1 || bus != lbus || dev != ldev || dom != ldom ||
+           func != lfunc) {
                if (fd != -1)
                        close(fd);
-               if (bus < 256)
+               if (bus < 256) {
                        sprintf(file, "/proc/bus/pci/%02x/%02x.%1x",
                                bus, dev, func);
-               else
+                       sprintf(file2, "/proc/bus/pci/%04x:%02x/%02x.%1x",
+                               dom, bus, dom, dev, func);
+               } else {
                        sprintf(file, "/proc/bus/pci/%04x/%02x.%1x",
                                bus, dev, func);
+                       sprintf(file2, "/proc/bus/pci/%04x:%04x/%02x.%1x",
+                               dom, bus, dev, func);
+               }
                fd = open(file,O_RDWR);
+               if(fd == -1) {
+                       fd = open(file2,O_RDWR);
+                       ldom  = dom;
+               }
                lbus  = bus;
                ldev  = dev;
                lfunc = func;
---- end patch ----

-- DN
Daniel

Reply via email to