summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/linux/dma.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2018-01-29 15:34:57 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-02-08 19:34:53 -0500
commitcb54d7ca8f7d9d99780ce1f82e0f7253a8556571 (patch)
treeb272c27201ab7f1c5ea504e0d9cd7b38c70dfa5d /drivers/gpu/nvgpu/common/linux/dma.c
parentdc110896cd6dbda8296720da816c1e81e64aca04 (diff)
gpu: nvgpu: Rely on own dma attribute handling
Tegra kernel abstracts Linux 4.4 vs Linux 4.9 differences from drivers. Upstream kernel does not provide that facility, so add nvgpu internal way of dealing with the differences. JIRA NVGPU-4 Change-Id: I8289fdcf98873de14398bffc808d89a675f2aa15 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1648160 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/dma.c')
-rw-r--r--drivers/gpu/nvgpu/common/linux/dma.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/dma.c b/drivers/gpu/nvgpu/common/linux/dma.c
index ec9c3b5a..fe4e9bc8 100644
--- a/drivers/gpu/nvgpu/common/linux/dma.c
+++ b/drivers/gpu/nvgpu/common/linux/dma.c
@@ -14,7 +14,6 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16 16
17#include <linux/dma-attrs.h>
18#include <linux/dma-mapping.h> 17#include <linux/dma-mapping.h>
19#include <linux/version.h> 18#include <linux/version.h>
20 19
@@ -35,6 +34,17 @@
35#include "platform_gk20a.h" 34#include "platform_gk20a.h"
36#include "os_linux.h" 35#include "os_linux.h"
37 36
37#ifdef __DMA_ATTRS_LONGS
38#define NVGPU_DEFINE_DMA_ATTRS(x) \
39 struct dma_attrs x = { \
40 .flags = { [0 ... __DMA_ATTRS_LONGS-1] = 0 }, \
41 }
42#define NVGPU_DMA_ATTR(attrs) &attrs
43#else
44#define NVGPU_DEFINE_DMA_ATTRS(attrs) unsigned long attrs = 0
45#define NVGPU_DMA_ATTR(attrs) attrs
46#endif
47
38/* 48/*
39 * Enough to hold all the possible flags in string form. When a new flag is 49 * Enough to hold all the possible flags in string form. When a new flag is
40 * added it must be added here as well!! 50 * added it must be added here as well!!
@@ -211,7 +221,7 @@ int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
211 struct device *d = dev_from_gk20a(g); 221 struct device *d = dev_from_gk20a(g);
212 int err; 222 int err;
213 dma_addr_t iova; 223 dma_addr_t iova;
214 DEFINE_DMA_ATTRS(dma_attrs); 224 NVGPU_DEFINE_DMA_ATTRS(dma_attrs);
215 void *alloc_ret; 225 void *alloc_ret;
216 226
217 /* 227 /*
@@ -233,7 +243,7 @@ int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
233 243
234 alloc_ret = dma_alloc_attrs(d, size, &iova, 244 alloc_ret = dma_alloc_attrs(d, size, &iova,
235 GFP_KERNEL|__GFP_ZERO, 245 GFP_KERNEL|__GFP_ZERO,
236 __DMA_ATTR(dma_attrs)); 246 NVGPU_DMA_ATTR(dma_attrs));
237 if (!alloc_ret) 247 if (!alloc_ret)
238 return -ENOMEM; 248 return -ENOMEM;
239 249
@@ -260,7 +270,7 @@ int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
260 270
261fail_free: 271fail_free:
262 g->dma_memory_used -= mem->aligned_size; 272 g->dma_memory_used -= mem->aligned_size;
263 dma_free_attrs(d, size, alloc_ret, iova, __DMA_ATTR(dma_attrs)); 273 dma_free_attrs(d, size, alloc_ret, iova, NVGPU_DMA_ATTR(dma_attrs));
264 mem->cpu_va = NULL; 274 mem->cpu_va = NULL;
265 mem->priv.sgt = NULL; 275 mem->priv.sgt = NULL;
266 mem->size = 0; 276 mem->size = 0;
@@ -460,18 +470,18 @@ static void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
460 !(mem->mem_flags & __NVGPU_MEM_FLAG_NO_DMA) && 470 !(mem->mem_flags & __NVGPU_MEM_FLAG_NO_DMA) &&
461 (mem->cpu_va || mem->priv.pages)) { 471 (mem->cpu_va || mem->priv.pages)) {
462 if (mem->priv.flags) { 472 if (mem->priv.flags) {
463 DEFINE_DMA_ATTRS(dma_attrs); 473 NVGPU_DEFINE_DMA_ATTRS(dma_attrs);
464 474
465 nvgpu_dma_flags_to_attrs(&dma_attrs, mem->priv.flags); 475 nvgpu_dma_flags_to_attrs(&dma_attrs, mem->priv.flags);
466 476
467 if (mem->priv.flags & NVGPU_DMA_NO_KERNEL_MAPPING) { 477 if (mem->priv.flags & NVGPU_DMA_NO_KERNEL_MAPPING) {
468 dma_free_attrs(d, mem->aligned_size, mem->priv.pages, 478 dma_free_attrs(d, mem->aligned_size, mem->priv.pages,
469 sg_dma_address(mem->priv.sgt->sgl), 479 sg_dma_address(mem->priv.sgt->sgl),
470 __DMA_ATTR(dma_attrs)); 480 NVGPU_DMA_ATTR(dma_attrs));
471 } else { 481 } else {
472 dma_free_attrs(d, mem->aligned_size, mem->cpu_va, 482 dma_free_attrs(d, mem->aligned_size, mem->cpu_va,
473 sg_dma_address(mem->priv.sgt->sgl), 483 sg_dma_address(mem->priv.sgt->sgl),
474 __DMA_ATTR(dma_attrs)); 484 NVGPU_DMA_ATTR(dma_attrs));
475 } 485 }
476 } else { 486 } else {
477 dma_free_coherent(d, mem->aligned_size, mem->cpu_va, 487 dma_free_coherent(d, mem->aligned_size, mem->cpu_va,
@@ -563,7 +573,7 @@ int nvgpu_get_sgtable_attrs(struct gk20a *g, struct sg_table **sgt,
563{ 573{
564 int err = 0; 574 int err = 0;
565 struct sg_table *tbl; 575 struct sg_table *tbl;
566 DEFINE_DMA_ATTRS(dma_attrs); 576 NVGPU_DEFINE_DMA_ATTRS(dma_attrs);
567 577
568 tbl = nvgpu_kzalloc(g, sizeof(struct sg_table)); 578 tbl = nvgpu_kzalloc(g, sizeof(struct sg_table));
569 if (!tbl) { 579 if (!tbl) {
@@ -573,7 +583,7 @@ int nvgpu_get_sgtable_attrs(struct gk20a *g, struct sg_table **sgt,
573 583
574 nvgpu_dma_flags_to_attrs(&dma_attrs, flags); 584 nvgpu_dma_flags_to_attrs(&dma_attrs, flags);
575 err = dma_get_sgtable_attrs(dev_from_gk20a(g), tbl, cpuva, iova, 585 err = dma_get_sgtable_attrs(dev_from_gk20a(g), tbl, cpuva, iova,
576 size, __DMA_ATTR(dma_attrs)); 586 size, NVGPU_DMA_ATTR(dma_attrs));
577 if (err) 587 if (err)
578 goto fail; 588 goto fail;
579 589