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. Signed-off-by: James (Qian) Wang <james.qian.wang@xxxxxxx> --- .../drm/arm/display/komeda/komeda_pipeline.h | 3 + .../display/komeda/komeda_pipeline_state.c | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h index c78edfc6ed5b..bc4ed1513348 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h @@ -408,11 +408,14 @@ 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_component_output *dflow, struct komeda_plane_state *kplane_st, struct komeda_crtc_state *kcrtc_st, struct komeda_layer_viewport *vp); +int komeda_build_display_data_flow(struct komeda_crtc *kcrtc, + struct komeda_crtc_state *kcrtc_st); #endif /* _KOMEDA_PIPELINE_H_*/ 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 b98163211cfd..05386e9d1749 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c @@ -380,6 +380,51 @@ int komeda_compiz_validate(struct komeda_compiz *compiz, return 0; } +int komeda_improc_validate(struct komeda_improc *improc, + struct komeda_component_output *input, + struct komeda_component_output *slave_in, + struct komeda_crtc_state *kcrtc_st) +{ + 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); + + pipeline_composition_size(kcrtc_st, &st->hsize, &st->vsize); + + komeda_component_add_input(&st->base, input, 0); + komeda_component_set_output(input, &improc->base, 0); + + return 0; +} + +int komeda_timing_ctrlr_validate(struct komeda_timing_ctrlr *ctrlr, + struct komeda_component_output *input, + struct komeda_crtc_state *kcrtc_st) +{ + 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, input, 0); + komeda_component_set_output(input, &ctrlr->base, 0); + + return 0; +} + int komeda_build_layer_data_flow(struct komeda_layer *layer, struct komeda_component_output *dflow, struct komeda_plane_state *kplane_st, @@ -406,3 +451,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_component_output m_dflow; /* master data flow */ + int err; + + memset(&m_dflow, 0, sizeof(m_dflow)); + + err = komeda_compiz_validate(master->compiz, &m_dflow, kcrtc_st, NULL); + if (err) + return err; + + err = komeda_improc_validate(master->improc, &m_dflow, NULL, kcrtc_st); + if (err) + return err; + + err = komeda_timing_ctrlr_validate(master->ctrlr, &m_dflow, kcrtc_st); + if (err) + return err; + + return 0; +} -- 2.17.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel