drm/msm: use upstream iommu
authorRob Clark <robdclark@gmail.com>
Thu, 10 Jul 2014 02:08:15 +0000 (22:08 -0400)
committerRob Clark <robdclark@gmail.com>
Mon, 4 Aug 2014 15:55:29 +0000 (11:55 -0400)
Downstream kernel IOMMU had a non-standard way of dealing with multiple
devices and multiple ports/contexts.  We don't need that on upstream
kernel, so rip out the crazy.

Note that we have to move the pinning of the ringbuffer to after the
IOMMU is attached.  No idea how that managed to work properly on the
downstream kernel.

For now, I am leaving the IOMMU port name stuff in place, to simplify
things for folks trying to backport latest drm/msm to device kernels.
Once we no longer have to care about pre-DT kernels, we can drop this
and instead backport upstream IOMMU driver.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/Kconfig
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_iommu.c
drivers/gpu/drm/msm/msm_mmu.h

index f12388967856bfad8522814f48afd4e20b1052e3..c99c50de3226d663bea299b722faeb2691581fbe 100644 (file)
@@ -2,7 +2,6 @@
 config DRM_MSM
        tristate "MSM DRM"
        depends on DRM
-       depends on MSM_IOMMU
        depends on ARCH_QCOM || (ARM && COMPILE_TEST)
        select DRM_KMS_HELPER
        select SHMEM
index 28ca8cd8b09ed11766796b1dd12665cde74b8ea3..76c1df73e7475fff826b93536d4b5d713125bef5 100644 (file)
@@ -91,9 +91,17 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value)
 int adreno_hw_init(struct msm_gpu *gpu)
 {
        struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
+       int ret;
 
        DBG("%s", gpu->name);
 
+       ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->id, &gpu->rb_iova);
+       if (ret) {
+               gpu->rb_iova = 0;
+               dev_err(gpu->dev->dev, "could not map ringbuffer: %d\n", ret);
+               return ret;
+       }
+
        /* Setup REG_CP_RB_CNTL: */
        gpu_write(gpu, REG_AXXX_CP_RB_CNTL,
                        /* size is log2(quad-words): */
index a9579ce2ffb9ee2bb1314cea98e2e89fff10003c..733646c0d3f871cc090efedb741fb8ae73ec790f 100644 (file)
@@ -361,7 +361,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
        mdelay(16);
 
        if (config->iommu) {
-               mmu = msm_iommu_new(dev, config->iommu);
+               mmu = msm_iommu_new(&pdev->dev, config->iommu);
                if (IS_ERR(mmu)) {
                        ret = PTR_ERR(mmu);
                        goto fail;
index 33b826dc493d5426ad64ff8f7b5909e9af0a8e36..17175b5035b3dbe156e64ec03433a00c80713288 100644 (file)
@@ -320,7 +320,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
        mdelay(16);
 
        if (config->iommu) {
-               mmu = msm_iommu_new(dev, config->iommu);
+               mmu = msm_iommu_new(&pdev->dev, config->iommu);
                if (IS_ERR(mmu)) {
                        ret = PTR_ERR(mmu);
                        dev_err(dev->dev, "failed to init iommu: %d\n", ret);
index c6322197db8cf15a1f9f96ea627afae5b10dc46b..915240b4b80a082277d4f5c20f1c1f9ba68ad507 100644 (file)
@@ -606,7 +606,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
        iommu = iommu_domain_alloc(&platform_bus_type);
        if (iommu) {
                dev_info(drm->dev, "%s: using IOMMU\n", name);
-               gpu->mmu = msm_iommu_new(drm, iommu);
+               gpu->mmu = msm_iommu_new(&pdev->dev, iommu);
        } else {
                dev_info(drm->dev, "%s: no IOMMU, fallback to VRAM carveout!\n", name);
        }
@@ -621,13 +621,6 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                goto fail;
        }
 
-       ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->id, &gpu->rb_iova);
-       if (ret) {
-               gpu->rb_iova = 0;
-               dev_err(drm->dev, "could not map ringbuffer: %d\n", ret);
-               goto fail;
-       }
-
        bs_init(gpu);
 
        return 0;
index 4b2ad9181edffb10239cb31c959376ecb429c689..099af483fdf0328925b23be1fc9c635a5c4c63ba 100644 (file)
@@ -33,39 +33,14 @@ static int msm_fault_handler(struct iommu_domain *iommu, struct device *dev,
 
 static int msm_iommu_attach(struct msm_mmu *mmu, const char **names, int cnt)
 {
-       struct drm_device *dev = mmu->dev;
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       int i, ret;
-
-       for (i = 0; i < cnt; i++) {
-               struct device *msm_iommu_get_ctx(const char *ctx_name);
-               struct device *ctx = msm_iommu_get_ctx(names[i]);
-               if (IS_ERR_OR_NULL(ctx)) {
-                       dev_warn(dev->dev, "couldn't get %s context", names[i]);
-                       continue;
-               }
-               ret = iommu_attach_device(iommu->domain, ctx);
-               if (ret) {
-                       dev_warn(dev->dev, "could not attach iommu to %s", names[i]);
-                       return ret;
-               }
-       }
-
-       return 0;
+       return iommu_attach_device(iommu->domain, mmu->dev);
 }
 
 static void msm_iommu_detach(struct msm_mmu *mmu, const char **names, int cnt)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       int i;
-
-       for (i = 0; i < cnt; i++) {
-               struct device *msm_iommu_get_ctx(const char *ctx_name);
-               struct device *ctx = msm_iommu_get_ctx(names[i]);
-               if (IS_ERR_OR_NULL(ctx))
-                       continue;
-               iommu_detach_device(iommu->domain, ctx);
-       }
+       iommu_detach_device(iommu->domain, mmu->dev);
 }
 
 static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova,
@@ -149,7 +124,7 @@ static const struct msm_mmu_funcs funcs = {
                .destroy = msm_iommu_destroy,
 };
 
-struct msm_mmu *msm_iommu_new(struct drm_device *dev, struct iommu_domain *domain)
+struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
 {
        struct msm_iommu *iommu;
 
index 21da6d154f715395417f28a33562c2520079be9d..7cd88d9dc1555f4e4f20482c58650fdcc7689d7c 100644 (file)
@@ -32,17 +32,17 @@ struct msm_mmu_funcs {
 
 struct msm_mmu {
        const struct msm_mmu_funcs *funcs;
-       struct drm_device *dev;
+       struct device *dev;
 };
 
-static inline void msm_mmu_init(struct msm_mmu *mmu, struct drm_device *dev,
+static inline void msm_mmu_init(struct msm_mmu *mmu, struct device *dev,
                const struct msm_mmu_funcs *funcs)
 {
        mmu->dev = dev;
        mmu->funcs = funcs;
 }
 
-struct msm_mmu *msm_iommu_new(struct drm_device *dev, struct iommu_domain *domain);
-struct msm_mmu *msm_gpummu_new(struct drm_device *dev, struct msm_gpu *gpu);
+struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain);
+struct msm_mmu *msm_gpummu_new(struct device *dev, struct msm_gpu *gpu);
 
 #endif /* __MSM_MMU_H__ */