Message ID | 20211001180058.1021913-3-bjorn.andersson@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/msm/dp: Support multiple DP instances and add sc8180x | expand |
On 2021-10-01 11:00, Bjorn Andersson wrote: > Functions in the DisplayPort code that relates to individual instances > (encoders) are passed both the struct msm_dp and the struct > drm_encoder. But > in a situation where multiple DP instances would exist this means that > the caller need to resolve which struct msm_dp relates to the struct > drm_encoder at hand. > > Store a reference to the struct msm_dp associated with each > dpu_encoder_virt to allow the particular instance to be associate with > the encoder in the following patch. > > Reviewed-by: Stephen Boyd <swboyd@chromium.org> > Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org> > --- > > Changes since v2: > - None > > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 23 ++++++++++++--------- > 1 file changed, 13 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > index 0e9d3fa1544b..b7f33da2799c 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > @@ -168,6 +168,7 @@ enum dpu_enc_rc_states { > * @vsync_event_work: worker to handle vsync event for autorefresh > * @topology: topology of the display > * @idle_timeout: idle timeout duration in milliseconds > + * @dp: msm_dp pointer, for DP encoders > */ > struct dpu_encoder_virt { > struct drm_encoder base; > @@ -206,6 +207,8 @@ struct dpu_encoder_virt { > struct msm_display_topology topology; > > u32 idle_timeout; > + > + struct msm_dp *dp; > }; > > #define to_dpu_encoder_virt(x) container_of(x, struct > dpu_encoder_virt, base) > @@ -1000,8 +1003,8 @@ static void dpu_encoder_virt_mode_set(struct > drm_encoder *drm_enc, > > trace_dpu_enc_mode_set(DRMID(drm_enc)); > > - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) > - msm_dp_display_mode_set(priv->dp, drm_enc, mode, adj_mode); > + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) > + msm_dp_display_mode_set(dpu_enc->dp, drm_enc, mode, adj_mode); > > list_for_each_entry(conn_iter, connector_list, head) > if (conn_iter->encoder == drm_enc) > @@ -1182,9 +1185,8 @@ static void dpu_encoder_virt_enable(struct > drm_encoder *drm_enc) > > _dpu_encoder_virt_enable_helper(drm_enc); > > - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { > - ret = msm_dp_display_enable(priv->dp, > - drm_enc); > + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { > + ret = msm_dp_display_enable(dpu_enc->dp, drm_enc); > if (ret) { > DPU_ERROR_ENC(dpu_enc, "dp display enable failed: %d\n", > ret); > @@ -1224,8 +1226,8 @@ static void dpu_encoder_virt_disable(struct > drm_encoder *drm_enc) > /* wait for idle */ > dpu_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE); > > - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { > - if (msm_dp_display_pre_disable(priv->dp, drm_enc)) > + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { > + if (msm_dp_display_pre_disable(dpu_enc->dp, drm_enc)) > DPU_ERROR_ENC(dpu_enc, "dp display push idle failed\n"); > } > > @@ -1253,8 +1255,8 @@ static void dpu_encoder_virt_disable(struct > drm_encoder *drm_enc) > > DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n"); > > - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { > - if (msm_dp_display_disable(priv->dp, drm_enc)) > + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { > + if (msm_dp_display_disable(dpu_enc->dp, drm_enc)) > DPU_ERROR_ENC(dpu_enc, "dp display disable failed\n"); > } > > @@ -2170,7 +2172,8 @@ int dpu_encoder_setup(struct drm_device *dev, > struct drm_encoder *enc, > timer_setup(&dpu_enc->vsync_event_timer, > dpu_encoder_vsync_event_handler, > 0); > - > + else if (disp_info->intf_type == DRM_MODE_ENCODER_TMDS) > + dpu_enc->dp = priv->dp; > > INIT_DELAYED_WORK(&dpu_enc->delayed_off_work, > dpu_encoder_off_work);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c index 0e9d3fa1544b..b7f33da2799c 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c @@ -168,6 +168,7 @@ enum dpu_enc_rc_states { * @vsync_event_work: worker to handle vsync event for autorefresh * @topology: topology of the display * @idle_timeout: idle timeout duration in milliseconds + * @dp: msm_dp pointer, for DP encoders */ struct dpu_encoder_virt { struct drm_encoder base; @@ -206,6 +207,8 @@ struct dpu_encoder_virt { struct msm_display_topology topology; u32 idle_timeout; + + struct msm_dp *dp; }; #define to_dpu_encoder_virt(x) container_of(x, struct dpu_encoder_virt, base) @@ -1000,8 +1003,8 @@ static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc, trace_dpu_enc_mode_set(DRMID(drm_enc)); - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) - msm_dp_display_mode_set(priv->dp, drm_enc, mode, adj_mode); + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) + msm_dp_display_mode_set(dpu_enc->dp, drm_enc, mode, adj_mode); list_for_each_entry(conn_iter, connector_list, head) if (conn_iter->encoder == drm_enc) @@ -1182,9 +1185,8 @@ static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc) _dpu_encoder_virt_enable_helper(drm_enc); - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { - ret = msm_dp_display_enable(priv->dp, - drm_enc); + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { + ret = msm_dp_display_enable(dpu_enc->dp, drm_enc); if (ret) { DPU_ERROR_ENC(dpu_enc, "dp display enable failed: %d\n", ret); @@ -1224,8 +1226,8 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) /* wait for idle */ dpu_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE); - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { - if (msm_dp_display_pre_disable(priv->dp, drm_enc)) + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { + if (msm_dp_display_pre_disable(dpu_enc->dp, drm_enc)) DPU_ERROR_ENC(dpu_enc, "dp display push idle failed\n"); } @@ -1253,8 +1255,8 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n"); - if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) { - if (msm_dp_display_disable(priv->dp, drm_enc)) + if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) { + if (msm_dp_display_disable(dpu_enc->dp, drm_enc)) DPU_ERROR_ENC(dpu_enc, "dp display disable failed\n"); } @@ -2170,7 +2172,8 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, timer_setup(&dpu_enc->vsync_event_timer, dpu_encoder_vsync_event_handler, 0); - + else if (disp_info->intf_type == DRM_MODE_ENCODER_TMDS) + dpu_enc->dp = priv->dp; INIT_DELAYED_WORK(&dpu_enc->delayed_off_work, dpu_encoder_off_work);