Re: [PATCH v3 5/5] drm/msm/a6xx: Support split pagetables

Jordan Crouse
2020-01-06T21:57:58Z

On Tue, Dec 24, 2019 at 08:27:28AM +0530, smasetty@codeaurora.org wrote:
> On 2019-12-16 22:07, Jordan Crouse wrote:
> >Attempt to enable split pagetables if the arm-smmu driver supports it.
> >This will move the default address space from the default region to
> >the address range assigned to TTBR1. The behavior should be transparent
> >to the driver for now but it gets the default buffers out of the way
> >when we want to start swapping TTBR0 for context-specific pagetables.
> >
> >Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
> >---
> >
> > drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 52
> >++++++++++++++++++++++++++++++++++-
> > 1 file changed, 51 insertions(+), 1 deletion(-)
> >
> >diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >index 5dc0b2c..1c6da93 100644
> >--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >@@ -811,6 +811,56 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu
> >*gpu)
> > return (unsigned long)busy_time;
> > }
> >
> >+static struct msm_gem_address_space *
> >+a6xx_create_address_space(struct msm_gpu *gpu, struct platform_device
> >*pdev)
> >+{
> >+ struct iommu_domain *iommu = iommu_domain_alloc(&platform_bus_type);
> >+ struct msm_gem_address_space *aspace;
> >+ struct msm_mmu *mmu;
> >+ u64 start, size;
> >+ u32 val = 1;
> >+ int ret;
> >+
> >+ if (!iommu)
> >+ return ERR_PTR(-ENOMEM);
> >+
> >+ /*
> >+ * Try to request split pagetables - the request has to be made before
> >+ * the domian is attached
> >+ */
> >+ iommu_domain_set_attr(iommu, DOMAIN_ATTR_SPLIT_TABLES, &val);
> >+
> >+ mmu = msm_iommu_new(&pdev->dev, iommu);
> >+ if (IS_ERR(mmu)) {
> >+ iommu_domain_free(iommu);
> >+ return ERR_CAST(mmu);
> >+ }
> >+
> >+ /*
> >+ * After the domain is attached, see if the split tables were actually
> >+ * successful.
> >+ */
> >+ ret = iommu_domain_get_attr(iommu, DOMAIN_ATTR_SPLIT_TABLES, &val);
> >+ if (!ret && val) {
> >+ /*
> >+ * The aperture start will be at the beginning of the TTBR1
> >+ * space so use that as a base
> >+ */
> >+ start = iommu->geometry.aperture_start;
> >+ size = 0xffffffff;
> This should be the va_end and not the size

This is a bug in msm_gem_address_space_create - I intended the parameter to be
the size.

Jordan

--
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project