All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Clark <robdclark@gmail.com>
To: Jordan Crouse <jcrouse@codeaurora.org>
Cc: "list@263.net:IOMMU DRIVERS <iommu@lists.linux-foundation.org>,
	Joerg Roedel <joro@8bytes.org>,"
	<iommu@lists.linux-foundation.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Will Deacon <will@kernel.org>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" 
	<linux-arm-kernel@lists.infradead.org>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	David Airlie <airlied@linux.ie>, Sean Paul <sean@poorly.run>,
	Bruce Wang <bzwang@chromium.org>,
	AngeloGioacchino Del Regno <kholk11@gmail.com>,
	Sam Ravnborg <sam@ravnborg.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Jeykumar Sankaran <jsanka@codeaurora.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Jonathan Marek <jonathan@marek.ca>,
	Drew Davenport <ddavenport@chromium.org>,
	Georgi Djakov <georgi.djakov@linaro.org>,
	freedreno <freedreno@lists.freedesktop.org>,
	Jeffrey Hugo <jeffrey.l.hugo@gmail.com>,
	Mamta Shukla <mamtashukla555@gmail.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Daniel Vetter <daniel@ffwll.ch>
Subject: Re: [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization
Date: Mon, 9 Dec 2019 12:11:35 -0800	[thread overview]
Message-ID: <CAF6AEGuAjSyMTqCauO2i6wQDEq1Q1baNMisCr=WZi3WHeyzxmw@mail.gmail.com> (raw)
In-Reply-To: <0101016e95754002-c2fa43aa-b14b-4cff-b6f9-a67c96661e26-000000@us-west-2.amazonses.com>

On Fri, Nov 22, 2019 at 3:32 PM Jordan Crouse <jcrouse@codeaurora.org> wrote:
>
> Everywhere an IOMMU object is created by msm_gpu_create_address_space
> the IOMMU device is attached immediately after. Instead of carrying around
> the infrastructure to do the attach from the device specific code do it
> directly in the msm_iommu_init() function. This gets it out of the way for
> more aggressive cleanups that follow.
>
> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

Hmm, yeah, now that we dropped the extra mmu->attach() args (which was
some ancient downstream compat thing), we don't need the separate
attach step.  I suppose we probably should do a similar cleanup for
mmu->detach(), but I guess that can be it's own patch

Reviewed-by: Rob Clark <robdclark@gmail.com>


> ---
>
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  8 --------
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  4 ----
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  7 -------
>  drivers/gpu/drm/msm/msm_gem_vma.c        | 23 +++++++++++++++++++----
>  drivers/gpu/drm/msm/msm_gpu.c            | 11 +----------
>  drivers/gpu/drm/msm/msm_gpummu.c         |  6 ------
>  drivers/gpu/drm/msm/msm_iommu.c          | 15 +++++++--------
>  drivers/gpu/drm/msm/msm_mmu.h            |  1 -
>  8 files changed, 27 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 6c92f0f..b082b23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -704,7 +704,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>  {
>         struct iommu_domain *domain;
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         domain = iommu_domain_alloc(&platform_bus_type);
>         if (!domain)
> @@ -720,13 +719,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>                 return PTR_ERR(aspace);
>         }
>
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               DPU_ERROR("failed to attach iommu %d\n", ret);
> -               msm_gem_address_space_put(aspace);
> -               return ret;
> -       }
> -
>         dpu_kms->base.aspace = aspace;
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index dda0543..9dba37c 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -518,10 +518,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret)
> -                       goto fail;
>         } else {
>                 DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys "
>                                 "contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index e43ecd4..653dab2 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -736,13 +736,6 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret) {
> -                       DRM_DEV_ERROR(&pdev->dev, "failed to attach iommu: %d\n",
> -                               ret);
> -                       goto fail;
> -               }
>         } else {
>                 DRM_DEV_INFO(&pdev->dev,
>                          "no iommu, fallback to phys contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c
> index 1af5354..91d993a 100644
> --- a/drivers/gpu/drm/msm/msm_gem_vma.c
> +++ b/drivers/gpu/drm/msm/msm_gem_vma.c
> @@ -131,8 +131,8 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>                 const char *name)
>  {
>         struct msm_gem_address_space *aspace;
> -       u64 size = domain->geometry.aperture_end -
> -               domain->geometry.aperture_start;
> +       u64 start = domain->geometry.aperture_start;
> +       u64 size = domain->geometry.aperture_end - start;
>
>         aspace = kzalloc(sizeof(*aspace), GFP_KERNEL);
>         if (!aspace)
> @@ -141,9 +141,18 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_iommu_new(dev, domain);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
>
> -       drm_mm_init(&aspace->mm, (domain->geometry.aperture_start >> PAGE_SHIFT),
> -               size >> PAGE_SHIFT);
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
> +
> +       /*
> +        * Attaching the IOMMU device changes the aperture values so use the
> +        * cached values instead
> +        */
> +       drm_mm_init(&aspace->mm, start >> PAGE_SHIFT, size >> PAGE_SHIFT);
>
>         kref_init(&aspace->kref);
>
> @@ -164,6 +173,12 @@ msm_gem_address_space_create_a2xx(struct device *dev, struct msm_gpu *gpu,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_gpummu_new(dev, gpu);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
> +
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
>
>         drm_mm_init(&aspace->mm, (va_start >> PAGE_SHIFT),
>                 size >> PAGE_SHIFT);
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 18f3a5c..f7bf80e 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -808,7 +808,6 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                 uint64_t va_start, uint64_t va_end)
>  {
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         /*
>          * Setup IOMMU.. eventually we will (I think) do this once per context
> @@ -833,17 +832,9 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                         va_start, va_end);
>         }
>
> -       if (IS_ERR(aspace)) {
> +       if (IS_ERR(aspace))
>                 DRM_DEV_ERROR(gpu->dev->dev, "failed to init mmu: %ld\n",
>                         PTR_ERR(aspace));
> -               return ERR_CAST(aspace);
> -       }
> -
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               msm_gem_address_space_put(aspace);
> -               return ERR_PTR(ret);
> -       }
>
>         return aspace;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_gpummu.c b/drivers/gpu/drm/msm/msm_gpummu.c
> index 34980d8..0ad0f84 100644
> --- a/drivers/gpu/drm/msm/msm_gpummu.c
> +++ b/drivers/gpu/drm/msm/msm_gpummu.c
> @@ -21,11 +21,6 @@ struct msm_gpummu {
>  #define GPUMMU_PAGE_SIZE SZ_4K
>  #define TABLE_SIZE (sizeof(uint32_t) * GPUMMU_VA_RANGE / GPUMMU_PAGE_SIZE)
>
> -static int msm_gpummu_attach(struct msm_mmu *mmu)
> -{
> -       return 0;
> -}
> -
>  static void msm_gpummu_detach(struct msm_mmu *mmu)
>  {
>  }
> @@ -85,7 +80,6 @@ static void msm_gpummu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_gpummu_attach,
>                 .detach = msm_gpummu_detach,
>                 .map = msm_gpummu_map,
>                 .unmap = msm_gpummu_unmap,
> diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
> index ad58cfe..544c519 100644
> --- a/drivers/gpu/drm/msm/msm_iommu.c
> +++ b/drivers/gpu/drm/msm/msm_iommu.c
> @@ -23,13 +23,6 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
>         return 0;
>  }
>
> -static int msm_iommu_attach(struct msm_mmu *mmu)
> -{
> -       struct msm_iommu *iommu = to_msm_iommu(mmu);
> -
> -       return iommu_attach_device(iommu->domain, mmu->dev);
> -}
> -
>  static void msm_iommu_detach(struct msm_mmu *mmu)
>  {
>         struct msm_iommu *iommu = to_msm_iommu(mmu);
> @@ -66,7 +59,6 @@ static void msm_iommu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_iommu_attach,
>                 .detach = msm_iommu_detach,
>                 .map = msm_iommu_map,
>                 .unmap = msm_iommu_unmap,
> @@ -76,6 +68,7 @@ static const struct msm_mmu_funcs funcs = {
>  struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>  {
>         struct msm_iommu *iommu;
> +       int ret;
>
>         iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
>         if (!iommu)
> @@ -85,5 +78,11 @@ struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>         msm_mmu_init(&iommu->base, dev, &funcs);
>         iommu_set_fault_handler(domain, msm_fault_handler, iommu);
>
> +       ret = iommu_attach_device(iommu->domain, dev);
> +       if (ret) {
> +               kfree(iommu);
> +               return ERR_PTR(ret);
> +       }
> +
>         return &iommu->base;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h
> index 67a623f..bae9e8e 100644
> --- a/drivers/gpu/drm/msm/msm_mmu.h
> +++ b/drivers/gpu/drm/msm/msm_mmu.h
> @@ -10,7 +10,6 @@
>  #include <linux/iommu.h>
>
>  struct msm_mmu_funcs {
> -       int (*attach)(struct msm_mmu *mmu);
>         void (*detach)(struct msm_mmu *mmu);
>         int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
>                         unsigned len, int prot);
> --
> 2.7.4
>

WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com>
To: Jordan Crouse <jcrouse@codeaurora.org>
Cc: Sean Paul <sean@poorly.run>,
	freedreno <freedreno@lists.freedesktop.org>,
	Jonathan Marek <jonathan@marek.ca>,
	Sam Ravnborg <sam@ravnborg.org>,
	Jeffrey Hugo <jeffrey.l.hugo@gmail.com>,
	David Airlie <airlied@linux.ie>,
	Robin Murphy <robin.murphy@arm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Georgi Djakov <georgi.djakov@linaro.org>,
	Bruce Wang <bzwang@chromium.org>,
	"list@263.net:IOMMU DRIVERS <iommu@lists.linux-foundation.org>,
	Joerg Roedel <joro@8bytes.org>,
	" <iommu@lists.linux-foundation.org>,
	Mamta Shukla <mamtashukla555@gmail.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Drew Davenport <ddavenport@chromium.org>,
	Jeykumar Sankaran <jsanka@codeaurora.org>,
	AngeloGioacchino Del Regno <kholk11@gmail.com>,
	Will Deacon <will@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization
Date: Mon, 9 Dec 2019 12:11:35 -0800	[thread overview]
Message-ID: <CAF6AEGuAjSyMTqCauO2i6wQDEq1Q1baNMisCr=WZi3WHeyzxmw@mail.gmail.com> (raw)
In-Reply-To: <0101016e95754002-c2fa43aa-b14b-4cff-b6f9-a67c96661e26-000000@us-west-2.amazonses.com>

On Fri, Nov 22, 2019 at 3:32 PM Jordan Crouse <jcrouse@codeaurora.org> wrote:
>
> Everywhere an IOMMU object is created by msm_gpu_create_address_space
> the IOMMU device is attached immediately after. Instead of carrying around
> the infrastructure to do the attach from the device specific code do it
> directly in the msm_iommu_init() function. This gets it out of the way for
> more aggressive cleanups that follow.
>
> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

Hmm, yeah, now that we dropped the extra mmu->attach() args (which was
some ancient downstream compat thing), we don't need the separate
attach step.  I suppose we probably should do a similar cleanup for
mmu->detach(), but I guess that can be it's own patch

Reviewed-by: Rob Clark <robdclark@gmail.com>


> ---
>
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  8 --------
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  4 ----
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  7 -------
>  drivers/gpu/drm/msm/msm_gem_vma.c        | 23 +++++++++++++++++++----
>  drivers/gpu/drm/msm/msm_gpu.c            | 11 +----------
>  drivers/gpu/drm/msm/msm_gpummu.c         |  6 ------
>  drivers/gpu/drm/msm/msm_iommu.c          | 15 +++++++--------
>  drivers/gpu/drm/msm/msm_mmu.h            |  1 -
>  8 files changed, 27 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 6c92f0f..b082b23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -704,7 +704,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>  {
>         struct iommu_domain *domain;
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         domain = iommu_domain_alloc(&platform_bus_type);
>         if (!domain)
> @@ -720,13 +719,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>                 return PTR_ERR(aspace);
>         }
>
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               DPU_ERROR("failed to attach iommu %d\n", ret);
> -               msm_gem_address_space_put(aspace);
> -               return ret;
> -       }
> -
>         dpu_kms->base.aspace = aspace;
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index dda0543..9dba37c 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -518,10 +518,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret)
> -                       goto fail;
>         } else {
>                 DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys "
>                                 "contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index e43ecd4..653dab2 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -736,13 +736,6 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret) {
> -                       DRM_DEV_ERROR(&pdev->dev, "failed to attach iommu: %d\n",
> -                               ret);
> -                       goto fail;
> -               }
>         } else {
>                 DRM_DEV_INFO(&pdev->dev,
>                          "no iommu, fallback to phys contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c
> index 1af5354..91d993a 100644
> --- a/drivers/gpu/drm/msm/msm_gem_vma.c
> +++ b/drivers/gpu/drm/msm/msm_gem_vma.c
> @@ -131,8 +131,8 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>                 const char *name)
>  {
>         struct msm_gem_address_space *aspace;
> -       u64 size = domain->geometry.aperture_end -
> -               domain->geometry.aperture_start;
> +       u64 start = domain->geometry.aperture_start;
> +       u64 size = domain->geometry.aperture_end - start;
>
>         aspace = kzalloc(sizeof(*aspace), GFP_KERNEL);
>         if (!aspace)
> @@ -141,9 +141,18 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_iommu_new(dev, domain);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
>
> -       drm_mm_init(&aspace->mm, (domain->geometry.aperture_start >> PAGE_SHIFT),
> -               size >> PAGE_SHIFT);
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
> +
> +       /*
> +        * Attaching the IOMMU device changes the aperture values so use the
> +        * cached values instead
> +        */
> +       drm_mm_init(&aspace->mm, start >> PAGE_SHIFT, size >> PAGE_SHIFT);
>
>         kref_init(&aspace->kref);
>
> @@ -164,6 +173,12 @@ msm_gem_address_space_create_a2xx(struct device *dev, struct msm_gpu *gpu,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_gpummu_new(dev, gpu);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
> +
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
>
>         drm_mm_init(&aspace->mm, (va_start >> PAGE_SHIFT),
>                 size >> PAGE_SHIFT);
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 18f3a5c..f7bf80e 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -808,7 +808,6 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                 uint64_t va_start, uint64_t va_end)
>  {
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         /*
>          * Setup IOMMU.. eventually we will (I think) do this once per context
> @@ -833,17 +832,9 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                         va_start, va_end);
>         }
>
> -       if (IS_ERR(aspace)) {
> +       if (IS_ERR(aspace))
>                 DRM_DEV_ERROR(gpu->dev->dev, "failed to init mmu: %ld\n",
>                         PTR_ERR(aspace));
> -               return ERR_CAST(aspace);
> -       }
> -
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               msm_gem_address_space_put(aspace);
> -               return ERR_PTR(ret);
> -       }
>
>         return aspace;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_gpummu.c b/drivers/gpu/drm/msm/msm_gpummu.c
> index 34980d8..0ad0f84 100644
> --- a/drivers/gpu/drm/msm/msm_gpummu.c
> +++ b/drivers/gpu/drm/msm/msm_gpummu.c
> @@ -21,11 +21,6 @@ struct msm_gpummu {
>  #define GPUMMU_PAGE_SIZE SZ_4K
>  #define TABLE_SIZE (sizeof(uint32_t) * GPUMMU_VA_RANGE / GPUMMU_PAGE_SIZE)
>
> -static int msm_gpummu_attach(struct msm_mmu *mmu)
> -{
> -       return 0;
> -}
> -
>  static void msm_gpummu_detach(struct msm_mmu *mmu)
>  {
>  }
> @@ -85,7 +80,6 @@ static void msm_gpummu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_gpummu_attach,
>                 .detach = msm_gpummu_detach,
>                 .map = msm_gpummu_map,
>                 .unmap = msm_gpummu_unmap,
> diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
> index ad58cfe..544c519 100644
> --- a/drivers/gpu/drm/msm/msm_iommu.c
> +++ b/drivers/gpu/drm/msm/msm_iommu.c
> @@ -23,13 +23,6 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
>         return 0;
>  }
>
> -static int msm_iommu_attach(struct msm_mmu *mmu)
> -{
> -       struct msm_iommu *iommu = to_msm_iommu(mmu);
> -
> -       return iommu_attach_device(iommu->domain, mmu->dev);
> -}
> -
>  static void msm_iommu_detach(struct msm_mmu *mmu)
>  {
>         struct msm_iommu *iommu = to_msm_iommu(mmu);
> @@ -66,7 +59,6 @@ static void msm_iommu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_iommu_attach,
>                 .detach = msm_iommu_detach,
>                 .map = msm_iommu_map,
>                 .unmap = msm_iommu_unmap,
> @@ -76,6 +68,7 @@ static const struct msm_mmu_funcs funcs = {
>  struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>  {
>         struct msm_iommu *iommu;
> +       int ret;
>
>         iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
>         if (!iommu)
> @@ -85,5 +78,11 @@ struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>         msm_mmu_init(&iommu->base, dev, &funcs);
>         iommu_set_fault_handler(domain, msm_fault_handler, iommu);
>
> +       ret = iommu_attach_device(iommu->domain, dev);
> +       if (ret) {
> +               kfree(iommu);
> +               return ERR_PTR(ret);
> +       }
> +
>         return &iommu->base;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h
> index 67a623f..bae9e8e 100644
> --- a/drivers/gpu/drm/msm/msm_mmu.h
> +++ b/drivers/gpu/drm/msm/msm_mmu.h
> @@ -10,7 +10,6 @@
>  #include <linux/iommu.h>
>
>  struct msm_mmu_funcs {
> -       int (*attach)(struct msm_mmu *mmu);
>         void (*detach)(struct msm_mmu *mmu);
>         int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
>                         unsigned len, int prot);
> --
> 2.7.4
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com>
To: Jordan Crouse <jcrouse@codeaurora.org>
Cc: Sean Paul <sean@poorly.run>,
	freedreno <freedreno@lists.freedesktop.org>,
	Jonathan Marek <jonathan@marek.ca>,
	Sam Ravnborg <sam@ravnborg.org>,
	Jeffrey Hugo <jeffrey.l.hugo@gmail.com>,
	David Airlie <airlied@linux.ie>,
	Robin Murphy <robin.murphy@arm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Georgi Djakov <georgi.djakov@linaro.org>,
	Bruce Wang <bzwang@chromium.org>,
	"list@263.net:IOMMU DRIVERS <iommu@lists.linux-foundation.org>,
	Joerg Roedel <joro@8bytes.org>,
	" <iommu@lists.linux-foundation.org>,
	Mamta Shukla <mamtashukla555@gmail.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Drew Davenport <ddavenport@chromium.org>,
	Jeykumar Sankaran <jsanka@codeaurora.org>,
	AngeloGioacchino Del Regno <kholk11@gmail.com>,
	Will Deacon <will@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization
Date: Mon, 9 Dec 2019 12:11:35 -0800	[thread overview]
Message-ID: <CAF6AEGuAjSyMTqCauO2i6wQDEq1Q1baNMisCr=WZi3WHeyzxmw@mail.gmail.com> (raw)
In-Reply-To: <0101016e95754002-c2fa43aa-b14b-4cff-b6f9-a67c96661e26-000000@us-west-2.amazonses.com>

On Fri, Nov 22, 2019 at 3:32 PM Jordan Crouse <jcrouse@codeaurora.org> wrote:
>
> Everywhere an IOMMU object is created by msm_gpu_create_address_space
> the IOMMU device is attached immediately after. Instead of carrying around
> the infrastructure to do the attach from the device specific code do it
> directly in the msm_iommu_init() function. This gets it out of the way for
> more aggressive cleanups that follow.
>
> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

Hmm, yeah, now that we dropped the extra mmu->attach() args (which was
some ancient downstream compat thing), we don't need the separate
attach step.  I suppose we probably should do a similar cleanup for
mmu->detach(), but I guess that can be it's own patch

Reviewed-by: Rob Clark <robdclark@gmail.com>


> ---
>
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  8 --------
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  4 ----
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  7 -------
>  drivers/gpu/drm/msm/msm_gem_vma.c        | 23 +++++++++++++++++++----
>  drivers/gpu/drm/msm/msm_gpu.c            | 11 +----------
>  drivers/gpu/drm/msm/msm_gpummu.c         |  6 ------
>  drivers/gpu/drm/msm/msm_iommu.c          | 15 +++++++--------
>  drivers/gpu/drm/msm/msm_mmu.h            |  1 -
>  8 files changed, 27 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 6c92f0f..b082b23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -704,7 +704,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>  {
>         struct iommu_domain *domain;
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         domain = iommu_domain_alloc(&platform_bus_type);
>         if (!domain)
> @@ -720,13 +719,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>                 return PTR_ERR(aspace);
>         }
>
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               DPU_ERROR("failed to attach iommu %d\n", ret);
> -               msm_gem_address_space_put(aspace);
> -               return ret;
> -       }
> -
>         dpu_kms->base.aspace = aspace;
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index dda0543..9dba37c 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -518,10 +518,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret)
> -                       goto fail;
>         } else {
>                 DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys "
>                                 "contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index e43ecd4..653dab2 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -736,13 +736,6 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret) {
> -                       DRM_DEV_ERROR(&pdev->dev, "failed to attach iommu: %d\n",
> -                               ret);
> -                       goto fail;
> -               }
>         } else {
>                 DRM_DEV_INFO(&pdev->dev,
>                          "no iommu, fallback to phys contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c
> index 1af5354..91d993a 100644
> --- a/drivers/gpu/drm/msm/msm_gem_vma.c
> +++ b/drivers/gpu/drm/msm/msm_gem_vma.c
> @@ -131,8 +131,8 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>                 const char *name)
>  {
>         struct msm_gem_address_space *aspace;
> -       u64 size = domain->geometry.aperture_end -
> -               domain->geometry.aperture_start;
> +       u64 start = domain->geometry.aperture_start;
> +       u64 size = domain->geometry.aperture_end - start;
>
>         aspace = kzalloc(sizeof(*aspace), GFP_KERNEL);
>         if (!aspace)
> @@ -141,9 +141,18 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_iommu_new(dev, domain);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
>
> -       drm_mm_init(&aspace->mm, (domain->geometry.aperture_start >> PAGE_SHIFT),
> -               size >> PAGE_SHIFT);
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
> +
> +       /*
> +        * Attaching the IOMMU device changes the aperture values so use the
> +        * cached values instead
> +        */
> +       drm_mm_init(&aspace->mm, start >> PAGE_SHIFT, size >> PAGE_SHIFT);
>
>         kref_init(&aspace->kref);
>
> @@ -164,6 +173,12 @@ msm_gem_address_space_create_a2xx(struct device *dev, struct msm_gpu *gpu,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_gpummu_new(dev, gpu);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
> +
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
>
>         drm_mm_init(&aspace->mm, (va_start >> PAGE_SHIFT),
>                 size >> PAGE_SHIFT);
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 18f3a5c..f7bf80e 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -808,7 +808,6 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                 uint64_t va_start, uint64_t va_end)
>  {
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         /*
>          * Setup IOMMU.. eventually we will (I think) do this once per context
> @@ -833,17 +832,9 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                         va_start, va_end);
>         }
>
> -       if (IS_ERR(aspace)) {
> +       if (IS_ERR(aspace))
>                 DRM_DEV_ERROR(gpu->dev->dev, "failed to init mmu: %ld\n",
>                         PTR_ERR(aspace));
> -               return ERR_CAST(aspace);
> -       }
> -
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               msm_gem_address_space_put(aspace);
> -               return ERR_PTR(ret);
> -       }
>
>         return aspace;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_gpummu.c b/drivers/gpu/drm/msm/msm_gpummu.c
> index 34980d8..0ad0f84 100644
> --- a/drivers/gpu/drm/msm/msm_gpummu.c
> +++ b/drivers/gpu/drm/msm/msm_gpummu.c
> @@ -21,11 +21,6 @@ struct msm_gpummu {
>  #define GPUMMU_PAGE_SIZE SZ_4K
>  #define TABLE_SIZE (sizeof(uint32_t) * GPUMMU_VA_RANGE / GPUMMU_PAGE_SIZE)
>
> -static int msm_gpummu_attach(struct msm_mmu *mmu)
> -{
> -       return 0;
> -}
> -
>  static void msm_gpummu_detach(struct msm_mmu *mmu)
>  {
>  }
> @@ -85,7 +80,6 @@ static void msm_gpummu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_gpummu_attach,
>                 .detach = msm_gpummu_detach,
>                 .map = msm_gpummu_map,
>                 .unmap = msm_gpummu_unmap,
> diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
> index ad58cfe..544c519 100644
> --- a/drivers/gpu/drm/msm/msm_iommu.c
> +++ b/drivers/gpu/drm/msm/msm_iommu.c
> @@ -23,13 +23,6 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
>         return 0;
>  }
>
> -static int msm_iommu_attach(struct msm_mmu *mmu)
> -{
> -       struct msm_iommu *iommu = to_msm_iommu(mmu);
> -
> -       return iommu_attach_device(iommu->domain, mmu->dev);
> -}
> -
>  static void msm_iommu_detach(struct msm_mmu *mmu)
>  {
>         struct msm_iommu *iommu = to_msm_iommu(mmu);
> @@ -66,7 +59,6 @@ static void msm_iommu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_iommu_attach,
>                 .detach = msm_iommu_detach,
>                 .map = msm_iommu_map,
>                 .unmap = msm_iommu_unmap,
> @@ -76,6 +68,7 @@ static const struct msm_mmu_funcs funcs = {
>  struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>  {
>         struct msm_iommu *iommu;
> +       int ret;
>
>         iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
>         if (!iommu)
> @@ -85,5 +78,11 @@ struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>         msm_mmu_init(&iommu->base, dev, &funcs);
>         iommu_set_fault_handler(domain, msm_fault_handler, iommu);
>
> +       ret = iommu_attach_device(iommu->domain, dev);
> +       if (ret) {
> +               kfree(iommu);
> +               return ERR_PTR(ret);
> +       }
> +
>         return &iommu->base;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h
> index 67a623f..bae9e8e 100644
> --- a/drivers/gpu/drm/msm/msm_mmu.h
> +++ b/drivers/gpu/drm/msm/msm_mmu.h
> @@ -10,7 +10,6 @@
>  #include <linux/iommu.h>
>
>  struct msm_mmu_funcs {
> -       int (*attach)(struct msm_mmu *mmu);
>         void (*detach)(struct msm_mmu *mmu);
>         int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
>                         unsigned len, int prot);
> --
> 2.7.4
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com>
To: Jordan Crouse <jcrouse@codeaurora.org>
Cc: Sean Paul <sean@poorly.run>,
	freedreno <freedreno@lists.freedesktop.org>,
	Jonathan Marek <jonathan@marek.ca>,
	Sam Ravnborg <sam@ravnborg.org>,
	Jeffrey Hugo <jeffrey.l.hugo@gmail.com>,
	David Airlie <airlied@linux.ie>,
	Robin Murphy <robin.murphy@arm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Georgi Djakov <georgi.djakov@linaro.org>,
	Bruce Wang <bzwang@chromium.org>,
	"list@263.net:IOMMU DRIVERS <iommu@lists.linux-foundation.org>,
	Joerg Roedel <joro@8bytes.org>,
	" <iommu@lists.linux-foundation.org>,
	Mamta Shukla <mamtashukla555@gmail.com>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Drew Davenport <ddavenport@chromium.org>,
	AngeloGioacchino Del Regno <kholk11@gmail.com>,
	Will Deacon <will@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization
Date: Mon, 9 Dec 2019 12:11:35 -0800	[thread overview]
Message-ID: <CAF6AEGuAjSyMTqCauO2i6wQDEq1Q1baNMisCr=WZi3WHeyzxmw@mail.gmail.com> (raw)
In-Reply-To: <0101016e95754002-c2fa43aa-b14b-4cff-b6f9-a67c96661e26-000000@us-west-2.amazonses.com>

On Fri, Nov 22, 2019 at 3:32 PM Jordan Crouse <jcrouse@codeaurora.org> wrote:
>
> Everywhere an IOMMU object is created by msm_gpu_create_address_space
> the IOMMU device is attached immediately after. Instead of carrying around
> the infrastructure to do the attach from the device specific code do it
> directly in the msm_iommu_init() function. This gets it out of the way for
> more aggressive cleanups that follow.
>
> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

Hmm, yeah, now that we dropped the extra mmu->attach() args (which was
some ancient downstream compat thing), we don't need the separate
attach step.  I suppose we probably should do a similar cleanup for
mmu->detach(), but I guess that can be it's own patch

Reviewed-by: Rob Clark <robdclark@gmail.com>


> ---
>
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  8 --------
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  4 ----
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  7 -------
>  drivers/gpu/drm/msm/msm_gem_vma.c        | 23 +++++++++++++++++++----
>  drivers/gpu/drm/msm/msm_gpu.c            | 11 +----------
>  drivers/gpu/drm/msm/msm_gpummu.c         |  6 ------
>  drivers/gpu/drm/msm/msm_iommu.c          | 15 +++++++--------
>  drivers/gpu/drm/msm/msm_mmu.h            |  1 -
>  8 files changed, 27 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 6c92f0f..b082b23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -704,7 +704,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>  {
>         struct iommu_domain *domain;
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         domain = iommu_domain_alloc(&platform_bus_type);
>         if (!domain)
> @@ -720,13 +719,6 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>                 return PTR_ERR(aspace);
>         }
>
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               DPU_ERROR("failed to attach iommu %d\n", ret);
> -               msm_gem_address_space_put(aspace);
> -               return ret;
> -       }
> -
>         dpu_kms->base.aspace = aspace;
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index dda0543..9dba37c 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -518,10 +518,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret)
> -                       goto fail;
>         } else {
>                 DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys "
>                                 "contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index e43ecd4..653dab2 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -736,13 +736,6 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
>                 }
>
>                 kms->aspace = aspace;
> -
> -               ret = aspace->mmu->funcs->attach(aspace->mmu);
> -               if (ret) {
> -                       DRM_DEV_ERROR(&pdev->dev, "failed to attach iommu: %d\n",
> -                               ret);
> -                       goto fail;
> -               }
>         } else {
>                 DRM_DEV_INFO(&pdev->dev,
>                          "no iommu, fallback to phys contig buffers for scanout\n");
> diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c
> index 1af5354..91d993a 100644
> --- a/drivers/gpu/drm/msm/msm_gem_vma.c
> +++ b/drivers/gpu/drm/msm/msm_gem_vma.c
> @@ -131,8 +131,8 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>                 const char *name)
>  {
>         struct msm_gem_address_space *aspace;
> -       u64 size = domain->geometry.aperture_end -
> -               domain->geometry.aperture_start;
> +       u64 start = domain->geometry.aperture_start;
> +       u64 size = domain->geometry.aperture_end - start;
>
>         aspace = kzalloc(sizeof(*aspace), GFP_KERNEL);
>         if (!aspace)
> @@ -141,9 +141,18 @@ msm_gem_address_space_create(struct device *dev, struct iommu_domain *domain,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_iommu_new(dev, domain);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
>
> -       drm_mm_init(&aspace->mm, (domain->geometry.aperture_start >> PAGE_SHIFT),
> -               size >> PAGE_SHIFT);
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
> +
> +       /*
> +        * Attaching the IOMMU device changes the aperture values so use the
> +        * cached values instead
> +        */
> +       drm_mm_init(&aspace->mm, start >> PAGE_SHIFT, size >> PAGE_SHIFT);
>
>         kref_init(&aspace->kref);
>
> @@ -164,6 +173,12 @@ msm_gem_address_space_create_a2xx(struct device *dev, struct msm_gpu *gpu,
>         spin_lock_init(&aspace->lock);
>         aspace->name = name;
>         aspace->mmu = msm_gpummu_new(dev, gpu);
> +       if (IS_ERR(aspace->mmu)) {
> +               int ret = PTR_ERR(aspace->mmu);
> +
> +               kfree(aspace);
> +               return ERR_PTR(ret);
> +       }
>
>         drm_mm_init(&aspace->mm, (va_start >> PAGE_SHIFT),
>                 size >> PAGE_SHIFT);
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 18f3a5c..f7bf80e 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -808,7 +808,6 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                 uint64_t va_start, uint64_t va_end)
>  {
>         struct msm_gem_address_space *aspace;
> -       int ret;
>
>         /*
>          * Setup IOMMU.. eventually we will (I think) do this once per context
> @@ -833,17 +832,9 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
>                         va_start, va_end);
>         }
>
> -       if (IS_ERR(aspace)) {
> +       if (IS_ERR(aspace))
>                 DRM_DEV_ERROR(gpu->dev->dev, "failed to init mmu: %ld\n",
>                         PTR_ERR(aspace));
> -               return ERR_CAST(aspace);
> -       }
> -
> -       ret = aspace->mmu->funcs->attach(aspace->mmu);
> -       if (ret) {
> -               msm_gem_address_space_put(aspace);
> -               return ERR_PTR(ret);
> -       }
>
>         return aspace;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_gpummu.c b/drivers/gpu/drm/msm/msm_gpummu.c
> index 34980d8..0ad0f84 100644
> --- a/drivers/gpu/drm/msm/msm_gpummu.c
> +++ b/drivers/gpu/drm/msm/msm_gpummu.c
> @@ -21,11 +21,6 @@ struct msm_gpummu {
>  #define GPUMMU_PAGE_SIZE SZ_4K
>  #define TABLE_SIZE (sizeof(uint32_t) * GPUMMU_VA_RANGE / GPUMMU_PAGE_SIZE)
>
> -static int msm_gpummu_attach(struct msm_mmu *mmu)
> -{
> -       return 0;
> -}
> -
>  static void msm_gpummu_detach(struct msm_mmu *mmu)
>  {
>  }
> @@ -85,7 +80,6 @@ static void msm_gpummu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_gpummu_attach,
>                 .detach = msm_gpummu_detach,
>                 .map = msm_gpummu_map,
>                 .unmap = msm_gpummu_unmap,
> diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
> index ad58cfe..544c519 100644
> --- a/drivers/gpu/drm/msm/msm_iommu.c
> +++ b/drivers/gpu/drm/msm/msm_iommu.c
> @@ -23,13 +23,6 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,
>         return 0;
>  }
>
> -static int msm_iommu_attach(struct msm_mmu *mmu)
> -{
> -       struct msm_iommu *iommu = to_msm_iommu(mmu);
> -
> -       return iommu_attach_device(iommu->domain, mmu->dev);
> -}
> -
>  static void msm_iommu_detach(struct msm_mmu *mmu)
>  {
>         struct msm_iommu *iommu = to_msm_iommu(mmu);
> @@ -66,7 +59,6 @@ static void msm_iommu_destroy(struct msm_mmu *mmu)
>  }
>
>  static const struct msm_mmu_funcs funcs = {
> -               .attach = msm_iommu_attach,
>                 .detach = msm_iommu_detach,
>                 .map = msm_iommu_map,
>                 .unmap = msm_iommu_unmap,
> @@ -76,6 +68,7 @@ static const struct msm_mmu_funcs funcs = {
>  struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>  {
>         struct msm_iommu *iommu;
> +       int ret;
>
>         iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
>         if (!iommu)
> @@ -85,5 +78,11 @@ struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
>         msm_mmu_init(&iommu->base, dev, &funcs);
>         iommu_set_fault_handler(domain, msm_fault_handler, iommu);
>
> +       ret = iommu_attach_device(iommu->domain, dev);
> +       if (ret) {
> +               kfree(iommu);
> +               return ERR_PTR(ret);
> +       }
> +
>         return &iommu->base;
>  }
> diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h
> index 67a623f..bae9e8e 100644
> --- a/drivers/gpu/drm/msm/msm_mmu.h
> +++ b/drivers/gpu/drm/msm/msm_mmu.h
> @@ -10,7 +10,6 @@
>  #include <linux/iommu.h>
>
>  struct msm_mmu_funcs {
> -       int (*attach)(struct msm_mmu *mmu);
>         void (*detach)(struct msm_mmu *mmu);
>         int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
>                         unsigned len, int prot);
> --
> 2.7.4
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2019-12-09 20:11 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1574465484-7115-1-git-send-email-jcrouse@codeaurora.org>
2019-11-22 23:31 ` [PATCH v2 1/8] dt-bindings: arm-smmu: Add Adreno GPU variant Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 2/8] iommu: Add DOMAIN_ATTR_SPLIT_TABLES Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 1/8] dt-bindings: arm-smmu: Add Adreno GPU variant Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 2/8] iommu: Add DOMAIN_ATTR_SPLIT_TABLES Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 1/8] dt-bindings: arm-smmu: Add Adreno GPU variant Jordan Crouse
2019-12-03 19:14   ` Rob Herring
2019-12-03 19:14     ` Rob Herring
2019-12-03 19:14     ` Rob Herring
2019-11-22 23:31 ` [PATCH v2 2/8] iommu: Add DOMAIN_ATTR_SPLIT_TABLES Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 3/8] iommu/arm-smmu: Pass io_pgtable_cfg to impl specific init_context Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 4/8] iommu/arm-smmu: Add split pagetables for Adreno IOMMU implementations Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31 ` [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31   ` Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:31   ` Jordan Crouse
2019-11-22 23:31 ` Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 7/8] drm/msm/a6xx: Support split pagetables Jordan Crouse
2019-11-22 23:32   ` Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 6/8] drm/msm: Refactor address space initialization Jordan Crouse
2019-11-22 23:32   ` Jordan Crouse
2019-11-22 23:32 ` Jordan Crouse
2019-11-22 23:32   ` Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 8/8] arm64: dts: qcom: sdm845: Update Adreno GPU SMMU compatible string Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 7/8] drm/msm/a6xx: Support split pagetables Jordan Crouse
2019-11-22 23:32 ` Jordan Crouse
2019-11-22 23:32   ` Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 8/8] arm64: dts: qcom: sdm845: Update Adreno GPU SMMU compatible string Jordan Crouse
2019-11-22 23:32 ` Jordan Crouse
     [not found] ` <1574465484-7115-1-git-send-email-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2019-11-22 23:32   ` [PATCH v2 6/8] drm/msm: Refactor address space initialization Jordan Crouse
2019-11-22 23:32     ` Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 7/8] drm/msm/a6xx: Support split pagetables Jordan Crouse
2019-11-22 23:32 ` [PATCH v2 6/8] drm/msm: Refactor address space initialization Jordan Crouse
2019-11-22 23:32   ` Jordan Crouse
     [not found] ` <0101016e95751c0b-33c9379b-6b8c-43b1-8785-e5e1b6f084f1-000000@us-west-2.amazonses.com>
2019-12-04 15:55   ` [PATCH v2 1/8] dt-bindings: arm-smmu: Add Adreno GPU variant Robin Murphy
2019-12-04 15:55     ` Robin Murphy
2019-12-04 15:55     ` Robin Murphy
2019-12-04 18:01     ` Rob Clark
2019-12-04 18:01       ` Rob Clark
2019-12-04 18:01       ` Rob Clark
     [not found] ` <0101016e95752703-78491f46-41db-441c-b0fb-9a760e4d56cb-000000@us-west-2.amazonses.com>
2019-12-04 16:44   ` [PATCH v2 4/8] iommu/arm-smmu: Add split pagetables for Adreno IOMMU implementations Robin Murphy
2019-12-04 16:44     ` Robin Murphy
2019-12-04 16:44     ` Robin Murphy
2019-12-05 15:51     ` Jordan Crouse
2019-12-05 15:51     ` Jordan Crouse
2019-12-05 15:51     ` Jordan Crouse
     [not found] ` <0101016e95754002-c2fa43aa-b14b-4cff-b6f9-a67c96661e26-000000@us-west-2.amazonses.com>
2019-12-09 20:11   ` Rob Clark [this message]
2019-12-09 20:11     ` [PATCH v2 5/8] drm/msm: Attach the IOMMU device during initialization Rob Clark
2019-12-09 20:11     ` Rob Clark
2019-12-09 20:11     ` Rob Clark
     [not found] ` <0101016e95755c16-5ab6f6e7-83bb-4d01-b746-7cc6ea265ad7-000000@us-west-2.amazonses.com>
2019-12-09 20:14   ` [PATCH v2 6/8] drm/msm: Refactor address space initialization Rob Clark
2019-12-09 20:14     ` Rob Clark
2019-12-09 20:14     ` Rob Clark
2019-12-09 20:14     ` Rob Clark
     [not found] ` <0101016e95754ea7-d6414f4c-9e25-4bc4-a852-7116a783bf63-000000@us-west-2.amazonses.com>
2019-12-09 20:17   ` [PATCH v2 7/8] drm/msm/a6xx: Support split pagetables Rob Clark
2019-12-09 20:17     ` Rob Clark
2019-12-09 20:17     ` Rob Clark
2019-12-09 20:17     ` Rob Clark

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAF6AEGuAjSyMTqCauO2i6wQDEq1Q1baNMisCr=WZi3WHeyzxmw@mail.gmail.com' \
    --to=robdclark@gmail.com \
    --cc=airlied@linux.ie \
    --cc=bzwang@chromium.org \
    --cc=daniel@ffwll.ch \
    --cc=ddavenport@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=georgi.djakov@linaro.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jcrouse@codeaurora.org \
    --cc=jeffrey.l.hugo@gmail.com \
    --cc=jonathan@marek.ca \
    --cc=jsanka@codeaurora.org \
    --cc=kholk11@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mamtashukla555@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=sam@ravnborg.org \
    --cc=sean@poorly.run \
    --cc=tglx@linutronix.de \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.