diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/r300_cmdbuf.c | 117 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r300_reg.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cp.c | 38 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.h | 19 |
4 files changed, 130 insertions, 49 deletions
diff --git a/drivers/gpu/drm/radeon/r300_cmdbuf.c b/drivers/gpu/drm/radeon/r300_cmdbuf.c index 702df45320f7..4b3bd6303daf 100644 --- a/drivers/gpu/drm/radeon/r300_cmdbuf.c +++ b/drivers/gpu/drm/radeon/r300_cmdbuf.c | |||
| @@ -136,6 +136,18 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv, | |||
| 136 | ADVANCE_RING(); | 136 | ADVANCE_RING(); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | /* flus cache and wait idle clean after cliprect change */ | ||
| 140 | BEGIN_RING(2); | ||
| 141 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 142 | OUT_RING(R300_RB3D_DC_FLUSH); | ||
| 143 | ADVANCE_RING(); | ||
| 144 | BEGIN_RING(2); | ||
| 145 | OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
| 146 | OUT_RING(RADEON_WAIT_3D_IDLECLEAN); | ||
| 147 | ADVANCE_RING(); | ||
| 148 | /* set flush flag */ | ||
| 149 | dev_priv->track_flush |= RADEON_FLUSH_EMITED; | ||
| 150 | |||
| 139 | return 0; | 151 | return 0; |
| 140 | } | 152 | } |
| 141 | 153 | ||
| @@ -166,13 +178,13 @@ void r300_init_reg_flags(struct drm_device *dev) | |||
| 166 | ADD_RANGE(0x21DC, 1); | 178 | ADD_RANGE(0x21DC, 1); |
| 167 | ADD_RANGE(R300_VAP_UNKNOWN_221C, 1); | 179 | ADD_RANGE(R300_VAP_UNKNOWN_221C, 1); |
| 168 | ADD_RANGE(R300_VAP_CLIP_X_0, 4); | 180 | ADD_RANGE(R300_VAP_CLIP_X_0, 4); |
| 169 | ADD_RANGE(R300_VAP_PVS_WAITIDLE, 1); | 181 | ADD_RANGE(R300_VAP_PVS_STATE_FLUSH_REG, 1); |
| 170 | ADD_RANGE(R300_VAP_UNKNOWN_2288, 1); | 182 | ADD_RANGE(R300_VAP_UNKNOWN_2288, 1); |
| 171 | ADD_RANGE(R300_VAP_OUTPUT_VTX_FMT_0, 2); | 183 | ADD_RANGE(R300_VAP_OUTPUT_VTX_FMT_0, 2); |
| 172 | ADD_RANGE(R300_VAP_PVS_CNTL_1, 3); | 184 | ADD_RANGE(R300_VAP_PVS_CNTL_1, 3); |
| 173 | ADD_RANGE(R300_GB_ENABLE, 1); | 185 | ADD_RANGE(R300_GB_ENABLE, 1); |
| 174 | ADD_RANGE(R300_GB_MSPOS0, 5); | 186 | ADD_RANGE(R300_GB_MSPOS0, 5); |
| 175 | ADD_RANGE(R300_TX_CNTL, 1); | 187 | ADD_RANGE(R300_TX_INVALTAGS, 1); |
| 176 | ADD_RANGE(R300_TX_ENABLE, 1); | 188 | ADD_RANGE(R300_TX_ENABLE, 1); |
| 177 | ADD_RANGE(0x4200, 4); | 189 | ADD_RANGE(0x4200, 4); |
| 178 | ADD_RANGE(0x4214, 1); | 190 | ADD_RANGE(0x4214, 1); |
| @@ -388,15 +400,28 @@ static __inline__ int r300_emit_vpu(drm_radeon_private_t *dev_priv, | |||
| 388 | if (sz * 16 > cmdbuf->bufsz) | 400 | if (sz * 16 > cmdbuf->bufsz) |
| 389 | return -EINVAL; | 401 | return -EINVAL; |
| 390 | 402 | ||
| 391 | BEGIN_RING(5 + sz * 4); | 403 | /* VAP is very sensitive so we purge cache before we program it |
| 392 | /* Wait for VAP to come to senses.. */ | 404 | * and we also flush its state before & after */ |
| 393 | /* there is no need to emit it multiple times, (only once before VAP is programmed, | 405 | BEGIN_RING(6); |
| 394 | but this optimization is for later */ | 406 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
| 395 | OUT_RING_REG(R300_VAP_PVS_WAITIDLE, 0); | 407 | OUT_RING(R300_RB3D_DC_FLUSH); |
| 408 | OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
| 409 | OUT_RING(RADEON_WAIT_3D_IDLECLEAN); | ||
| 410 | OUT_RING(CP_PACKET0(R300_VAP_PVS_STATE_FLUSH_REG, 0)); | ||
| 411 | OUT_RING(0); | ||
| 412 | ADVANCE_RING(); | ||
| 413 | /* set flush flag */ | ||
| 414 | dev_priv->track_flush |= RADEON_FLUSH_EMITED; | ||
| 415 | |||
| 416 | BEGIN_RING(3 + sz * 4); | ||
| 396 | OUT_RING_REG(R300_VAP_PVS_UPLOAD_ADDRESS, addr); | 417 | OUT_RING_REG(R300_VAP_PVS_UPLOAD_ADDRESS, addr); |
| 397 | OUT_RING(CP_PACKET0_TABLE(R300_VAP_PVS_UPLOAD_DATA, sz * 4 - 1)); | 418 | OUT_RING(CP_PACKET0_TABLE(R300_VAP_PVS_UPLOAD_DATA, sz * 4 - 1)); |
| 398 | OUT_RING_TABLE((int *)cmdbuf->buf, sz * 4); | 419 | OUT_RING_TABLE((int *)cmdbuf->buf, sz * 4); |
| 420 | ADVANCE_RING(); | ||
| 399 | 421 | ||
| 422 | BEGIN_RING(2); | ||
| 423 | OUT_RING(CP_PACKET0(R300_VAP_PVS_STATE_FLUSH_REG, 0)); | ||
| 424 | OUT_RING(0); | ||
| 400 | ADVANCE_RING(); | 425 | ADVANCE_RING(); |
| 401 | 426 | ||
| 402 | cmdbuf->buf += sz * 16; | 427 | cmdbuf->buf += sz * 16; |
| @@ -424,6 +449,15 @@ static __inline__ int r300_emit_clear(drm_radeon_private_t *dev_priv, | |||
| 424 | OUT_RING_TABLE((int *)cmdbuf->buf, 8); | 449 | OUT_RING_TABLE((int *)cmdbuf->buf, 8); |
| 425 | ADVANCE_RING(); | 450 | ADVANCE_RING(); |
| 426 | 451 | ||
| 452 | BEGIN_RING(4); | ||
| 453 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 454 | OUT_RING(R300_RB3D_DC_FLUSH); | ||
| 455 | OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
| 456 | OUT_RING(RADEON_WAIT_3D_IDLECLEAN); | ||
| 457 | ADVANCE_RING(); | ||
| 458 | /* set flush flag */ | ||
| 459 | dev_priv->track_flush |= RADEON_FLUSH_EMITED; | ||
| 460 | |||
| 427 | cmdbuf->buf += 8 * 4; | 461 | cmdbuf->buf += 8 * 4; |
| 428 | cmdbuf->bufsz -= 8 * 4; | 462 | cmdbuf->bufsz -= 8 * 4; |
| 429 | 463 | ||
| @@ -613,11 +647,19 @@ static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, | |||
| 613 | case RADEON_CNTL_BITBLT_MULTI: | 647 | case RADEON_CNTL_BITBLT_MULTI: |
| 614 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); | 648 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); |
| 615 | 649 | ||
| 616 | case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | 650 | case RADEON_CP_INDX_BUFFER: |
| 651 | /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | ||
| 617 | return r300_emit_indx_buffer(dev_priv, cmdbuf); | 652 | return r300_emit_indx_buffer(dev_priv, cmdbuf); |
| 618 | case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */ | 653 | case RADEON_CP_3D_DRAW_IMMD_2: |
| 619 | case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */ | 654 | /* triggers drawing using in-packet vertex data */ |
| 620 | case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */ | 655 | case RADEON_CP_3D_DRAW_VBUF_2: |
| 656 | /* triggers drawing of vertex buffers setup elsewhere */ | ||
| 657 | case RADEON_CP_3D_DRAW_INDX_2: | ||
| 658 | /* triggers drawing using indices to vertex buffer */ | ||
| 659 | /* whenever we send vertex we clear flush & purge */ | ||
| 660 | dev_priv->track_flush &= ~(RADEON_FLUSH_EMITED | | ||
| 661 | RADEON_PURGE_EMITED); | ||
| 662 | break; | ||
| 621 | case RADEON_WAIT_FOR_IDLE: | 663 | case RADEON_WAIT_FOR_IDLE: |
| 622 | case RADEON_CP_NOP: | 664 | case RADEON_CP_NOP: |
| 623 | /* these packets are safe */ | 665 | /* these packets are safe */ |
| @@ -713,17 +755,53 @@ static __inline__ int r300_emit_packet3(drm_radeon_private_t *dev_priv, | |||
| 713 | */ | 755 | */ |
| 714 | static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv) | 756 | static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv) |
| 715 | { | 757 | { |
| 758 | uint32_t cache_z, cache_3d, cache_2d; | ||
| 716 | RING_LOCALS; | 759 | RING_LOCALS; |
| 760 | |||
| 761 | cache_z = R300_ZC_FLUSH; | ||
| 762 | cache_2d = R300_RB2D_DC_FLUSH; | ||
| 763 | cache_3d = R300_RB3D_DC_FLUSH; | ||
| 764 | if (!(dev_priv->track_flush & RADEON_PURGE_EMITED)) { | ||
| 765 | /* we can purge, primitive where draw since last purge */ | ||
| 766 | cache_z |= R300_ZC_FREE; | ||
| 767 | cache_2d |= R300_RB2D_DC_FREE; | ||
| 768 | cache_3d |= R300_RB3D_DC_FREE; | ||
| 769 | } | ||
| 717 | 770 | ||
| 718 | BEGIN_RING(6); | 771 | /* flush & purge zbuffer */ |
| 719 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); | 772 | BEGIN_RING(2); |
| 720 | OUT_RING(R300_RB3D_DSTCACHE_UNKNOWN_0A); | ||
| 721 | OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0)); | 773 | OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0)); |
| 722 | OUT_RING(R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE| | 774 | OUT_RING(cache_z); |
| 723 | R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE); | 775 | ADVANCE_RING(); |
| 724 | OUT_RING(CP_PACKET3(RADEON_CP_NOP, 0)); | 776 | /* flush & purge 3d */ |
| 725 | OUT_RING(0x0); | 777 | BEGIN_RING(2); |
| 778 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 779 | OUT_RING(cache_3d); | ||
| 780 | ADVANCE_RING(); | ||
| 781 | /* flush & purge texture */ | ||
| 782 | BEGIN_RING(2); | ||
| 783 | OUT_RING(CP_PACKET0(R300_TX_INVALTAGS, 0)); | ||
| 784 | OUT_RING(0); | ||
| 785 | ADVANCE_RING(); | ||
| 786 | /* FIXME: is this one really needed ? */ | ||
| 787 | BEGIN_RING(2); | ||
| 788 | OUT_RING(CP_PACKET0(R300_RB3D_AARESOLVE_CTL, 0)); | ||
| 789 | OUT_RING(0); | ||
| 790 | ADVANCE_RING(); | ||
| 791 | BEGIN_RING(2); | ||
| 792 | OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
| 793 | OUT_RING(RADEON_WAIT_3D_IDLECLEAN); | ||
| 794 | ADVANCE_RING(); | ||
| 795 | /* flush & purge 2d through E2 as RB2D will trigger lockup */ | ||
| 796 | BEGIN_RING(4); | ||
| 797 | OUT_RING(CP_PACKET0(R300_DSTCACHE_CTLSTAT, 0)); | ||
| 798 | OUT_RING(cache_2d); | ||
| 799 | OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
| 800 | OUT_RING(RADEON_WAIT_2D_IDLECLEAN | | ||
| 801 | RADEON_WAIT_HOST_IDLECLEAN); | ||
| 726 | ADVANCE_RING(); | 802 | ADVANCE_RING(); |
| 803 | /* set flush & purge flags */ | ||
| 804 | dev_priv->track_flush |= RADEON_FLUSH_EMITED | RADEON_PURGE_EMITED; | ||
| 727 | } | 805 | } |
| 728 | 806 | ||
| 729 | /** | 807 | /** |
| @@ -905,8 +983,7 @@ int r300_do_cp_cmdbuf(struct drm_device *dev, | |||
| 905 | 983 | ||
| 906 | DRM_DEBUG("\n"); | 984 | DRM_DEBUG("\n"); |
| 907 | 985 | ||
| 908 | /* See the comment above r300_emit_begin3d for why this call must be here, | 986 | /* pacify */ |
| 909 | * and what the cleanup gotos are for. */ | ||
| 910 | r300_pacify(dev_priv); | 987 | r300_pacify(dev_priv); |
| 911 | 988 | ||
| 912 | if (cmdbuf->nbox <= R300_SIMULTANEOUS_CLIPRECTS) { | 989 | if (cmdbuf->nbox <= R300_SIMULTANEOUS_CLIPRECTS) { |
diff --git a/drivers/gpu/drm/radeon/r300_reg.h b/drivers/gpu/drm/radeon/r300_reg.h index a6802f26afc4..ee6f811599a3 100644 --- a/drivers/gpu/drm/radeon/r300_reg.h +++ b/drivers/gpu/drm/radeon/r300_reg.h | |||
| @@ -317,7 +317,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| 317 | * Therefore, I suspect writing zero to 0x2284 synchronizes the engine and | 317 | * Therefore, I suspect writing zero to 0x2284 synchronizes the engine and |
| 318 | * avoids bugs caused by still running shaders reading bad data from memory. | 318 | * avoids bugs caused by still running shaders reading bad data from memory. |
| 319 | */ | 319 | */ |
| 320 | #define R300_VAP_PVS_WAITIDLE 0x2284 /* GUESS */ | 320 | #define R300_VAP_PVS_STATE_FLUSH_REG 0x2284 |
| 321 | 321 | ||
| 322 | /* Absolutely no clue what this register is about. */ | 322 | /* Absolutely no clue what this register is about. */ |
| 323 | #define R300_VAP_UNKNOWN_2288 0x2288 | 323 | #define R300_VAP_UNKNOWN_2288 0x2288 |
| @@ -513,7 +513,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| 513 | /* gap */ | 513 | /* gap */ |
| 514 | 514 | ||
| 515 | /* Zero to flush caches. */ | 515 | /* Zero to flush caches. */ |
| 516 | #define R300_TX_CNTL 0x4100 | 516 | #define R300_TX_INVALTAGS 0x4100 |
| 517 | #define R300_TX_FLUSH 0x0 | 517 | #define R300_TX_FLUSH 0x0 |
| 518 | 518 | ||
| 519 | /* The upper enable bits are guessed, based on fglrx reported limits. */ | 519 | /* The upper enable bits are guessed, based on fglrx reported limits. */ |
| @@ -1362,6 +1362,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| 1362 | #define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */ | 1362 | #define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */ |
| 1363 | #define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */ | 1363 | #define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */ |
| 1364 | 1364 | ||
| 1365 | #define R300_RB3D_AARESOLVE_CTL 0x4E88 | ||
| 1365 | /* gap */ | 1366 | /* gap */ |
| 1366 | 1367 | ||
| 1367 | /* Guess by Vladimir. | 1368 | /* Guess by Vladimir. |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index f0de81a5689d..3331f88dcfb6 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #define RADEON_FIFO_DEBUG 0 | 40 | #define RADEON_FIFO_DEBUG 0 |
| 41 | 41 | ||
| 42 | static int radeon_do_cleanup_cp(struct drm_device * dev); | 42 | static int radeon_do_cleanup_cp(struct drm_device * dev); |
| 43 | static void radeon_do_cp_start(drm_radeon_private_t * dev_priv); | ||
| 43 | 44 | ||
| 44 | static u32 R500_READ_MCIND(drm_radeon_private_t *dev_priv, int addr) | 45 | static u32 R500_READ_MCIND(drm_radeon_private_t *dev_priv, int addr) |
| 45 | { | 46 | { |
| @@ -198,23 +199,8 @@ static int radeon_do_pixcache_flush(drm_radeon_private_t * dev_priv) | |||
| 198 | DRM_UDELAY(1); | 199 | DRM_UDELAY(1); |
| 199 | } | 200 | } |
| 200 | } else { | 201 | } else { |
| 201 | /* 3D */ | 202 | /* don't flush or purge cache here or lockup */ |
| 202 | tmp = RADEON_READ(R300_RB3D_DSTCACHE_CTLSTAT); | 203 | return 0; |
| 203 | tmp |= RADEON_RB3D_DC_FLUSH_ALL; | ||
| 204 | RADEON_WRITE(R300_RB3D_DSTCACHE_CTLSTAT, tmp); | ||
| 205 | |||
| 206 | /* 2D */ | ||
| 207 | tmp = RADEON_READ(R300_DSTCACHE_CTLSTAT); | ||
| 208 | tmp |= RADEON_RB3D_DC_FLUSH_ALL; | ||
| 209 | RADEON_WRITE(R300_DSTCACHE_CTLSTAT, tmp); | ||
| 210 | |||
| 211 | for (i = 0; i < dev_priv->usec_timeout; i++) { | ||
| 212 | if (!(RADEON_READ(R300_DSTCACHE_CTLSTAT) | ||
| 213 | & RADEON_RB3D_DC_BUSY)) { | ||
| 214 | return 0; | ||
| 215 | } | ||
| 216 | DRM_UDELAY(1); | ||
| 217 | } | ||
| 218 | } | 204 | } |
| 219 | 205 | ||
| 220 | #if RADEON_FIFO_DEBUG | 206 | #if RADEON_FIFO_DEBUG |
| @@ -237,6 +223,9 @@ static int radeon_do_wait_for_fifo(drm_radeon_private_t * dev_priv, int entries) | |||
| 237 | return 0; | 223 | return 0; |
| 238 | DRM_UDELAY(1); | 224 | DRM_UDELAY(1); |
| 239 | } | 225 | } |
| 226 | DRM_INFO("wait for fifo failed status : 0x%08X 0x%08X\n", | ||
| 227 | RADEON_READ(RADEON_RBBM_STATUS), | ||
| 228 | RADEON_READ(R300_VAP_CNTL_STATUS)); | ||
| 240 | 229 | ||
| 241 | #if RADEON_FIFO_DEBUG | 230 | #if RADEON_FIFO_DEBUG |
| 242 | DRM_ERROR("failed!\n"); | 231 | DRM_ERROR("failed!\n"); |
| @@ -263,6 +252,9 @@ static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv) | |||
| 263 | } | 252 | } |
| 264 | DRM_UDELAY(1); | 253 | DRM_UDELAY(1); |
| 265 | } | 254 | } |
| 255 | DRM_INFO("wait idle failed status : 0x%08X 0x%08X\n", | ||
| 256 | RADEON_READ(RADEON_RBBM_STATUS), | ||
| 257 | RADEON_READ(R300_VAP_CNTL_STATUS)); | ||
| 266 | 258 | ||
| 267 | #if RADEON_FIFO_DEBUG | 259 | #if RADEON_FIFO_DEBUG |
| 268 | DRM_ERROR("failed!\n"); | 260 | DRM_ERROR("failed!\n"); |
| @@ -443,14 +435,20 @@ static void radeon_do_cp_start(drm_radeon_private_t * dev_priv) | |||
| 443 | 435 | ||
| 444 | dev_priv->cp_running = 1; | 436 | dev_priv->cp_running = 1; |
| 445 | 437 | ||
| 446 | BEGIN_RING(6); | 438 | BEGIN_RING(8); |
| 447 | 439 | /* isync can only be written through cp on r5xx write it here */ | |
| 440 | OUT_RING(CP_PACKET0(RADEON_ISYNC_CNTL, 0)); | ||
| 441 | OUT_RING(RADEON_ISYNC_ANY2D_IDLE3D | | ||
| 442 | RADEON_ISYNC_ANY3D_IDLE2D | | ||
| 443 | RADEON_ISYNC_WAIT_IDLEGUI | | ||
| 444 | RADEON_ISYNC_CPSCRATCH_IDLEGUI); | ||
| 448 | RADEON_PURGE_CACHE(); | 445 | RADEON_PURGE_CACHE(); |
| 449 | RADEON_PURGE_ZCACHE(); | 446 | RADEON_PURGE_ZCACHE(); |
| 450 | RADEON_WAIT_UNTIL_IDLE(); | 447 | RADEON_WAIT_UNTIL_IDLE(); |
| 451 | |||
| 452 | ADVANCE_RING(); | 448 | ADVANCE_RING(); |
| 453 | COMMIT_RING(); | 449 | COMMIT_RING(); |
| 450 | |||
| 451 | dev_priv->track_flush |= RADEON_FLUSH_EMITED | RADEON_PURGE_EMITED; | ||
| 454 | } | 452 | } |
| 455 | 453 | ||
| 456 | /* Reset the Command Processor. This will not flush any pending | 454 | /* Reset the Command Processor. This will not flush any pending |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 3f0eca957aa7..099381693175 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
| @@ -220,6 +220,9 @@ struct radeon_virt_surface { | |||
| 220 | struct drm_file *file_priv; | 220 | struct drm_file *file_priv; |
| 221 | }; | 221 | }; |
| 222 | 222 | ||
| 223 | #define RADEON_FLUSH_EMITED (1 < 0) | ||
| 224 | #define RADEON_PURGE_EMITED (1 < 1) | ||
| 225 | |||
| 223 | typedef struct drm_radeon_private { | 226 | typedef struct drm_radeon_private { |
| 224 | drm_radeon_ring_buffer_t ring; | 227 | drm_radeon_ring_buffer_t ring; |
| 225 | drm_radeon_sarea_t *sarea_priv; | 228 | drm_radeon_sarea_t *sarea_priv; |
| @@ -311,6 +314,7 @@ typedef struct drm_radeon_private { | |||
| 311 | unsigned long fb_aper_offset; | 314 | unsigned long fb_aper_offset; |
| 312 | 315 | ||
| 313 | int num_gb_pipes; | 316 | int num_gb_pipes; |
| 317 | int track_flush; | ||
| 314 | } drm_radeon_private_t; | 318 | } drm_radeon_private_t; |
| 315 | 319 | ||
| 316 | typedef struct drm_radeon_buf_priv { | 320 | typedef struct drm_radeon_buf_priv { |
| @@ -693,7 +697,6 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev, | |||
| 693 | #define R300_ZB_ZCACHE_CTLSTAT 0x4f18 | 697 | #define R300_ZB_ZCACHE_CTLSTAT 0x4f18 |
| 694 | # define R300_ZC_FLUSH (1 << 0) | 698 | # define R300_ZC_FLUSH (1 << 0) |
| 695 | # define R300_ZC_FREE (1 << 1) | 699 | # define R300_ZC_FREE (1 << 1) |
| 696 | # define R300_ZC_FLUSH_ALL 0x3 | ||
| 697 | # define R300_ZC_BUSY (1 << 31) | 700 | # define R300_ZC_BUSY (1 << 31) |
| 698 | #define RADEON_RB3D_DSTCACHE_CTLSTAT 0x325c | 701 | #define RADEON_RB3D_DSTCACHE_CTLSTAT 0x325c |
| 699 | # define RADEON_RB3D_DC_FLUSH (3 << 0) | 702 | # define RADEON_RB3D_DC_FLUSH (3 << 0) |
| @@ -701,6 +704,8 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev, | |||
| 701 | # define RADEON_RB3D_DC_FLUSH_ALL 0xf | 704 | # define RADEON_RB3D_DC_FLUSH_ALL 0xf |
| 702 | # define RADEON_RB3D_DC_BUSY (1 << 31) | 705 | # define RADEON_RB3D_DC_BUSY (1 << 31) |
| 703 | #define R300_RB3D_DSTCACHE_CTLSTAT 0x4e4c | 706 | #define R300_RB3D_DSTCACHE_CTLSTAT 0x4e4c |
| 707 | # define R300_RB3D_DC_FLUSH (2 << 0) | ||
| 708 | # define R300_RB3D_DC_FREE (2 << 2) | ||
| 704 | # define R300_RB3D_DC_FINISH (1 << 4) | 709 | # define R300_RB3D_DC_FINISH (1 << 4) |
| 705 | #define RADEON_RB3D_ZSTENCILCNTL 0x1c2c | 710 | #define RADEON_RB3D_ZSTENCILCNTL 0x1c2c |
| 706 | # define RADEON_Z_TEST_MASK (7 << 4) | 711 | # define RADEON_Z_TEST_MASK (7 << 4) |
| @@ -1246,17 +1251,17 @@ do { \ | |||
| 1246 | OUT_RING(RADEON_RB3D_DC_FLUSH); \ | 1251 | OUT_RING(RADEON_RB3D_DC_FLUSH); \ |
| 1247 | } else { \ | 1252 | } else { \ |
| 1248 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ | 1253 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ |
| 1249 | OUT_RING(RADEON_RB3D_DC_FLUSH); \ | 1254 | OUT_RING(R300_RB3D_DC_FLUSH); \ |
| 1250 | } \ | 1255 | } \ |
| 1251 | } while (0) | 1256 | } while (0) |
| 1252 | 1257 | ||
| 1253 | #define RADEON_PURGE_CACHE() do { \ | 1258 | #define RADEON_PURGE_CACHE() do { \ |
| 1254 | if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \ | 1259 | if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \ |
| 1255 | OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ | 1260 | OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ |
| 1256 | OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ | 1261 | OUT_RING(RADEON_RB3D_DC_FLUSH | RADEON_RB3D_DC_FREE); \ |
| 1257 | } else { \ | 1262 | } else { \ |
| 1258 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ | 1263 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ |
| 1259 | OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ | 1264 | OUT_RING(R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); \ |
| 1260 | } \ | 1265 | } \ |
| 1261 | } while (0) | 1266 | } while (0) |
| 1262 | 1267 | ||
| @@ -1273,10 +1278,10 @@ do { \ | |||
| 1273 | #define RADEON_PURGE_ZCACHE() do { \ | 1278 | #define RADEON_PURGE_ZCACHE() do { \ |
| 1274 | if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \ | 1279 | if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \ |
| 1275 | OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ | 1280 | OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ |
| 1276 | OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ | 1281 | OUT_RING(RADEON_RB3D_ZC_FLUSH | RADEON_RB3D_ZC_FREE); \ |
| 1277 | } else { \ | 1282 | } else { \ |
| 1278 | OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ | 1283 | OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0)); \ |
| 1279 | OUT_RING(R300_ZC_FLUSH_ALL); \ | 1284 | OUT_RING(R300_ZC_FLUSH | R300_ZC_FREE); \ |
| 1280 | } \ | 1285 | } \ |
| 1281 | } while (0) | 1286 | } while (0) |
| 1282 | 1287 | ||
