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

Commit 390bef8c authored by Jordan Crouse's avatar Jordan Crouse
Browse files

msm: kgsl: Consolidate the contiguous memory allocation functions



We have competing contiguous memory allocation functions that
serve the same purpose. Use CMA for all our contiguous needs
and factor out the legacy code.

Change-Id: Ic0dedbad9965a456b24bc78e1f360242568f15bb
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 4f40ffa1
Loading
Loading
Loading
Loading
+0 −49
Original line number Diff line number Diff line
@@ -455,13 +455,6 @@ static int kgsl_contiguous_vmfault(struct kgsl_memdesc *memdesc,
	return VM_FAULT_NOPAGE;
}

static void kgsl_coherent_free(struct kgsl_memdesc *memdesc)
{
	kgsl_driver.stats.coherent -= memdesc->size;
	dma_free_coherent(memdesc->dev, memdesc->size,
			  memdesc->hostptr, memdesc->physaddr);
}

static void kgsl_cma_coherent_free(struct kgsl_memdesc *memdesc)
{
	if (memdesc->hostptr) {
@@ -487,10 +480,6 @@ static struct kgsl_memdesc_ops kgsl_cma_ops = {
	.vmfault = kgsl_contiguous_vmfault,
};

static struct kgsl_memdesc_ops kgsl_coherent_ops = {
	.free = kgsl_coherent_free,
};

int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, size_t offset,
			size_t size, unsigned int op)
{
@@ -721,44 +710,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc,
}
EXPORT_SYMBOL(kgsl_sharedmem_page_alloc_user);

int
kgsl_sharedmem_alloc_coherent(struct kgsl_device *device,
			struct kgsl_memdesc *memdesc, size_t size)
{
	int result = 0;

	size = ALIGN(size, PAGE_SIZE);
	if (size == 0)
		return -EINVAL;

	memdesc->size = size;
	memdesc->ops = &kgsl_coherent_ops;
	memdesc->dev = &device->pdev->dev;

	memdesc->hostptr = dma_alloc_coherent(memdesc->dev, size,
					&memdesc->physaddr, GFP_KERNEL);
	if (memdesc->hostptr == NULL) {
		result = -ENOMEM;
		goto err;
	}

	result = memdesc_sg_phys(memdesc, memdesc->physaddr, size);
	if (result)
		goto err;

	/* Record statistics */

	KGSL_STATS_ADD(size, kgsl_driver.stats.coherent,
		       kgsl_driver.stats.coherent_max);

err:
	if (result)
		kgsl_sharedmem_free(memdesc);

	return result;
}
EXPORT_SYMBOL(kgsl_sharedmem_alloc_coherent);

void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc)
{
	if (memdesc == NULL || memdesc->size == 0)
+5 −5
Original line number Diff line number Diff line
@@ -33,9 +33,6 @@ int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc,
				struct kgsl_pagetable *pagetable,
				size_t size);

int kgsl_sharedmem_alloc_coherent(struct kgsl_device *device,
			struct kgsl_memdesc *memdesc, size_t size);

int kgsl_cma_alloc_coherent(struct kgsl_device *device,
			struct kgsl_memdesc *memdesc,
			struct kgsl_pagetable *pagetable, size_t size);
@@ -233,11 +230,14 @@ static inline int
kgsl_allocate_contiguous(struct kgsl_device *device,
			struct kgsl_memdesc *memdesc, size_t size)
{
	int ret  = kgsl_sharedmem_alloc_coherent(device, memdesc, size);
	int ret;

	size = ALIGN(size, PAGE_SIZE);

	ret = kgsl_cma_alloc_coherent(device, memdesc, NULL, size);
	if (!ret && (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE))
		memdesc->gpuaddr = memdesc->physaddr;

	memdesc->flags |= (KGSL_MEMTYPE_KERNEL << KGSL_MEMTYPE_SHIFT);
	return ret;
}