please find attached a complete patch that allows pci Radeon cards to work with DRI. It was created against the DRI CVS xc branch/trunk.
Thanks to MrCooper and M.Harris for their help. Note: also contains the pcigart patch many often refer too.
Index: programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v retrieving revision 1.43 diff -u -r1.43 radeon_dri.c --- programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c 25 Jan 2003 22:25:43 -0000 1.43 +++ programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c 3 Feb 2003 14:22:24 +-0000 @@ -56,12 +56,6 @@ #include "sarea.h" #include "radeon_sarea.h" -#if defined(__alpha__) || defined(__powerpc__) -# define PCIGART_ENABLED -#else -# undef PCIGART_ENABLED -#endif - /* HACK - for now, put this here... */ /* Alpha - this may need to be a variable to handle UP1x00 vs TITAN */ #if defined(__alpha__) @@ -883,7 +877,6 @@ return TRUE; } -#if defined(PCIGART_ENABLED) /* Initialize the PCIGART state. Request memory for use in PCI space, * and initialize the Radeon registers to point to that memory. */ @@ -987,7 +980,6 @@ return TRUE; } -#endif /* Add a map for the MMIO registers that will be accessed by any * DRI-based clients. @@ -1092,15 +1084,11 @@ { /* Initialize vertex buffers */ if (info->IsPCI) { -#if !defined(PCIGART_ENABLED) - return TRUE; -#else info->bufNumBufs = drmAddBufs(info->drmFD, info->bufMapSize / RADEON_BUFFER_SIZE, RADEON_BUFFER_SIZE, DRM_SG_BUFFER, info->bufStart); -#endif } else { info->bufNumBufs = drmAddBufs(info->drmFD, info->bufMapSize / RADEON_BUFFER_SIZE, @@ -1415,30 +1403,21 @@ drmFreeVersion(version); } -#if !defined(PCIGART_ENABLED) - /* Initialize AGP */ - if (!info->IsPCI && !RADEONDRIAgpInit(info, pScreen)) { - RADEONDRICloseScreen(pScreen); - return FALSE; - } - - /* Initialize PCI */ - if (info->IsPCI) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] PCI cards not yet " - "supported. Disabling DRI.\n"); - RADEONDRICloseScreen(pScreen); - return FALSE; - } -#else /* Initialize AGP */ if (!info->IsPCI && !RADEONDRIAgpInit(info, pScreen)) { +#if defined(__alpha__) || defined(__powerpc__) info->IsPCI = TRUE; xf86DrvMsg(pScreen->myNum, X_WARNING, "[agp] AGP failed to initialize " "-- falling back to PCI mode.\n"); xf86DrvMsg(pScreen->myNum, X_WARNING, - "[agp] Make sure you have the agpgart kernel module " - "loaded.\n"); + "[agp] If this is an AGP card, you may want to make sure " + "the agpgart\nkernel module is loaded before the radeon " + "kernel module.\n"); +#else + RADEONDRICloseScreen(pScreen); + return FALSE; +#endif } /* Initialize PCI */ @@ -1446,7 +1425,6 @@ RADEONDRICloseScreen(pScreen); return FALSE; } -#endif /* DRIScreenInit doesn't add all the * common mappings. Add additional Index: programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_cp.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_cp.c,v retrieving revision 1.17 diff -u -r1.17 radeon_cp.c --- programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_cp.c 16 Jan 2003 06:20:44 -0000 1.17 +++ programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_cp.c 3 Feb +2003 14:22:29 -0000 @@ -36,11 +36,6 @@ #define RADEON_FIFO_DEBUG 0 -#if defined(__alpha__) || defined(__powerpc__) -# define PCIGART_ENABLED -#else -# undef PCIGART_ENABLED -#endif /* CP microcode (from ATI) */ @@ -989,17 +984,6 @@ memset( dev_priv, 0, sizeof(drm_radeon_private_t) ); dev_priv->is_pci = init->is_pci; - -#if !defined(PCIGART_ENABLED) - /* PCI support is not 100% working, so we disable it here. - */ - if ( dev_priv->is_pci ) { - DRM_ERROR( "PCI GART not yet supported for Radeon!\n" ); - dev->dev_private = (void *)dev_priv; - radeon_do_cleanup_cp(dev); - return DRM_ERR(EINVAL); - } -#endif if ( dev_priv->is_pci && !dev->sg ) { DRM_ERROR( "PCI GART memory not allocated!\n" ); Index: programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drv.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drv.h,v retrieving revision 1.12 diff -u -r1.12 radeon_drv.h --- programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drv.h 2 Jan 2003 18:38:07 -0000 1.12 +++ programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drv.h 3 Feb +2003 14:22:29 -0000 @@ -864,8 +864,11 @@ dev_priv->ring.tail = write; \ } while (0) -#define COMMIT_RING() do { \ - RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail ); \ +#define COMMIT_RING() do { \ + /* read from PCI bus to ensure correct posting */ \ + RADEON_READ( RADEON_CP_RB_WPTR ); \ + RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail ); \ + RADEON_READ( RADEON_CP_RB_WPTR ); \ } while (0) #define OUT_RING( x ) do { \