diff options
| author | Jeykumar Sankaran <jsanka@codeaurora.org> | 2018-12-17 17:35:04 -0500 |
|---|---|---|
| committer | Sean Paul <seanpaul@chromium.org> | 2019-02-01 10:35:55 -0500 |
| commit | a802ee99c448ca0496fa307f3e46b834ae2a46a3 (patch) | |
| tree | 748cd9c66469bb8a5ec5f1e1b8ae75e486c398bf /drivers/gpu/drm/msm | |
| parent | 9b9c8e7e829a7144b664f6dcbc26dc9af3818bfe (diff) | |
drm/msm/dpu: handle failures while initializing displays
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>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Diffstat (limited to 'drivers/gpu/drm/msm')
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 31 |
1 files 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 d39b745c3d27..885bf88afa3e 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, | |||
| 405 | } | 405 | } |
| 406 | } | 406 | } |
| 407 | 407 | ||
| 408 | static void _dpu_kms_initialize_dsi(struct drm_device *dev, | 408 | static int _dpu_kms_initialize_dsi(struct drm_device *dev, |
| 409 | struct msm_drm_private *priv, | 409 | struct msm_drm_private *priv, |
| 410 | struct dpu_kms *dpu_kms) | 410 | struct dpu_kms *dpu_kms) |
| 411 | { | 411 | { |
| 412 | struct drm_encoder *encoder = NULL; | 412 | struct drm_encoder *encoder = NULL; |
| 413 | int i, rc; | 413 | int i, rc = 0; |
| 414 | |||
| 415 | if (!(priv->dsi[0] || priv->dsi[1])) | ||
| 416 | return rc; | ||
| 414 | 417 | ||
| 415 | /*TODO: Support two independent DSI connectors */ | 418 | /*TODO: Support two independent DSI connectors */ |
| 416 | encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI); | 419 | encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI); |
| 417 | if (IS_ERR_OR_NULL(encoder)) { | 420 | if (IS_ERR(encoder)) { |
| 418 | DPU_ERROR("encoder init failed for dsi display\n"); | 421 | DPU_ERROR("encoder init failed for dsi display\n"); |
| 419 | return; | 422 | return PTR_ERR(encoder); |
| 420 | } | 423 | } |
| 421 | 424 | ||
| 422 | priv->encoders[priv->num_encoders++] = encoder; | 425 | priv->encoders[priv->num_encoders++] = encoder; |
| 423 | 426 | ||
| 424 | for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) { | 427 | for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) { |
| 425 | if (!priv->dsi[i]) { | 428 | if (!priv->dsi[i]) |
| 426 | DPU_DEBUG("invalid msm_dsi for ctrl %d\n", i); | 429 | continue; |
| 427 | return; | ||
| 428 | } | ||
| 429 | 430 | ||
| 430 | rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder); | 431 | rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder); |
| 431 | if (rc) { | 432 | if (rc) { |
| 432 | DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", | 433 | DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", |
| 433 | i, rc); | 434 | i, rc); |
| 434 | continue; | 435 | break; |
| 435 | } | 436 | } |
| 436 | } | 437 | } |
| 438 | |||
| 439 | return rc; | ||
| 437 | } | 440 | } |
| 438 | 441 | ||
| 439 | /** | 442 | /** |
| @@ -444,16 +447,16 @@ static void _dpu_kms_initialize_dsi(struct drm_device *dev, | |||
| 444 | * @dpu_kms: Pointer to dpu kms structure | 447 | * @dpu_kms: Pointer to dpu kms structure |
| 445 | * Returns: Zero on success | 448 | * Returns: Zero on success |
| 446 | */ | 449 | */ |
| 447 | static void _dpu_kms_setup_displays(struct drm_device *dev, | 450 | static int _dpu_kms_setup_displays(struct drm_device *dev, |
| 448 | struct msm_drm_private *priv, | 451 | struct msm_drm_private *priv, |
| 449 | struct dpu_kms *dpu_kms) | 452 | struct dpu_kms *dpu_kms) |
| 450 | { | 453 | { |
| 451 | _dpu_kms_initialize_dsi(dev, priv, dpu_kms); | ||
| 452 | |||
| 453 | /** | 454 | /** |
| 454 | * Extend this function to initialize other | 455 | * Extend this function to initialize other |
| 455 | * types of displays | 456 | * types of displays |
| 456 | */ | 457 | */ |
| 458 | |||
| 459 | return _dpu_kms_initialize_dsi(dev, priv, dpu_kms); | ||
| 457 | } | 460 | } |
| 458 | 461 | ||
| 459 | static void _dpu_kms_drm_obj_destroy(struct dpu_kms *dpu_kms) | 462 | 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) | |||
| 516 | * Create encoder and query display drivers to create | 519 | * Create encoder and query display drivers to create |
| 517 | * bridges and connectors | 520 | * bridges and connectors |
| 518 | */ | 521 | */ |
| 519 | _dpu_kms_setup_displays(dev, priv, dpu_kms); | 522 | ret = _dpu_kms_setup_displays(dev, priv, dpu_kms); |
| 523 | if (ret) | ||
| 524 | goto fail; | ||
| 520 | 525 | ||
| 521 | max_crtc_count = min(catalog->mixer_count, priv->num_encoders); | 526 | max_crtc_count = min(catalog->mixer_count, priv->num_encoders); |
| 522 | 527 | ||
