diff options
Diffstat (limited to 'drivers/staging/android/ion/ion_carveout_heap.c')
-rw-r--r-- | drivers/staging/android/ion/ion_carveout_heap.c | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/drivers/staging/android/ion/ion_carveout_heap.c b/drivers/staging/android/ion/ion_carveout_heap.c deleted file mode 100644 index bb9d614767a2..000000000000 --- a/drivers/staging/android/ion/ion_carveout_heap.c +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * ION Memory Allocator carveout heap helper - * - * Copyright (C) 2011 Google, Inc. - */ - -#include <linux/dma-mapping.h> -#include <linux/err.h> -#include <linux/genalloc.h> -#include <linux/io.h> -#include <linux/mm.h> -#include <linux/scatterlist.h> -#include <linux/slab.h> - -#include "ion.h" - -#define ION_CARVEOUT_ALLOCATE_FAIL -1 - -struct ion_carveout_heap { - struct ion_heap heap; - struct gen_pool *pool; -}; - -static phys_addr_t ion_carveout_allocate(struct ion_heap *heap, - unsigned long size) -{ - struct ion_carveout_heap *carveout_heap = - container_of(heap, struct ion_carveout_heap, heap); - unsigned long offset = gen_pool_alloc(carveout_heap->pool, size); - - if (!offset) - return ION_CARVEOUT_ALLOCATE_FAIL; - - return offset; -} - -static void ion_carveout_free(struct ion_heap *heap, phys_addr_t addr, - unsigned long size) -{ - struct ion_carveout_heap *carveout_heap = - container_of(heap, struct ion_carveout_heap, heap); - - if (addr == ION_CARVEOUT_ALLOCATE_FAIL) - return; - - gen_pool_free(carveout_heap->pool, addr, size); -} - -static int ion_carveout_heap_allocate(struct ion_heap *heap, - struct ion_buffer *buffer, - unsigned long size, - unsigned long flags) -{ - struct sg_table *table; - phys_addr_t paddr; - int ret; - - table = kmalloc(sizeof(*table), GFP_KERNEL); - if (!table) - return -ENOMEM; - ret = sg_alloc_table(table, 1, GFP_KERNEL); - if (ret) - goto err_free; - - paddr = ion_carveout_allocate(heap, size); - if (paddr == ION_CARVEOUT_ALLOCATE_FAIL) { - ret = -ENOMEM; - goto err_free_table; - } - - sg_set_page(table->sgl, pfn_to_page(PFN_DOWN(paddr)), size, 0); - buffer->sg_table = table; - - return 0; - -err_free_table: - sg_free_table(table); -err_free: - kfree(table); - return ret; -} - -static void ion_carveout_heap_free(struct ion_buffer *buffer) -{ - struct ion_heap *heap = buffer->heap; - struct sg_table *table = buffer->sg_table; - struct page *page = sg_page(table->sgl); - phys_addr_t paddr = PFN_PHYS(page_to_pfn(page)); - - ion_heap_buffer_zero(buffer); - - ion_carveout_free(heap, paddr, buffer->size); - sg_free_table(table); - kfree(table); -} - -static struct ion_heap_ops carveout_heap_ops = { - .allocate = ion_carveout_heap_allocate, - .free = ion_carveout_heap_free, - .map_user = ion_heap_map_user, - .map_kernel = ion_heap_map_kernel, - .unmap_kernel = ion_heap_unmap_kernel, -}; - -struct ion_heap *ion_carveout_heap_create(phys_addr_t base, size_t size) -{ - struct ion_carveout_heap *carveout_heap; - int ret; - - struct page *page; - - page = pfn_to_page(PFN_DOWN(base)); - ret = ion_heap_pages_zero(page, size, pgprot_writecombine(PAGE_KERNEL)); - if (ret) - return ERR_PTR(ret); - - carveout_heap = kzalloc(sizeof(*carveout_heap), GFP_KERNEL); - if (!carveout_heap) - return ERR_PTR(-ENOMEM); - - carveout_heap->pool = gen_pool_create(PAGE_SHIFT, -1); - if (!carveout_heap->pool) { - kfree(carveout_heap); - return ERR_PTR(-ENOMEM); - } - gen_pool_add(carveout_heap->pool, base, size, -1); - carveout_heap->heap.ops = &carveout_heap_ops; - carveout_heap->heap.type = ION_HEAP_TYPE_CARVEOUT; - carveout_heap->heap.flags = ION_HEAP_FLAG_DEFER_FREE; - - return &carveout_heap->heap; -} |