Re: [Freedreno] [DPU PATCH v2 04/12] drm/msm/dpu: create new platform driver for dpu device
On Fri, May 11, 2018 at 08:19:30PM +0530, Rajesh Yadav wrote: > Current MSM display controller HW matches a tree like > hierarchy where MDSS top level wrapper is parent device > and mdp5/dpu, dsi, dp are child devices. > > Each child device like mdp5, dsi etc. have a separate driver, > but currently dpu handling is tied to a single driver which > was managing both mdss and dpu resources. > > Inorder to have the cleaner one to one device and driver > association, this change adds a new platform_driver for dpu > child device node which implements the kms functionality. > > The dpu driver implements runtime_pm support for managing clocks > and bus bandwidth etc. > > Changes in v2: > - remove redundant param check from _dpu_kms_hw_destroy (Sean Paul) > - remove explicit calls to devm_kfree (Sean Paul) > - merge dpu_init into dpu_bind (Sean Paul) > - merge dpu_destroy into dpu_unbind (Sean Paul) > - use %pK for kernel pointer printing (Jordan Crouse) > - remove explicit devm allocation failure message (Jordan Crouse) > > Signed-off-by: Rajesh Yadav Reviewed-by: Jordan Crouse > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 238 > +--- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 4 + > drivers/gpu/drm/msm/msm_drv.c | 2 + > drivers/gpu/drm/msm/msm_drv.h | 3 + > 4 files changed, 196 insertions(+), 51 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index e4ab753..85f3dbc 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -1030,16 +1030,12 @@ static long dpu_kms_round_pixclk(struct msm_kms *kms, > unsigned long rate, > return rate; > } > > -static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms, > - struct platform_device *pdev) > +static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms) > { > struct drm_device *dev; > struct msm_drm_private *priv; > int i; > > - if (!dpu_kms || !pdev) > - return; > - > dev = dpu_kms->dev; > if (!dev) > return; > @@ -1091,15 +1087,15 @@ static void _dpu_kms_hw_destroy(struct dpu_kms > *dpu_kms, > dpu_kms->core_client = NULL; > > if (dpu_kms->vbif[VBIF_NRT]) > - msm_iounmap(pdev, dpu_kms->vbif[VBIF_NRT]); > + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_NRT]); > dpu_kms->vbif[VBIF_NRT] = NULL; > > if (dpu_kms->vbif[VBIF_RT]) > - msm_iounmap(pdev, dpu_kms->vbif[VBIF_RT]); > + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_RT]); > dpu_kms->vbif[VBIF_RT] = NULL; > > if (dpu_kms->mmio) > - msm_iounmap(pdev, dpu_kms->mmio); > + msm_iounmap(dpu_kms->pdev, dpu_kms->mmio); > dpu_kms->mmio = NULL; > > dpu_reg_dma_deinit(); > @@ -1172,8 +1168,6 @@ int dpu_kms_mmu_attach(struct dpu_kms *dpu_kms, bool > secure_only) > static void dpu_kms_destroy(struct msm_kms *kms) > { > struct dpu_kms *dpu_kms; > - struct drm_device *dev; > - struct platform_device *platformdev; > > if (!kms) { > DPU_ERROR("invalid kms\n"); > @@ -1181,20 +1175,7 @@ static void dpu_kms_destroy(struct msm_kms *kms) > } > > dpu_kms = to_dpu_kms(kms); > - dev = dpu_kms->dev; > - if (!dev) { > - DPU_ERROR("invalid device\n"); > - return; > - } > - > - platformdev = to_platform_device(dev->dev); > - if (!platformdev) { > - DPU_ERROR("invalid platform device\n"); > - return; > - } > - > - _dpu_kms_hw_destroy(dpu_kms, platformdev); > - kfree(dpu_kms); > + _dpu_kms_hw_destroy(dpu_kms); > } > > static void dpu_kms_preclose(struct msm_kms *kms, struct drm_file *file) > @@ -1550,7 +1531,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms) > struct dpu_kms *dpu_kms; > struct drm_device *dev; > struct msm_drm_private *priv; > - struct platform_device *platformdev; > int i, rc = -EINVAL; > > if (!kms) { > @@ -1565,34 +1545,28 @@ static int dpu_kms_hw_init(struct msm_kms *kms) > goto end; > } > > - platformdev = to_platform_device(dev->dev); > - if (!platformdev) { > - DPU_ERROR("invalid platform device\n"); > - goto end; > - } > - > priv = dev->dev_private; > if (!priv) { > DPU_ERROR("invalid private data\n"); > goto end; > } > > - dpu_kms->mmio = msm_ioremap(platformdev, "mdp_phys", "mdp_phys"); > + dpu_kms->mmio = msm_ioremap(dpu_kms->pdev, "mdp_phys", "mdp_phys"); > if (IS_ERR(dpu_kms->mmio)) { > rc = PTR_ERR(dpu_kms->mmio); > DPU_ERROR("mdp register memory map failed: %d\n", rc); > dpu_kms->mmio = NULL; > goto error; > } > - DRM_INFO("map
Re: [DPU PATCH v2 04/12] drm/msm/dpu: create new platform driver for dpu device
On Fri, May 11, 2018 at 08:19:30PM +0530, Rajesh Yadav wrote: > Current MSM display controller HW matches a tree like > hierarchy where MDSS top level wrapper is parent device > and mdp5/dpu, dsi, dp are child devices. > > Each child device like mdp5, dsi etc. have a separate driver, > but currently dpu handling is tied to a single driver which > was managing both mdss and dpu resources. > > Inorder to have the cleaner one to one device and driver > association, this change adds a new platform_driver for dpu > child device node which implements the kms functionality. > > The dpu driver implements runtime_pm support for managing clocks > and bus bandwidth etc. > > Changes in v2: > - remove redundant param check from _dpu_kms_hw_destroy (Sean Paul) > - remove explicit calls to devm_kfree (Sean Paul) > - merge dpu_init into dpu_bind (Sean Paul) > - merge dpu_destroy into dpu_unbind (Sean Paul) > - use %pK for kernel pointer printing (Jordan Crouse) > - remove explicit devm allocation failure message (Jordan Crouse) > > Signed-off-by: Rajesh Yadav Reviewed-by: Sean Paul > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 238 > +--- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 4 + > drivers/gpu/drm/msm/msm_drv.c | 2 + > drivers/gpu/drm/msm/msm_drv.h | 3 + > 4 files changed, 196 insertions(+), 51 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index e4ab753..85f3dbc 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -1030,16 +1030,12 @@ static long dpu_kms_round_pixclk(struct msm_kms *kms, > unsigned long rate, > return rate; > } > > -static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms, > - struct platform_device *pdev) > +static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms) > { > struct drm_device *dev; > struct msm_drm_private *priv; > int i; > > - if (!dpu_kms || !pdev) > - return; > - > dev = dpu_kms->dev; > if (!dev) > return; > @@ -1091,15 +1087,15 @@ static void _dpu_kms_hw_destroy(struct dpu_kms > *dpu_kms, > dpu_kms->core_client = NULL; > > if (dpu_kms->vbif[VBIF_NRT]) > - msm_iounmap(pdev, dpu_kms->vbif[VBIF_NRT]); > + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_NRT]); > dpu_kms->vbif[VBIF_NRT] = NULL; > > if (dpu_kms->vbif[VBIF_RT]) > - msm_iounmap(pdev, dpu_kms->vbif[VBIF_RT]); > + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_RT]); > dpu_kms->vbif[VBIF_RT] = NULL; > > if (dpu_kms->mmio) > - msm_iounmap(pdev, dpu_kms->mmio); > + msm_iounmap(dpu_kms->pdev, dpu_kms->mmio); > dpu_kms->mmio = NULL; > > dpu_reg_dma_deinit(); > @@ -1172,8 +1168,6 @@ int dpu_kms_mmu_attach(struct dpu_kms *dpu_kms, bool > secure_only) > static void dpu_kms_destroy(struct msm_kms *kms) > { > struct dpu_kms *dpu_kms; > - struct drm_device *dev; > - struct platform_device *platformdev; > > if (!kms) { > DPU_ERROR("invalid kms\n"); > @@ -1181,20 +1175,7 @@ static void dpu_kms_destroy(struct msm_kms *kms) > } > > dpu_kms = to_dpu_kms(kms); > - dev = dpu_kms->dev; > - if (!dev) { > - DPU_ERROR("invalid device\n"); > - return; > - } > - > - platformdev = to_platform_device(dev->dev); > - if (!platformdev) { > - DPU_ERROR("invalid platform device\n"); > - return; > - } > - > - _dpu_kms_hw_destroy(dpu_kms, platformdev); > - kfree(dpu_kms); > + _dpu_kms_hw_destroy(dpu_kms); > } > > static void dpu_kms_preclose(struct msm_kms *kms, struct drm_file *file) > @@ -1550,7 +1531,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms) > struct dpu_kms *dpu_kms; > struct drm_device *dev; > struct msm_drm_private *priv; > - struct platform_device *platformdev; > int i, rc = -EINVAL; > > if (!kms) { > @@ -1565,34 +1545,28 @@ static int dpu_kms_hw_init(struct msm_kms *kms) > goto end; > } > > - platformdev = to_platform_device(dev->dev); > - if (!platformdev) { > - DPU_ERROR("invalid platform device\n"); > - goto end; > - } > - > priv = dev->dev_private; > if (!priv) { > DPU_ERROR("invalid private data\n"); > goto end; > } > > - dpu_kms->mmio = msm_ioremap(platformdev, "mdp_phys", "mdp_phys"); > + dpu_kms->mmio = msm_ioremap(dpu_kms->pdev, "mdp_phys", "mdp_phys"); > if (IS_ERR(dpu_kms->mmio)) { > rc = PTR_ERR(dpu_kms->mmio); > DPU_ERROR("mdp register memory map failed: %d\n", rc); > dpu_kms->mmio = NULL; > goto error; > } > - DRM_INFO("mappe
[DPU PATCH v2 04/12] drm/msm/dpu: create new platform driver for dpu device
Current MSM display controller HW matches a tree like hierarchy where MDSS top level wrapper is parent device and mdp5/dpu, dsi, dp are child devices. Each child device like mdp5, dsi etc. have a separate driver, but currently dpu handling is tied to a single driver which was managing both mdss and dpu resources. Inorder to have the cleaner one to one device and driver association, this change adds a new platform_driver for dpu child device node which implements the kms functionality. The dpu driver implements runtime_pm support for managing clocks and bus bandwidth etc. Changes in v2: - remove redundant param check from _dpu_kms_hw_destroy (Sean Paul) - remove explicit calls to devm_kfree (Sean Paul) - merge dpu_init into dpu_bind (Sean Paul) - merge dpu_destroy into dpu_unbind (Sean Paul) - use %pK for kernel pointer printing (Jordan Crouse) - remove explicit devm allocation failure message (Jordan Crouse) Signed-off-by: Rajesh Yadav --- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 238 +--- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 4 + drivers/gpu/drm/msm/msm_drv.c | 2 + drivers/gpu/drm/msm/msm_drv.h | 3 + 4 files changed, 196 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index e4ab753..85f3dbc 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -1030,16 +1030,12 @@ static long dpu_kms_round_pixclk(struct msm_kms *kms, unsigned long rate, return rate; } -static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms, - struct platform_device *pdev) +static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms) { struct drm_device *dev; struct msm_drm_private *priv; int i; - if (!dpu_kms || !pdev) - return; - dev = dpu_kms->dev; if (!dev) return; @@ -1091,15 +1087,15 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms, dpu_kms->core_client = NULL; if (dpu_kms->vbif[VBIF_NRT]) - msm_iounmap(pdev, dpu_kms->vbif[VBIF_NRT]); + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_NRT]); dpu_kms->vbif[VBIF_NRT] = NULL; if (dpu_kms->vbif[VBIF_RT]) - msm_iounmap(pdev, dpu_kms->vbif[VBIF_RT]); + msm_iounmap(dpu_kms->pdev, dpu_kms->vbif[VBIF_RT]); dpu_kms->vbif[VBIF_RT] = NULL; if (dpu_kms->mmio) - msm_iounmap(pdev, dpu_kms->mmio); + msm_iounmap(dpu_kms->pdev, dpu_kms->mmio); dpu_kms->mmio = NULL; dpu_reg_dma_deinit(); @@ -1172,8 +1168,6 @@ int dpu_kms_mmu_attach(struct dpu_kms *dpu_kms, bool secure_only) static void dpu_kms_destroy(struct msm_kms *kms) { struct dpu_kms *dpu_kms; - struct drm_device *dev; - struct platform_device *platformdev; if (!kms) { DPU_ERROR("invalid kms\n"); @@ -1181,20 +1175,7 @@ static void dpu_kms_destroy(struct msm_kms *kms) } dpu_kms = to_dpu_kms(kms); - dev = dpu_kms->dev; - if (!dev) { - DPU_ERROR("invalid device\n"); - return; - } - - platformdev = to_platform_device(dev->dev); - if (!platformdev) { - DPU_ERROR("invalid platform device\n"); - return; - } - - _dpu_kms_hw_destroy(dpu_kms, platformdev); - kfree(dpu_kms); + _dpu_kms_hw_destroy(dpu_kms); } static void dpu_kms_preclose(struct msm_kms *kms, struct drm_file *file) @@ -1550,7 +1531,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms) struct dpu_kms *dpu_kms; struct drm_device *dev; struct msm_drm_private *priv; - struct platform_device *platformdev; int i, rc = -EINVAL; if (!kms) { @@ -1565,34 +1545,28 @@ static int dpu_kms_hw_init(struct msm_kms *kms) goto end; } - platformdev = to_platform_device(dev->dev); - if (!platformdev) { - DPU_ERROR("invalid platform device\n"); - goto end; - } - priv = dev->dev_private; if (!priv) { DPU_ERROR("invalid private data\n"); goto end; } - dpu_kms->mmio = msm_ioremap(platformdev, "mdp_phys", "mdp_phys"); + dpu_kms->mmio = msm_ioremap(dpu_kms->pdev, "mdp_phys", "mdp_phys"); if (IS_ERR(dpu_kms->mmio)) { rc = PTR_ERR(dpu_kms->mmio); DPU_ERROR("mdp register memory map failed: %d\n", rc); dpu_kms->mmio = NULL; goto error; } - DRM_INFO("mapped mdp address space @%p\n", dpu_kms->mmio); - dpu_kms->mmio_len = msm_iomap_size(platformdev, "mdp_phys"); + DRM_DEBUG("mapped dpu address space @%pK\n", dpu_kms->mmio); + dpu_kms->mmio_len = msm_ioma