mirror of https://github.com/armbian/build.git
103 lines
3.7 KiB
Diff
103 lines
3.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
|
Date: Sun, 14 Mar 2021 04:58:32 +0300
|
|
Subject: drm/msm/dpu1: use one active CTL if it is available
|
|
|
|
Unlike previous generation, with newer ("active") CTLs it is possible to
|
|
use just one CTL to handle both interfaces. And one has to use single
|
|
CTL to support master/slave DSI config. So use one active CTL if it is
|
|
available.
|
|
|
|
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
|
---
|
|
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 6 +++-
|
|
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 1 +
|
|
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 14 +++++++---
|
|
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 1 +
|
|
4 files changed, 17 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
|
|
@@ -1198,7 +1198,11 @@ static void dpu_encoder_virt_atomic_mode_set(struct drm_encoder *drm_enc,
|
|
return;
|
|
}
|
|
|
|
- phys->hw_ctl = i < num_ctl ? to_dpu_hw_ctl(hw_ctl[i]) : NULL;
|
|
+ /* Use first (and only) CTL if active CTLs are supported */
|
|
+ if (dpu_kms->catalog->caps->has_active_ctls)
|
|
+ phys->hw_ctl = to_dpu_hw_ctl(hw_ctl[0]);
|
|
+ else
|
|
+ phys->hw_ctl = i < num_ctl ? to_dpu_hw_ctl(hw_ctl[i]) : NULL;
|
|
if (!phys->hw_ctl) {
|
|
DPU_ERROR_ENC(dpu_enc,
|
|
"no ctl block assigned at idx: %d\n", i);
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
|
|
@@ -354,6 +354,7 @@ struct dpu_caps {
|
|
bool has_dim_layer;
|
|
bool has_idle_pc;
|
|
bool has_3d_merge;
|
|
+ bool has_active_ctls;
|
|
/* SSPP limits */
|
|
u32 max_linewidth;
|
|
u32 pixel_ram_size;
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
|
|
@@ -132,6 +132,7 @@ int dpu_rm_init(struct drm_device *dev,
|
|
}
|
|
rm->ctl_blks[ctl->id - CTL_0] = &hw->base;
|
|
}
|
|
+ rm->has_active_ctls = cat->caps->has_active_ctls;
|
|
|
|
for (i = 0; i < cat->dspp_count; i++) {
|
|
struct dpu_hw_dspp *hw;
|
|
@@ -366,10 +367,15 @@ static int _dpu_rm_reserve_ctls(
|
|
int i = 0, j, num_ctls;
|
|
bool needs_split_display;
|
|
|
|
- /* each hw_intf needs its own hw_ctrl to program its control path */
|
|
- num_ctls = top->num_intf;
|
|
+ if (rm->has_active_ctls) {
|
|
+ num_ctls = 1;
|
|
+ needs_split_display = false;
|
|
+ } else {
|
|
+ /* each hw_intf needs its own hw_ctrl to program its control path */
|
|
+ num_ctls = top->num_intf;
|
|
|
|
- needs_split_display = _dpu_rm_needs_split_display(top);
|
|
+ needs_split_display = _dpu_rm_needs_split_display(top);
|
|
+ }
|
|
|
|
for (j = 0; j < ARRAY_SIZE(rm->ctl_blks); j++) {
|
|
const struct dpu_hw_ctl *ctl;
|
|
@@ -387,7 +393,7 @@ static int _dpu_rm_reserve_ctls(
|
|
|
|
DPU_DEBUG("ctl %d caps 0x%lX\n", j + CTL_0, features);
|
|
|
|
- if (needs_split_display != has_split_display)
|
|
+ if (!rm->has_active_ctls && needs_split_display != has_split_display)
|
|
continue;
|
|
|
|
ctl_idx[i] = j;
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
|
|
@@ -35,6 +35,7 @@ struct dpu_rm {
|
|
struct dpu_hw_blk *dsc_blks[DSC_MAX - DSC_0];
|
|
struct dpu_hw_sspp *hw_sspp[SSPP_MAX - SSPP_NONE];
|
|
struct dpu_hw_blk *cdm_blk;
|
|
+ bool has_active_ctls;
|
|
};
|
|
|
|
/**
|
|
--
|
|
Armbian
|
|
|