@@ -939,6 +939,7 @@ static void vop_power_enable(struct drm_crtc *crtc)
939939static void vop_initial (struct drm_crtc * crtc )
940940{
941941 struct vop * vop = to_vop (crtc );
942+ uint32_t irqs ;
942943 int i ;
943944
944945 vop_power_enable (crtc );
@@ -972,6 +973,12 @@ static void vop_initial(struct drm_crtc *crtc)
972973 VOP_WIN_SET (vop , win , gate , 1 );
973974 }
974975 VOP_CTRL_SET (vop , afbdc_en , 0 );
976+
977+ irqs = BUS_ERROR_INTR | WIN0_EMPTY_INTR | WIN1_EMPTY_INTR |
978+ WIN2_EMPTY_INTR | WIN3_EMPTY_INTR | HWC_EMPTY_INTR |
979+ POST_BUF_EMPTY_INTR ;
980+ VOP_INTR_SET_TYPE (vop , clear , irqs , 1 );
981+ VOP_INTR_SET_TYPE (vop , enable , irqs , 1 );
975982}
976983
977984static void vop_crtc_disable (struct drm_crtc * crtc )
@@ -2609,6 +2616,23 @@ static irqreturn_t vop_isr(int irq, void *data)
26092616 ret = IRQ_HANDLED ;
26102617 }
26112618
2619+ #define ERROR_HANDLER (x ) \
2620+ do { \
2621+ if (active_irqs & x##_INTR) {\
2622+ DRM_DEV_ERROR_RATELIMITED(vop->dev, #x " irq err\n"); \
2623+ active_irqs &= ~x##_INTR; \
2624+ ret = IRQ_HANDLED; \
2625+ } \
2626+ } while (0)
2627+
2628+ ERROR_HANDLER (BUS_ERROR );
2629+ ERROR_HANDLER (WIN0_EMPTY );
2630+ ERROR_HANDLER (WIN1_EMPTY );
2631+ ERROR_HANDLER (WIN2_EMPTY );
2632+ ERROR_HANDLER (WIN3_EMPTY );
2633+ ERROR_HANDLER (HWC_EMPTY );
2634+ ERROR_HANDLER (POST_BUF_EMPTY );
2635+
26122636 /* Unhandled irqs are spurious. */
26132637 if (active_irqs )
26142638 DRM_ERROR ("Unknown VOP IRQs: %#02x\n" , active_irqs );
0 commit comments