Loading drivers/gpu/msm/kgsl_iommu.c +18 −3 Original line number Diff line number Diff line Loading @@ -2266,6 +2266,22 @@ static uint64_t kgsl_iommu_find_svm_region(struct kgsl_pagetable *pagetable, return addr; } static bool iommu_addr_in_svm_ranges(struct kgsl_iommu_pt *pt, u64 gpuaddr, u64 size) { if ((gpuaddr >= pt->compat_va_start && gpuaddr < pt->compat_va_end) && ((gpuaddr + size) > pt->compat_va_start && (gpuaddr + size) <= pt->compat_va_end)) return true; if ((gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) && ((gpuaddr + size) > pt->svm_start && (gpuaddr + size) <= pt->svm_end)) return true; return false; } static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, uint64_t gpuaddr, uint64_t size) { Loading @@ -2273,9 +2289,8 @@ static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, struct kgsl_iommu_pt *pt = pagetable->priv; struct rb_node *node; /* Make sure the requested address doesn't fall in the global range */ if (ADDR_IN_GLOBAL(pagetable->mmu, gpuaddr) || ADDR_IN_GLOBAL(pagetable->mmu, gpuaddr + size)) /* Make sure the requested address doesn't fall out of SVM range */ if (!iommu_addr_in_svm_ranges(pt, gpuaddr, size)) return -ENOMEM; spin_lock(&pagetable->lock); Loading Loading
drivers/gpu/msm/kgsl_iommu.c +18 −3 Original line number Diff line number Diff line Loading @@ -2266,6 +2266,22 @@ static uint64_t kgsl_iommu_find_svm_region(struct kgsl_pagetable *pagetable, return addr; } static bool iommu_addr_in_svm_ranges(struct kgsl_iommu_pt *pt, u64 gpuaddr, u64 size) { if ((gpuaddr >= pt->compat_va_start && gpuaddr < pt->compat_va_end) && ((gpuaddr + size) > pt->compat_va_start && (gpuaddr + size) <= pt->compat_va_end)) return true; if ((gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) && ((gpuaddr + size) > pt->svm_start && (gpuaddr + size) <= pt->svm_end)) return true; return false; } static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, uint64_t gpuaddr, uint64_t size) { Loading @@ -2273,9 +2289,8 @@ static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, struct kgsl_iommu_pt *pt = pagetable->priv; struct rb_node *node; /* Make sure the requested address doesn't fall in the global range */ if (ADDR_IN_GLOBAL(pagetable->mmu, gpuaddr) || ADDR_IN_GLOBAL(pagetable->mmu, gpuaddr + size)) /* Make sure the requested address doesn't fall out of SVM range */ if (!iommu_addr_in_svm_ranges(pt, gpuaddr, size)) return -ENOMEM; spin_lock(&pagetable->lock); Loading