diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2014-12-08 07:07:39 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:12:27 -0400 |
commit | 5477d0f4c226847fe030ad00425e00206118b0d6 (patch) | |
tree | f9009dd92f5e4096a75ca126f177c52f77778fde /drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |
parent | 69bb5e156944d5df715d6bb388fd1c97fe458f18 (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.c | 50 |
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 | ||
1549 | int 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 | |||
1576 | fail_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 | |||
1584 | void 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 | |||
1549 | dma_addr_t gk20a_mm_gpuva_to_iova_base(struct vm_gk20a *vm, u64 gpu_vaddr) | 1599 | dma_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; |