Posting my latest DRM and Mesa patches in case they should prove useful to anyone else. They are to head as of early Saturday.
I moved the CP idle outside the while loop in radeon_state.c. I think it may apply to the R300 as well as there is an "if R300 idle command" in the Xserver RADEONEnterServer function. I have not tried removing the DRM changes since adding the Mesa change. Just sticking with something that doesn't lockup. diff -ru drm120205/shared-core/radeon_state.c drmbld/shared-core/radeon_state.c --- drm120205/shared-core/radeon_state.c Mon Nov 28 22:05:43 2005 +++ drmbld/shared-core/radeon_state.c Sat Dec 3 13:00:57 2005 @@ -2388,7 +2388,7 @@ */ BEGIN_RING(2); - RADEON_WAIT_UNTIL_3D_IDLE(); + RADEON_WAIT_UNTIL_IDLE(); ADVANCE_RING(); @@ -2737,6 +2737,7 @@ drm_radeon_cmd_header_t header; int orig_nbox, orig_bufsz; char *kbuf = NULL; + RING_LOCALS; LOCK_TEST_WITH_RETURN(dev, filp); @@ -2775,7 +2776,17 @@ } orig_nbox = cmdbuf.nbox; - + + /* Wait for the engine to idle before the indirect buffer + * is processed. + */ + + BEGIN_RING(2); + + RADEON_WAIT_UNTIL_IDLE(); + + ADVANCE_RING(); + if(dev_priv->microcode_version == UCODE_R300) { int temp; temp=r300_do_cp_cmdbuf(dev, filp, filp_priv, &cmdbuf); @@ -2785,7 +2796,7 @@ return temp; } - + /* microcode_version != r300 */ while (cmdbuf.bufsz >= sizeof(header)) { header.i = *(int *)cmdbuf.buf; diff -ru mesa120205/Mesa/src/mesa/drivers/dri/r200/r200_state_init.c xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/r200/r200_state_init.c --- mesa120205/Mesa/src/mesa/drivers/dri/r200/r200_state_init.c Fri Dec 2 00:56:29 2005 +++ xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/r200/r200_state_init.c Sat Dec 3 12:09:32 2005 @@ -253,8 +253,8 @@ ALLOC_STATE( zbs, always, ZBS_STATE_SIZE, "ZBS/zbias", 0 ); ALLOC_STATE( tf, tf, TF_STATE_SIZE, "TF/tfactor", 0 ); if (rmesa->r200Screen->drmSupportsFragShader) { - if (rmesa->r200Screen->chip_family == CHIP_FAMILY_R200) { - /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */ + if (rmesa->r200Screen->chip_flags & R200_CHIPSET_TEX01_BROKEN) { + /* make sure texture units 0/1 are emitted pair-wise for t0 hang workaround */ ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-0", 0 ); ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-1", 1 ); ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 ); @@ -273,7 +273,7 @@ ALLOC_STATE( afs[1], afs, AFS_STATE_SIZE, "AFS/afsinst-1", 1 ); } else { - if (rmesa->r200Screen->chip_family == CHIP_FAMILY_R200) { + if (rmesa->r200Screen->chip_flags & R200_CHIPSET_TEX01_BROKEN) { ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-0", 0 ); ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-1", 1 ); ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 ); diff -ru mesa120205/Mesa/src/mesa/drivers/dri/r200/r200_texstate.c xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/r200/r200_texstate.c --- mesa120205/Mesa/src/mesa/drivers/dri/r200/r200_texstate.c Fri Dec 2 00:56:29 2005 +++ xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/r200/r200_texstate.c Sat Dec 3 12:13:52 2005 @@ -1678,11 +1678,10 @@ r200ChooseVertexState( ctx ); - if (rmesa->r200Screen->chip_family == CHIP_FAMILY_R200) { + if (rmesa->r200Screen->chip_flags & R200_CHIPSET_TEX01_BROKEN) { /* - * T0 hang workaround ------------- - * not needed for r200 derivatives + * T0 hang workaround */ if ((rmesa->hw.ctx.cmd[CTX_PP_CNTL] & R200_TEX_ENABLE_MASK) == R200_TEX_0_ENABLE && (rmesa->hw.tex[0].cmd[TEX_PP_TXFILTER] & R200_MIN_FILTER_MASK) > R200_MIN_FILTER_LINEAR) { diff -ru mesa120205/Mesa/src/mesa/drivers/dri/radeon/radeon_chipset.h xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/radeon/radeon_chipset.h --- mesa120205/Mesa/src/mesa/drivers/dri/radeon/radeon_chipset.h Fri Dec 2 21:21:24 2005 +++ xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/radeon/radeon_chipset.h Sat Dec 3 19:47:56 2005 @@ -133,5 +133,6 @@ #define RADEON_CHIPSET_TCL (1 << 2) /* tcl support - any radeon */ #define RADEON_CHIPSET_BROKEN_STENCIL (1 << 3) /* r100 stencil bug */ #define R200_CHIPSET_YCBCR_BROKEN (1 << 4) /* r200 ycbcr bug */ +#define R200_CHIPSET_TEX01_BROKEN (1 << 5) /* r200 texture pair bug */ #endif /* _RADEON_CHIPSET_H */ diff -ru mesa120205/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c --- mesa120205/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c Fri Dec 2 21:21:24 2005 +++ xorgcursrc/xc/extras/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c Sat Dec 3 19:25:34 2005 @@ -481,7 +481,7 @@ case PCI_CHIP_R200_QN: case PCI_CHIP_R200_QO: screen->chip_family = CHIP_FAMILY_R200; - screen->chip_flags = RADEON_CHIPSET_TCL; + screen->chip_flags = RADEON_CHIPSET_TCL | R200_CHIPSET_TEX01_BROKEN; break; case PCI_CHIP_RV250_Id: @@ -493,7 +493,8 @@ case PCI_CHIP_RV250_Lf: case PCI_CHIP_RV250_Lg: screen->chip_family = CHIP_FAMILY_RV250; - screen->chip_flags = R200_CHIPSET_YCBCR_BROKEN | RADEON_CHIPSET_TCL; + screen->chip_flags = RADEON_CHIPSET_TCL | R200_CHIPSET_YCBCR_BROKEN | + R200_CHIPSET_TEX01_BROKEN; break; case PCI_CHIP_RV280_5960: ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click -- _______________________________________________ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel