summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch59
1 files changed, 59 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch b/target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch
new file mode 100644
index 0000000000..3060c0201f
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-0955-drm-vc4-Enable-SCALER_CONTROL-early-in-HVS-init.patch
@@ -0,0 +1,59 @@
+From 542ba979b4fa1e07ff2ad2dabbdc12e92b80ed46 Mon Sep 17 00:00:00 2001
+From: Tim Gover <tim.gover@raspberrypi.com>
+Date: Thu, 13 Jul 2023 17:47:22 +0100
+Subject: [PATCH] drm/vc4: Enable SCALER_CONTROL early in HVS init
+
+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>
+---
+ drivers/gpu/drm/vc4/vc4_hvs.c | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hvs.c
++++ b/drivers/gpu/drm/vc4/vc4_hvs.c
+@@ -1303,6 +1303,10 @@ static int vc4_hvs_hw_init(struct vc4_hv
+ 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,
+@@ -1324,8 +1328,6 @@ static int vc4_hvs_hw_init(struct vc4_hv
+ 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);
+@@ -1521,6 +1523,10 @@ static int vc4_hvs_bind(struct device *d
+ 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.
+ */
+@@ -1530,10 +1536,6 @@ static int vc4_hvs_bind(struct device *d
+ if (ret)
+ return ret;
+
+- ret = vc4_hvs_hw_init(hvs);
+- if (ret)
+- return ret;
+-
+ ret = vc4_hvs_cob_init(hvs);
+ if (ret)
+ return ret;