diff options
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r420.c | 13 |
3 files changed, 33 insertions, 30 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 38209a61e515..597f85b283bc 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -366,8 +366,8 @@ void r100_fence_ring_emit(struct radeon_device *rdev, | |||
366 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); | 366 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); |
367 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); | 367 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); |
368 | /* Wait until IDLE & CLEAN */ | 368 | /* Wait until IDLE & CLEAN */ |
369 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 369 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
370 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 370 | radeon_ring_write(rdev, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); |
371 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | 371 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
372 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl | | 372 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl | |
373 | RADEON_HDP_READ_BUFFER_INVALIDATE); | 373 | RADEON_HDP_READ_BUFFER_INVALIDATE); |
@@ -1701,7 +1701,7 @@ int r100_gui_wait_for_idle(struct radeon_device *rdev) | |||
1701 | } | 1701 | } |
1702 | for (i = 0; i < rdev->usec_timeout; i++) { | 1702 | for (i = 0; i < rdev->usec_timeout; i++) { |
1703 | tmp = RREG32(RADEON_RBBM_STATUS); | 1703 | tmp = RREG32(RADEON_RBBM_STATUS); |
1704 | if (!(tmp & (1 << 31))) { | 1704 | if (!(tmp & RADEON_RBBM_ACTIVE)) { |
1705 | return 0; | 1705 | return 0; |
1706 | } | 1706 | } |
1707 | DRM_UDELAY(1); | 1707 | DRM_UDELAY(1); |
@@ -1716,8 +1716,8 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev) | |||
1716 | 1716 | ||
1717 | for (i = 0; i < rdev->usec_timeout; i++) { | 1717 | for (i = 0; i < rdev->usec_timeout; i++) { |
1718 | /* read MC_STATUS */ | 1718 | /* read MC_STATUS */ |
1719 | tmp = RREG32(0x0150); | 1719 | tmp = RREG32(RADEON_MC_STATUS); |
1720 | if (tmp & (1 << 2)) { | 1720 | if (tmp & RADEON_MC_IDLE) { |
1721 | return 0; | 1721 | return 0; |
1722 | } | 1722 | } |
1723 | DRM_UDELAY(1); | 1723 | DRM_UDELAY(1); |
@@ -1790,7 +1790,7 @@ int r100_gpu_reset(struct radeon_device *rdev) | |||
1790 | } | 1790 | } |
1791 | /* Check if GPU is idle */ | 1791 | /* Check if GPU is idle */ |
1792 | status = RREG32(RADEON_RBBM_STATUS); | 1792 | status = RREG32(RADEON_RBBM_STATUS); |
1793 | if (status & (1 << 31)) { | 1793 | if (status & RADEON_RBBM_ACTIVE) { |
1794 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | 1794 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); |
1795 | return -1; | 1795 | return -1; |
1796 | } | 1796 | } |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 43b55a030b4d..748335c5fa84 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -174,18 +174,20 @@ void r300_fence_ring_emit(struct radeon_device *rdev, | |||
174 | /* Who ever call radeon_fence_emit should call ring_lock and ask | 174 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
175 | * for enough space (today caller are ib schedule and buffer move) */ | 175 | * for enough space (today caller are ib schedule and buffer move) */ |
176 | /* Write SC register so SC & US assert idle */ | 176 | /* Write SC register so SC & US assert idle */ |
177 | radeon_ring_write(rdev, PACKET0(0x43E0, 0)); | 177 | radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_TL, 0)); |
178 | radeon_ring_write(rdev, 0); | 178 | radeon_ring_write(rdev, 0); |
179 | radeon_ring_write(rdev, PACKET0(0x43E4, 0)); | 179 | radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_BR, 0)); |
180 | radeon_ring_write(rdev, 0); | 180 | radeon_ring_write(rdev, 0); |
181 | /* Flush 3D cache */ | 181 | /* Flush 3D cache */ |
182 | radeon_ring_write(rdev, PACKET0(0x4E4C, 0)); | 182 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
183 | radeon_ring_write(rdev, (2 << 0)); | 183 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH); |
184 | radeon_ring_write(rdev, PACKET0(0x4F18, 0)); | 184 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
185 | radeon_ring_write(rdev, (1 << 0)); | 185 | radeon_ring_write(rdev, R300_ZC_FLUSH); |
186 | /* Wait until IDLE & CLEAN */ | 186 | /* Wait until IDLE & CLEAN */ |
187 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 187 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
188 | radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); | 188 | radeon_ring_write(rdev, (RADEON_WAIT_3D_IDLECLEAN | |
189 | RADEON_WAIT_2D_IDLECLEAN | | ||
190 | RADEON_WAIT_DMA_GUI_IDLE)); | ||
189 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | 191 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
190 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | | 192 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | |
191 | RADEON_HDP_READ_BUFFER_INVALIDATE); | 193 | RADEON_HDP_READ_BUFFER_INVALIDATE); |
@@ -219,7 +221,7 @@ int r300_copy_dma(struct radeon_device *rdev, | |||
219 | } | 221 | } |
220 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ | 222 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ |
221 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); | 223 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); |
222 | radeon_ring_write(rdev, (1 << 16)); | 224 | radeon_ring_write(rdev, RADEON_WAIT_2D_IDLECLEAN); |
223 | for (i = 0; i < num_loops; i++) { | 225 | for (i = 0; i < num_loops; i++) { |
224 | cur_size = size; | 226 | cur_size = size; |
225 | if (cur_size > 0x1FFFFF) { | 227 | if (cur_size > 0x1FFFFF) { |
@@ -281,8 +283,8 @@ void r300_ring_start(struct radeon_device *rdev) | |||
281 | radeon_ring_write(rdev, | 283 | radeon_ring_write(rdev, |
282 | RADEON_WAIT_2D_IDLECLEAN | | 284 | RADEON_WAIT_2D_IDLECLEAN | |
283 | RADEON_WAIT_3D_IDLECLEAN); | 285 | RADEON_WAIT_3D_IDLECLEAN); |
284 | radeon_ring_write(rdev, PACKET0(0x170C, 0)); | 286 | radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
285 | radeon_ring_write(rdev, 1 << 31); | 287 | radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG); |
286 | radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); | 288 | radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); |
287 | radeon_ring_write(rdev, 0); | 289 | radeon_ring_write(rdev, 0); |
288 | radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); | 290 | radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); |
@@ -349,8 +351,8 @@ int r300_mc_wait_for_idle(struct radeon_device *rdev) | |||
349 | 351 | ||
350 | for (i = 0; i < rdev->usec_timeout; i++) { | 352 | for (i = 0; i < rdev->usec_timeout; i++) { |
351 | /* read MC_STATUS */ | 353 | /* read MC_STATUS */ |
352 | tmp = RREG32(0x0150); | 354 | tmp = RREG32(RADEON_MC_STATUS); |
353 | if (tmp & (1 << 4)) { | 355 | if (tmp & R300_MC_IDLE) { |
354 | return 0; | 356 | return 0; |
355 | } | 357 | } |
356 | DRM_UDELAY(1); | 358 | DRM_UDELAY(1); |
@@ -395,8 +397,8 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
395 | "programming pipes. Bad things might happen.\n"); | 397 | "programming pipes. Bad things might happen.\n"); |
396 | } | 398 | } |
397 | 399 | ||
398 | tmp = RREG32(0x170C); | 400 | tmp = RREG32(R300_DST_PIPE_CONFIG); |
399 | WREG32(0x170C, tmp | (1 << 31)); | 401 | WREG32(R300_DST_PIPE_CONFIG, tmp | R300_PIPE_AUTO_CONFIG); |
400 | 402 | ||
401 | WREG32(R300_RB2D_DSTCACHE_MODE, | 403 | WREG32(R300_RB2D_DSTCACHE_MODE, |
402 | R300_DC_AUTOFLUSH_ENABLE | | 404 | R300_DC_AUTOFLUSH_ENABLE | |
@@ -437,8 +439,8 @@ int r300_ga_reset(struct radeon_device *rdev) | |||
437 | /* GA still busy soft reset it */ | 439 | /* GA still busy soft reset it */ |
438 | WREG32(0x429C, 0x200); | 440 | WREG32(0x429C, 0x200); |
439 | WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0); | 441 | WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0); |
440 | WREG32(0x43E0, 0); | 442 | WREG32(R300_RE_SCISSORS_TL, 0); |
441 | WREG32(0x43E4, 0); | 443 | WREG32(R300_RE_SCISSORS_BR, 0); |
442 | WREG32(0x24AC, 0); | 444 | WREG32(0x24AC, 0); |
443 | } | 445 | } |
444 | /* Wait to prevent race in RBBM_STATUS */ | 446 | /* Wait to prevent race in RBBM_STATUS */ |
@@ -488,7 +490,7 @@ int r300_gpu_reset(struct radeon_device *rdev) | |||
488 | } | 490 | } |
489 | /* Check if GPU is idle */ | 491 | /* Check if GPU is idle */ |
490 | status = RREG32(RADEON_RBBM_STATUS); | 492 | status = RREG32(RADEON_RBBM_STATUS); |
491 | if (status & (1 << 31)) { | 493 | if (status & RADEON_RBBM_ACTIVE) { |
492 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | 494 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); |
493 | return -1; | 495 | return -1; |
494 | } | 496 | } |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index d9373246c97f..12ebbdb83d1c 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
@@ -69,7 +69,8 @@ void r420_pipes_init(struct radeon_device *rdev) | |||
69 | unsigned num_pipes; | 69 | unsigned num_pipes; |
70 | 70 | ||
71 | /* GA_ENHANCE workaround TCL deadlock issue */ | 71 | /* GA_ENHANCE workaround TCL deadlock issue */ |
72 | WREG32(0x4274, (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)); | 72 | WREG32(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL | |
73 | (1 << 2) | (1 << 3)); | ||
73 | /* add idle wait as per freedesktop.org bug 24041 */ | 74 | /* add idle wait as per freedesktop.org bug 24041 */ |
74 | if (r100_gui_wait_for_idle(rdev)) { | 75 | if (r100_gui_wait_for_idle(rdev)) { |
75 | printk(KERN_WARNING "Failed to wait GUI idle while " | 76 | printk(KERN_WARNING "Failed to wait GUI idle while " |
@@ -97,17 +98,17 @@ void r420_pipes_init(struct radeon_device *rdev) | |||
97 | tmp = (7 << 1); | 98 | tmp = (7 << 1); |
98 | break; | 99 | break; |
99 | } | 100 | } |
100 | WREG32(0x42C8, (1 << num_pipes) - 1); | 101 | WREG32(R500_SU_REG_DEST, (1 << num_pipes) - 1); |
101 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ | 102 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ |
102 | tmp |= (1 << 4) | (1 << 0); | 103 | tmp |= R300_TILE_SIZE_16 | R300_ENABLE_TILING; |
103 | WREG32(0x4018, tmp); | 104 | WREG32(R300_GB_TILE_CONFIG, tmp); |
104 | if (r100_gui_wait_for_idle(rdev)) { | 105 | if (r100_gui_wait_for_idle(rdev)) { |
105 | printk(KERN_WARNING "Failed to wait GUI idle while " | 106 | printk(KERN_WARNING "Failed to wait GUI idle while " |
106 | "programming pipes. Bad things might happen.\n"); | 107 | "programming pipes. Bad things might happen.\n"); |
107 | } | 108 | } |
108 | 109 | ||
109 | tmp = RREG32(0x170C); | 110 | tmp = RREG32(R300_DST_PIPE_CONFIG); |
110 | WREG32(0x170C, tmp | (1 << 31)); | 111 | WREG32(R300_DST_PIPE_CONFIG, tmp | R300_PIPE_AUTO_CONFIG); |
111 | 112 | ||
112 | WREG32(R300_RB2D_DSTCACHE_MODE, | 113 | WREG32(R300_RB2D_DSTCACHE_MODE, |
113 | RREG32(R300_RB2D_DSTCACHE_MODE) | | 114 | RREG32(R300_RB2D_DSTCACHE_MODE) | |