Message ID | 1545086105-7770-2-git-send-email-jsanka@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4,1/3] drm/msm/dpu: fix documentation for intf_type | expand |
On Mon, Dec 17, 2018 at 02:35:04PM -0800, Jeykumar Sankaran wrote: > Bail out KMS hw init on display initialization failures with > proper error logging. > > changes in v3: > - introduced in the series > changes in v4: > - avoid duplicate return on errors (Sean Paul) > - avoid spamming errors on failures (Jordon Crouse) > > Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org> Pushed this one too, so just the 3/3 patch should go with Chandan's series Sean > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 31 ++++++++++++++++++------------- > 1 file changed, 18 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index d39b745..885bf88 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -405,35 +405,38 @@ static void dpu_kms_wait_for_commit_done(struct msm_kms *kms, > } > } > > -static void _dpu_kms_initialize_dsi(struct drm_device *dev, > +static int _dpu_kms_initialize_dsi(struct drm_device *dev, > struct msm_drm_private *priv, > struct dpu_kms *dpu_kms) > { > struct drm_encoder *encoder = NULL; > - int i, rc; > + int i, rc = 0; > + > + if (!(priv->dsi[0] || priv->dsi[1])) > + return rc; > > /*TODO: Support two independent DSI connectors */ > encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI); > - if (IS_ERR_OR_NULL(encoder)) { > + if (IS_ERR(encoder)) { > DPU_ERROR("encoder init failed for dsi display\n"); > - return; > + return PTR_ERR(encoder); > } > > priv->encoders[priv->num_encoders++] = encoder; > > for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) { > - if (!priv->dsi[i]) { > - DPU_DEBUG("invalid msm_dsi for ctrl %d\n", i); > - return; > - } > + if (!priv->dsi[i]) > + continue; > > rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder); > if (rc) { > DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", > i, rc); > - continue; > + break; > } > } > + > + return rc; > } > > /** > @@ -444,16 +447,16 @@ static void _dpu_kms_initialize_dsi(struct drm_device *dev, > * @dpu_kms: Pointer to dpu kms structure > * Returns: Zero on success > */ > -static void _dpu_kms_setup_displays(struct drm_device *dev, > +static int _dpu_kms_setup_displays(struct drm_device *dev, > struct msm_drm_private *priv, > struct dpu_kms *dpu_kms) > { > - _dpu_kms_initialize_dsi(dev, priv, dpu_kms); > - > /** > * Extend this function to initialize other > * types of displays > */ > + > + return _dpu_kms_initialize_dsi(dev, priv, dpu_kms); > } > > static void _dpu_kms_drm_obj_destroy(struct dpu_kms *dpu_kms) > @@ -516,7 +519,9 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms) > * Create encoder and query display drivers to create > * bridges and connectors > */ > - _dpu_kms_setup_displays(dev, priv, dpu_kms); > + ret = _dpu_kms_setup_displays(dev, priv, dpu_kms); > + if (ret) > + goto fail; > > max_crtc_count = min(catalog->mixer_count, priv->num_encoders); > > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index d39b745..885bf88 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -405,35 +405,38 @@ static void dpu_kms_wait_for_commit_done(struct msm_kms *kms, } } -static void _dpu_kms_initialize_dsi(struct drm_device *dev, +static int _dpu_kms_initialize_dsi(struct drm_device *dev, struct msm_drm_private *priv, struct dpu_kms *dpu_kms) { struct drm_encoder *encoder = NULL; - int i, rc; + int i, rc = 0; + + if (!(priv->dsi[0] || priv->dsi[1])) + return rc; /*TODO: Support two independent DSI connectors */ encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI); - if (IS_ERR_OR_NULL(encoder)) { + if (IS_ERR(encoder)) { DPU_ERROR("encoder init failed for dsi display\n"); - return; + return PTR_ERR(encoder); } priv->encoders[priv->num_encoders++] = encoder; for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) { - if (!priv->dsi[i]) { - DPU_DEBUG("invalid msm_dsi for ctrl %d\n", i); - return; - } + if (!priv->dsi[i]) + continue; rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder); if (rc) { DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", i, rc); - continue; + break; } } + + return rc; } /** @@ -444,16 +447,16 @@ static void _dpu_kms_initialize_dsi(struct drm_device *dev, * @dpu_kms: Pointer to dpu kms structure * Returns: Zero on success */ -static void _dpu_kms_setup_displays(struct drm_device *dev, +static int _dpu_kms_setup_displays(struct drm_device *dev, struct msm_drm_private *priv, struct dpu_kms *dpu_kms) { - _dpu_kms_initialize_dsi(dev, priv, dpu_kms); - /** * Extend this function to initialize other * types of displays */ + + return _dpu_kms_initialize_dsi(dev, priv, dpu_kms); } static void _dpu_kms_drm_obj_destroy(struct dpu_kms *dpu_kms) @@ -516,7 +519,9 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms) * Create encoder and query display drivers to create * bridges and connectors */ - _dpu_kms_setup_displays(dev, priv, dpu_kms); + ret = _dpu_kms_setup_displays(dev, priv, dpu_kms); + if (ret) + goto fail; max_crtc_count = min(catalog->mixer_count, priv->num_encoders);
Bail out KMS hw init on display initialization failures with proper error logging. changes in v3: - introduced in the series changes in v4: - avoid duplicate return on errors (Sean Paul) - avoid spamming errors on failures (Jordon Crouse) Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org> --- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-)