|
@@ -3702,6 +3702,7 @@ int cik_copy_cpdma(struct radeon_device *rdev,
|
|
|
r = radeon_fence_emit(rdev, fence, ring->idx);
|
|
|
if (r) {
|
|
|
radeon_ring_unlock_undo(rdev, ring);
|
|
|
+ radeon_semaphore_free(rdev, &sem, NULL);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -6693,6 +6694,19 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev)
|
|
|
WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
|
|
WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
|
|
}
|
|
|
+ /* pflip */
|
|
|
+ if (rdev->num_crtc >= 2) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
|
|
+ }
|
|
|
+ if (rdev->num_crtc >= 4) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
|
|
|
+ }
|
|
|
+ if (rdev->num_crtc >= 6) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
|
|
+ }
|
|
|
|
|
|
/* dac hotplug */
|
|
|
WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
|
|
@@ -7049,6 +7063,25 @@ int cik_irq_set(struct radeon_device *rdev)
|
|
|
WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
|
|
|
}
|
|
|
|
|
|
+ if (rdev->num_crtc >= 2) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ }
|
|
|
+ if (rdev->num_crtc >= 4) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ }
|
|
|
+ if (rdev->num_crtc >= 6) {
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_MASK);
|
|
|
+ }
|
|
|
+
|
|
|
WREG32(DC_HPD1_INT_CONTROL, hpd1);
|
|
|
WREG32(DC_HPD2_INT_CONTROL, hpd2);
|
|
|
WREG32(DC_HPD3_INT_CONTROL, hpd3);
|
|
@@ -7085,6 +7118,29 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
|
|
|
rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
|
|
|
rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
|
|
|
|
|
|
+ rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC0_REGISTER_OFFSET);
|
|
|
+ rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC1_REGISTER_OFFSET);
|
|
|
+ if (rdev->num_crtc >= 4) {
|
|
|
+ rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC2_REGISTER_OFFSET);
|
|
|
+ rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC3_REGISTER_OFFSET);
|
|
|
+ }
|
|
|
+ if (rdev->num_crtc >= 6) {
|
|
|
+ rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC4_REGISTER_OFFSET);
|
|
|
+ rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
|
|
|
+ EVERGREEN_CRTC5_REGISTER_OFFSET);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
+ if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
|
|
|
WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
|
|
@@ -7095,6 +7151,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
|
|
|
WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
|
|
|
|
|
|
if (rdev->num_crtc >= 4) {
|
|
|
+ if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
+ if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
|
|
|
WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
|
|
@@ -7106,6 +7168,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
|
|
|
}
|
|
|
|
|
|
if (rdev->num_crtc >= 6) {
|
|
|
+ if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
+ if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
|
|
|
+ WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
|
|
|
+ GRPH_PFLIP_INT_CLEAR);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
|
|
|
WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
|
|
|
if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
|
|
@@ -7457,6 +7525,15 @@ restart_ih:
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
+ case 8: /* D1 page flip */
|
|
|
+ case 10: /* D2 page flip */
|
|
|
+ case 12: /* D3 page flip */
|
|
|
+ case 14: /* D4 page flip */
|
|
|
+ case 16: /* D5 page flip */
|
|
|
+ case 18: /* D6 page flip */
|
|
|
+ DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
|
|
|
+ radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
|
|
|
+ break;
|
|
|
case 42: /* HPD hotplug */
|
|
|
switch (src_data) {
|
|
|
case 0:
|