Rev 5078 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5078 | Rev 5179 | ||
---|---|---|---|
Line 6314... | Line 6314... | ||
6314 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
6314 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
6315 | else |
6315 | else |
6316 | wptr = RREG32(IH_RB_WPTR); |
6316 | wptr = RREG32(IH_RB_WPTR); |
Line 6317... | Line 6317... | ||
6317 | 6317 | ||
- | 6318 | if (wptr & RB_OVERFLOW) { |
|
6318 | if (wptr & RB_OVERFLOW) { |
6319 | wptr &= ~RB_OVERFLOW; |
6319 | /* When a ring buffer overflow happen start parsing interrupt |
6320 | /* When a ring buffer overflow happen start parsing interrupt |
6320 | * from the last not overwritten vector (wptr + 16). Hopefully |
6321 | * from the last not overwritten vector (wptr + 16). Hopefully |
6321 | * this should allow us to catchup. |
6322 | * this should allow us to catchup. |
6322 | */ |
6323 | */ |
6323 | dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n", |
6324 | dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n", |
6324 | wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask); |
6325 | wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask); |
6325 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
6326 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
6326 | tmp = RREG32(IH_RB_CNTL); |
6327 | tmp = RREG32(IH_RB_CNTL); |
6327 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
6328 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
6328 | WREG32(IH_RB_CNTL, tmp); |
- | |
6329 | wptr &= ~RB_OVERFLOW; |
6329 | WREG32(IH_RB_CNTL, tmp); |
6330 | } |
6330 | } |
6331 | return (wptr & rdev->ih.ptr_mask); |
6331 | return (wptr & rdev->ih.ptr_mask); |
Line 6332... | Line 6332... | ||
6332 | } |
6332 | } |
Line 6660... | Line 6660... | ||
6660 | } |
6660 | } |
Line 6661... | Line 6661... | ||
6661 | 6661 | ||
6662 | /* wptr/rptr are in bytes! */ |
6662 | /* wptr/rptr are in bytes! */ |
6663 | rptr += 16; |
6663 | rptr += 16; |
- | 6664 | rptr &= rdev->ih.ptr_mask; |
|
6664 | rptr &= rdev->ih.ptr_mask; |
6665 | WREG32(IH_RB_RPTR, rptr); |
6665 | } |
6666 | } |
6666 | // if (queue_hotplug) |
6667 | // if (queue_hotplug) |
6667 | // schedule_work(&rdev->hotplug_work); |
6668 | // schedule_work(&rdev->hotplug_work); |
6668 | rdev->ih.rptr = rptr; |
- | |
6669 | WREG32(IH_RB_RPTR, rdev->ih.rptr); |
6669 | rdev->ih.rptr = rptr; |
Line 6670... | Line 6670... | ||
6670 | atomic_set(&rdev->ih.lock, 0); |
6670 | atomic_set(&rdev->ih.lock, 0); |
6671 | 6671 | ||
6672 | /* make sure wptr hasn't changed while processing */ |
6672 | /* make sure wptr hasn't changed while processing */ |