From 5477d0f4c226847fe030ad00425e00206118b0d6 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Mon, 8 Dec 2014 14:07:39 +0200 Subject: gpu: nvgpu: Generic mem_desc & allocation Make mem_desc a generic container for buffers. Add functions for allocating and mapping buffers to an address space which store their data in mem_desc. Change-Id: I031643442c6fd41f5e7222fe9b7bfcaf9b784db5 Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/660908 GVS: Gerrit_Virtual_Submit Reviewed-by: Seshendra Gadagottu --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 9fdbf2b7..5e925d65 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -1546,6 +1546,56 @@ u64 gk20a_gmmu_map(struct vm_gk20a *vm, return vaddr; } +int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, + size_t size, struct mem_desc *mem) +{ + struct gk20a *g = vm->mm->g; + struct device *d = dev_from_gk20a(g); + int err; + struct sg_table *sgt; + + mem->cpu_va = dma_alloc_coherent(d, size, &mem->iova, GFP_KERNEL); + if (!mem->cpu_va) + return -ENOMEM; + + err = gk20a_get_sgtable(d, &sgt, mem->cpu_va, mem->iova, size); + if (err) + goto fail_free; + + mem->gpu_va = gk20a_gmmu_map(vm, &sgt, size, 0, gk20a_mem_flag_none); + gk20a_free_sgtable(&sgt); + if (!mem->gpu_va) { + err = -ENOMEM; + goto fail_free; + } + + mem->size = size; + + return 0; + +fail_free: + dma_free_coherent(d, size, mem->cpu_va, mem->iova); + mem->cpu_va = NULL; + mem->iova = 0; + + return err; +} + +void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem) +{ + struct gk20a *g = vm->mm->g; + struct device *d = dev_from_gk20a(g); + + if (mem->gpu_va) + gk20a_gmmu_unmap(vm, mem->gpu_va, mem->size, gk20a_mem_flag_none); + mem->gpu_va = 0; + + if (mem->cpu_va) + dma_free_coherent(d, mem->size, mem->cpu_va, mem->iova); + mem->cpu_va = NULL; + mem->iova = 0; +} + dma_addr_t gk20a_mm_gpuva_to_iova_base(struct vm_gk20a *vm, u64 gpu_vaddr) { struct mapped_buffer_node *buffer; -- cgit v1.2.2