drm/komeda: Add komeda_build_display_data_flow
authorjames qian wang (Arm Technology China) <james.qian.wang@arm.com>
Tue, 22 Jan 2019 11:10:30 +0000 (11:10 +0000)
committerLiviu Dudau <Liviu.Dudau@arm.com>
Mon, 29 Apr 2019 11:35:56 +0000 (12:35 +0100)
This function builds a display output pipeline according to crtc_state.
And this change only added single pipeline support, the dual pipeline with
slave enabled data flow support will be added in the following change.

v2: Rebase

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c

index 16d7ae891e81b074a3637cb4587f9af565ebcdf6..22ad4dfc3e8d5299979f46fbb82ca66849e47e74 100644 (file)
@@ -400,10 +400,13 @@ void komeda_component_destroy(struct komeda_dev *mdev,
 
 struct komeda_plane_state;
 struct komeda_crtc_state;
+struct komeda_crtc;
 
 int komeda_build_layer_data_flow(struct komeda_layer *layer,
                                 struct komeda_plane_state *kplane_st,
                                 struct komeda_crtc_state *kcrtc_st,
                                 struct komeda_data_flow_cfg *dflow);
+int komeda_build_display_data_flow(struct komeda_crtc *kcrtc,
+                                  struct komeda_crtc_state *kcrtc_st);
 
 #endif /* _KOMEDA_PIPELINE_H_*/
index 9470c8b6468f1d9c1deda29b6f5cdd16f045c8d5..8d25ce17e5178abecd0fbd4833cae1287f9cd2aa 100644 (file)
@@ -346,7 +346,7 @@ komeda_compiz_set_input(struct komeda_compiz *compiz,
        return 0;
 }
 
-int
+static int
 komeda_compiz_validate(struct komeda_compiz *compiz,
                       struct komeda_crtc_state *state,
                       struct komeda_data_flow_cfg *dflow)
@@ -384,6 +384,53 @@ komeda_compiz_validate(struct komeda_compiz *compiz,
        return 0;
 }
 
+static int
+komeda_improc_validate(struct komeda_improc *improc,
+                      struct komeda_crtc_state *kcrtc_st,
+                      struct komeda_data_flow_cfg *dflow)
+{
+       struct drm_crtc *crtc = kcrtc_st->base.crtc;
+       struct komeda_component_state *c_st;
+       struct komeda_improc_state *st;
+
+       c_st = komeda_component_get_state_and_set_user(&improc->base,
+                       kcrtc_st->base.state, crtc, crtc);
+       if (IS_ERR(c_st))
+               return PTR_ERR(c_st);
+
+       st = to_improc_st(c_st);
+
+       st->hsize = dflow->in_w;
+       st->vsize = dflow->in_h;
+
+       komeda_component_add_input(&st->base, &dflow->input, 0);
+       komeda_component_set_output(&dflow->input, &improc->base, 0);
+
+       return 0;
+}
+
+static int
+komeda_timing_ctrlr_validate(struct komeda_timing_ctrlr *ctrlr,
+                            struct komeda_crtc_state *kcrtc_st,
+                            struct komeda_data_flow_cfg *dflow)
+{
+       struct drm_crtc *crtc = kcrtc_st->base.crtc;
+       struct komeda_timing_ctrlr_state *st;
+       struct komeda_component_state *c_st;
+
+       c_st = komeda_component_get_state_and_set_user(&ctrlr->base,
+                       kcrtc_st->base.state, crtc, crtc);
+       if (IS_ERR(c_st))
+               return PTR_ERR(c_st);
+
+       st = to_ctrlr_st(c_st);
+
+       komeda_component_add_input(&st->base, &dflow->input, 0);
+       komeda_component_set_output(&dflow->input, &ctrlr->base, 0);
+
+       return 0;
+}
+
 int komeda_build_layer_data_flow(struct komeda_layer *layer,
                                 struct komeda_plane_state *kplane_st,
                                 struct komeda_crtc_state *kcrtc_st,
@@ -406,3 +453,30 @@ int komeda_build_layer_data_flow(struct komeda_layer *layer,
 
        return err;
 }
+
+/* build display output data flow, the data path is:
+ * compiz -> improc -> timing_ctrlr
+ */
+int komeda_build_display_data_flow(struct komeda_crtc *kcrtc,
+                                  struct komeda_crtc_state *kcrtc_st)
+{
+       struct komeda_pipeline *master = kcrtc->master;
+       struct komeda_data_flow_cfg m_dflow; /* master data flow */
+       int err;
+
+       memset(&m_dflow, 0, sizeof(m_dflow));
+
+       err = komeda_compiz_validate(master->compiz, kcrtc_st, &m_dflow);
+       if (err)
+               return err;
+
+       err = komeda_improc_validate(master->improc, kcrtc_st, &m_dflow);
+       if (err)
+               return err;
+
+       err = komeda_timing_ctrlr_validate(master->ctrlr, kcrtc_st, &m_dflow);
+       if (err)
+               return err;
+
+       return 0;
+}