Here it is. It'll need cleaning up if it works, but it'll do as a test.

-- 
Tim Smith ([EMAIL PROTECTED])
"A fray!!!!"
  -- Groo the Wanderer
Index: xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c,v
retrieving revision 1.16
diff -u -3 -p -r1.16 radeon_ioctl.c
--- xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c	18 Jun 2002 22:40:26 -0000	1.16
+++ xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c	1 Jul 2002 21:36:54 -0000
@@ -614,7 +614,22 @@ static int radeonWaitForFrameCompletion(
    int i;
 
    while ( 1 ) {
-      frame = INREG( RADEON_LAST_FRAME_REG );
+      /* frame = INREG( RADEON_LAST_FRAME_REG ); */
+      drmRadeonGetParam gp;
+      int ret;
+
+      gp.param = RADEON_PARAM_LAST_FRAME;
+      gp.value = &frame;
+      ret = drmCommandWriteRead( rmesa->dri.fd,
+		      DRM_RADEON_GETPARAM,&gp, sizeof(gp));
+      if (ret) {
+	 fprintf(stderr, "drmRadeonGetParam: %d\n", ret);
+	 exit(1);
+      }
+      if ( RADEON_DEBUG & DEBUG_IOCTL ) {
+	 fprintf( stderr, "%s( %d )\n", __FUNCTION__, clear );
+      }
+
       if ( sarea->last_frame - frame <= RADEON_MAX_OUTSTANDING ) {
 	 break;
       }
@@ -803,12 +818,28 @@ static void radeonClear( GLcontext *ctx,
    /* Throttle the number of clear ioctls we do.
     */
    while ( 1 ) {
-      clear = INREG( RADEON_LAST_CLEAR_REG );
+      /* clear = INREG( RADEON_LAST_CLEAR_REG ); */
+      drmRadeonGetParam gp;
+      int ret;
+
+      gp.param = RADEON_PARAM_LAST_CLEAR;
+      gp.value = &clear;
+      ret = drmCommandWriteRead( rmesa->dri.fd,
+		      DRM_RADEON_GETPARAM,&gp, sizeof(gp));
+      if (ret) {
+	 fprintf(stderr, "drmRadeonGetParam: %d\n", ret);
+	 exit(1);
+      }
+      if ( RADEON_DEBUG & DEBUG_IOCTL ) {
+	 fprintf( stderr, "%s( %d )\n", __FUNCTION__, clear );
+      }
+
       if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) {
 	 break;
       }
       /* Spin in place a bit so we aren't hammering the bus */
       for ( i = 0 ; i < 1024 ; i++ ) {
+         delay();
       }
    }
 
Index: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h,v
retrieving revision 1.3
diff -u -3 -p -r1.3 radeon_common.h
--- xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h	12 Jun 2002 15:50:27 -0000	1.3
+++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h	1 Jul 2002 21:36:55 -0000
@@ -336,5 +336,8 @@ typedef struct drm_radeon_getparam {
 } drmRadeonGetParam;
 
 #define RADEON_PARAM_AGP_BUFFER_OFFSET 0x1
+#define RADEON_PARAM_LAST_FRAME 0x2
+#define RADEON_PARAM_LAST_DISPATCH 0x3
+#define RADEON_PARAM_LAST_CLEAR 0x4
 
 #endif
Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c,v
retrieving revision 1.23
diff -u -3 -p -r1.23 radeon_cp.c
--- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c	12 Jun 2002 15:50:28 -0000	1.23
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c	1 Jul 2002 21:36:57 -0000
@@ -905,17 +905,16 @@ static int radeon_do_init_cp( drm_device
 
 	dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
 
-#if 0
 	/* Initialize the scratch register pointer.  This will cause
 	 * the scratch register values to be written out to memory
 	 * whenever they are updated.
 	 * FIXME: This doesn't quite work yet, so we're disabling it
 	 * for the release.
+	 * TCS 2002-07-01 enabled again for testing
 	 */
 	RADEON_WRITE( RADEON_SCRATCH_ADDR, (dev_priv->ring_rptr->offset +
 					    RADEON_SCRATCH_REG_OFFSET) );
 	RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 );
-#endif
 
 	dev_priv->scratch = ((__volatile__ u32 *)
 			     dev_priv->ring_rptr->handle +
@@ -1189,7 +1188,11 @@ drm_buf_t *radeon_freelist_get( drm_devi
 	start = dev_priv->last_buf;
 
 	for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) {
+		/* Testing scratch register writeback
 		u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
+		*/
+		u32 done_age = dev_priv->scratch[1];
+		DRM_DEBUG("done_age = %d\n",done_age);
 		for ( i = start ; i < dma->buf_count ; i++ ) {
 			buf = dma->buflist[i];
 			buf_priv = buf->dev_private;
Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h,v
retrieving revision 1.11
diff -u -3 -p -r1.11 radeon_drm.h
--- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h	12 Jun 2002 15:50:28 -0000	1.11
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drm.h	1 Jul 2002 21:36:57 -0000
@@ -458,6 +458,9 @@ typedef struct drm_radeon_indirect {
  * client any other way.  
  */
 #define RADEON_PARAM_AGP_BUFFER_OFFSET 0x1
+#define RADEON_PARAM_LAST_FRAME 0x2
+#define RADEON_PARAM_LAST_DISPATCH 0x3
+#define RADEON_PARAM_LAST_CLEAR 0x4
 
 typedef struct drm_radeon_getparam {
 	int param;
Index: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c,v
retrieving revision 1.17
diff -u -3 -p -r1.17 radeon_state.c
--- xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c	27 Jun 2002 17:56:39 -0000	1.17
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c	1 Jul 2002 21:36:58 -0000
@@ -1878,6 +1878,15 @@ int radeon_cp_getparam( struct inode *in
 	case RADEON_PARAM_AGP_BUFFER_OFFSET:
 		value = dev_priv->agp_buffers_offset;
 		break;
+	case RADEON_PARAM_LAST_FRAME:
+		value = dev_priv->scratch[0];
+		break;
+	case RADEON_PARAM_LAST_DISPATCH:
+		value = dev_priv->scratch[1];
+		break;
+	case RADEON_PARAM_LAST_CLEAR:
+		value = dev_priv->scratch[2];
+		break;
 	default:
 		return -EINVAL;
 	}


Reply via email to