summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2017-06-12 09:16:49 -0600
committerJordan Crouse <jcrouse@codeaurora.org>2017-06-19 15:50:33 -0600
commitae2cb03114bd664101ff72709a534ed4ddafd012 (patch)
treed0673e00426daac310ae7d76b9e659b6e81cb865 /drivers/gpu
parent1db3fbd43a0bbc38494d11c65828e4d8b8eaa315 (diff)
drm/msm: Attach the MMUs as soon as they are allocated
Currently the normal and secure MMUs are allocated when the address space is created in msm_gpu_init() but not attached until the end of adreno_gpu_init(). Since we can't map buffer objects in the IOMMU without attaching it first this restricts when we can allocate buffer objects in the sequence. For arm-smmu based targets there isn't any reason why we can't immediately attach the MMU after creating the address space - this makes the whole system immediately available to map memory and will facilitate moving around global allocations. Change-Id: Ic0dedbad161396e9d095f3f3d1e4fca2d240a084 Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/msm/adreno/adreno_gpu.c33
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c28
2 files changed, 28 insertions, 33 deletions
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 0c8f24e25ac7..0de73f61bfcb 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -516,7 +516,6 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
{
struct adreno_platform_config *config = pdev->dev.platform_data;
struct msm_gpu *gpu = &adreno_gpu->base;
- struct msm_mmu *mmu;
int ret;
adreno_gpu->funcs = funcs;
@@ -547,22 +546,6 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
return ret;
}
- mmu = gpu->aspace->mmu;
- if (mmu) {
- ret = mmu->funcs->attach(mmu, NULL, 0);
- if (ret)
- return ret;
- }
-
- if (gpu->secure_aspace) {
- mmu = gpu->secure_aspace->mmu;
- if (mmu) {
- ret = mmu->funcs->attach(mmu, NULL, 0);
- if (ret)
- return ret;
- }
- }
-
adreno_gpu->memptrs = msm_gem_kernel_new(drm,
sizeof(*adreno_gpu->memptrs), MSM_BO_UNCACHED, gpu->aspace,
&adreno_gpu->memptrs_bo, &adreno_gpu->memptrs_iova);
@@ -577,28 +560,14 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
void adreno_gpu_cleanup(struct adreno_gpu *gpu)
{
- struct msm_gem_address_space *aspace = gpu->base.aspace;
-
if (gpu->memptrs_bo) {
- if (gpu->memptrs_iova)
- msm_gem_put_iova(gpu->memptrs_bo, aspace);
+ msm_gem_put_iova(gpu->memptrs_bo, gpu->base.aspace);
drm_gem_object_unreference_unlocked(gpu->memptrs_bo);
}
release_firmware(gpu->pm4);
release_firmware(gpu->pfp);
msm_gpu_cleanup(&gpu->base);
-
- if (aspace) {
- aspace->mmu->funcs->detach(aspace->mmu);
- msm_gem_address_space_put(aspace);
- }
-
- if (gpu->base.secure_aspace) {
- aspace = gpu->base.secure_aspace;
- aspace->mmu->funcs->detach(aspace->mmu);
- msm_gem_address_space_put(aspace);
- }
}
static void adreno_snapshot_os(struct msm_gpu *gpu,
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index 4e43b96341f8..159dc6d75cbb 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -810,12 +810,32 @@ msm_gpu_create_address_space(struct msm_gpu *gpu, struct device *dev,
gpu->name, name, PTR_ERR(aspace));
iommu_domain_free(iommu);
- aspace = NULL;
+ return NULL;
+ }
+
+ if (aspace->mmu) {
+ int ret = aspace->mmu->funcs->attach(aspace->mmu, NULL, 0);
+
+ if (ret) {
+ dev_err(gpu->dev->dev,
+ "%s: failed to atach IOMMU '%s': %d\n",
+ gpu->name, name, ret);
+ msm_gem_address_space_put(aspace);
+ aspace = ERR_PTR(ret);
+ }
}
return aspace;
}
+static void msm_gpu_destroy_address_space(struct msm_gem_address_space *aspace)
+{
+ if (!IS_ERR_OR_NULL(aspace) && aspace->mmu)
+ aspace->mmu->funcs->detach(aspace->mmu);
+
+ msm_gem_address_space_put(aspace);
+}
+
int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
struct msm_gpu *gpu, const struct msm_gpu_funcs *funcs,
const char *name, struct msm_gpu_config *config)
@@ -938,6 +958,9 @@ fail:
for (i = 0; i < ARRAY_SIZE(gpu->rb); i++)
msm_ringbuffer_destroy(gpu->rb[i]);
+ msm_gpu_destroy_address_space(gpu->aspace);
+ msm_gpu_destroy_address_space(gpu->secure_aspace);
+
pm_runtime_disable(&pdev->dev);
return ret;
}
@@ -960,4 +983,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
msm_snapshot_destroy(gpu, gpu->snapshot);
pm_runtime_disable(&pdev->dev);
+
+ msm_gpu_destroy_address_space(gpu->aspace);
+ msm_gpu_destroy_address_space(gpu->secure_aspace);
}