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
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel