diff options
author | Jerome Glisse <jglisse@redhat.com> | 2013-01-02 17:30:35 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-01-03 13:18:41 -0500 |
commit | 64c56e8ce377842c8c8ff41054530480c7128c0b (patch) | |
tree | e72cf12a47e467ff5bf664d57698ba510e227c81 /drivers/gpu/drm/radeon/evergreen.c | |
parent | eaaa6983ab2ccdf826c90838eb584211e0cadb76 (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.c | 30 |
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 | |||
2309 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | 2309 | static 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)); |