Here's the workaround for the Radeon 7500 lockup. I won't dignify it by calling it a fix until I've investigated the actual commands being sent and determined whether there's a better way of fixing it.
-- Tim Smith ([EMAIL PROTECTED]) Imperial Royal Guard foils attempted theft of Palpatine's left leg. "I'm hopping mad!" says Emperor.
Index: xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_state.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_state.c,v retrieving revision 1.3 diff -u -3 -p -r1.3 radeon_state.c --- xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_state.c 11 Jul 2002 20:31:12 -0000 1.3 +++ xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_state.c 15 Jul 2002 20:40:07 -0000 @@ -1692,6 +1692,19 @@ static int radeon_emit_packet3_cliprect( if ( i < cmdbuf->nbox ) { if (DRM_COPY_FROM_USER_UNCHECKED( &box, &boxes[i], sizeof(box) )) return DRM_ERR(EFAULT); + /* FIXME The second and subsequent times round this loop, send a + * WAIT_UNTIL_3D_IDLE before calling emit_clip_rect(). This + * fixes a lockup on fast machines when sending several + * cliprects with a cmdbuf, as when waving a 2D window over + * a 3D window. Something in the commands from user space + * seems to hang the card when they're sent several times + * in a row. That would be the correct place to fix it but + * this works around it until I can figure that out - Tim Smith */ + if ( i ) { + BEGIN_RING( 2 ); + RADEON_WAIT_UNTIL_3D_IDLE(); + ADVANCE_RING(); + } radeon_emit_clip_rect( dev_priv, &box ); } @@ -1700,7 +1713,6 @@ static int radeon_emit_packet3_cliprect( ADVANCE_RING(); } while ( ++i < cmdbuf->nbox ); - if (cmdbuf->nbox == 1) cmdbuf->nbox = 0;