Unverified Commit 87551ec6 authored by Dave Stevenson's avatar Dave Stevenson Committed by Maxime Ripard
Browse files

drm/vc4: hvs: Correct interrupt masking bit assignment for HVS5



HVS5 has moved the interrupt enable bits around within the
DISPCTRL register, therefore the configuration has to be updated
to account for this.

Fixes: c54619b0 ("drm/vc4: Add support for the BCM2711 HVS5")
Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://lore.kernel.org/r/20221207-rpi-hvs-crtc-misc-v1-4-1f8e0770798b@cerno.tech


Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent 982ee944
Loading
Loading
Loading
Loading
+36 −16
Original line number Diff line number Diff line
@@ -660,7 +660,8 @@ void vc4_hvs_mask_underrun(struct vc4_hvs *hvs, int channel)
		return;

	dispctrl = HVS_READ(SCALER_DISPCTRL);
	dispctrl &= ~SCALER_DISPCTRL_DSPEISLUR(channel);
	dispctrl &= ~(hvs->vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
					 SCALER_DISPCTRL_DSPEISLUR(channel));

	HVS_WRITE(SCALER_DISPCTRL, dispctrl);

@@ -677,7 +678,8 @@ void vc4_hvs_unmask_underrun(struct vc4_hvs *hvs, int channel)
		return;

	dispctrl = HVS_READ(SCALER_DISPCTRL);
	dispctrl |= SCALER_DISPCTRL_DSPEISLUR(channel);
	dispctrl |= (hvs->vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
					SCALER_DISPCTRL_DSPEISLUR(channel));

	HVS_WRITE(SCALER_DISPSTAT,
		  SCALER_DISPSTAT_EUFLOW(channel));
@@ -703,6 +705,7 @@ static irqreturn_t vc4_hvs_irq_handler(int irq, void *data)
	int channel;
	u32 control;
	u32 status;
	u32 dspeislur;

	/*
	 * NOTE: We don't need to protect the register access using
@@ -719,9 +722,11 @@ static irqreturn_t vc4_hvs_irq_handler(int irq, void *data)
	control = HVS_READ(SCALER_DISPCTRL);

	for (channel = 0; channel < SCALER_CHANNELS_COUNT; channel++) {
		dspeislur = vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
					  SCALER_DISPCTRL_DSPEISLUR(channel);
		/* Interrupt masking is not always honored, so check it here. */
		if (status & SCALER_DISPSTAT_EUFLOW(channel) &&
		    control & SCALER_DISPCTRL_DSPEISLUR(channel)) {
		    control & dspeislur) {
			vc4_hvs_mask_underrun(hvs, channel);
			vc4_hvs_report_underrun(dev);

@@ -901,6 +906,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
		    SCALER_DISPCTRL_DISPEIRQ(1) |
		    SCALER_DISPCTRL_DISPEIRQ(2);

	if (!vc4->is_vc5)
		dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ |
			      SCALER_DISPCTRL_SLVWREIRQ |
			      SCALER_DISPCTRL_SLVRDEIRQ |
@@ -914,6 +920,20 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
			      SCALER_DISPCTRL_DSPEISLUR(1) |
			      SCALER_DISPCTRL_DSPEISLUR(2) |
			      SCALER_DISPCTRL_SCLEIRQ);
	else
		dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ |
			      SCALER5_DISPCTRL_SLVEIRQ |
			      SCALER5_DISPCTRL_DSPEIEOF(0) |
			      SCALER5_DISPCTRL_DSPEIEOF(1) |
			      SCALER5_DISPCTRL_DSPEIEOF(2) |
			      SCALER5_DISPCTRL_DSPEIEOLN(0) |
			      SCALER5_DISPCTRL_DSPEIEOLN(1) |
			      SCALER5_DISPCTRL_DSPEIEOLN(2) |
			      SCALER5_DISPCTRL_DSPEISLUR(0) |
			      SCALER5_DISPCTRL_DSPEISLUR(1) |
			      SCALER5_DISPCTRL_DSPEISLUR(2) |
			      SCALER_DISPCTRL_SCLEIRQ);


	/* Set AXI panic mode.
	 * VC4 panics when < 2 lines in FIFO.
+8 −2
Original line number Diff line number Diff line
@@ -234,15 +234,21 @@
 * always enabled.
 */
# define SCALER_DISPCTRL_DSPEISLUR(x)		BIT(13 + (x))
# define SCALER5_DISPCTRL_DSPEISLUR(x)		BIT(9 + ((x) * 4))
/* Enables Display 0 end-of-line-N contribution to
 * SCALER_DISPSTAT_IRQDISP0
 */
# define SCALER_DISPCTRL_DSPEIEOLN(x)		BIT(8 + ((x) * 2))
# define SCALER5_DISPCTRL_DSPEIEOLN(x)		BIT(8 + ((x) * 4))
/* Enables Display 0 EOF contribution to SCALER_DISPSTAT_IRQDISP0 */
# define SCALER_DISPCTRL_DSPEIEOF(x)		BIT(7 + ((x) * 2))
# define SCALER5_DISPCTRL_DSPEIEOF(x)		BIT(7 + ((x) * 4))

# define SCALER_DISPCTRL_SLVRDEIRQ		BIT(6)
# define SCALER_DISPCTRL_SLVWREIRQ		BIT(5)
# define SCALER5_DISPCTRL_DSPEIVST(x)		BIT(6 + ((x) * 4))

# define SCALER_DISPCTRL_SLVRDEIRQ		BIT(6)	/* HVS4 only */
# define SCALER_DISPCTRL_SLVWREIRQ		BIT(5)	/* HVS4 only */
# define SCALER5_DISPCTRL_SLVEIRQ		BIT(5)
# define SCALER_DISPCTRL_DMAEIRQ		BIT(4)
/* Enables interrupt generation on the enabled EOF/EOLN/EISLUR
 * bits and short frames..