Fix ring space calculations, tests. Based on patch by Bruce Stockwell.
authorGareth Hughes <gareth@users.sourceforge.net>
Thu, 8 Mar 2001 00:21:33 +0000 (00:21 +0000)
committerGareth Hughes <gareth@users.sourceforge.net>
Thu, 8 Mar 2001 00:21:33 +0000 (00:21 +0000)
linux-core/r128_drv.c
linux-core/radeon_drv.c
linux/r128_cce.c
linux/r128_drv.c
linux/r128_drv.h
linux/r128_state.c
linux/radeon_cp.c
linux/radeon_drv.c
linux/radeon_drv.h
linux/radeon_state.c

index e42868e..daae0f8 100644 (file)
 
 #define DRIVER_NAME            "r128"
 #define DRIVER_DESC            "ATI Rage 128"
-#define DRIVER_DATE            "20010216"
+#define DRIVER_DATE            "20010308"
 
 #define DRIVER_MAJOR           2
 #define DRIVER_MINOR           1
-#define DRIVER_PATCHLEVEL      4
+#define DRIVER_PATCHLEVEL      5
 
 #define DRIVER_IOCTLS                                                      \
    [DRM_IOCTL_NR(DRM_IOCTL_DMA)]             = { r128_cce_buffers,  1, 0 }, \
index 1aa889a..dba2037 100644 (file)
 
 #define DRIVER_NAME            "radeon"
 #define DRIVER_DESC            "ATI Radeon"
-#define DRIVER_DATE            "20010305"
+#define DRIVER_DATE            "20010308"
 
 #define DRIVER_MAJOR           1
 #define DRIVER_MINOR           0
-#define DRIVER_PATCHLEVEL      0
+#define DRIVER_PATCHLEVEL      1
 
 #define DRIVER_IOCTLS                                                       \
  [DRM_IOCTL_NR(DRM_IOCTL_DMA)]               = { radeon_cp_buffers,  1, 0 }, \
index d179049..5c67bec 100644 (file)
@@ -839,13 +839,9 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
        int i;
 
        for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
-               ring->space = *ring->head - ring->tail;
-               if ( ring->space <= 0 )
-                       ring->space += ring->size;
-
+               r128_update_ring_snapshot( ring );
                if ( ring->space >= n )
                        return 0;
-
                udelay( 1 );
        }
 
@@ -854,19 +850,6 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
        return -EBUSY;
 }
 
-void r128_update_ring_snapshot( drm_r128_private_t *dev_priv )
-{
-       drm_r128_ring_buffer_t *ring = &dev_priv->ring;
-
-       ring->space = *ring->head - ring->tail;
-#if R128_PERFORMANCE_BOXES
-       if ( ring->space == 0 )
-               atomic_inc( &dev_priv->idle_count );
-#endif
-       if ( ring->space <= 0 )
-               ring->space += ring->size;
-}
-
 static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
 {
        int i;
index e42868e..daae0f8 100644 (file)
 
 #define DRIVER_NAME            "r128"
 #define DRIVER_DESC            "ATI Rage 128"
-#define DRIVER_DATE            "20010216"
+#define DRIVER_DATE            "20010308"
 
 #define DRIVER_MAJOR           2
 #define DRIVER_MINOR           1
-#define DRIVER_PATCHLEVEL      4
+#define DRIVER_PATCHLEVEL      5
 
 #define DRIVER_IOCTLS                                                      \
    [DRM_IOCTL_NR(DRM_IOCTL_DMA)]             = { r128_cce_buffers,  1, 0 }, \
index 9f53746..6216b9a 100644 (file)
@@ -130,7 +130,14 @@ extern void r128_freelist_reset( drm_device_t *dev );
 extern drm_buf_t *r128_freelist_get( drm_device_t *dev );
 
 extern int r128_wait_ring( drm_r128_private_t *dev_priv, int n );
-extern void r128_update_ring_snapshot( drm_r128_private_t *dev_priv );
+
+static inline void
+r128_update_ring_snapshot( drm_r128_ring_buffer_t *ring )
+{
+       ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32);
+       if ( ring->space <= 0 )
+               ring->space += ring->size;
+}
 
 extern int r128_do_cce_idle( drm_r128_private_t *dev_priv );
 extern int r128_do_cleanup_cce( drm_device_t *dev );
@@ -415,9 +422,7 @@ do {                                                                        \
        drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
        if ( ring->space < ring->high_mark ) {                          \
                for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {      \
-                       ring->space = *ring->head - ring->tail;         \
-                       if ( ring->space <= 0 )                         \
-                               ring->space += ring->size;              \
+                       r128_update_ring_snapshot( ring );              \
                        if ( ring->space >= ring->high_mark )           \
                                goto __ring_space_done;                 \
                        udelay( 1 );                                    \
@@ -462,7 +467,7 @@ do {                                                                        \
                DRM_INFO( "BEGIN_RING( %d ) in %s\n",                   \
                           (n), __FUNCTION__ );                         \
        }                                                               \
-       if ( dev_priv->ring.space < (n) * sizeof(u32) ) {               \
+       if ( dev_priv->ring.space <= (n) * sizeof(u32) ) {              \
                r128_wait_ring( dev_priv, (n) * sizeof(u32) );          \
        }                                                               \
        dev_priv->ring.space -= (n) * sizeof(u32);                      \
index fa16f3c..9fc6b48 100644 (file)
@@ -372,8 +372,6 @@ static void r128_cce_dispatch_clear( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) {
                unsigned int tmp = flags;
 
@@ -477,8 +475,6 @@ static void r128_cce_dispatch_swap( drm_device_t *dev )
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
 #if R128_PERFORMANCE_BOXES
        /* Do some trivial performance monitoring...
         */
@@ -535,8 +531,6 @@ static void r128_cce_dispatch_flip( drm_device_t *dev )
        RING_LOCALS;
        DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page );
 
-       r128_update_ring_snapshot( dev_priv );
-
 #if R128_PERFORMANCE_BOXES
        /* Do some trivial performance monitoring...
         */
@@ -587,8 +581,6 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev,
        DRM_DEBUG( "%s: buf=%d nbox=%d\n",
                   __FUNCTION__, buf->idx, sarea_priv->nbox );
 
-       r128_update_ring_snapshot( dev_priv );
-
        if ( 0 )
                r128_print_dirty( "dispatch_vertex", sarea_priv->dirty );
 
@@ -656,8 +648,6 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev,
        DRM_DEBUG( "indirect: buf=%d s=0x%x e=0x%x\n",
                   buf->idx, start, end );
 
-       r128_update_ring_snapshot( dev_priv );
-
        if ( start != end ) {
                int offset = buf->bus_address + start;
                int dwords = (end - start + 3) / sizeof(u32);
@@ -722,8 +712,6 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "indices: s=%d e=%d c=%d\n", start, end, count );
 
-       r128_update_ring_snapshot( dev_priv );
-
        if ( 0 )
                r128_print_dirty( "dispatch_indices", sarea_priv->dirty );
 
@@ -799,8 +787,6 @@ static int r128_cce_dispatch_blit( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        /* The compiler won't optimize away a division by a variable,
         * even if the only legal values are powers of two.  Thus, we'll
         * use a shift instead.
@@ -911,8 +897,6 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        count = depth->n;
        if ( copy_from_user( &x, depth->x, sizeof(x) ) ) {
                return -EFAULT;
@@ -1006,8 +990,6 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        count = depth->n;
 
        x = kmalloc( count * sizeof(*x), 0 );
@@ -1123,8 +1105,6 @@ static int r128_cce_dispatch_read_span( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        count = depth->n;
        if ( copy_from_user( &x, depth->x, sizeof(x) ) ) {
                return -EFAULT;
@@ -1167,8 +1147,6 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        count = depth->n;
        if ( count > dev_priv->depth_pitch ) {
                count = dev_priv->depth_pitch;
@@ -1236,8 +1214,6 @@ static void r128_cce_dispatch_stipple( drm_device_t *dev, u32 *stipple )
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       r128_update_ring_snapshot( dev_priv );
-
        BEGIN_RING( 33 );
 
        OUT_RING( CCE_PACKET0( R128_BRUSH_DATA0, 31 ) );
index 3feb4b2..cea8c32 100644 (file)
@@ -1166,13 +1166,9 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
        int i;
 
        for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
-               ring->space = *ring->head - ring->tail;
-               if ( ring->space <= 0 )
-                       ring->space += ring->size;
-
-               if ( ring->space >= n )
+               radeon_update_ring_snapshot( ring );
+               if ( ring->space > n )
                        return 0;
-
                udelay( 1 );
        }
 
@@ -1181,17 +1177,6 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
        return -EBUSY;
 }
 
-void radeon_update_ring_snapshot( drm_radeon_private_t *dev_priv )
-{
-       drm_radeon_ring_buffer_t *ring = &dev_priv->ring;
-
-       ring->space = *ring->head - ring->tail;
-       if ( ring->space == 0 )
-               atomic_inc( &dev_priv->idle_count );
-       if ( ring->space <= 0 )
-               ring->space += ring->size;
-}
-
 static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
 {
        int i;
index 1aa889a..dba2037 100644 (file)
 
 #define DRIVER_NAME            "radeon"
 #define DRIVER_DESC            "ATI Radeon"
-#define DRIVER_DATE            "20010305"
+#define DRIVER_DATE            "20010308"
 
 #define DRIVER_MAJOR           1
 #define DRIVER_MINOR           0
-#define DRIVER_PATCHLEVEL      0
+#define DRIVER_PATCHLEVEL      1
 
 #define DRIVER_IOCTLS                                                       \
  [DRM_IOCTL_NR(DRM_IOCTL_DMA)]               = { radeon_cp_buffers,  1, 0 }, \
index d279b04..f176bb5 100644 (file)
@@ -146,7 +146,14 @@ extern void radeon_freelist_reset( drm_device_t *dev );
 extern drm_buf_t *radeon_freelist_get( drm_device_t *dev );
 
 extern int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n );
-extern void radeon_update_ring_snapshot( drm_radeon_private_t *dev_priv );
+
+static inline void
+radeon_update_ring_snapshot( drm_radeon_ring_buffer_t *ring )
+{
+       ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32);
+       if ( ring->space <= 0 )
+               ring->space += ring->size;
+}
 
 extern int radeon_do_cp_idle( drm_radeon_private_t *dev_priv );
 extern int radeon_do_cleanup_cp( drm_device_t *dev );
@@ -601,9 +608,7 @@ do {                                                                        \
        drm_radeon_ring_buffer_t *ring = &dev_priv->ring; int i;        \
        if ( ring->space < ring->high_mark ) {                          \
                for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {      \
-                       ring->space = *ring->head - ring->tail;         \
-                       if ( ring->space <= 0 )                         \
-                               ring->space += ring->size;              \
+                       radeon_update_ring_snapshot( ring );            \
                        if ( ring->space >= ring->high_mark )           \
                                goto __ring_space_done;                 \
                        udelay( 1 );                                    \
@@ -657,7 +662,7 @@ do {                                                                        \
                DRM_INFO( "BEGIN_RING( %d ) in %s\n",                   \
                           n, __FUNCTION__ );                           \
        }                                                               \
-       if ( dev_priv->ring.space < (n) * sizeof(u32) ) {               \
+       if ( dev_priv->ring.space <= (n) * sizeof(u32) ) {              \
                radeon_wait_ring( dev_priv, (n) * sizeof(u32) );        \
        }                                                               \
        dev_priv->ring.space -= (n) * sizeof(u32);                      \
index ff1b351..816e63b 100644 (file)
@@ -498,8 +498,6 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       radeon_update_ring_snapshot( dev_priv );
-
        if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) {
                unsigned int tmp = flags;
 
@@ -656,8 +654,6 @@ static void radeon_cp_dispatch_swap( drm_device_t *dev )
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       radeon_update_ring_snapshot( dev_priv );
-
 #if RADEON_PERFORMANCE_BOXES
        /* Do some trivial performance monitoring...
         */
@@ -725,8 +721,6 @@ static void radeon_cp_dispatch_flip( drm_device_t *dev )
        RING_LOCALS;
        DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page );
 
-       radeon_update_ring_snapshot( dev_priv );
-
 #if RADEON_PERFORMANCE_BOXES
        /* Do some trivial performance monitoring...
         */
@@ -777,8 +771,6 @@ static void radeon_cp_dispatch_vertex( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "%s: nbox=%d\n", __FUNCTION__, sarea_priv->nbox );
 
-       radeon_update_ring_snapshot( dev_priv );
-
        if ( 0 )
                radeon_print_dirty( "dispatch_vertex", sarea_priv->dirty );
 
@@ -845,8 +837,6 @@ static void radeon_cp_dispatch_indirect( drm_device_t *dev,
        DRM_DEBUG( "indirect: buf=%d s=0x%x e=0x%x\n",
                   buf->idx, start, end );
 
-       radeon_update_ring_snapshot( dev_priv );
-
        if ( start != end ) {
                int offset = (dev_priv->agp_buffers_offset
                              + buf->offset + start);
@@ -909,8 +899,6 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev,
        RING_LOCALS;
        DRM_DEBUG( "indices: s=%d e=%d c=%d\n", start, end, count );
 
-       radeon_update_ring_snapshot( dev_priv );
-
        if ( 0 )
                radeon_print_dirty( "dispatch_indices", sarea_priv->dirty );
 
@@ -1143,8 +1131,6 @@ static void radeon_cp_dispatch_stipple( drm_device_t *dev, u32 *stipple )
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       radeon_update_ring_snapshot( dev_priv );
-
        BEGIN_RING( 35 );
 
        OUT_RING( CP_PACKET0( RADEON_RE_STIPPLE_ADDR, 0 ) );
@@ -1180,7 +1166,6 @@ int radeon_cp_clear( struct inode *inode, struct file *filp,
                             sizeof(clear) ) )
                return -EFAULT;
 
-
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
        if ( sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS )