lkml.org 
[lkml]   [2019]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 4/6] drm/komeda: Add side by side support for writeback
Date
In side by side mode, the master pipeline writeback the left frame and the
slave writeback the right part, the data flow as below:

slave.compiz -> slave.wb_layer -> fb (right-part)
master.compiz -> master.wb_layer -> fb (left-part)

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
---
.../drm/arm/display/komeda/komeda_pipeline.h | 4 ++
.../display/komeda/komeda_pipeline_state.c | 42 +++++++++++++++++++
.../arm/display/komeda/komeda_wb_connector.c | 6 ++-
3 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
index 3358bcea8f7d..9145af3355f4 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
@@ -554,6 +554,10 @@ int komeda_build_wb_split_data_flow(struct komeda_layer *wb_layer,
struct drm_connector_state *conn_st,
struct komeda_crtc_state *kcrtc_st,
struct komeda_data_flow_cfg *dflow);
+int komeda_build_wb_sbs_data_flow(struct komeda_crtc *kcrtc,
+ struct drm_connector_state *conn_st,
+ struct komeda_crtc_state *kcrtc_st,
+ struct komeda_data_flow_cfg *wb_dflow);

int komeda_build_display_data_flow(struct komeda_crtc *kcrtc,
struct komeda_crtc_state *kcrtc_st);
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
index 4e5c891fbbd4..9fcd3d7cabe5 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
@@ -1349,6 +1349,48 @@ int komeda_build_wb_split_data_flow(struct komeda_layer *wb_layer,
return komeda_wb_layer_validate(wb_layer, conn_st, dflow);
}

+/* writeback side by side split data path:
+ *
+ * slave.compiz -> slave.wb_layer - > fb (right-part)
+ * master.compiz -> master.wb_layer -> fb (left-part)
+ */
+int komeda_build_wb_sbs_data_flow(struct komeda_crtc *kcrtc,
+ struct drm_connector_state *conn_st,
+ struct komeda_crtc_state *kcrtc_st,
+ struct komeda_data_flow_cfg *wb_dflow)
+{
+ struct komeda_pipeline *master = kcrtc->master;
+ struct komeda_pipeline *slave = kcrtc->slave;
+ struct komeda_data_flow_cfg m_dflow, s_dflow;
+ int err;
+
+ if (wb_dflow->en_scaling || wb_dflow->en_img_enhancement) {
+ DRM_DEBUG_ATOMIC("sbs doesn't support WB_scaling\n");
+ return -EINVAL;
+ }
+
+ memcpy(&m_dflow, wb_dflow, sizeof(*wb_dflow));
+ memcpy(&s_dflow, wb_dflow, sizeof(*wb_dflow));
+
+ /* master writeout the left part */
+ m_dflow.in_w >>= 1;
+ m_dflow.out_w >>= 1;
+ m_dflow.input.component = &master->compiz->base;
+
+ /* slave writeout the right part */
+ s_dflow.in_w >>= 1;
+ s_dflow.out_w >>= 1;
+ s_dflow.in_x += m_dflow.in_w;
+ s_dflow.out_x += m_dflow.out_w;
+ s_dflow.input.component = &slave->compiz->base;
+
+ err = komeda_wb_layer_validate(master->wb_layer, conn_st, &m_dflow);
+ if (err)
+ return err;
+
+ return komeda_wb_layer_validate(slave->wb_layer, conn_st, &s_dflow);
+}
+
/* build display output data flow, the data path is:
* compiz -> improc -> timing_ctrlr
*/
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
index c1b0ad22422e..ea584b1e5bd2 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -45,6 +45,7 @@ komeda_wb_encoder_atomic_check(struct drm_encoder *encoder,
struct drm_crtc_state *crtc_st,
struct drm_connector_state *conn_st)
{
+ struct komeda_crtc *kcrtc = to_kcrtc(crtc_st->crtc);
struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc_st);
struct drm_writeback_job *writeback_job = conn_st->writeback_job;
struct komeda_layer *wb_layer;
@@ -73,7 +74,10 @@ komeda_wb_encoder_atomic_check(struct drm_encoder *encoder,
if (err)
return err;

- if (dflow.en_split)
+ if (kcrtc->side_by_side)
+ err = komeda_build_wb_sbs_data_flow(kcrtc,
+ conn_st, kcrtc_st, &dflow);
+ else if (dflow.en_split)
err = komeda_build_wb_split_data_flow(wb_layer,
conn_st, kcrtc_st, &dflow);
else
--
2.20.1
\
 
 \ /
  Last update: 2019-07-04 08:19    [W:0.083 / U:0.512 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site