Rev 5128 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5128 | Rev 5179 | ||
---|---|---|---|
Line 3713... | Line 3713... | ||
3713 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
3713 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
3714 | else |
3714 | else |
3715 | wptr = RREG32(IH_RB_WPTR); |
3715 | wptr = RREG32(IH_RB_WPTR); |
Line 3716... | Line 3716... | ||
3716 | 3716 | ||
- | 3717 | if (wptr & RB_OVERFLOW) { |
|
3717 | if (wptr & RB_OVERFLOW) { |
3718 | wptr &= ~RB_OVERFLOW; |
3718 | /* When a ring buffer overflow happen start parsing interrupt |
3719 | /* When a ring buffer overflow happen start parsing interrupt |
3719 | * from the last not overwritten vector (wptr + 16). Hopefully |
3720 | * from the last not overwritten vector (wptr + 16). Hopefully |
3720 | * this should allow us to catchup. |
3721 | * this should allow us to catchup. |
3721 | */ |
3722 | */ |
3722 | dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n", |
3723 | dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n", |
3723 | wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask); |
3724 | wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask); |
3724 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
3725 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
3725 | tmp = RREG32(IH_RB_CNTL); |
3726 | tmp = RREG32(IH_RB_CNTL); |
3726 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
3727 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
3727 | WREG32(IH_RB_CNTL, tmp); |
- | |
3728 | wptr &= ~RB_OVERFLOW; |
3728 | WREG32(IH_RB_CNTL, tmp); |
3729 | } |
3729 | } |
3730 | return (wptr & rdev->ih.ptr_mask); |
3730 | return (wptr & rdev->ih.ptr_mask); |
Line 3731... | Line 3731... | ||
3731 | } |
3731 | } |
Line 3961... | Line 3961... | ||
3961 | } |
3961 | } |
Line 3962... | Line 3962... | ||
3962 | 3962 | ||
3963 | /* wptr/rptr are in bytes! */ |
3963 | /* wptr/rptr are in bytes! */ |
3964 | rptr += 16; |
3964 | rptr += 16; |
- | 3965 | rptr &= rdev->ih.ptr_mask; |
|
3965 | rptr &= rdev->ih.ptr_mask; |
3966 | WREG32(IH_RB_RPTR, rptr); |
3966 | } |
3967 | } |
3967 | rdev->ih.rptr = rptr; |
- | |
3968 | WREG32(IH_RB_RPTR, rdev->ih.rptr); |
3968 | rdev->ih.rptr = rptr; |
Line 3969... | Line 3969... | ||
3969 | atomic_set(&rdev->ih.lock, 0); |
3969 | atomic_set(&rdev->ih.lock, 0); |
3970 | 3970 | ||
3971 | /* make sure wptr hasn't changed while processing */ |
3971 | /* make sure wptr hasn't changed while processing */ |