summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm/kgsl_iommu.c
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2015-12-03 08:38:11 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:16:31 -0700
commit7359adc0bfd3d94e4aa8f66b7f18aa276bffa598 (patch)
tree2c386398a04aeeeb068d53c81b508e4c4eb8b03d /drivers/gpu/msm/kgsl_iommu.c
parentca2aa87713dd63dd67fd27e17c19c5955af16146 (diff)
msm: kgsl: Move setstate to the IOMMU initialization
The setstate memory is a IOMMU specific construct. Move it to the IOMMU code where it belongs. Change-Id: Ic0dedbada977f2861f7c1300a5365da5b09d70a9 Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm/kgsl_iommu.c')
-rw-r--r--drivers/gpu/msm/kgsl_iommu.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c
index a0e84472c8e8..0235fd5ebaff 100644
--- a/drivers/gpu/msm/kgsl_iommu.c
+++ b/drivers/gpu/msm/kgsl_iommu.c
@@ -957,6 +957,24 @@ static unsigned int kgsl_iommu_get_reg_ahbaddr(struct kgsl_mmu *mmu,
return result;
}
+static int _setstate_alloc(struct kgsl_device *device,
+ struct kgsl_iommu *iommu)
+{
+ int ret;
+
+ ret = kgsl_sharedmem_alloc_contig(device, &iommu->setstate, NULL,
+ PAGE_SIZE);
+ if (ret)
+ return ret;
+
+ /* Mark the setstate memory as read only */
+ iommu->setstate.flags |= KGSL_MEMFLAGS_GPUREADONLY;
+
+ kgsl_sharedmem_set(device, &iommu->setstate, 0, 0, PAGE_SIZE);
+
+ return 0;
+}
+
static int kgsl_iommu_init(struct kgsl_mmu *mmu)
{
/*
@@ -974,6 +992,10 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu)
return -EINVAL;
}
+ status = _setstate_alloc(KGSL_MMU_DEVICE(mmu), iommu);
+ if (status)
+ return status;
+
/* check requirements for per process pagetables */
if (ctx->gpu_offset == UINT_MAX) {
KGSL_CORE_ERR("missing qcom,gpu-offset forces global pt\n");
@@ -994,7 +1016,8 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu)
if (iommu->regbase == NULL) {
KGSL_CORE_ERR("Could not map IOMMU registers 0x%lx:0x%x\n",
iommu->regstart, iommu->regsize);
- return -ENOMEM;
+ status = -ENOMEM;
+ goto done;
}
if (addr_entry_cache == NULL) {
@@ -1014,7 +1037,12 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu)
}
}
+ kgsl_add_global_pt_entry(KGSL_MMU_DEVICE(mmu), &iommu->setstate);
+
done:
+ if (status)
+ kgsl_sharedmem_free(&iommu->setstate);
+
return status;
}
@@ -1311,7 +1339,7 @@ static void kgsl_iommu_stop(struct kgsl_mmu *mmu)
}
}
-static int kgsl_iommu_close(struct kgsl_mmu *mmu)
+static void kgsl_iommu_close(struct kgsl_mmu *mmu)
{
struct kgsl_iommu *iommu = mmu->priv;
int i;
@@ -1336,7 +1364,7 @@ static int kgsl_iommu_close(struct kgsl_mmu *mmu)
kgsl_guard_page = NULL;
}
- return 0;
+ kgsl_free_global(&iommu->setstate);
}
static u64