summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-12-08 07:07:39 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:12:27 -0400
commit5477d0f4c226847fe030ad00425e00206118b0d6 (patch)
treef9009dd92f5e4096a75ca126f177c52f77778fde /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent69bb5e156944d5df715d6bb388fd1c97fe458f18 (diff)
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 <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/660908 GVS: Gerrit_Virtual_Submit Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c50
1 files changed, 50 insertions, 0 deletions
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,
1546 return vaddr; 1546 return vaddr;
1547} 1547}
1548 1548
1549int gk20a_gmmu_alloc_map(struct vm_gk20a *vm,
1550 size_t size, struct mem_desc *mem)
1551{
1552 struct gk20a *g = vm->mm->g;
1553 struct device *d = dev_from_gk20a(g);
1554 int err;
1555 struct sg_table *sgt;
1556
1557 mem->cpu_va = dma_alloc_coherent(d, size, &mem->iova, GFP_KERNEL);
1558 if (!mem->cpu_va)
1559 return -ENOMEM;
1560
1561 err = gk20a_get_sgtable(d, &sgt, mem->cpu_va, mem->iova, size);
1562 if (err)
1563 goto fail_free;
1564
1565 mem->gpu_va = gk20a_gmmu_map(vm, &sgt, size, 0, gk20a_mem_flag_none);
1566 gk20a_free_sgtable(&sgt);
1567 if (!mem->gpu_va) {
1568 err = -ENOMEM;
1569 goto fail_free;
1570 }
1571
1572 mem->size = size;
1573
1574 return 0;
1575
1576fail_free:
1577 dma_free_coherent(d, size, mem->cpu_va, mem->iova);
1578 mem->cpu_va = NULL;
1579 mem->iova = 0;
1580
1581 return err;
1582}
1583
1584void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem)
1585{
1586 struct gk20a *g = vm->mm->g;
1587 struct device *d = dev_from_gk20a(g);
1588
1589 if (mem->gpu_va)
1590 gk20a_gmmu_unmap(vm, mem->gpu_va, mem->size, gk20a_mem_flag_none);
1591 mem->gpu_va = 0;
1592
1593 if (mem->cpu_va)
1594 dma_free_coherent(d, mem->size, mem->cpu_va, mem->iova);
1595 mem->cpu_va = NULL;
1596 mem->iova = 0;
1597}
1598
1549dma_addr_t gk20a_mm_gpuva_to_iova_base(struct vm_gk20a *vm, u64 gpu_vaddr) 1599dma_addr_t gk20a_mm_gpuva_to_iova_base(struct vm_gk20a *vm, u64 gpu_vaddr)
1550{ 1600{
1551 struct mapped_buffer_node *buffer; 1601 struct mapped_buffer_node *buffer;