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;
}