aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen.c
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2013-01-02 17:30:35 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-01-03 13:18:41 -0500
commit64c56e8ce377842c8c8ff41054530480c7128c0b (patch)
treee72cf12a47e467ff5bf664d57698ba510e227c81 /drivers/gpu/drm/radeon/evergreen.c
parenteaaa6983ab2ccdf826c90838eb584211e0cadb76 (diff)
drm/radeon: reset dma engine on gpu reset (v2)
This try to reset the dma engine when performing gpu reset. Hopefully bringing back the gpu dma engine in sane state. v2: agd5f: fix dma reset on cayman/TN, add support for SI Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 6dc9ee78f4a8..f92f6bb18872 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2309,19 +2309,19 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
2309static int evergreen_gpu_soft_reset(struct radeon_device *rdev) 2309static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2310{ 2310{
2311 struct evergreen_mc_save save; 2311 struct evergreen_mc_save save;
2312 u32 grbm_reset = 0; 2312 u32 grbm_reset = 0, tmp;
2313 2313
2314 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 2314 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
2315 return 0; 2315 return 0;
2316 2316
2317 dev_info(rdev->dev, "GPU softreset \n"); 2317 dev_info(rdev->dev, "GPU softreset \n");
2318 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2318 dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n",
2319 RREG32(GRBM_STATUS)); 2319 RREG32(GRBM_STATUS));
2320 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", 2320 dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n",
2321 RREG32(GRBM_STATUS_SE0)); 2321 RREG32(GRBM_STATUS_SE0));
2322 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", 2322 dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n",
2323 RREG32(GRBM_STATUS_SE1)); 2323 RREG32(GRBM_STATUS_SE1));
2324 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2324 dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n",
2325 RREG32(SRBM_STATUS)); 2325 RREG32(SRBM_STATUS));
2326 dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 2326 dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n",
2327 RREG32(CP_STALLED_STAT1)); 2327 RREG32(CP_STALLED_STAT1));
@@ -2337,9 +2337,21 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2337 if (evergreen_mc_wait_for_idle(rdev)) { 2337 if (evergreen_mc_wait_for_idle(rdev)) {
2338 dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2338 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2339 } 2339 }
2340
2340 /* Disable CP parsing/prefetching */ 2341 /* Disable CP parsing/prefetching */
2341 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 2342 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
2342 2343
2344 /* Disable DMA */
2345 tmp = RREG32(DMA_RB_CNTL);
2346 tmp &= ~DMA_RB_ENABLE;
2347 WREG32(DMA_RB_CNTL, tmp);
2348
2349 /* Reset dma */
2350 WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
2351 RREG32(SRBM_SOFT_RESET);
2352 udelay(50);
2353 WREG32(SRBM_SOFT_RESET, 0);
2354
2343 /* reset all the gfx blocks */ 2355 /* reset all the gfx blocks */
2344 grbm_reset = (SOFT_RESET_CP | 2356 grbm_reset = (SOFT_RESET_CP |
2345 SOFT_RESET_CB | 2357 SOFT_RESET_CB |
@@ -2362,13 +2374,13 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2362 (void)RREG32(GRBM_SOFT_RESET); 2374 (void)RREG32(GRBM_SOFT_RESET);
2363 /* Wait a little for things to settle down */ 2375 /* Wait a little for things to settle down */
2364 udelay(50); 2376 udelay(50);
2365 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2377 dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n",
2366 RREG32(GRBM_STATUS)); 2378 RREG32(GRBM_STATUS));
2367 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", 2379 dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n",
2368 RREG32(GRBM_STATUS_SE0)); 2380 RREG32(GRBM_STATUS_SE0));
2369 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", 2381 dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n",
2370 RREG32(GRBM_STATUS_SE1)); 2382 RREG32(GRBM_STATUS_SE1));
2371 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2383 dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n",
2372 RREG32(SRBM_STATUS)); 2384 RREG32(SRBM_STATUS));
2373 dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 2385 dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n",
2374 RREG32(CP_STALLED_STAT1)); 2386 RREG32(CP_STALLED_STAT1));