|
@@ -1309,19 +1309,19 @@ void cayman_dma_fini(struct radeon_device *rdev)
|
|
|
static int cayman_gpu_soft_reset(struct radeon_device *rdev)
|
|
|
{
|
|
|
struct evergreen_mc_save save;
|
|
|
- u32 grbm_reset = 0;
|
|
|
+ u32 grbm_reset = 0, tmp;
|
|
|
|
|
|
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
|
|
|
return 0;
|
|
|
|
|
|
dev_info(rdev->dev, "GPU softreset \n");
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS));
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS_SE0));
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS_SE1));
|
|
|
- dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n",
|
|
|
RREG32(SRBM_STATUS));
|
|
|
dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n",
|
|
|
RREG32(CP_STALLED_STAT1));
|
|
@@ -1346,9 +1346,26 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev)
|
|
|
if (evergreen_mc_wait_for_idle(rdev)) {
|
|
|
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
|
|
}
|
|
|
+
|
|
|
/* Disable CP parsing/prefetching */
|
|
|
WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
|
|
|
|
|
|
+ /* dma0 */
|
|
|
+ tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
|
|
|
+ tmp &= ~DMA_RB_ENABLE;
|
|
|
+ WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
|
|
|
+
|
|
|
+ /* dma1 */
|
|
|
+ tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
|
|
|
+ tmp &= ~DMA_RB_ENABLE;
|
|
|
+ WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
|
|
|
+
|
|
|
+ /* Reset dma */
|
|
|
+ WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
|
|
|
+ RREG32(SRBM_SOFT_RESET);
|
|
|
+ udelay(50);
|
|
|
+ WREG32(SRBM_SOFT_RESET, 0);
|
|
|
+
|
|
|
/* reset all the gfx blocks */
|
|
|
grbm_reset = (SOFT_RESET_CP |
|
|
|
SOFT_RESET_CB |
|
|
@@ -1373,13 +1390,13 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev)
|
|
|
/* Wait a little for things to settle down */
|
|
|
udelay(50);
|
|
|
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS));
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS_SE0));
|
|
|
- dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n",
|
|
|
RREG32(GRBM_STATUS_SE1));
|
|
|
- dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
|
|
|
+ dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n",
|
|
|
RREG32(SRBM_STATUS));
|
|
|
dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n",
|
|
|
RREG32(CP_STALLED_STAT1));
|