xf86-video-ati: Branch 'pci-rework'

George Sapountzis gsap7 at kemper.freedesktop.org
Tue Aug 28 06:12:31 PDT 2007


 configure.ac         |   10 ++++++++
 src/Makefile.am      |    4 +++
 src/ati.c            |   54 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/atimach64probe.c |    2 +
 src/atipcirename.h   |    6 ++---
 src/atiprobe.c       |    2 +
 src/atividmem.c      |   57 ++++++++++++++++++++++++++++++++++++++++++++++-----
 src/r128_probe.c     |    2 +
 src/radeon_probe.c   |    2 +
 9 files changed, 131 insertions(+), 8 deletions(-)

New commits:
diff-tree 6ff0645ecfe65727e8ef5d5e6215b4e03078e1a5 (from 7b38d9a1209f87255e5bb0aefe46a363ce4fb6ef)
Author: George Sapountzis <gsap7 at yahoo.gr>
Date:   Tue Aug 28 15:37:11 2007 +0300

    [mach64] Convert to pci-rework, keeping source-code compatibility.
    
    It still uses the old probe method though, this is due to the ati wrapper.

diff --git a/configure.ac b/configure.ac
index 0c413c8..03b3440 100644
--- a/configure.ac
+++ b/configure.ac
@@ -204,10 +204,20 @@ AC_CHECK_DECL(xf86XVFillKeyHelperDrawabl
 	      [],
 	      [#include <xf86xv.h>])
 
+AC_CHECK_DECL(XSERVER_LIBPCIACCESS,
+	      [XSERVER_LIBPCIACCESS=yes],[XSERVER_LIBPCIACCESS=no],
+	      [#include "xorg-server.h"])
+
 CPPFLAGS="$SAVE_CPPFLAGS"
 
 AM_CONDITIONAL(USE_EXA, test "x$USE_EXA" = xyes)
 
+if test "x$XSERVER_LIBPCIACCESS" = xyes; then
+    PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0])
+    XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"
+fi
+AM_CONDITIONAL(XSERVER_LIBPCIACCESS, test "x$XSERVER_LIBPCIACCESS" = xyes)
+
 AC_SUBST([XORG_CFLAGS])
 AC_SUBST([DRI_CFLAGS])
 AC_SUBST([moduledir])
diff --git a/src/Makefile.am b/src/Makefile.am
index dd7007e..16cbb66 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -66,6 +66,9 @@ atimisc_drv_la_SOURCES = \
 	atiload.c atimisc.c atimach64probe.c $(ATIMISC_CPIO_SOURCES) \
 	$(ATIMISC_DGA_SOURCES) $(ATIMISC_DRI_SRCS) $(ATIMISC_EXA_SOURCES)
 
+if XSERVER_LIBPCIACCESS
+# r128, radeon and theatre have not been ported yet
+else
 r128_drv_la_LTLIBRARIES = r128_drv.la
 r128_drv_la_LDFLAGS = -module -avoid-version
 r128_drv_ladir = @moduledir@/drivers
@@ -103,6 +106,7 @@ theatre200_drv_la_CFLAGS = \
 	$(AM_CFLAGS) -DMICROC_DIR=\"$(theatre200_drv_ladir)\"
 theatre200_drv_la_SOURCES = \
 	theatre200.c theatre200_module.c
+endif
 
 EXTRA_DIST = \
 	atimach64render.c \
diff --git a/src/ati.c b/src/ati.c
index 3f6cc0c..ada165f 100644
--- a/src/ati.c
+++ b/src/ati.c
@@ -57,6 +57,9 @@
 #include "config.h"
 #endif
 
+#ifdef XSERVER_LIBPCIACCESS
+#include <pciaccess.h>
+#endif
 #include "atipcirename.h"
 
 #include "ati.h"
@@ -67,6 +70,22 @@
 #include "radeon_probe.h"
 #include "r128_probe.h"
 
+#ifdef XSERVER_LIBPCIACCESS
+static const struct pci_id_match ati_device_match = {
+    PCI_VENDOR_ATI, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0
+};
+
+/* Stolen from xf86pciBus.c */
+/* PCI classes that get included in xf86PciVideoInfo */
+#define PCIINFOCLASSES(c) \
+    (  (((c) & 0x00ff0000) == (PCI_CLASS_PREHISTORIC << 16)) ||           \
+       (((c) & 0x00ff0000) == (PCI_CLASS_DISPLAY << 16)) ||               \
+      ((((c) & 0x00ffff00) == ((PCI_CLASS_MULTIMEDIA << 16) |             \
+                               (PCI_SUBCLASS_MULTIMEDIA_VIDEO << 8)))) || \
+      ((((c) & 0x00ffff00) == ((PCI_CLASS_PROCESSOR << 16) |              \
+                               (PCI_SUBCLASS_PROCESSOR_COPROC << 8)))) )
+#endif
+
 /*
  * ATIIdentify --
  *
@@ -101,11 +120,17 @@ ATIProbe
 )
 {
     pciVideoPtr pVideo;
+#ifndef XSERVER_LIBPCIACCESS
     pciVideoPtr *xf86PciVideoInfo;
+#else
+    struct pci_device_iterator *pVideoIter;
+#endif
     Bool        DoMach64 = FALSE;
     Bool        DoRage128 = FALSE, DoRadeon = FALSE;
     ATIChipType Chip;
 
+#ifndef XSERVER_LIBPCIACCESS
+
     xf86PciVideoInfo = xf86GetPciVideoInfo();
 
     if (xf86PciVideoInfo == NULL)
@@ -127,6 +152,35 @@ ATIProbe
             DoRadeon = TRUE;
     }
 
+#else /* XSERVER_LIBPCIACCESS */
+
+    pVideoIter = pci_id_match_iterator_create(&ati_device_match);
+
+    while ((pVideo = pci_device_next(pVideoIter)) != NULL)
+    {
+        /* Check for non-video devices */
+        if (!PCIINFOCLASSES(pVideo->device_class))
+            continue;
+
+        /* Check for prehistoric PCI Mach32 */
+        if ((PCI_DEV_VENDOR_ID(pVideo) != PCI_VENDOR_ATI) ||
+            (PCI_DEV_DEVICE_ID(pVideo) == PCI_CHIP_MACH32))
+            continue;
+
+        /* Check for Rage128's, Radeon's and later adapters */
+        Chip = ATIChipID(PCI_DEV_DEVICE_ID(pVideo), PCI_DEV_REVISION(pVideo));
+        if (Chip <= ATI_CHIP_Mach64)
+            DoMach64 = TRUE;
+        else if (Chip <= ATI_CHIP_Rage128)
+            DoRage128 = TRUE;
+        else if (Chip <= ATI_CHIP_Radeon)
+            DoRadeon = TRUE;
+    }
+
+    pci_iterator_destroy(pVideoIter);
+
+#endif /* XSERVER_LIBPCIACCESS */
+
     /* Call Radeon driver probe */
     if (DoRadeon)
     {
diff --git a/src/atimach64probe.c b/src/atimach64probe.c
index c5330cc..2f716a1 100644
--- a/src/atimach64probe.c
+++ b/src/atimach64probe.c
@@ -146,8 +146,10 @@ Mach64Probe(DriverPtr pDriver, int flags
     int     numUsed;
     Bool    ProbeSuccess = FALSE;
 
+#ifndef XSERVER_LIBPCIACCESS
     if (xf86GetPciVideoInfo() == NULL)
         return FALSE;
+#endif
 
     if ((numDevSections = xf86MatchDevice(ATI_DRIVER_NAME, &devSections)) <= 0)
         return FALSE;
diff --git a/src/atipcirename.h b/src/atipcirename.h
index 280a81a..e30d10c 100644
--- a/src/atipcirename.h
+++ b/src/atipcirename.h
@@ -34,7 +34,7 @@ enum region_type {
     REGION_IO 
 };
 
-#ifndef PCIACCESS
+#ifndef XSERVER_LIBPCIACCESS
 
 /* pciVideoPtr */
 #define PCI_DEV_VENDOR_ID(_pcidev) ((_pcidev)->vendor)
@@ -71,7 +71,7 @@ enum region_type {
 #define PCI_WRITE_LONG(_pcidev, _value, _offset) \
     pciWriteLong(PCI_CFG_TAG(_pcidev), (_offset), (_value))
 
-#else /* PCIACCESS */
+#else /* XSERVER_LIBPCIACCESS */
 
 typedef struct pci_device *pciVideoPtr;
 
@@ -105,6 +105,6 @@ typedef struct pci_device *pciVideoPtr;
 #define PCI_WRITE_LONG(_pcidev, _value, _offset) \
     pci_device_cfg_write_u32((_pcidev), (_value), (_offset))
 
-#endif /* PCIACCESS */
+#endif /* XSERVER_LIBPCIACCESS */
 
 #endif /* ATIPCIRENAME_H */
diff --git a/src/atiprobe.c b/src/atiprobe.c
index cddcc61..78b3edd 100644
--- a/src/atiprobe.c
+++ b/src/atiprobe.c
@@ -385,10 +385,12 @@ ATIMach64ProbeIO
         uint32_t PciReg;
         uint32_t j;
 
+#ifndef XSERVER_LIBPCIACCESS
         pciConfigPtr pPCI = pVideo->thisCard;
 
         if (pPCI == NULL)
             goto SkipSparse;
+#endif
 
         PCI_READ_LONG(pVideo, &PciReg, PCI_REG_USERCONFIG);
         j = PciReg & 0x03U;
diff --git a/src/atividmem.c b/src/atividmem.c
index 7ab203e..69d89ef 100644
--- a/src/atividmem.c
+++ b/src/atividmem.c
@@ -73,9 +73,16 @@ const char *ATIMemoryTypeNames_264xT[] =
  *
  * It is called implicitely by xf86MapPciMem(VIDMEM_FRAMEBUFFER).
  */
+#ifndef XSERVER_LIBPCIACCESS
 #define nop_setWC(_screenNum, _base, _size, _enable) \
 do {                                                 \
 } while (0)
+#else
+#define nop_setWC(_screenNum, _base, _size, _enable) \
+do {                                                 \
+    /* XXX */                                        \
+} while (0)
+#endif
 
 #ifndef AVOID_CPIO
 
@@ -120,7 +127,11 @@ ATIUnmapLinear
         if (pATI->LinearBase)
             nop_setWC(iScreen, pATI->LinearBase, pATI->LinearSize, FALSE);
 
+#ifndef XSERVER_LIBPCIACCESS
         xf86UnMapVidMem(iScreen, pATI->pMemoryLE, (1U << pVideo->size[0]));
+#else
+        pci_device_unmap_region(pVideo, 0);
+#endif
     }
 
     pATI->pMemory = pATI->pMemoryLE = NULL;
@@ -140,8 +151,16 @@ ATIUnmapMMIO
     ATIPtr pATI
 )
 {
+    pciVideoPtr pVideo = pATI->PCIInfo;
+
     if (pATI->pMMIO)
+    {
+#ifndef XSERVER_LIBPCIACCESS
         xf86UnMapVidMem(iScreen, pATI->pMMIO, getpagesize());
+#else
+        pci_device_unmap_region(pVideo, 2);
+#endif
+    }
 
     pATI->pMMIO = pATI->pBlock[0] = pATI->pBlock[1] = NULL;
 }
@@ -163,8 +182,7 @@ ATIMapApertures
     ATIPtr pATI
 )
 {
-    pciVideoPtr   pVideo = pATI->PCIInfo;
-    int           mode;
+    pciVideoPtr pVideo = pATI->PCIInfo;
 
     if (pATI->Mapped)
         return TRUE;
@@ -192,18 +210,32 @@ ATIMapApertures
     /* Map linear aperture */
     if (pATI->LinearBase || (pATI->Block0Base && pATI->MMIOInLinear))
     {
-        mode = VIDMEM_FRAMEBUFFER;
 
+#ifndef XSERVER_LIBPCIACCESS
+
+        int mode = VIDMEM_FRAMEBUFFER;
+    
         /* Reset write-combining for the whole FB when MMIO registers fall in
          * the linear aperture.
          */
         if (pATI->MMIOInLinear)
             mode = VIDMEM_MMIO;
-
+    
         pATI->pMemoryLE = xf86MapPciMem(iScreen, mode, PCI_CFG_TAG(pVideo),
                                         pVideo->memBase[0],
                                         (1U << pVideo->size[0]));
 
+#else /* XSERVER_LIBPCIACCESS */
+
+        int err = pci_device_map_region(pVideo, 0, TRUE);
+    
+        if (err)
+            pATI->pMemoryLE = NULL;
+        else
+            pATI->pMemoryLE = pVideo->regions[0].memory;
+
+#endif /* XSERVER_LIBPCIACCESS */
+
         if (!pATI->pMemoryLE)
             goto bail;
 
@@ -230,11 +262,26 @@ ATIMapApertures
     /* Map MMIO aperture */
     if (pATI->Block0Base && !pATI->MMIOInLinear)
     {
-        mode = VIDMEM_MMIO;
+
+#ifndef XSERVER_LIBPCIACCESS
+
+        int mode = VIDMEM_MMIO;
+    
         pATI->pMMIO = xf86MapPciMem(iScreen, mode, PCI_CFG_TAG(pVideo),
                                     pVideo->memBase[2],
                                     getpagesize());
 
+#else /* XSERVER_LIBPCIACCESS */
+
+        int err = pci_device_map_region(pVideo, 2, TRUE);
+    
+        if (err)
+            pATI->pMMIO = NULL;
+        else
+            pATI->pMMIO = pVideo->regions[2].memory;
+
+#endif /* XSERVER_LIBPCIACCESS */
+
         if (!pATI->pMMIO)
             goto bail;
 
diff --git a/src/r128_probe.c b/src/r128_probe.c
index 81ff663..b2298df 100644
--- a/src/r128_probe.c
+++ b/src/r128_probe.c
@@ -144,7 +144,9 @@ R128Probe(DriverPtr drv, int flags)
     Bool          foundScreen = FALSE;
     int           i;
 
+#ifndef XSERVER_LIBPCIACCESS
     if (!xf86GetPciVideoInfo()) return FALSE;
+#endif
 
     /* Collect unclaimed device sections for both driver names */
     nATIGDev = xf86MatchDevice(ATI_NAME, &ATIGDevs);
diff --git a/src/radeon_probe.c b/src/radeon_probe.c
index c697f65..b7c38ad 100644
--- a/src/radeon_probe.c
+++ b/src/radeon_probe.c
@@ -237,7 +237,9 @@ RADEONProbe(DriverPtr drv, int flags)
     Bool     foundScreen = FALSE;
     int      i;
 
+#ifndef XSERVER_LIBPCIACCESS
     if (!xf86GetPciVideoInfo()) return FALSE;
+#endif
 
     /* Collect unclaimed device sections for both driver names */
     nATIGDev    = xf86MatchDevice(ATI_NAME, &ATIGDevs);


More information about the xorg-commit mailing list