Message ID | 20230415171926.85774-3-dmitry.baryshkov@linaro.org |
---|---|
State | Accepted |
Commit | e6f756af381f80c064d1f94077b150f8d95b3dab |
Headers | show |
Series | drm/msm/dpu: enable INTF_HDMI support | expand |
On Apr 15 20:19, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: >MSM8998 and the older Qualcomm platforms support HDMI outputs. Now as >DPU encoder is ready, add support for using INTF_HDMI. > >Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >--- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 45 +++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > >diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >index e85e3721d2c7..65cce59163a4 100644 >--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c >@@ -617,6 +617,45 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev, > return 0; > } > >+static int _dpu_kms_initialize_hdmi(struct drm_device *dev, >+ struct msm_drm_private *priv, >+ struct dpu_kms *dpu_kms) >+{ >+ struct drm_encoder *encoder = NULL; >+ struct msm_display_info info; >+ int rc; >+ int i; >+ >+ if (!priv->hdmi) >+ return 0; >+ >+ encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS); >+ if (IS_ERR(encoder)) { >+ DPU_ERROR("encoder init failed for HDMI display\n"); >+ return PTR_ERR(encoder); >+ } >+ >+ memset(&info, 0, sizeof(info)); Move this where fields are initialized ? >+ rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); >+ if (rc) { >+ DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc); >+ drm_encoder_cleanup(encoder); >+ return rc; >+ } >+ >+ info.num_of_h_tiles = 1; >+ info.h_tile_instance[0] = i; i is uninitialized here, the line can be removed. With the above changes: Reviewed-by: Arnaud Vrac <rawoul@gmail.com> Tested-by: Arnaud Vrac <rawoul@gmail.com> # on msm8998 -Arnaud >+ info.intf_type = INTF_HDMI; >+ rc = dpu_encoder_setup(dev, encoder, &info); >+ if (rc) { >+ DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n", >+ encoder->base.id, rc); >+ return rc; >+ } >+ >+ return 0; >+} >+ > static int _dpu_kms_initialize_writeback(struct drm_device *dev, > struct msm_drm_private *priv, struct dpu_kms *dpu_kms, > const u32 *wb_formats, int n_formats) >@@ -683,6 +722,12 @@ static int _dpu_kms_setup_displays(struct drm_device *dev, > return rc; > } > >+ rc = _dpu_kms_initialize_hdmi(dev, priv, dpu_kms); >+ if (rc) { >+ DPU_ERROR("initialize HDMI failed, rc = %d\n", rc); >+ return rc; >+ } >+ > /* Since WB isn't a driver check the catalog before initializing */ > if (dpu_kms->catalog->wb_count) { > for (i = 0; i < dpu_kms->catalog->wb_count; i++) { >-- >2.30.2 >
On 4/15/2023 10:19 AM, Dmitry Baryshkov wrote: > MSM8998 and the older Qualcomm platforms support HDMI outputs. Now as > DPU encoder is ready, add support for using INTF_HDMI. > From what I see, encoder was always ready but just HDMI case was not handled? Or are you saying this because of the prev patch which sorts out encoder_type and intf_type > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 45 +++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index e85e3721d2c7..65cce59163a4 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -617,6 +617,45 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev, > return 0; > } > > +static int _dpu_kms_initialize_hdmi(struct drm_device *dev, > + struct msm_drm_private *priv, > + struct dpu_kms *dpu_kms) > +{ > + struct drm_encoder *encoder = NULL; > + struct msm_display_info info; > + int rc; > + int i; > + > + if (!priv->hdmi) > + return 0; > + > + encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS); > + if (IS_ERR(encoder)) { > + DPU_ERROR("encoder init failed for HDMI display\n"); > + return PTR_ERR(encoder); > + } > + > + memset(&info, 0, sizeof(info)); > + rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); > + if (rc) { > + DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc); > + drm_encoder_cleanup(encoder); > + return rc; > + } > + > + info.num_of_h_tiles = 1; > + info.h_tile_instance[0] = i; As Arnaud noted, i is uninitialized here. > + info.intf_type = INTF_HDMI; > + rc = dpu_encoder_setup(dev, encoder, &info); > + if (rc) { > + DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n", > + encoder->base.id, rc); > + return rc; > + } > + > + return 0; > +} > + > static int _dpu_kms_initialize_writeback(struct drm_device *dev, > struct msm_drm_private *priv, struct dpu_kms *dpu_kms, > const u32 *wb_formats, int n_formats) > @@ -683,6 +722,12 @@ static int _dpu_kms_setup_displays(struct drm_device *dev, > return rc; > } > > + rc = _dpu_kms_initialize_hdmi(dev, priv, dpu_kms); > + if (rc) { > + DPU_ERROR("initialize HDMI failed, rc = %d\n", rc); > + return rc; > + } > + > /* Since WB isn't a driver check the catalog before initializing */ > if (dpu_kms->catalog->wb_count) { > for (i = 0; i < dpu_kms->catalog->wb_count; i++) {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index e85e3721d2c7..65cce59163a4 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -617,6 +617,45 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev, return 0; } +static int _dpu_kms_initialize_hdmi(struct drm_device *dev, + struct msm_drm_private *priv, + struct dpu_kms *dpu_kms) +{ + struct drm_encoder *encoder = NULL; + struct msm_display_info info; + int rc; + int i; + + if (!priv->hdmi) + return 0; + + encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS); + if (IS_ERR(encoder)) { + DPU_ERROR("encoder init failed for HDMI display\n"); + return PTR_ERR(encoder); + } + + memset(&info, 0, sizeof(info)); + rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); + if (rc) { + DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc); + drm_encoder_cleanup(encoder); + return rc; + } + + info.num_of_h_tiles = 1; + info.h_tile_instance[0] = i; + info.intf_type = INTF_HDMI; + rc = dpu_encoder_setup(dev, encoder, &info); + if (rc) { + DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n", + encoder->base.id, rc); + return rc; + } + + return 0; +} + static int _dpu_kms_initialize_writeback(struct drm_device *dev, struct msm_drm_private *priv, struct dpu_kms *dpu_kms, const u32 *wb_formats, int n_formats) @@ -683,6 +722,12 @@ static int _dpu_kms_setup_displays(struct drm_device *dev, return rc; } + rc = _dpu_kms_initialize_hdmi(dev, priv, dpu_kms); + if (rc) { + DPU_ERROR("initialize HDMI failed, rc = %d\n", rc); + return rc; + } + /* Since WB isn't a driver check the catalog before initializing */ if (dpu_kms->catalog->wb_count) { for (i = 0; i < dpu_kms->catalog->wb_count; i++) {
MSM8998 and the older Qualcomm platforms support HDMI outputs. Now as DPU encoder is ready, add support for using INTF_HDMI. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> --- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+)