From fcd7fce9bc9ee744a518854995ba9679216e09c8 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Tue, 21 Mar 2017 13:42:45 +0200 Subject: gpu: nvgpu: use dma-attr wrappers for K4.9 compatibility On kernel 4.9, the DMA API has changed, so use the NVIDIA compatibility wrappers from dma-attrs.h to allow the code to build for both 4.4 and 4.9. Bug 1853519 Change-Id: I0196936e81c7f72b41b38a67f42af0dc0b5518df Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1321102 Reviewed-by: svccoveritychecker Reviewed-by: Alex Waterman GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 24 +++++++++++++++------- .../gpu/nvgpu/tegra/linux/platform_gk20a_tegra.c | 11 +++++----- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index b9678fbb..bb7c7985 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -2929,15 +2929,23 @@ int gk20a_gmmu_alloc_sys(struct gk20a *g, size_t size, struct mem_desc *mem) return gk20a_gmmu_alloc_flags_sys(g, 0, size, mem); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) +static void gk20a_dma_flags_to_attrs(unsigned long *attrs, + unsigned long flags) +#define ATTR_ARG(x) *x +#else static void gk20a_dma_flags_to_attrs(struct dma_attrs *attrs, unsigned long flags) +#define ATTR_ARG(x) x +#endif { if (flags & NVGPU_DMA_NO_KERNEL_MAPPING) - dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs); + dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, ATTR_ARG(attrs)); if (flags & NVGPU_DMA_FORCE_CONTIGUOUS) - dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, attrs); + dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, ATTR_ARG(attrs)); if (flags & NVGPU_DMA_READ_ONLY) - dma_set_attr(DMA_ATTR_READ_ONLY, attrs); + dma_set_attr(DMA_ATTR_READ_ONLY, ATTR_ARG(attrs)); +#undef ATTR_ARG } int gk20a_gmmu_alloc_flags_sys(struct gk20a *g, unsigned long flags, @@ -2956,12 +2964,14 @@ int gk20a_gmmu_alloc_flags_sys(struct gk20a *g, unsigned long flags, if (flags & NVGPU_DMA_NO_KERNEL_MAPPING) { mem->pages = dma_alloc_attrs(d, - size, &iova, GFP_KERNEL, &dma_attrs); + size, &iova, GFP_KERNEL, + __DMA_ATTR(dma_attrs)); if (!mem->pages) return -ENOMEM; } else { mem->cpu_va = dma_alloc_attrs(d, - size, &iova, GFP_KERNEL, &dma_attrs); + size, &iova, GFP_KERNEL, + __DMA_ATTR(dma_attrs)); if (!mem->cpu_va) return -ENOMEM; } @@ -3009,11 +3019,11 @@ static void gk20a_gmmu_free_sys(struct gk20a *g, struct mem_desc *mem) if (mem->flags & NVGPU_DMA_NO_KERNEL_MAPPING) { dma_free_attrs(d, mem->size, mem->pages, sg_dma_address(mem->sgt->sgl), - &dma_attrs); + __DMA_ATTR(dma_attrs)); } else { dma_free_attrs(d, mem->size, mem->cpu_va, sg_dma_address(mem->sgt->sgl), - &dma_attrs); + __DMA_ATTR(dma_attrs)); } } else { dma_free_coherent(d, mem->size, mem->cpu_va, diff --git a/drivers/gpu/nvgpu/tegra/linux/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/tegra/linux/platform_gk20a_tegra.c index d612fcd2..ceb1d67e 100644 --- a/drivers/gpu/nvgpu/tegra/linux/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/tegra/linux/platform_gk20a_tegra.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -98,7 +99,7 @@ static void gk20a_tegra_secure_page_destroy(struct device *dev, DEFINE_DMA_ATTRS(attrs); dma_free_attrs(&tegra_vpr_dev, secure_buffer->size, (void *)(uintptr_t)secure_buffer->iova, - secure_buffer->iova, &attrs); + secure_buffer->iova, __DMA_ATTR(attrs)); } int gk20a_tegra_secure_page_alloc(struct device *dev) @@ -113,7 +114,7 @@ int gk20a_tegra_secure_page_alloc(struct device *dev) return -EINVAL; (void)dma_alloc_attrs(&tegra_vpr_dev, size, &iova, - DMA_MEMORY_NOMAP, &attrs); + DMA_MEMORY_NOMAP, __DMA_ATTR(attrs)); if (dma_mapping_error(&tegra_vpr_dev, iova)) return -ENOMEM; @@ -133,7 +134,7 @@ static void gk20a_tegra_secure_destroy(struct gk20a *g, phys_addr_t pa = sg_phys(desc->mem.sgt->sgl); dma_free_attrs(&tegra_vpr_dev, desc->mem.size, (void *)(uintptr_t)pa, - pa, &attrs); + pa, __DMA_ATTR(attrs)); gk20a_free_sgtable(&desc->mem.sgt); desc->mem.sgt = NULL; } @@ -154,7 +155,7 @@ int gk20a_tegra_secure_alloc(struct device *dev, return -EINVAL; (void)dma_alloc_attrs(&tegra_vpr_dev, size, &iova, - DMA_MEMORY_NOMAP, &attrs); + DMA_MEMORY_NOMAP, __DMA_ATTR(attrs)); if (dma_mapping_error(&tegra_vpr_dev, iova)) return -ENOMEM; @@ -185,7 +186,7 @@ fail_sgt: kfree(sgt); fail: dma_free_attrs(&tegra_vpr_dev, desc->mem.size, - (void *)(uintptr_t)iova, iova, &attrs); + (void *)(uintptr_t)iova, iova, __DMA_ATTR(attrs)); return err; } -- cgit v1.2.2