@@ -621,7 +621,8 @@ static void vc4_hvs_install_dlist(struct vc4_dev *vc4, unsigned int channel)
621621 hvs -> fifo [channel ].pending = false;
622622
623623 reg = HVS_READ (SCALER_DISPCTRL );
624- reg &= ~BIT (7 + (channel * (vc4 -> hvs -> hvs5 ? 4 : 2 )));
624+ reg &= ~(vc4 -> hvs -> hvs5 ? SCALER5_DISPCTRL_DSPEIEOF (channel ) :
625+ SCALER_DISPCTRL_DSPEIEOF (channel ));
625626 HVS_WRITE (SCALER_DISPCTRL , reg );
626627
627628 spin_unlock_irqrestore (& hvs -> hw_dlist_lock , flags );
@@ -641,7 +642,9 @@ static void vc4_hvs_schedule_dlist_update(struct vc4_dev *vc4,
641642 }
642643
643644 HVS_WRITE (SCALER_DISPCTRL ,
644- HVS_READ (SCALER_DISPCTRL ) | BIT (7 + (channel * (vc4 -> hvs -> hvs5 ? 4 : 2 ))));
645+ HVS_READ (SCALER_DISPCTRL ) |
646+ (vc4 -> hvs -> hvs5 ? SCALER5_DISPCTRL_DSPEIEOF (channel ) :
647+ SCALER_DISPCTRL_DSPEIEOF (channel )));
645648
646649 hvs -> fifo [channel ].pending = true;
647650
@@ -827,7 +830,8 @@ void vc4_hvs_mask_underrun(struct drm_device *dev, int channel)
827830 struct vc4_dev * vc4 = to_vc4_dev (dev );
828831 u32 dispctrl = HVS_READ (SCALER_DISPCTRL );
829832
830- dispctrl &= ~SCALER_DISPCTRL_DSPEISLUR (channel );
833+ dispctrl &= ~(vc4 -> hvs -> hvs5 ? SCALER5_DISPCTRL_DSPEISLUR (channel ) :
834+ SCALER_DISPCTRL_DSPEISLUR (channel ));
831835
832836 HVS_WRITE (SCALER_DISPCTRL , dispctrl );
833837}
@@ -837,7 +841,8 @@ void vc4_hvs_unmask_underrun(struct drm_device *dev, int channel)
837841 struct vc4_dev * vc4 = to_vc4_dev (dev );
838842 u32 dispctrl = HVS_READ (SCALER_DISPCTRL );
839843
840- dispctrl |= SCALER_DISPCTRL_DSPEISLUR (channel );
844+ dispctrl |= vc4 -> hvs -> hvs5 ? SCALER5_DISPCTRL_DSPEISLUR (channel ) :
845+ SCALER_DISPCTRL_DSPEISLUR (channel );
841846
842847 HVS_WRITE (SCALER_DISPSTAT ,
843848 SCALER_DISPSTAT_EUFLOW (channel ));
@@ -867,7 +872,8 @@ static irqreturn_t vc4_hvs_irq_handler(int irq, void *data)
867872 for (channel = 0 ; channel < SCALER_CHANNELS_COUNT ; channel ++ ) {
868873 /* Interrupt masking is not always honored, so check it here. */
869874 if (status & SCALER_DISPSTAT_EUFLOW (channel ) &&
870- control & SCALER_DISPCTRL_DSPEISLUR (channel )) {
875+ control & (vc4 -> hvs -> hvs5 ? SCALER5_DISPCTRL_DSPEISLUR (channel ) :
876+ SCALER_DISPCTRL_DSPEISLUR (channel ))) {
871877 vc4_hvs_mask_underrun (dev , channel );
872878 vc4_hvs_report_underrun (dev );
873879
@@ -881,9 +887,14 @@ static irqreturn_t vc4_hvs_irq_handler(int irq, void *data)
881887 }
882888
883889 /* Clear every per-channel interrupt flag. */
884- HVS_WRITE (SCALER_DISPSTAT , SCALER_DISPSTAT_IRQMASK (0 ) |
885- SCALER_DISPSTAT_IRQMASK (1 ) |
886- SCALER_DISPSTAT_IRQMASK (2 ));
890+ if (vc4 -> hvs -> hvs5 )
891+ HVS_WRITE (SCALER_DISPSTAT , SCALER5_DISPSTAT_IRQMASK (0 ) |
892+ SCALER5_DISPSTAT_IRQMASK (1 ) |
893+ SCALER5_DISPSTAT_IRQMASK (2 ));
894+ else
895+ HVS_WRITE (SCALER_DISPSTAT , SCALER_DISPSTAT_IRQMASK (0 ) |
896+ SCALER_DISPSTAT_IRQMASK (1 ) |
897+ SCALER_DISPSTAT_IRQMASK (2 ));
887898
888899 return irqret ;
889900}
@@ -979,19 +990,37 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
979990 * be unused.
980991 */
981992 dispctrl &= ~SCALER_DISPCTRL_DSP3_MUX_MASK ;
982- dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ |
983- SCALER_DISPCTRL_SLVWREIRQ |
984- SCALER_DISPCTRL_SLVRDEIRQ |
985- SCALER_DISPCTRL_DSPEIEOF (0 ) |
986- SCALER_DISPCTRL_DSPEIEOF (1 ) |
987- SCALER_DISPCTRL_DSPEIEOF (2 ) |
988- SCALER_DISPCTRL_DSPEIEOLN (0 ) |
989- SCALER_DISPCTRL_DSPEIEOLN (1 ) |
990- SCALER_DISPCTRL_DSPEIEOLN (2 ) |
991- SCALER_DISPCTRL_DSPEISLUR (0 ) |
992- SCALER_DISPCTRL_DSPEISLUR (1 ) |
993- SCALER_DISPCTRL_DSPEISLUR (2 ) |
994- SCALER_DISPCTRL_SCLEIRQ );
993+ if (!hvs -> hvs5 )
994+ dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ |
995+ SCALER_DISPCTRL_SLVWREIRQ |
996+ SCALER_DISPCTRL_SLVRDEIRQ |
997+ SCALER_DISPCTRL_DSPEIEOF (0 ) |
998+ SCALER_DISPCTRL_DSPEIEOF (1 ) |
999+ SCALER_DISPCTRL_DSPEIEOF (2 ) |
1000+ SCALER_DISPCTRL_DSPEIEOLN (0 ) |
1001+ SCALER_DISPCTRL_DSPEIEOLN (1 ) |
1002+ SCALER_DISPCTRL_DSPEIEOLN (2 ) |
1003+ SCALER_DISPCTRL_DSPEISLUR (0 ) |
1004+ SCALER_DISPCTRL_DSPEISLUR (1 ) |
1005+ SCALER_DISPCTRL_DSPEISLUR (2 ) |
1006+ SCALER_DISPCTRL_SCLEIRQ );
1007+ else
1008+ dispctrl &= ~(SCALER5_DISPCTRL_DMAEIRQ |
1009+ SCALER5_DISPCTRL_SLVEIRQ |
1010+ SCALER5_DISPCTRL_DSPEIEOF (0 ) |
1011+ SCALER5_DISPCTRL_DSPEIEOF (1 ) |
1012+ SCALER5_DISPCTRL_DSPEIEOF (2 ) |
1013+ SCALER5_DISPCTRL_DSPEIEOLN (0 ) |
1014+ SCALER5_DISPCTRL_DSPEIEOLN (1 ) |
1015+ SCALER5_DISPCTRL_DSPEIEOLN (2 ) |
1016+ SCALER5_DISPCTRL_DSPEISLUR (0 ) |
1017+ SCALER5_DISPCTRL_DSPEISLUR (1 ) |
1018+ SCALER5_DISPCTRL_DSPEISLUR (2 ) |
1019+ SCALER5_DISPCTRL_DSPVSTART (0 ) |
1020+ SCALER5_DISPCTRL_DSPVSTART (1 ) |
1021+ SCALER5_DISPCTRL_DSPVSTART (2 ) |
1022+ SCALER_DISPCTRL_SCLEIRQ );
1023+
9951024 dispctrl |= VC4_SET_FIELD (2 , SCALER_DISPCTRL_DSP3_MUX );
9961025
9971026 HVS_WRITE (SCALER_DISPCTRL , dispctrl );
0 commit comments