lkml.org 
[lkml]   [2021]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH] drm/msm: Initialize MDSS irq domain at probe time
    From
    Date
    On 25/11/2021 18:09, AngeloGioacchino Del Regno wrote:
    > Since commit 8f59ee9a570c ("drm/msm/dsi: Adjust probe order"), the
    > DSI host gets initialized earlier, but this caused unability to probe
    > the entire stack of components because they all depend on interrupts
    > coming from the main `mdss` node (mdp5, or dpu1).
    >
    > To fix this issue, also anticipate probing mdp5 or dpu1 by initializing
    > them at msm_pdev_probe() time: this will make sure that we add the
    > required interrupt controller mapping before dsi and/or other components
    > try to initialize, finally satisfying the dependency.
    >
    > While at it, also change the allocation of msm_drm_private to use the
    > devm variant of kzalloc().
    >
    > Fixes: 8f59ee9a570c ("drm/msm/dsi: Adjust probe order")
    > Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>

    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

    > ---
    > drivers/gpu/drm/msm/msm_drv.c | 81 ++++++++++++++++-------------------
    > 1 file changed, 38 insertions(+), 43 deletions(-)
    >
    > diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
    > index 7936e8d498dd..790acf4993c0 100644
    > --- a/drivers/gpu/drm/msm/msm_drv.c
    > +++ b/drivers/gpu/drm/msm/msm_drv.c
    > @@ -512,45 +512,12 @@ static int msm_init_vram(struct drm_device *dev)
    > static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
    > {
    > struct platform_device *pdev = to_platform_device(dev);
    > - struct drm_device *ddev;
    > - struct msm_drm_private *priv;
    > - struct msm_kms *kms;
    > - struct msm_mdss *mdss;
    > + struct drm_device *ddev = platform_get_drvdata(pdev);
    > + struct msm_drm_private *priv = ddev->dev_private;
    > + struct msm_kms *kms = priv->kms;
    > + struct msm_mdss *mdss = priv->mdss;
    > int ret, i;
    >
    > - ddev = drm_dev_alloc(drv, dev);
    > - if (IS_ERR(ddev)) {
    > - DRM_DEV_ERROR(dev, "failed to allocate drm_device\n");
    > - return PTR_ERR(ddev);
    > - }
    > -
    > - platform_set_drvdata(pdev, ddev);
    > -
    > - priv = kzalloc(sizeof(*priv), GFP_KERNEL);
    > - if (!priv) {
    > - ret = -ENOMEM;
    > - goto err_put_drm_dev;
    > - }
    > -
    > - ddev->dev_private = priv;
    > - priv->dev = ddev;
    > -
    > - switch (get_mdp_ver(pdev)) {
    > - case KMS_MDP5:
    > - ret = mdp5_mdss_init(ddev);
    > - break;
    > - case KMS_DPU:
    > - ret = dpu_mdss_init(ddev);
    > - break;
    > - default:
    > - ret = 0;
    > - break;
    > - }
    > - if (ret)
    > - goto err_free_priv;
    > -
    > - mdss = priv->mdss;
    > -
    > priv->wq = alloc_ordered_workqueue("msm", 0);
    > priv->hangcheck_period = DRM_MSM_HANGCHECK_DEFAULT_PERIOD;
    >
    > @@ -685,11 +652,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
    > err_destroy_mdss:
    > if (mdss && mdss->funcs)
    > mdss->funcs->destroy(ddev);
    > -err_free_priv:
    > - kfree(priv);
    > -err_put_drm_dev:
    > - drm_dev_put(ddev);
    > - platform_set_drvdata(pdev, NULL);
    > return ret;
    > }
    >
    > @@ -1382,12 +1344,42 @@ static const struct component_master_ops msm_drm_ops = {
    > static int msm_pdev_probe(struct platform_device *pdev)
    > {
    > struct component_match *match = NULL;
    > + struct msm_drm_private *priv;
    > + struct drm_device *ddev;
    > int ret;
    >
    > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
    > + if (!priv)
    > + return -ENOMEM;
    > +
    > + ddev = drm_dev_alloc(&msm_driver, &pdev->dev);
    > + if (IS_ERR(ddev)) {
    > + DRM_DEV_ERROR(&pdev->dev, "failed to allocate drm_device\n");
    > + return PTR_ERR(ddev);
    > + }
    > +
    > + platform_set_drvdata(pdev, ddev);
    > + ddev->dev_private = priv;
    > + priv->dev = ddev;
    > +
    > + switch (get_mdp_ver(pdev)) {
    > + case KMS_MDP5:
    > + ret = mdp5_mdss_init(ddev);
    > + break;
    > + case KMS_DPU:
    > + ret = dpu_mdss_init(ddev);
    > + break;
    > + default:
    > + ret = 0;
    > + break;
    > + }
    > + if (ret)
    > + goto err_put_drm_dev;
    > +
    > if (get_mdp_ver(pdev)) {
    > ret = add_display_components(pdev, &match);
    > if (ret)
    > - return ret;
    > + goto fail;
    > }
    >
    > ret = add_gpu_components(&pdev->dev, &match);
    > @@ -1409,6 +1401,9 @@ static int msm_pdev_probe(struct platform_device *pdev)
    >
    > fail:
    > of_platform_depopulate(&pdev->dev);
    > +err_put_drm_dev:
    > + drm_dev_put(ddev);
    > + platform_set_drvdata(pdev, NULL);
    > return ret;
    > }
    >
    >


    --
    With best wishes
    Dmitry

    \
     
     \ /
      Last update: 2021-11-25 16:30    [W:4.801 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site