diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-01-15 08:44:39 -0500 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2010-01-20 17:45:01 -0500 |
commit | 7924e5eb8fe422d6b1ce3b3e2be749a480dfcdd9 (patch) | |
tree | 9fbe9d6b1d23b01300e95bebd09b4ee4a3d1e697 | |
parent | 79c2bbc505751bb5130ac753251fc9a0eb37bb12 (diff) |
drm/radeon/kms: r600 handle irq vector ring overflow
In some rare case i faced an irq overflow quickly followed by
a GPU lockup (hard hang) this patch try to deal with irq vector
ring overflow, so far haven't been able to reproduce it with
the patch.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@linux.ie>
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0f9a8c6788a3..bb9115bdc3a2 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2648,9 +2648,13 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev) | |||
2648 | wptr = RREG32(IH_RB_WPTR); | 2648 | wptr = RREG32(IH_RB_WPTR); |
2649 | 2649 | ||
2650 | if (wptr & RB_OVERFLOW) { | 2650 | if (wptr & RB_OVERFLOW) { |
2651 | WARN_ON(1); | 2651 | /* When a ring buffer overflow happen start parsing interrupt |
2652 | /* XXX deal with overflow */ | 2652 | * from the last not overwritten vector (wptr + 16). Hopefully |
2653 | DRM_ERROR("IH RB overflow\n"); | 2653 | * this should allow us to catchup. |
2654 | */ | ||
2655 | dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n", | ||
2656 | wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask); | ||
2657 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; | ||
2654 | tmp = RREG32(IH_RB_CNTL); | 2658 | tmp = RREG32(IH_RB_CNTL); |
2655 | tmp |= IH_WPTR_OVERFLOW_CLEAR; | 2659 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
2656 | WREG32(IH_RB_CNTL, tmp); | 2660 | WREG32(IH_RB_CNTL, tmp); |