diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2015-12-03 08:38:11 -0700 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:16:31 -0700 |
commit | 7359adc0bfd3d94e4aa8f66b7f18aa276bffa598 (patch) | |
tree | 2c386398a04aeeeb068d53c81b508e4c4eb8b03d /drivers/gpu/msm/kgsl_iommu.c | |
parent | ca2aa87713dd63dd67fd27e17c19c5955af16146 (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.c | 34 |
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 |