]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/vc4: hvs: Enable SCALER_CONTROL early in HVS init
authorTim Gover <tim.gover@raspberrypi.com>
Fri, 21 Jun 2024 15:20:54 +0000 (16:20 +0100)
committerDave Stevenson <dave.stevenson@raspberrypi.com>
Mon, 9 Sep 2024 12:02:54 +0000 (13:02 +0100)
Always enable SCALER_CONTROL before attempting other HVS
operations. It's safe to write to some parts of the HVS but
in general it's dangerous to do this because it can cause bus
lockups.

Signed-off-by: Tim Gover <tim.gover@raspberrypi.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-31-dave.stevenson@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/vc4_hvs.c

index 8e6327910d9f1e04ad4608dd989abf501b075f61..93e7edd8b084b32e7738a79ae5ba335dabbc7735 100644 (file)
@@ -860,6 +860,10 @@ static int vc4_hvs_hw_init(struct vc4_hvs *hvs)
        struct vc4_dev *vc4 = hvs->vc4;
        u32 dispctrl, reg;
 
+       dispctrl = HVS_READ(SCALER_DISPCTRL);
+       dispctrl |= SCALER_DISPCTRL_ENABLE;
+       HVS_WRITE(SCALER_DISPCTRL, dispctrl);
+
        reg = HVS_READ(SCALER_DISPECTRL);
        reg &= ~SCALER_DISPECTRL_DSP2_MUX_MASK;
        HVS_WRITE(SCALER_DISPECTRL,
@@ -881,8 +885,6 @@ static int vc4_hvs_hw_init(struct vc4_hvs *hvs)
                  reg | VC4_SET_FIELD(3, SCALER_DISPDITHER_DSP5_MUX));
 
        dispctrl = HVS_READ(SCALER_DISPCTRL);
-
-       dispctrl |= SCALER_DISPCTRL_ENABLE;
        dispctrl |= SCALER_DISPCTRL_DISPEIRQ(0) |
                    SCALER_DISPCTRL_DISPEIRQ(1) |
                    SCALER_DISPCTRL_DISPEIRQ(2);
@@ -1078,6 +1080,10 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
        else
                hvs->dlist = hvs->regs + SCALER5_DLIST_START;
 
+       ret = vc4_hvs_hw_init(hvs);
+       if (ret)
+               return ret;
+
        /* Upload filter kernels.  We only have the one for now, so we
         * keep it around for the lifetime of the driver.
         */
@@ -1087,10 +1093,6 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
        if (ret)
                return ret;
 
-       ret = vc4_hvs_hw_init(hvs);
-       if (ret)
-               return ret;
-
        ret = vc4_hvs_cob_init(hvs);
        if (ret)
                return ret;