summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-03-21 11:47:41 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-04-04 22:01:37 -0400
commit90e42e424aba21aed9aa380795cd564cfe97da28 (patch)
tree02ff8475c62c3e9e049cfbd17011cef80b2c8c06 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent92b667b88856240d3129912934d6e25e526c6d5e (diff)
gpu: nvgpu: Helper for no kernel mapping alloc
Reduce amount of duplicate code around memory allocation by introducing a variant of allocation helper that does not map the allocated buffer to kernel address space. NO_KERNEL_MAPPING allocations return a struct page **, so store the results of allocation in a new field of mem_desc. Bug 1605769 Change-Id: Ib760b9e6d34b229b04d1fb4f3abf10648670fc69 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/721029
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c55
1 files changed, 45 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 954249c6..036f1472 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1532,16 +1532,30 @@ int gk20a_gmmu_alloc_attr(struct gk20a *g, enum dma_attr attr, size_t size, stru
1532 if (attr) { 1532 if (attr) {
1533 DEFINE_DMA_ATTRS(attrs); 1533 DEFINE_DMA_ATTRS(attrs);
1534 dma_set_attr(attr, &attrs); 1534 dma_set_attr(attr, &attrs);
1535 mem->cpu_va = 1535 if (attr == DMA_ATTR_NO_KERNEL_MAPPING) {
1536 dma_alloc_attrs(d, size, &iova, GFP_KERNEL, &attrs); 1536 mem->pages = dma_alloc_attrs(d,
1537 size, &iova, GFP_KERNEL, &attrs);
1538 if (!mem->pages)
1539 return -ENOMEM;
1540 } else {
1541 mem->cpu_va = dma_alloc_attrs(d,
1542 size, &iova, GFP_KERNEL, &attrs);
1543 if (!mem->cpu_va)
1544 return -ENOMEM;
1545 }
1537 } else { 1546 } else {
1538 mem->cpu_va = dma_alloc_coherent(d, size, &iova, GFP_KERNEL); 1547 mem->cpu_va = dma_alloc_coherent(d, size, &iova, GFP_KERNEL);
1548 if (!mem->cpu_va)
1549 return -ENOMEM;
1539 } 1550 }
1540 1551
1541 if (!mem->cpu_va) 1552 if (attr == DMA_ATTR_NO_KERNEL_MAPPING)
1542 return -ENOMEM; 1553 err = gk20a_get_sgtable_from_pages(d, &mem->sgt, mem->pages,
1543 1554 iova, size);
1544 err = gk20a_get_sgtable(d, &mem->sgt, mem->cpu_va, iova, size); 1555 else {
1556 err = gk20a_get_sgtable(d, &mem->sgt, mem->cpu_va, iova, size);
1557 memset(mem->cpu_va, 0, size);
1558 }
1545 if (err) 1559 if (err)
1546 goto fail_free; 1560 goto fail_free;
1547 1561
@@ -1559,19 +1573,40 @@ fail_free:
1559 return err; 1573 return err;
1560} 1574}
1561 1575
1562void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem) 1576void gk20a_gmmu_free_attr(struct gk20a *g, enum dma_attr attr,
1577 struct mem_desc *mem)
1563{ 1578{
1564 struct device *d = dev_from_gk20a(g); 1579 struct device *d = dev_from_gk20a(g);
1565 1580
1566 if (mem->cpu_va) 1581 if (mem->cpu_va) {
1567 dma_free_coherent(d, mem->size, mem->cpu_va, 1582 if (attr) {
1583 DEFINE_DMA_ATTRS(attrs);
1584 dma_set_attr(attr, &attrs);
1585 if (attr == DMA_ATTR_NO_KERNEL_MAPPING)
1586 dma_free_attrs(d, mem->size, mem->pages,
1587 sg_dma_address(mem->sgt->sgl),
1588 &attrs);
1589 else
1590 dma_free_attrs(d, mem->size, mem->cpu_va,
1591 sg_dma_address(mem->sgt->sgl),
1592 &attrs);
1593 } else {
1594 dma_free_coherent(d, mem->size, mem->cpu_va,
1568 sg_dma_address(mem->sgt->sgl)); 1595 sg_dma_address(mem->sgt->sgl));
1569 mem->cpu_va = NULL; 1596 }
1597
1598 mem->cpu_va = NULL;
1599 }
1570 1600
1571 if (mem->sgt) 1601 if (mem->sgt)
1572 gk20a_free_sgtable(&mem->sgt); 1602 gk20a_free_sgtable(&mem->sgt);
1573} 1603}
1574 1604
1605void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem)
1606{
1607 return gk20a_gmmu_free_attr(g, 0, mem);
1608}
1609
1575int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, struct mem_desc *mem) 1610int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, struct mem_desc *mem)
1576{ 1611{
1577 return gk20a_gmmu_alloc_map_attr(vm, 0, size, mem); 1612 return gk20a_gmmu_alloc_map_attr(vm, 0, size, mem);