diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/ni.c')
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 4784c4e5056f..b6e80550ed90 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1534,23 +1534,49 @@ int cayman_asic_reset(struct radeon_device *rdev) | |||
1534 | } | 1534 | } |
1535 | 1535 | ||
1536 | /** | 1536 | /** |
1537 | * cayman_gfx_is_lockup - Check if the GFX engine is locked up | ||
1538 | * | ||
1539 | * @rdev: radeon_device pointer | ||
1540 | * @ring: radeon_ring structure holding ring information | ||
1541 | * | ||
1542 | * Check if the GFX engine is locked up. | ||
1543 | * Returns true if the engine appears to be locked up, false if not. | ||
1544 | */ | ||
1545 | bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | ||
1546 | { | ||
1547 | u32 reset_mask = cayman_gpu_check_soft_reset(rdev); | ||
1548 | |||
1549 | if (!(reset_mask & (RADEON_RESET_GFX | | ||
1550 | RADEON_RESET_COMPUTE | | ||
1551 | RADEON_RESET_CP))) { | ||
1552 | radeon_ring_lockup_update(ring); | ||
1553 | return false; | ||
1554 | } | ||
1555 | /* force CP activities */ | ||
1556 | radeon_ring_force_activity(rdev, ring); | ||
1557 | return radeon_ring_test_lockup(rdev, ring); | ||
1558 | } | ||
1559 | |||
1560 | /** | ||
1537 | * cayman_dma_is_lockup - Check if the DMA engine is locked up | 1561 | * cayman_dma_is_lockup - Check if the DMA engine is locked up |
1538 | * | 1562 | * |
1539 | * @rdev: radeon_device pointer | 1563 | * @rdev: radeon_device pointer |
1540 | * @ring: radeon_ring structure holding ring information | 1564 | * @ring: radeon_ring structure holding ring information |
1541 | * | 1565 | * |
1542 | * Check if the async DMA engine is locked up (cayman-SI). | 1566 | * Check if the async DMA engine is locked up. |
1543 | * Returns true if the engine appears to be locked up, false if not. | 1567 | * Returns true if the engine appears to be locked up, false if not. |
1544 | */ | 1568 | */ |
1545 | bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) | 1569 | bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) |
1546 | { | 1570 | { |
1547 | u32 dma_status_reg; | 1571 | u32 reset_mask = cayman_gpu_check_soft_reset(rdev); |
1572 | u32 mask; | ||
1548 | 1573 | ||
1549 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | 1574 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) |
1550 | dma_status_reg = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); | 1575 | mask = RADEON_RESET_DMA; |
1551 | else | 1576 | else |
1552 | dma_status_reg = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); | 1577 | mask = RADEON_RESET_DMA1; |
1553 | if (dma_status_reg & DMA_IDLE) { | 1578 | |
1579 | if (!(reset_mask & mask)) { | ||
1554 | radeon_ring_lockup_update(ring); | 1580 | radeon_ring_lockup_update(ring); |
1555 | return false; | 1581 | return false; |
1556 | } | 1582 | } |