diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_pm.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 86 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 106 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/nid.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 89 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 51 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_i2c.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 78 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 18 |
16 files changed, 416 insertions, 102 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 5614c89148cb..69d7b1d0b9d6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
| @@ -1276,7 +1276,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | |||
| 1276 | if (drm->agp.stat == ENABLED) { | 1276 | if (drm->agp.stat == ENABLED) { |
| 1277 | mem->bus.offset = mem->start << PAGE_SHIFT; | 1277 | mem->bus.offset = mem->start << PAGE_SHIFT; |
| 1278 | mem->bus.base = drm->agp.base; | 1278 | mem->bus.base = drm->agp.base; |
| 1279 | mem->bus.is_iomem = true; | 1279 | mem->bus.is_iomem = !dev->agp->cant_use_aperture; |
| 1280 | } | 1280 | } |
| 1281 | #endif | 1281 | #endif |
| 1282 | break; | 1282 | break; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c index 5566172774df..a701ff5ffa5b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_pm.c +++ b/drivers/gpu/drm/nouveau/nouveau_pm.c | |||
| @@ -698,10 +698,10 @@ static int | |||
| 698 | nouveau_hwmon_init(struct drm_device *dev) | 698 | nouveau_hwmon_init(struct drm_device *dev) |
| 699 | { | 699 | { |
| 700 | struct nouveau_pm *pm = nouveau_pm(dev); | 700 | struct nouveau_pm *pm = nouveau_pm(dev); |
| 701 | struct nouveau_drm *drm = nouveau_drm(dev); | ||
| 702 | struct nouveau_therm *therm = nouveau_therm(drm->device); | ||
| 703 | 701 | ||
| 704 | #if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE)) | 702 | #if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE)) |
| 703 | struct nouveau_drm *drm = nouveau_drm(dev); | ||
| 704 | struct nouveau_therm *therm = nouveau_therm(drm->device); | ||
| 705 | struct device *hwmon_dev; | 705 | struct device *hwmon_dev; |
| 706 | int ret = 0; | 706 | int ret = 0; |
| 707 | 707 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index f95d7fc1f5e0..061fa0a28900 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -2306,22 +2306,20 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin | |||
| 2306 | return radeon_ring_test_lockup(rdev, ring); | 2306 | return radeon_ring_test_lockup(rdev, ring); |
| 2307 | } | 2307 | } |
| 2308 | 2308 | ||
| 2309 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | 2309 | static void evergreen_gpu_soft_reset_gfx(struct radeon_device *rdev) |
| 2310 | { | 2310 | { |
| 2311 | struct evergreen_mc_save save; | ||
| 2312 | u32 grbm_reset = 0; | 2311 | u32 grbm_reset = 0; |
| 2313 | 2312 | ||
| 2314 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | 2313 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) |
| 2315 | return 0; | 2314 | return; |
| 2316 | 2315 | ||
| 2317 | dev_info(rdev->dev, "GPU softreset \n"); | 2316 | dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", |
| 2318 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | ||
| 2319 | RREG32(GRBM_STATUS)); | 2317 | RREG32(GRBM_STATUS)); |
| 2320 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | 2318 | dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", |
| 2321 | RREG32(GRBM_STATUS_SE0)); | 2319 | RREG32(GRBM_STATUS_SE0)); |
| 2322 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | 2320 | dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", |
| 2323 | RREG32(GRBM_STATUS_SE1)); | 2321 | RREG32(GRBM_STATUS_SE1)); |
| 2324 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 2322 | dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", |
| 2325 | RREG32(SRBM_STATUS)); | 2323 | RREG32(SRBM_STATUS)); |
| 2326 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 2324 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 2327 | RREG32(CP_STALLED_STAT1)); | 2325 | RREG32(CP_STALLED_STAT1)); |
| @@ -2331,10 +2329,7 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2331 | RREG32(CP_BUSY_STAT)); | 2329 | RREG32(CP_BUSY_STAT)); |
| 2332 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 2330 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 2333 | RREG32(CP_STAT)); | 2331 | RREG32(CP_STAT)); |
| 2334 | evergreen_mc_stop(rdev, &save); | 2332 | |
| 2335 | if (evergreen_mc_wait_for_idle(rdev)) { | ||
| 2336 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 2337 | } | ||
| 2338 | /* Disable CP parsing/prefetching */ | 2333 | /* Disable CP parsing/prefetching */ |
| 2339 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); | 2334 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); |
| 2340 | 2335 | ||
| @@ -2358,15 +2353,14 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2358 | udelay(50); | 2353 | udelay(50); |
| 2359 | WREG32(GRBM_SOFT_RESET, 0); | 2354 | WREG32(GRBM_SOFT_RESET, 0); |
| 2360 | (void)RREG32(GRBM_SOFT_RESET); | 2355 | (void)RREG32(GRBM_SOFT_RESET); |
| 2361 | /* Wait a little for things to settle down */ | 2356 | |
| 2362 | udelay(50); | 2357 | dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", |
| 2363 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | ||
| 2364 | RREG32(GRBM_STATUS)); | 2358 | RREG32(GRBM_STATUS)); |
| 2365 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | 2359 | dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", |
| 2366 | RREG32(GRBM_STATUS_SE0)); | 2360 | RREG32(GRBM_STATUS_SE0)); |
| 2367 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | 2361 | dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", |
| 2368 | RREG32(GRBM_STATUS_SE1)); | 2362 | RREG32(GRBM_STATUS_SE1)); |
| 2369 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 2363 | dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", |
| 2370 | RREG32(SRBM_STATUS)); | 2364 | RREG32(SRBM_STATUS)); |
| 2371 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 2365 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 2372 | RREG32(CP_STALLED_STAT1)); | 2366 | RREG32(CP_STALLED_STAT1)); |
| @@ -2376,13 +2370,65 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2376 | RREG32(CP_BUSY_STAT)); | 2370 | RREG32(CP_BUSY_STAT)); |
| 2377 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 2371 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 2378 | RREG32(CP_STAT)); | 2372 | RREG32(CP_STAT)); |
| 2373 | } | ||
| 2374 | |||
| 2375 | static void evergreen_gpu_soft_reset_dma(struct radeon_device *rdev) | ||
| 2376 | { | ||
| 2377 | u32 tmp; | ||
| 2378 | |||
| 2379 | if (RREG32(DMA_STATUS_REG) & DMA_IDLE) | ||
| 2380 | return; | ||
| 2381 | |||
| 2382 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 2383 | RREG32(DMA_STATUS_REG)); | ||
| 2384 | |||
| 2385 | /* Disable DMA */ | ||
| 2386 | tmp = RREG32(DMA_RB_CNTL); | ||
| 2387 | tmp &= ~DMA_RB_ENABLE; | ||
| 2388 | WREG32(DMA_RB_CNTL, tmp); | ||
| 2389 | |||
| 2390 | /* Reset dma */ | ||
| 2391 | WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA); | ||
| 2392 | RREG32(SRBM_SOFT_RESET); | ||
| 2393 | udelay(50); | ||
| 2394 | WREG32(SRBM_SOFT_RESET, 0); | ||
| 2395 | |||
| 2396 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 2397 | RREG32(DMA_STATUS_REG)); | ||
| 2398 | } | ||
| 2399 | |||
| 2400 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) | ||
| 2401 | { | ||
| 2402 | struct evergreen_mc_save save; | ||
| 2403 | |||
| 2404 | if (reset_mask == 0) | ||
| 2405 | return 0; | ||
| 2406 | |||
| 2407 | dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); | ||
| 2408 | |||
| 2409 | evergreen_mc_stop(rdev, &save); | ||
| 2410 | if (evergreen_mc_wait_for_idle(rdev)) { | ||
| 2411 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 2412 | } | ||
| 2413 | |||
| 2414 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) | ||
| 2415 | evergreen_gpu_soft_reset_gfx(rdev); | ||
| 2416 | |||
| 2417 | if (reset_mask & RADEON_RESET_DMA) | ||
| 2418 | evergreen_gpu_soft_reset_dma(rdev); | ||
| 2419 | |||
| 2420 | /* Wait a little for things to settle down */ | ||
| 2421 | udelay(50); | ||
| 2422 | |||
| 2379 | evergreen_mc_resume(rdev, &save); | 2423 | evergreen_mc_resume(rdev, &save); |
| 2380 | return 0; | 2424 | return 0; |
| 2381 | } | 2425 | } |
| 2382 | 2426 | ||
| 2383 | int evergreen_asic_reset(struct radeon_device *rdev) | 2427 | int evergreen_asic_reset(struct radeon_device *rdev) |
| 2384 | { | 2428 | { |
| 2385 | return evergreen_gpu_soft_reset(rdev); | 2429 | return evergreen_gpu_soft_reset(rdev, (RADEON_RESET_GFX | |
| 2430 | RADEON_RESET_COMPUTE | | ||
| 2431 | RADEON_RESET_DMA)); | ||
| 2386 | } | 2432 | } |
| 2387 | 2433 | ||
| 2388 | /* Interrupts */ | 2434 | /* Interrupts */ |
| @@ -3215,7 +3261,7 @@ void evergreen_dma_fence_ring_emit(struct radeon_device *rdev, | |||
| 3215 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0)); | 3261 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0)); |
| 3216 | /* flush HDP */ | 3262 | /* flush HDP */ |
| 3217 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); | 3263 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
| 3218 | radeon_ring_write(ring, (0xf << 16) | HDP_MEM_COHERENCY_FLUSH_CNTL); | 3264 | radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2)); |
| 3219 | radeon_ring_write(ring, 1); | 3265 | radeon_ring_write(ring, 1); |
| 3220 | } | 3266 | } |
| 3221 | 3267 | ||
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index cb9baaac9e85..0bfd0e9e469b 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -742,8 +742,9 @@ | |||
| 742 | #define SOFT_RESET_ROM (1 << 14) | 742 | #define SOFT_RESET_ROM (1 << 14) |
| 743 | #define SOFT_RESET_SEM (1 << 15) | 743 | #define SOFT_RESET_SEM (1 << 15) |
| 744 | #define SOFT_RESET_VMC (1 << 17) | 744 | #define SOFT_RESET_VMC (1 << 17) |
| 745 | #define SOFT_RESET_DMA (1 << 20) | ||
| 745 | #define SOFT_RESET_TST (1 << 21) | 746 | #define SOFT_RESET_TST (1 << 21) |
| 746 | #define SOFT_RESET_REGBB (1 << 22) | 747 | #define SOFT_RESET_REGBB (1 << 22) |
| 747 | #define SOFT_RESET_ORB (1 << 23) | 748 | #define SOFT_RESET_ORB (1 << 23) |
| 748 | 749 | ||
| 749 | /* display watermarks */ | 750 | /* display watermarks */ |
| @@ -2027,4 +2028,15 @@ | |||
| 2027 | /* cayman packet3 addition */ | 2028 | /* cayman packet3 addition */ |
| 2028 | #define CAYMAN_PACKET3_DEALLOC_STATE 0x14 | 2029 | #define CAYMAN_PACKET3_DEALLOC_STATE 0x14 |
| 2029 | 2030 | ||
| 2031 | /* DMA regs common on r6xx/r7xx/evergreen/ni */ | ||
| 2032 | #define DMA_RB_CNTL 0xd000 | ||
| 2033 | # define DMA_RB_ENABLE (1 << 0) | ||
| 2034 | # define DMA_RB_SIZE(x) ((x) << 1) /* log2 */ | ||
| 2035 | # define DMA_RB_SWAP_ENABLE (1 << 9) /* 8IN32 */ | ||
| 2036 | # define DMA_RPTR_WRITEBACK_ENABLE (1 << 12) | ||
| 2037 | # define DMA_RPTR_WRITEBACK_SWAP_ENABLE (1 << 13) /* 8IN32 */ | ||
| 2038 | # define DMA_RPTR_WRITEBACK_TIMER(x) ((x) << 16) /* log2 */ | ||
| 2039 | #define DMA_STATUS_REG 0xd034 | ||
| 2040 | # define DMA_IDLE (1 << 0) | ||
| 2041 | |||
| 2030 | #endif | 2042 | #endif |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 7bdbcb00aaf2..896f1cbc58a5 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -1306,22 +1306,20 @@ void cayman_dma_fini(struct radeon_device *rdev) | |||
| 1306 | radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]); | 1306 | radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]); |
| 1307 | } | 1307 | } |
| 1308 | 1308 | ||
| 1309 | static int cayman_gpu_soft_reset(struct radeon_device *rdev) | 1309 | static void cayman_gpu_soft_reset_gfx(struct radeon_device *rdev) |
| 1310 | { | 1310 | { |
| 1311 | struct evergreen_mc_save save; | ||
| 1312 | u32 grbm_reset = 0; | 1311 | u32 grbm_reset = 0; |
| 1313 | 1312 | ||
| 1314 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | 1313 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) |
| 1315 | return 0; | 1314 | return; |
| 1316 | 1315 | ||
| 1317 | dev_info(rdev->dev, "GPU softreset \n"); | 1316 | dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", |
| 1318 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | ||
| 1319 | RREG32(GRBM_STATUS)); | 1317 | RREG32(GRBM_STATUS)); |
| 1320 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | 1318 | dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", |
| 1321 | RREG32(GRBM_STATUS_SE0)); | 1319 | RREG32(GRBM_STATUS_SE0)); |
| 1322 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | 1320 | dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", |
| 1323 | RREG32(GRBM_STATUS_SE1)); | 1321 | RREG32(GRBM_STATUS_SE1)); |
| 1324 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 1322 | dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", |
| 1325 | RREG32(SRBM_STATUS)); | 1323 | RREG32(SRBM_STATUS)); |
| 1326 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 1324 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 1327 | RREG32(CP_STALLED_STAT1)); | 1325 | RREG32(CP_STALLED_STAT1)); |
| @@ -1331,19 +1329,7 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1331 | RREG32(CP_BUSY_STAT)); | 1329 | RREG32(CP_BUSY_STAT)); |
| 1332 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 1330 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 1333 | RREG32(CP_STAT)); | 1331 | RREG32(CP_STAT)); |
| 1334 | dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
| 1335 | RREG32(0x14F8)); | ||
| 1336 | dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
| 1337 | RREG32(0x14D8)); | ||
| 1338 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
| 1339 | RREG32(0x14FC)); | ||
| 1340 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
| 1341 | RREG32(0x14DC)); | ||
| 1342 | 1332 | ||
| 1343 | evergreen_mc_stop(rdev, &save); | ||
| 1344 | if (evergreen_mc_wait_for_idle(rdev)) { | ||
| 1345 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 1346 | } | ||
| 1347 | /* Disable CP parsing/prefetching */ | 1333 | /* Disable CP parsing/prefetching */ |
| 1348 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); | 1334 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); |
| 1349 | 1335 | ||
| @@ -1368,16 +1354,14 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1368 | udelay(50); | 1354 | udelay(50); |
| 1369 | WREG32(GRBM_SOFT_RESET, 0); | 1355 | WREG32(GRBM_SOFT_RESET, 0); |
| 1370 | (void)RREG32(GRBM_SOFT_RESET); | 1356 | (void)RREG32(GRBM_SOFT_RESET); |
| 1371 | /* Wait a little for things to settle down */ | ||
| 1372 | udelay(50); | ||
| 1373 | 1357 | ||
| 1374 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | 1358 | dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", |
| 1375 | RREG32(GRBM_STATUS)); | 1359 | RREG32(GRBM_STATUS)); |
| 1376 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | 1360 | dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", |
| 1377 | RREG32(GRBM_STATUS_SE0)); | 1361 | RREG32(GRBM_STATUS_SE0)); |
| 1378 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | 1362 | dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", |
| 1379 | RREG32(GRBM_STATUS_SE1)); | 1363 | RREG32(GRBM_STATUS_SE1)); |
| 1380 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 1364 | dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", |
| 1381 | RREG32(SRBM_STATUS)); | 1365 | RREG32(SRBM_STATUS)); |
| 1382 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 1366 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 1383 | RREG32(CP_STALLED_STAT1)); | 1367 | RREG32(CP_STALLED_STAT1)); |
| @@ -1387,13 +1371,81 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1387 | RREG32(CP_BUSY_STAT)); | 1371 | RREG32(CP_BUSY_STAT)); |
| 1388 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 1372 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 1389 | RREG32(CP_STAT)); | 1373 | RREG32(CP_STAT)); |
| 1374 | |||
| 1375 | } | ||
| 1376 | |||
| 1377 | static void cayman_gpu_soft_reset_dma(struct radeon_device *rdev) | ||
| 1378 | { | ||
| 1379 | u32 tmp; | ||
| 1380 | |||
| 1381 | if (RREG32(DMA_STATUS_REG) & DMA_IDLE) | ||
| 1382 | return; | ||
| 1383 | |||
| 1384 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 1385 | RREG32(DMA_STATUS_REG)); | ||
| 1386 | |||
| 1387 | /* dma0 */ | ||
| 1388 | tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); | ||
| 1389 | tmp &= ~DMA_RB_ENABLE; | ||
| 1390 | WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); | ||
| 1391 | |||
| 1392 | /* dma1 */ | ||
| 1393 | tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); | ||
| 1394 | tmp &= ~DMA_RB_ENABLE; | ||
| 1395 | WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); | ||
| 1396 | |||
| 1397 | /* Reset dma */ | ||
| 1398 | WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1); | ||
| 1399 | RREG32(SRBM_SOFT_RESET); | ||
| 1400 | udelay(50); | ||
| 1401 | WREG32(SRBM_SOFT_RESET, 0); | ||
| 1402 | |||
| 1403 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 1404 | RREG32(DMA_STATUS_REG)); | ||
| 1405 | |||
| 1406 | } | ||
| 1407 | |||
| 1408 | static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) | ||
| 1409 | { | ||
| 1410 | struct evergreen_mc_save save; | ||
| 1411 | |||
| 1412 | if (reset_mask == 0) | ||
| 1413 | return 0; | ||
| 1414 | |||
| 1415 | dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); | ||
| 1416 | |||
| 1417 | dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
| 1418 | RREG32(0x14F8)); | ||
| 1419 | dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
| 1420 | RREG32(0x14D8)); | ||
| 1421 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
| 1422 | RREG32(0x14FC)); | ||
| 1423 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
| 1424 | RREG32(0x14DC)); | ||
| 1425 | |||
| 1426 | evergreen_mc_stop(rdev, &save); | ||
| 1427 | if (evergreen_mc_wait_for_idle(rdev)) { | ||
| 1428 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 1429 | } | ||
| 1430 | |||
| 1431 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) | ||
| 1432 | cayman_gpu_soft_reset_gfx(rdev); | ||
| 1433 | |||
| 1434 | if (reset_mask & RADEON_RESET_DMA) | ||
| 1435 | cayman_gpu_soft_reset_dma(rdev); | ||
| 1436 | |||
| 1437 | /* Wait a little for things to settle down */ | ||
| 1438 | udelay(50); | ||
| 1439 | |||
| 1390 | evergreen_mc_resume(rdev, &save); | 1440 | evergreen_mc_resume(rdev, &save); |
| 1391 | return 0; | 1441 | return 0; |
| 1392 | } | 1442 | } |
| 1393 | 1443 | ||
| 1394 | int cayman_asic_reset(struct radeon_device *rdev) | 1444 | int cayman_asic_reset(struct radeon_device *rdev) |
| 1395 | { | 1445 | { |
| 1396 | return cayman_gpu_soft_reset(rdev); | 1446 | return cayman_gpu_soft_reset(rdev, (RADEON_RESET_GFX | |
| 1447 | RADEON_RESET_COMPUTE | | ||
| 1448 | RADEON_RESET_DMA)); | ||
| 1397 | } | 1449 | } |
| 1398 | 1450 | ||
| 1399 | /** | 1451 | /** |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index b93186b8ee4b..48e5022ee921 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
| @@ -65,7 +65,7 @@ | |||
| 65 | #define SOFT_RESET_VMC (1 << 17) | 65 | #define SOFT_RESET_VMC (1 << 17) |
| 66 | #define SOFT_RESET_DMA (1 << 20) | 66 | #define SOFT_RESET_DMA (1 << 20) |
| 67 | #define SOFT_RESET_TST (1 << 21) | 67 | #define SOFT_RESET_TST (1 << 21) |
| 68 | #define SOFT_RESET_REGBB (1 << 22) | 68 | #define SOFT_RESET_REGBB (1 << 22) |
| 69 | #define SOFT_RESET_ORB (1 << 23) | 69 | #define SOFT_RESET_ORB (1 << 23) |
| 70 | 70 | ||
| 71 | #define VM_CONTEXT0_REQUEST_RESPONSE 0x1470 | 71 | #define VM_CONTEXT0_REQUEST_RESPONSE 0x1470 |
| @@ -675,4 +675,3 @@ | |||
| 675 | #define DMA_PACKET_NOP 0xf | 675 | #define DMA_PACKET_NOP 0xf |
| 676 | 676 | ||
| 677 | #endif | 677 | #endif |
| 678 | |||
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 2aaf147969bd..923f93647042 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1258,9 +1258,8 @@ void r600_vram_scratch_fini(struct radeon_device *rdev) | |||
| 1258 | * reset, it's up to the caller to determine if the GPU needs one. We | 1258 | * reset, it's up to the caller to determine if the GPU needs one. We |
| 1259 | * might add an helper function to check that. | 1259 | * might add an helper function to check that. |
| 1260 | */ | 1260 | */ |
| 1261 | static int r600_gpu_soft_reset(struct radeon_device *rdev) | 1261 | static void r600_gpu_soft_reset_gfx(struct radeon_device *rdev) |
| 1262 | { | 1262 | { |
| 1263 | struct rv515_mc_save save; | ||
| 1264 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | | 1263 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | |
| 1265 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | | 1264 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | |
| 1266 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | | 1265 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | |
| @@ -1280,14 +1279,13 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1280 | u32 tmp; | 1279 | u32 tmp; |
| 1281 | 1280 | ||
| 1282 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | 1281 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) |
| 1283 | return 0; | 1282 | return; |
| 1284 | 1283 | ||
| 1285 | dev_info(rdev->dev, "GPU softreset \n"); | 1284 | dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", |
| 1286 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
| 1287 | RREG32(R_008010_GRBM_STATUS)); | 1285 | RREG32(R_008010_GRBM_STATUS)); |
| 1288 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | 1286 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", |
| 1289 | RREG32(R_008014_GRBM_STATUS2)); | 1287 | RREG32(R_008014_GRBM_STATUS2)); |
| 1290 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | 1288 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", |
| 1291 | RREG32(R_000E50_SRBM_STATUS)); | 1289 | RREG32(R_000E50_SRBM_STATUS)); |
| 1292 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 1290 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 1293 | RREG32(CP_STALLED_STAT1)); | 1291 | RREG32(CP_STALLED_STAT1)); |
| @@ -1297,12 +1295,10 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1297 | RREG32(CP_BUSY_STAT)); | 1295 | RREG32(CP_BUSY_STAT)); |
| 1298 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 1296 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 1299 | RREG32(CP_STAT)); | 1297 | RREG32(CP_STAT)); |
| 1300 | rv515_mc_stop(rdev, &save); | 1298 | |
| 1301 | if (r600_mc_wait_for_idle(rdev)) { | ||
| 1302 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 1303 | } | ||
| 1304 | /* Disable CP parsing/prefetching */ | 1299 | /* Disable CP parsing/prefetching */ |
| 1305 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); | 1300 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); |
| 1301 | |||
| 1306 | /* Check if any of the rendering block is busy and reset it */ | 1302 | /* Check if any of the rendering block is busy and reset it */ |
| 1307 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || | 1303 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || |
| 1308 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { | 1304 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { |
| @@ -1332,13 +1328,12 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1332 | RREG32(R_008020_GRBM_SOFT_RESET); | 1328 | RREG32(R_008020_GRBM_SOFT_RESET); |
| 1333 | mdelay(15); | 1329 | mdelay(15); |
| 1334 | WREG32(R_008020_GRBM_SOFT_RESET, 0); | 1330 | WREG32(R_008020_GRBM_SOFT_RESET, 0); |
| 1335 | /* Wait a little for things to settle down */ | 1331 | |
| 1336 | mdelay(1); | 1332 | dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", |
| 1337 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
| 1338 | RREG32(R_008010_GRBM_STATUS)); | 1333 | RREG32(R_008010_GRBM_STATUS)); |
| 1339 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | 1334 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", |
| 1340 | RREG32(R_008014_GRBM_STATUS2)); | 1335 | RREG32(R_008014_GRBM_STATUS2)); |
| 1341 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | 1336 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", |
| 1342 | RREG32(R_000E50_SRBM_STATUS)); | 1337 | RREG32(R_000E50_SRBM_STATUS)); |
| 1343 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", | 1338 | dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", |
| 1344 | RREG32(CP_STALLED_STAT1)); | 1339 | RREG32(CP_STALLED_STAT1)); |
| @@ -1348,6 +1343,60 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1348 | RREG32(CP_BUSY_STAT)); | 1343 | RREG32(CP_BUSY_STAT)); |
| 1349 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", | 1344 | dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", |
| 1350 | RREG32(CP_STAT)); | 1345 | RREG32(CP_STAT)); |
| 1346 | |||
| 1347 | } | ||
| 1348 | |||
| 1349 | static void r600_gpu_soft_reset_dma(struct radeon_device *rdev) | ||
| 1350 | { | ||
| 1351 | u32 tmp; | ||
| 1352 | |||
| 1353 | if (RREG32(DMA_STATUS_REG) & DMA_IDLE) | ||
| 1354 | return; | ||
| 1355 | |||
| 1356 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 1357 | RREG32(DMA_STATUS_REG)); | ||
| 1358 | |||
| 1359 | /* Disable DMA */ | ||
| 1360 | tmp = RREG32(DMA_RB_CNTL); | ||
| 1361 | tmp &= ~DMA_RB_ENABLE; | ||
| 1362 | WREG32(DMA_RB_CNTL, tmp); | ||
| 1363 | |||
| 1364 | /* Reset dma */ | ||
| 1365 | if (rdev->family >= CHIP_RV770) | ||
| 1366 | WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA); | ||
| 1367 | else | ||
| 1368 | WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA); | ||
| 1369 | RREG32(SRBM_SOFT_RESET); | ||
| 1370 | udelay(50); | ||
| 1371 | WREG32(SRBM_SOFT_RESET, 0); | ||
| 1372 | |||
| 1373 | dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", | ||
| 1374 | RREG32(DMA_STATUS_REG)); | ||
| 1375 | } | ||
| 1376 | |||
| 1377 | static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) | ||
| 1378 | { | ||
| 1379 | struct rv515_mc_save save; | ||
| 1380 | |||
| 1381 | if (reset_mask == 0) | ||
| 1382 | return 0; | ||
| 1383 | |||
| 1384 | dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); | ||
| 1385 | |||
| 1386 | rv515_mc_stop(rdev, &save); | ||
| 1387 | if (r600_mc_wait_for_idle(rdev)) { | ||
| 1388 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 1389 | } | ||
| 1390 | |||
| 1391 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) | ||
| 1392 | r600_gpu_soft_reset_gfx(rdev); | ||
| 1393 | |||
| 1394 | if (reset_mask & RADEON_RESET_DMA) | ||
| 1395 | r600_gpu_soft_reset_dma(rdev); | ||
| 1396 | |||
| 1397 | /* Wait a little for things to settle down */ | ||
| 1398 | mdelay(1); | ||
| 1399 | |||
| 1351 | rv515_mc_resume(rdev, &save); | 1400 | rv515_mc_resume(rdev, &save); |
| 1352 | return 0; | 1401 | return 0; |
| 1353 | } | 1402 | } |
| @@ -1395,7 +1444,9 @@ bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 1395 | 1444 | ||
| 1396 | int r600_asic_reset(struct radeon_device *rdev) | 1445 | int r600_asic_reset(struct radeon_device *rdev) |
| 1397 | { | 1446 | { |
| 1398 | return r600_gpu_soft_reset(rdev); | 1447 | return r600_gpu_soft_reset(rdev, (RADEON_RESET_GFX | |
| 1448 | RADEON_RESET_COMPUTE | | ||
| 1449 | RADEON_RESET_DMA)); | ||
| 1399 | } | 1450 | } |
| 1400 | 1451 | ||
| 1401 | u32 r6xx_remap_render_backend(struct radeon_device *rdev, | 1452 | u32 r6xx_remap_render_backend(struct radeon_device *rdev, |
| @@ -2636,8 +2687,8 @@ int r600_copy_dma(struct radeon_device *rdev, | |||
| 2636 | 2687 | ||
| 2637 | for (i = 0; i < num_loops; i++) { | 2688 | for (i = 0; i < num_loops; i++) { |
| 2638 | cur_size_in_dw = size_in_dw; | 2689 | cur_size_in_dw = size_in_dw; |
| 2639 | if (cur_size_in_dw > 0xFFFF) | 2690 | if (cur_size_in_dw > 0xFFFE) |
| 2640 | cur_size_in_dw = 0xFFFF; | 2691 | cur_size_in_dw = 0xFFFE; |
| 2641 | size_in_dw -= cur_size_in_dw; | 2692 | size_in_dw -= cur_size_in_dw; |
| 2642 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); | 2693 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); |
| 2643 | radeon_ring_write(ring, dst_offset & 0xfffffffc); | 2694 | radeon_ring_write(ring, dst_offset & 0xfffffffc); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 9b9422c4403a..34e52304a525 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -132,6 +132,11 @@ extern int radeon_lockup_timeout; | |||
| 132 | #define RADEON_VA_RESERVED_SIZE (8 << 20) | 132 | #define RADEON_VA_RESERVED_SIZE (8 << 20) |
| 133 | #define RADEON_IB_VM_MAX_SIZE (64 << 10) | 133 | #define RADEON_IB_VM_MAX_SIZE (64 << 10) |
| 134 | 134 | ||
| 135 | /* reset flags */ | ||
| 136 | #define RADEON_RESET_GFX (1 << 0) | ||
| 137 | #define RADEON_RESET_COMPUTE (1 << 1) | ||
| 138 | #define RADEON_RESET_DMA (1 << 2) | ||
| 139 | |||
| 135 | /* | 140 | /* |
| 136 | * Errata workarounds. | 141 | * Errata workarounds. |
| 137 | */ | 142 | */ |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 4af89126e223..33a56a09ff10 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -1548,6 +1548,9 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 1548 | of_machine_is_compatible("PowerBook6,7")) { | 1548 | of_machine_is_compatible("PowerBook6,7")) { |
| 1549 | /* ibook */ | 1549 | /* ibook */ |
| 1550 | rdev->mode_info.connector_table = CT_IBOOK; | 1550 | rdev->mode_info.connector_table = CT_IBOOK; |
| 1551 | } else if (of_machine_is_compatible("PowerMac3,5")) { | ||
| 1552 | /* PowerMac G4 Silver radeon 7500 */ | ||
| 1553 | rdev->mode_info.connector_table = CT_MAC_G4_SILVER; | ||
| 1551 | } else if (of_machine_is_compatible("PowerMac4,4")) { | 1554 | } else if (of_machine_is_compatible("PowerMac4,4")) { |
| 1552 | /* emac */ | 1555 | /* emac */ |
| 1553 | rdev->mode_info.connector_table = CT_EMAC; | 1556 | rdev->mode_info.connector_table = CT_EMAC; |
| @@ -2212,6 +2215,54 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 2212 | CONNECTOR_OBJECT_ID_SVIDEO, | 2215 | CONNECTOR_OBJECT_ID_SVIDEO, |
| 2213 | &hpd); | 2216 | &hpd); |
| 2214 | break; | 2217 | break; |
| 2218 | case CT_MAC_G4_SILVER: | ||
| 2219 | DRM_INFO("Connector Table: %d (mac g4 silver)\n", | ||
| 2220 | rdev->mode_info.connector_table); | ||
| 2221 | /* DVI-I - tv dac, int tmds */ | ||
| 2222 | ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); | ||
| 2223 | hpd.hpd = RADEON_HPD_1; /* ??? */ | ||
| 2224 | radeon_add_legacy_encoder(dev, | ||
| 2225 | radeon_get_encoder_enum(dev, | ||
| 2226 | ATOM_DEVICE_DFP1_SUPPORT, | ||
| 2227 | 0), | ||
| 2228 | ATOM_DEVICE_DFP1_SUPPORT); | ||
| 2229 | radeon_add_legacy_encoder(dev, | ||
| 2230 | radeon_get_encoder_enum(dev, | ||
| 2231 | ATOM_DEVICE_CRT2_SUPPORT, | ||
| 2232 | 2), | ||
| 2233 | ATOM_DEVICE_CRT2_SUPPORT); | ||
| 2234 | radeon_add_legacy_connector(dev, 0, | ||
| 2235 | ATOM_DEVICE_DFP1_SUPPORT | | ||
| 2236 | ATOM_DEVICE_CRT2_SUPPORT, | ||
| 2237 | DRM_MODE_CONNECTOR_DVII, &ddc_i2c, | ||
| 2238 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, | ||
| 2239 | &hpd); | ||
| 2240 | /* VGA - primary dac */ | ||
| 2241 | ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); | ||
| 2242 | hpd.hpd = RADEON_HPD_NONE; | ||
| 2243 | radeon_add_legacy_encoder(dev, | ||
| 2244 | radeon_get_encoder_enum(dev, | ||
| 2245 | ATOM_DEVICE_CRT1_SUPPORT, | ||
| 2246 | 1), | ||
| 2247 | ATOM_DEVICE_CRT1_SUPPORT); | ||
| 2248 | radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT, | ||
| 2249 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
| 2250 | CONNECTOR_OBJECT_ID_VGA, | ||
| 2251 | &hpd); | ||
| 2252 | /* TV - TV DAC */ | ||
| 2253 | ddc_i2c.valid = false; | ||
| 2254 | hpd.hpd = RADEON_HPD_NONE; | ||
| 2255 | radeon_add_legacy_encoder(dev, | ||
| 2256 | radeon_get_encoder_enum(dev, | ||
| 2257 | ATOM_DEVICE_TV1_SUPPORT, | ||
| 2258 | 2), | ||
| 2259 | ATOM_DEVICE_TV1_SUPPORT); | ||
| 2260 | radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, | ||
| 2261 | DRM_MODE_CONNECTOR_SVIDEO, | ||
| 2262 | &ddc_i2c, | ||
| 2263 | CONNECTOR_OBJECT_ID_SVIDEO, | ||
| 2264 | &hpd); | ||
| 2265 | break; | ||
| 2215 | default: | 2266 | default: |
| 2216 | DRM_INFO("Connector table: %d (invalid)\n", | 2267 | DRM_INFO("Connector table: %d (invalid)\n", |
| 2217 | rdev->mode_info.connector_table); | 2268 | rdev->mode_info.connector_table); |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 47bf162ab9c6..2399f25ec037 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -741,7 +741,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | |||
| 741 | ret = connector_status_disconnected; | 741 | ret = connector_status_disconnected; |
| 742 | 742 | ||
| 743 | if (radeon_connector->ddc_bus) | 743 | if (radeon_connector->ddc_bus) |
| 744 | dret = radeon_ddc_probe(radeon_connector); | 744 | dret = radeon_ddc_probe(radeon_connector, false); |
| 745 | if (dret) { | 745 | if (dret) { |
| 746 | radeon_connector->detected_by_load = false; | 746 | radeon_connector->detected_by_load = false; |
| 747 | if (radeon_connector->edid) { | 747 | if (radeon_connector->edid) { |
| @@ -947,7 +947,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
| 947 | return connector->status; | 947 | return connector->status; |
| 948 | 948 | ||
| 949 | if (radeon_connector->ddc_bus) | 949 | if (radeon_connector->ddc_bus) |
| 950 | dret = radeon_ddc_probe(radeon_connector); | 950 | dret = radeon_ddc_probe(radeon_connector, false); |
| 951 | if (dret) { | 951 | if (dret) { |
| 952 | radeon_connector->detected_by_load = false; | 952 | radeon_connector->detected_by_load = false; |
| 953 | if (radeon_connector->edid) { | 953 | if (radeon_connector->edid) { |
| @@ -1401,7 +1401,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
| 1401 | if (encoder) { | 1401 | if (encoder) { |
| 1402 | /* setup ddc on the bridge */ | 1402 | /* setup ddc on the bridge */ |
| 1403 | radeon_atom_ext_encoder_setup_ddc(encoder); | 1403 | radeon_atom_ext_encoder_setup_ddc(encoder); |
| 1404 | if (radeon_ddc_probe(radeon_connector)) /* try DDC */ | 1404 | /* bridge chips are always aux */ |
| 1405 | if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ | ||
| 1405 | ret = connector_status_connected; | 1406 | ret = connector_status_connected; |
| 1406 | else if (radeon_connector->dac_load_detect) { /* try load detection */ | 1407 | else if (radeon_connector->dac_load_detect) { /* try load detection */ |
| 1407 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | 1408 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
| @@ -1419,7 +1420,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
| 1419 | if (radeon_dp_getdpcd(radeon_connector)) | 1420 | if (radeon_dp_getdpcd(radeon_connector)) |
| 1420 | ret = connector_status_connected; | 1421 | ret = connector_status_connected; |
| 1421 | } else { | 1422 | } else { |
| 1422 | if (radeon_ddc_probe(radeon_connector)) | 1423 | /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ |
| 1424 | if (radeon_ddc_probe(radeon_connector, false)) | ||
| 1423 | ret = connector_status_connected; | 1425 | ret = connector_status_connected; |
| 1424 | } | 1426 | } |
| 1425 | } | 1427 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 310c0e5254ba..1da2386d7cf7 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -699,10 +699,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
| 699 | if (radeon_connector->router.ddc_valid) | 699 | if (radeon_connector->router.ddc_valid) |
| 700 | radeon_router_select_ddc_port(radeon_connector); | 700 | radeon_router_select_ddc_port(radeon_connector); |
| 701 | 701 | ||
| 702 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | 702 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != |
| 703 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) || | 703 | ENCODER_OBJECT_ID_NONE) { |
| 704 | (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | 704 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
| 705 | ENCODER_OBJECT_ID_NONE)) { | 705 | |
| 706 | if (dig->dp_i2c_bus) | ||
| 707 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, | ||
| 708 | &dig->dp_i2c_bus->adapter); | ||
| 709 | } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
| 710 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | ||
| 706 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | 711 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
| 707 | 712 | ||
| 708 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || | 713 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index c5bddd630eb9..fc60b74ee304 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
| @@ -39,7 +39,7 @@ extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap); | |||
| 39 | * radeon_ddc_probe | 39 | * radeon_ddc_probe |
| 40 | * | 40 | * |
| 41 | */ | 41 | */ |
| 42 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | 42 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux) |
| 43 | { | 43 | { |
| 44 | u8 out = 0x0; | 44 | u8 out = 0x0; |
| 45 | u8 buf[8]; | 45 | u8 buf[8]; |
| @@ -63,7 +63,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | |||
| 63 | if (radeon_connector->router.ddc_valid) | 63 | if (radeon_connector->router.ddc_valid) |
| 64 | radeon_router_select_ddc_port(radeon_connector); | 64 | radeon_router_select_ddc_port(radeon_connector); |
| 65 | 65 | ||
| 66 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | 66 | if (use_aux) { |
| 67 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
| 68 | ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2); | ||
| 69 | } else { | ||
| 70 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
| 71 | } | ||
| 72 | |||
| 67 | if (ret != 2) | 73 | if (ret != 2) |
| 68 | /* Couldn't find an accessible DDC on this connector */ | 74 | /* Couldn't find an accessible DDC on this connector */ |
| 69 | return false; | 75 | return false; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index d818b503b42f..4003f5a68c09 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -209,7 +209,8 @@ enum radeon_connector_table { | |||
| 209 | CT_RN50_POWER, | 209 | CT_RN50_POWER, |
| 210 | CT_MAC_X800, | 210 | CT_MAC_X800, |
| 211 | CT_MAC_G5_9600, | 211 | CT_MAC_G5_9600, |
| 212 | CT_SAM440EP | 212 | CT_SAM440EP, |
| 213 | CT_MAC_G4_SILVER | ||
| 213 | }; | 214 | }; |
| 214 | 215 | ||
| 215 | enum radeon_dvo_chip { | 216 | enum radeon_dvo_chip { |
| @@ -558,7 +559,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c, | |||
| 558 | u8 val); | 559 | u8 val); |
| 559 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); | 560 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); |
| 560 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); | 561 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); |
| 561 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); | 562 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); |
| 562 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); | 563 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); |
| 563 | 564 | ||
| 564 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); | 565 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index ebd69562ef6c..141f2b6a9cf2 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -770,22 +770,28 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
| 770 | int ridx = *(int*)node->info_ent->data; | 770 | int ridx = *(int*)node->info_ent->data; |
| 771 | struct radeon_ring *ring = &rdev->ring[ridx]; | 771 | struct radeon_ring *ring = &rdev->ring[ridx]; |
| 772 | unsigned count, i, j; | 772 | unsigned count, i, j; |
| 773 | u32 tmp; | ||
| 773 | 774 | ||
| 774 | radeon_ring_free_size(rdev, ring); | 775 | radeon_ring_free_size(rdev, ring); |
| 775 | count = (ring->ring_size / 4) - ring->ring_free_dw; | 776 | count = (ring->ring_size / 4) - ring->ring_free_dw; |
| 776 | seq_printf(m, "wptr(0x%04x): 0x%08x\n", ring->wptr_reg, RREG32(ring->wptr_reg)); | 777 | tmp = RREG32(ring->wptr_reg) >> ring->ptr_reg_shift; |
| 777 | seq_printf(m, "rptr(0x%04x): 0x%08x\n", ring->rptr_reg, RREG32(ring->rptr_reg)); | 778 | seq_printf(m, "wptr(0x%04x): 0x%08x [%5d]\n", ring->wptr_reg, tmp, tmp); |
| 779 | tmp = RREG32(ring->rptr_reg) >> ring->ptr_reg_shift; | ||
| 780 | seq_printf(m, "rptr(0x%04x): 0x%08x [%5d]\n", ring->rptr_reg, tmp, tmp); | ||
| 778 | if (ring->rptr_save_reg) { | 781 | if (ring->rptr_save_reg) { |
| 779 | seq_printf(m, "rptr next(0x%04x): 0x%08x\n", ring->rptr_save_reg, | 782 | seq_printf(m, "rptr next(0x%04x): 0x%08x\n", ring->rptr_save_reg, |
| 780 | RREG32(ring->rptr_save_reg)); | 783 | RREG32(ring->rptr_save_reg)); |
| 781 | } | 784 | } |
| 782 | seq_printf(m, "driver's copy of the wptr: 0x%08x\n", ring->wptr); | 785 | seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr); |
| 783 | seq_printf(m, "driver's copy of the rptr: 0x%08x\n", ring->rptr); | 786 | seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr); |
| 784 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); | 787 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
| 785 | seq_printf(m, "%u dwords in ring\n", count); | 788 | seq_printf(m, "%u dwords in ring\n", count); |
| 786 | i = ring->rptr; | 789 | /* print 8 dw before current rptr as often it's the last executed |
| 787 | for (j = 0; j <= count; j++) { | 790 | * packet that is the root issue |
| 788 | seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | 791 | */ |
| 792 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; | ||
| 793 | for (j = 0; j <= (count + 32); j++) { | ||
| 794 | seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); | ||
| 789 | i = (i + 1) & ring->ptr_mask; | 795 | i = (i + 1) & ring->ptr_mask; |
| 790 | } | 796 | } |
| 791 | return 0; | 797 | return 0; |
| @@ -794,11 +800,15 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
| 794 | static int radeon_ring_type_gfx_index = RADEON_RING_TYPE_GFX_INDEX; | 800 | static int radeon_ring_type_gfx_index = RADEON_RING_TYPE_GFX_INDEX; |
| 795 | static int cayman_ring_type_cp1_index = CAYMAN_RING_TYPE_CP1_INDEX; | 801 | static int cayman_ring_type_cp1_index = CAYMAN_RING_TYPE_CP1_INDEX; |
| 796 | static int cayman_ring_type_cp2_index = CAYMAN_RING_TYPE_CP2_INDEX; | 802 | static int cayman_ring_type_cp2_index = CAYMAN_RING_TYPE_CP2_INDEX; |
| 803 | static int radeon_ring_type_dma1_index = R600_RING_TYPE_DMA_INDEX; | ||
| 804 | static int radeon_ring_type_dma2_index = CAYMAN_RING_TYPE_DMA1_INDEX; | ||
| 797 | 805 | ||
| 798 | static struct drm_info_list radeon_debugfs_ring_info_list[] = { | 806 | static struct drm_info_list radeon_debugfs_ring_info_list[] = { |
| 799 | {"radeon_ring_gfx", radeon_debugfs_ring_info, 0, &radeon_ring_type_gfx_index}, | 807 | {"radeon_ring_gfx", radeon_debugfs_ring_info, 0, &radeon_ring_type_gfx_index}, |
| 800 | {"radeon_ring_cp1", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp1_index}, | 808 | {"radeon_ring_cp1", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp1_index}, |
| 801 | {"radeon_ring_cp2", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp2_index}, | 809 | {"radeon_ring_cp2", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp2_index}, |
| 810 | {"radeon_ring_dma1", radeon_debugfs_ring_info, 0, &radeon_ring_type_dma1_index}, | ||
| 811 | {"radeon_ring_dma2", radeon_debugfs_ring_info, 0, &radeon_ring_type_dma2_index}, | ||
| 802 | }; | 812 | }; |
| 803 | 813 | ||
| 804 | static int radeon_debugfs_sa_info(struct seq_file *m, void *data) | 814 | static int radeon_debugfs_sa_info(struct seq_file *m, void *data) |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index ef683653f0b7..3240a3d64f30 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -2126,15 +2126,13 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 2126 | return radeon_ring_test_lockup(rdev, ring); | 2126 | return radeon_ring_test_lockup(rdev, ring); |
| 2127 | } | 2127 | } |
| 2128 | 2128 | ||
| 2129 | static int si_gpu_soft_reset(struct radeon_device *rdev) | 2129 | static void si_gpu_soft_reset_gfx(struct radeon_device *rdev) |
| 2130 | { | 2130 | { |
| 2131 | struct evergreen_mc_save save; | ||
| 2132 | u32 grbm_reset = 0; | 2131 | u32 grbm_reset = 0; |
| 2133 | 2132 | ||
| 2134 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | 2133 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) |
| 2135 | return 0; | 2134 | return; |
| 2136 | 2135 | ||
| 2137 | dev_info(rdev->dev, "GPU softreset \n"); | ||
| 2138 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | 2136 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", |
| 2139 | RREG32(GRBM_STATUS)); | 2137 | RREG32(GRBM_STATUS)); |
| 2140 | dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", | 2138 | dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", |
| @@ -2145,10 +2143,7 @@ static int si_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2145 | RREG32(GRBM_STATUS_SE1)); | 2143 | RREG32(GRBM_STATUS_SE1)); |
| 2146 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 2144 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", |
| 2147 | RREG32(SRBM_STATUS)); | 2145 | RREG32(SRBM_STATUS)); |
| 2148 | evergreen_mc_stop(rdev, &save); | 2146 | |
| 2149 | if (radeon_mc_wait_for_idle(rdev)) { | ||
| 2150 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 2151 | } | ||
| 2152 | /* Disable CP parsing/prefetching */ | 2147 | /* Disable CP parsing/prefetching */ |
| 2153 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT); | 2148 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT); |
| 2154 | 2149 | ||
| @@ -2173,8 +2168,7 @@ static int si_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2173 | udelay(50); | 2168 | udelay(50); |
| 2174 | WREG32(GRBM_SOFT_RESET, 0); | 2169 | WREG32(GRBM_SOFT_RESET, 0); |
| 2175 | (void)RREG32(GRBM_SOFT_RESET); | 2170 | (void)RREG32(GRBM_SOFT_RESET); |
| 2176 | /* Wait a little for things to settle down */ | 2171 | |
| 2177 | udelay(50); | ||
| 2178 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | 2172 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", |
| 2179 | RREG32(GRBM_STATUS)); | 2173 | RREG32(GRBM_STATUS)); |
| 2180 | dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", | 2174 | dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", |
| @@ -2185,13 +2179,75 @@ static int si_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2185 | RREG32(GRBM_STATUS_SE1)); | 2179 | RREG32(GRBM_STATUS_SE1)); |
| 2186 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | 2180 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", |
| 2187 | RREG32(SRBM_STATUS)); | 2181 | RREG32(SRBM_STATUS)); |
| 2182 | } | ||
| 2183 | |||
| 2184 | static void si_gpu_soft_reset_dma(struct radeon_device *rdev) | ||
| 2185 | { | ||
| 2186 | u32 tmp; | ||
| 2187 | |||
| 2188 | if (RREG32(DMA_STATUS_REG) & DMA_IDLE) | ||
| 2189 | return; | ||
| 2190 | |||
| 2191 | dev_info(rdev->dev, " DMA_STATUS_REG = 0x%08X\n", | ||
| 2192 | RREG32(DMA_STATUS_REG)); | ||
| 2193 | |||
| 2194 | /* dma0 */ | ||
| 2195 | tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); | ||
| 2196 | tmp &= ~DMA_RB_ENABLE; | ||
| 2197 | WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); | ||
| 2198 | |||
| 2199 | /* dma1 */ | ||
| 2200 | tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); | ||
| 2201 | tmp &= ~DMA_RB_ENABLE; | ||
| 2202 | WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); | ||
| 2203 | |||
| 2204 | /* Reset dma */ | ||
| 2205 | WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1); | ||
| 2206 | RREG32(SRBM_SOFT_RESET); | ||
| 2207 | udelay(50); | ||
| 2208 | WREG32(SRBM_SOFT_RESET, 0); | ||
| 2209 | |||
| 2210 | dev_info(rdev->dev, " DMA_STATUS_REG = 0x%08X\n", | ||
| 2211 | RREG32(DMA_STATUS_REG)); | ||
| 2212 | } | ||
| 2213 | |||
| 2214 | static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) | ||
| 2215 | { | ||
| 2216 | struct evergreen_mc_save save; | ||
| 2217 | |||
| 2218 | if (reset_mask == 0) | ||
| 2219 | return 0; | ||
| 2220 | |||
| 2221 | dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); | ||
| 2222 | |||
| 2223 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
| 2224 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); | ||
| 2225 | dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
| 2226 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); | ||
| 2227 | |||
| 2228 | evergreen_mc_stop(rdev, &save); | ||
| 2229 | if (radeon_mc_wait_for_idle(rdev)) { | ||
| 2230 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 2231 | } | ||
| 2232 | |||
| 2233 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) | ||
| 2234 | si_gpu_soft_reset_gfx(rdev); | ||
| 2235 | |||
| 2236 | if (reset_mask & RADEON_RESET_DMA) | ||
| 2237 | si_gpu_soft_reset_dma(rdev); | ||
| 2238 | |||
| 2239 | /* Wait a little for things to settle down */ | ||
| 2240 | udelay(50); | ||
| 2241 | |||
| 2188 | evergreen_mc_resume(rdev, &save); | 2242 | evergreen_mc_resume(rdev, &save); |
| 2189 | return 0; | 2243 | return 0; |
| 2190 | } | 2244 | } |
| 2191 | 2245 | ||
| 2192 | int si_asic_reset(struct radeon_device *rdev) | 2246 | int si_asic_reset(struct radeon_device *rdev) |
| 2193 | { | 2247 | { |
| 2194 | return si_gpu_soft_reset(rdev); | 2248 | return si_gpu_soft_reset(rdev, (RADEON_RESET_GFX | |
| 2249 | RADEON_RESET_COMPUTE | | ||
| 2250 | RADEON_RESET_DMA)); | ||
| 2195 | } | 2251 | } |
| 2196 | 2252 | ||
| 2197 | /* MC */ | 2253 | /* MC */ |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index 62b46215d423..c056aae814f0 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
| @@ -62,6 +62,22 @@ | |||
| 62 | 62 | ||
| 63 | #define SRBM_STATUS 0xE50 | 63 | #define SRBM_STATUS 0xE50 |
| 64 | 64 | ||
| 65 | #define SRBM_SOFT_RESET 0x0E60 | ||
| 66 | #define SOFT_RESET_BIF (1 << 1) | ||
| 67 | #define SOFT_RESET_DC (1 << 5) | ||
| 68 | #define SOFT_RESET_DMA1 (1 << 6) | ||
| 69 | #define SOFT_RESET_GRBM (1 << 8) | ||
| 70 | #define SOFT_RESET_HDP (1 << 9) | ||
| 71 | #define SOFT_RESET_IH (1 << 10) | ||
| 72 | #define SOFT_RESET_MC (1 << 11) | ||
| 73 | #define SOFT_RESET_ROM (1 << 14) | ||
| 74 | #define SOFT_RESET_SEM (1 << 15) | ||
| 75 | #define SOFT_RESET_VMC (1 << 17) | ||
| 76 | #define SOFT_RESET_DMA (1 << 20) | ||
| 77 | #define SOFT_RESET_TST (1 << 21) | ||
| 78 | #define SOFT_RESET_REGBB (1 << 22) | ||
| 79 | #define SOFT_RESET_ORB (1 << 23) | ||
| 80 | |||
| 65 | #define CC_SYS_RB_BACKEND_DISABLE 0xe80 | 81 | #define CC_SYS_RB_BACKEND_DISABLE 0xe80 |
| 66 | #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84 | 82 | #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84 |
| 67 | 83 | ||
| @@ -1013,6 +1029,8 @@ | |||
| 1013 | # define DATA_SWAP_ENABLE (1 << 3) | 1029 | # define DATA_SWAP_ENABLE (1 << 3) |
| 1014 | # define FENCE_SWAP_ENABLE (1 << 4) | 1030 | # define FENCE_SWAP_ENABLE (1 << 4) |
| 1015 | # define CTXEMPTY_INT_ENABLE (1 << 28) | 1031 | # define CTXEMPTY_INT_ENABLE (1 << 28) |
| 1032 | #define DMA_STATUS_REG 0xd034 | ||
| 1033 | # define DMA_IDLE (1 << 0) | ||
| 1016 | #define DMA_TILING_CONFIG 0xd0b8 | 1034 | #define DMA_TILING_CONFIG 0xd0b8 |
| 1017 | 1035 | ||
| 1018 | #define DMA_PACKET(cmd, b, t, s, n) ((((cmd) & 0xF) << 28) | \ | 1036 | #define DMA_PACKET(cmd, b, t, s, n) ((((cmd) & 0xF) << 28) | \ |
