Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c68d71f0 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Pad sparse objects when mapping them"

parents 34f2dc73 a6aee4cf
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -425,7 +425,7 @@ static int kgsl_mem_entry_attach_process(struct kgsl_device *device,
			ret = kgsl_mmu_sparse_dummy_map(
				entry->memdesc.pagetable,
				&entry->memdesc, 0,
					entry->memdesc.size);
				kgsl_memdesc_footprint(&entry->memdesc));
		else if (entry->memdesc.gpuaddr)
			ret = kgsl_mmu_map(entry->memdesc.pagetable,
					&entry->memdesc);
@@ -4349,6 +4349,8 @@ static unsigned long _get_svm_area(struct kgsl_process_private *private,
	else
		align = SZ_4K;

	align = max_t(uint64_t, align, entry->memdesc.pad_to);

	/* get the GPU pagetable's SVM range */
	if (kgsl_mmu_svm_range(private->pagetable, &start, &end,
				entry->memdesc.flags))
+9 −3
Original line number Diff line number Diff line
@@ -1869,9 +1869,10 @@ static int kgsl_iommu_sparse_dummy_map(struct kgsl_pagetable *pt,
	struct page **pages = NULL;
	struct sg_table sgt;
	int count = size >> PAGE_SHIFT;
	unsigned int map_flags;

	/* verify the offset is within our range */
	if (size + offset > memdesc->size)
	if (size + offset > kgsl_memdesc_footprint(memdesc))
		return -EINVAL;

	if (kgsl_dummy_page == NULL) {
@@ -1881,6 +1882,10 @@ static int kgsl_iommu_sparse_dummy_map(struct kgsl_pagetable *pt,
			return -ENOMEM;
	}

	map_flags = MMU_FEATURE(pt->mmu, KGSL_MMU_PAD_VA) ?
				_get_protection_flags(pt, memdesc) :
				IOMMU_READ | IOMMU_NOEXEC;

	pages = kcalloc(count, sizeof(struct page *), GFP_KERNEL);
	if (pages == NULL)
		return -ENOMEM;
@@ -1892,7 +1897,7 @@ static int kgsl_iommu_sparse_dummy_map(struct kgsl_pagetable *pt,
			0, size, GFP_KERNEL);
	if (ret == 0) {
		ret = _iommu_map_sg_sync_pc(pt, memdesc->gpuaddr + offset,
				sgt.sgl, sgt.nents, IOMMU_READ | IOMMU_NOEXEC);
				sgt.sgl, sgt.nents, map_flags);
		sg_free_table(&sgt);
	}

@@ -2472,7 +2477,8 @@ static int kgsl_iommu_get_gpuaddr(struct kgsl_pagetable *pagetable,

	size = kgsl_memdesc_footprint(memdesc);

	align = 1 << kgsl_memdesc_get_align(memdesc);
	align = max_t(uint64_t, 1 << kgsl_memdesc_get_align(memdesc),
			memdesc->pad_to);

	if (memdesc->flags & KGSL_MEMFLAGS_FORCE_32BIT) {
		start = pt->compat_va_start;
+0 −1
Original line number Diff line number Diff line
@@ -135,7 +135,6 @@ kgsl_memdesc_get_memtype(const struct kgsl_memdesc *memdesc)
static inline int
kgsl_memdesc_set_align(struct kgsl_memdesc *memdesc, unsigned int align)
{
	align = max_t(unsigned int, align, ilog2(memdesc->pad_to));
	if (align > 32)
		align = 32;