blob: 0a73c131e441e092f90693e6bacd8adecee7b853 [file] [log] [blame]
From 010cb0f70f607541084b1c1b8c1e83966b2ce8a1 Mon Sep 17 00:00:00 2001
From: Rob Clark <robdclark@chromium.org>
Date: Fri, 23 Oct 2020 14:00:57 -0700
Subject: [PATCH] CHROMIUM: HACK: drm/msm/dpu: Give each CRTC a dedicated
cursor and primary (except for coachz)
Most of the issues that caused us to pin the planes to a single CRTC are
fixed, except for b/168868719. We are pushing to get hw overlays
enabled on coachz, so re-work the previous hack to let us re-enable hw-
overlays on a per-board basis to avoid disrupting shipping devices.
Once the remaining bug has been fixed, and we have some confidence that
there are no other bugs that we missed, we can revert this patch.
BUG=b:176990056, b:187095776
TEST=verify primary/cursor planes are pinned to one CRTC except for
coachz
Signed-off-by: Rob Clark <robdclark@chromium.org>
Change-Id: Ib76eef92d195c08d470b740365dc558efdc2fac5
Reviewed-on: https: //chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2773884
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Commit-Queue: Stephen Boyd <swboyd@chromium.org>
(cherry picked from commit 30aef5779b6108baaea00750064338bf0ed145c2)
Signed-off-by: Matt Turner <msturner@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3564538
---
.../boot/dts/qcom/sc7180-trogdor-coachz.dtsi | 4 ++++
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 23 +++++++++++++++----
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 2 +-
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi b/arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi
index 7ee407f7b6bb5fb52b9f8ba6a6e5052ffea549a6..78ba056beaccfbf8aaef097da7b6e7bbd5ed8e9e 100644
--- a/arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi
@@ -114,6 +114,10 @@ &i2c9 {
status = "disabled";
};
+&mdp {
+ chromium-enable-overlays;
+};
+
&panel {
compatible = "boe,nv110wtm-n61";
};
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 5e6e2626151e8d174f8ce78facb7cc0e2e0a2361..ea07ae88d4c9dc560082f1974e3693165826e93f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -738,6 +738,9 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
struct drm_crtc *crtc;
struct drm_encoder *encoder;
unsigned int num_encoders;
+ unsigned cursor_idx = 0;
+ unsigned primary_idx = 0;
+ bool pin_overlays;
struct msm_drm_private *priv;
const struct dpu_mdss_cfg *catalog;
@@ -748,6 +751,8 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
priv = dev->dev_private;
catalog = dpu_kms->catalog;
+ pin_overlays = !of_property_read_bool(dpu_kms->pdev->dev.of_node, "chromium-enable-overlays");
+
/*
* Create encoder and query display drivers to create
* bridges and connectors
@@ -765,21 +770,31 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
/* Create the planes, keeping track of one primary/cursor per crtc */
for (i = 0; i < catalog->sspp_count; i++) {
enum drm_plane_type type;
+ unsigned possible_crtcs;
if ((catalog->sspp[i].features & BIT(DPU_SSPP_CURSOR))
- && cursor_planes_idx < max_crtc_count)
+ && cursor_planes_idx < max_crtc_count) {
type = DRM_PLANE_TYPE_CURSOR;
- else if (primary_planes_idx < max_crtc_count)
+ possible_crtcs = BIT(cursor_idx);
+ cursor_idx++;
+ } else if (primary_planes_idx < max_crtc_count) {
type = DRM_PLANE_TYPE_PRIMARY;
- else
+ possible_crtcs = BIT(primary_idx);
+ primary_idx++;
+ } else {
type = DRM_PLANE_TYPE_OVERLAY;
+ possible_crtcs = (1UL << max_crtc_count) - 1;
+ }
DPU_DEBUG("Create plane type %d with features %lx (cur %lx)\n",
type, catalog->sspp[i].features,
catalog->sspp[i].features & BIT(DPU_SSPP_CURSOR));
+ if (!pin_overlays)
+ possible_crtcs = (1UL << max_crtc_count) - 1;
+
plane = dpu_plane_init(dev, catalog->sspp[i].id, type,
- (1UL << max_crtc_count) - 1);
+ possible_crtcs, 0);
if (IS_ERR(plane)) {
DPU_ERROR("dpu_plane_init failed\n");
ret = PTR_ERR(plane);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 658005f609f4b3d1e373dd8d3dbaf888ad80e122..76b2e88afe4421a5cf640966f0a10ab1fc876f57 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1496,7 +1496,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
format_list = pdpu->pipe_hw->cap->sblk->format_list;
num_formats = pdpu->pipe_hw->cap->sblk->num_formats;
- ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,
+ ret = drm_universal_plane_init(dev, plane, possible_crtcs, &dpu_plane_funcs,
format_list, num_formats,
supported_format_modifiers, type, NULL);
if (ret)
--
2.38.1.584.g0f3c55d4c2-goog