Up until now, if not all display controller paths were valid, the driver would fail probing and refuse to bind components: while that was a good idea before, now that mediatek-drm gained much more flexibility, it is finally possible to gracefully handle this situation and register only the valid paths while leaving the invalid ones unregistered, without any crash.
Count how many output paths are found, and then count how many have failed probing: if there is at least one valid path, avoid erroring out, so that at least some outputs will just work. Of course, any path failing is not a clean situation and must be resolved: in this case, function mtk_crtc_create() still prints error messages so, even though some output works, that will not go unnoticed, as a quick check in kmsg will show the errors that made a certain path not to register. Signed-off-by: AngeloGioacchino Del Regno <[email protected]> --- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index f5c9fe1588d0..65a891815408 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -379,6 +379,8 @@ static int mtk_drm_kms_init(struct drm_device *drm) struct mtk_drm_private *priv_n; struct device *dma_dev = NULL; struct drm_crtc *crtc; + int num_failed = 0; + int num_paths = 0; int ret, i, j; if (drm_firmware_drivers_only()) @@ -445,15 +447,29 @@ static int mtk_drm_kms_init(struct drm_device *drm) if (!priv_n->data->output_paths[i].len) continue; + num_paths++; + + dev_vdbg(drm->dev, + "[CTRL%d-CRTC%d] Path Len:%d, Controller Order:%u\n", + j, i, priv_n->data->output_paths[i].len, + priv_n->data->output_paths[i].order); + ret = mtk_crtc_create(drm, i, j, priv_n->data->conn_routes, priv_n->data->num_conn_routes); + if (ret == 0) + break; - if (ret) - goto err_component_unbind; + num_failed++; } } + if (num_failed == num_paths) { + dev_err(drm->dev, "No valid Display Controller path! Going out.\n"); + ret = -ENODEV; + goto err_component_unbind; + } + /* IGT will check if the cursor size is configured */ drm->mode_config.cursor_width = 512; drm->mode_config.cursor_height = 512; -- 2.54.0
