drm/msm/dpu: enable PINGPONG TE operations only when supported by HW
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 4 Sep 2023 02:04:48 +0000 (05:04 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 9 Oct 2023 09:17:46 +0000 (12:17 +0300)
The DPU_PINGPONG_TE bit is set for all PINGPONG blocks on DPU < 5.0.
Rather than checking for the flag, check for the presense of the
corresponding interrupt line.

Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/555541/
Link: https://lore.kernel.org/r/20230904020454.2945667-3-dmitry.baryshkov@linaro.org
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c

index 9298c166b2132fffc74e38e27a2628d7bcbd8396..057cac7f5d936f8f84cb3949172c161bf0b0a1c3 100644 (file)
@@ -282,7 +282,7 @@ static int dpu_hw_pp_setup_dsc(struct dpu_hw_pingpong *pp)
 }
 
 struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
-               void __iomem *addr)
+               void __iomem *addr, const struct dpu_mdss_version *mdss_rev)
 {
        struct dpu_hw_pingpong *c;
 
@@ -296,7 +296,9 @@ struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
        c->idx = cfg->id;
        c->caps = cfg;
 
-       if (test_bit(DPU_PINGPONG_TE, &cfg->features)) {
+       if (mdss_rev->core_major_ver < 5) {
+               WARN_ON(!cfg->intr_rdptr);
+
                c->ops.enable_tearcheck = dpu_hw_pp_enable_te;
                c->ops.disable_tearcheck = dpu_hw_pp_disable_te;
                c->ops.connect_external_te = dpu_hw_pp_connect_external_te;
index d3246a9a5808fa62e49763be95abfc2d3059a71e..0d541ca5b05669191c0f022803c3743a720c11f7 100644 (file)
@@ -123,10 +123,11 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
  * pingpong catalog entry.
  * @cfg:  Pingpong catalog entry for which driver object is required
  * @addr: Mapped register io address of MDP
+ * @mdss_rev: dpu core's major and minor versions
  * Return: Error code or allocated dpu_hw_pingpong context
  */
 struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
-               void __iomem *addr);
+               void __iomem *addr, const struct dpu_mdss_version *mdss_rev);
 
 /**
  * dpu_hw_pingpong_destroy - destroys pingpong driver context
index f9215643c71ae943ad9c900218ba9aa93d9f7c9d..f3aff605554deb0d75d1b07d5c5ea7f07ab2de55 100644 (file)
@@ -146,7 +146,7 @@ int dpu_rm_init(struct dpu_rm *rm,
                struct dpu_hw_pingpong *hw;
                const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
 
-               hw = dpu_hw_pingpong_init(pp, mmio);
+               hw = dpu_hw_pingpong_init(pp, mmio, cat->mdss_ver);
                if (IS_ERR(hw)) {
                        rc = PTR_ERR(hw);
                        DPU_ERROR("failed pingpong object creation: err %d\n",