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

Commit a6aee4cf authored by Lynus Vaz's avatar Lynus Vaz
Browse files

msm: kgsl: Pad sparse objects when mapping them



The device may require a minimum alignment and padding for GPU VA
mappings. Pad sparse objects up to this alignment when mapping them.

Change-Id: I807eec24a3b4adbfcb1aa8347783a61ed70d355b
Signed-off-by: default avatarLynus Vaz <lvaz@codeaurora.org>
parent 49d8a2ad
Loading
Loading
Loading
Loading
+3 −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);
+7 −2
Original line number Diff line number Diff line
@@ -1865,9 +1865,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) {
@@ -1877,6 +1878,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;
@@ -1888,7 +1893,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);
	}