diff options
author | Dave Airlie <airlied@redhat.com> | 2013-01-03 21:51:51 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-01-03 21:51:51 -0500 |
commit | e61e512b5ae7ceda32e84c5ccfe77b6188a01fad (patch) | |
tree | 30eba03cd9f9da531759e8908ea141b2471d5a62 /drivers/gpu/drm | |
parent | d5757dbe79870d825d0dec30074d48683e1d7e9a (diff) | |
parent | 06bc6df0df52bf8d08247ded2f4d98966d5a046b (diff) |
Merge branch 'drm-fixes-3.8' of git://people.freedesktop.org/~agd5f/linux into drm-next
- fix the crashes related to DMA on r6xx
- properly reset DMA on GPU reset
- fix monitor probing with some DP bridges
- misc small bug fixes
* 'drm-fixes-3.8' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon: switch to a finer grained reset for SI (v2)
drm/radeon: switch to a finer grained reset for cayman/TN
drm/radeon: switch to a finer grained reset for evergreen
drm/radeon: switch to a finer grained reset for r6xx/7xx
drm/radeon: add GPU reset flags
drm/radeon: fix typo in evergreen dma fence
drm/radeon: Properly handle DDC probe for DP bridges
drm/radeon: reset dma engine on gpu reset (v2)
drm/radeon: print dma status reg on lockup (v2)
drm/radeon: improve ring debugfs printing
drm/radeon: add debugfs file for dma rings
drm/radeon/r6xx: fix DMA engine for ttm bo transfers
drm/radeon: add connector table for Mac G4 Silver
Diffstat (limited to 'drivers/gpu/drm')
-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 |
14 files changed, 413 insertions, 99 deletions
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) | \ |