From 6c33a010d8e3983cc3504e073cd552f952440aa1 Mon Sep 17 00:00:00 2001 From: Thomas Fleury Date: Wed, 7 Mar 2018 09:23:53 -0800 Subject: gpu: nvgpu: add placeholder for IPA to PA Add __nvgpu_sgl_phys function that can be used to implement IPA to PA translation in a subsequent change. Adapt existing function prototypes to add pointer to gpu context, as we will need to check if IPA to PA translation is needed. JIRA EVLR-2442 Bug 200392719 Change-Id: I5a734c958c8277d1bf673c020dafb31263f142d6 Signed-off-by: Thomas Fleury Reviewed-on: https://git-master.nvidia.com/r/1673142 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/nvgpu_mem.c | 19 +++++++++++++------ drivers/gpu/nvgpu/common/mm/gmmu.c | 4 ++-- drivers/gpu/nvgpu/common/mm/nvgpu_mem.c | 7 ++++--- drivers/gpu/nvgpu/common/mm/page_allocator.c | 11 +++++++---- drivers/gpu/nvgpu/common/mm/vidmem.c | 4 ++-- 5 files changed, 28 insertions(+), 17 deletions(-) (limited to 'drivers/gpu/nvgpu/common') diff --git a/drivers/gpu/nvgpu/common/linux/nvgpu_mem.c b/drivers/gpu/nvgpu/common/linux/nvgpu_mem.c index d4549e1b..63a14f40 100644 --- a/drivers/gpu/nvgpu/common/linux/nvgpu_mem.c +++ b/drivers/gpu/nvgpu/common/linux/nvgpu_mem.c @@ -34,6 +34,11 @@ #include "gk20a/gk20a.h" #include "gk20a/mm_gk20a.h" +static inline u64 __nvgpu_sgl_phys(struct gk20a *g, struct nvgpu_sgl *sgl) +{ + return sg_phys((struct scatterlist *)sgl); +} + int nvgpu_mem_begin(struct gk20a *g, struct nvgpu_mem *mem) { void *cpu_va; @@ -309,10 +314,12 @@ u64 nvgpu_mem_get_addr_sgl(struct gk20a *g, struct scatterlist *sgl) { if (nvgpu_is_enabled(g, NVGPU_MM_USE_PHYSICAL_SG) || !nvgpu_iommuable(g)) - return g->ops.mm.gpu_phys_addr(g, NULL, sg_phys(sgl)); + return g->ops.mm.gpu_phys_addr(g, NULL, + __nvgpu_sgl_phys(g, (struct nvgpu_sgl *)sgl)); if (sg_dma_address(sgl) == 0) - return g->ops.mm.gpu_phys_addr(g, NULL, sg_phys(sgl)); + return g->ops.mm.gpu_phys_addr(g, NULL, + __nvgpu_sgl_phys(g, (struct nvgpu_sgl *)sgl)); if (sg_dma_address(sgl) == DMA_ERROR_CODE) return 0; @@ -376,7 +383,7 @@ u64 nvgpu_mem_get_phys_addr(struct gk20a *g, struct nvgpu_mem *mem) if (mem->aperture == APERTURE_VIDMEM) return nvgpu_mem_get_addr(g, mem); - return sg_phys(mem->priv.sgt->sgl); + return __nvgpu_sgl_phys(g, (struct nvgpu_sgl *)mem->priv.sgt->sgl); } /* @@ -501,9 +508,9 @@ static struct nvgpu_sgl *nvgpu_mem_linux_sgl_next(struct nvgpu_sgl *sgl) return (struct nvgpu_sgl *)sg_next((struct scatterlist *)sgl); } -static u64 nvgpu_mem_linux_sgl_phys(struct nvgpu_sgl *sgl) +static u64 nvgpu_mem_linux_sgl_phys(struct gk20a *g, struct nvgpu_sgl *sgl) { - return (u64)sg_phys((struct scatterlist *)sgl); + return (u64)__nvgpu_sgl_phys(g, sgl); } static u64 nvgpu_mem_linux_sgl_dma(struct nvgpu_sgl *sgl) @@ -522,7 +529,7 @@ static u64 nvgpu_mem_linux_sgl_gpu_addr(struct gk20a *g, { if (sg_dma_address((struct scatterlist *)sgl) == 0) return g->ops.mm.gpu_phys_addr(g, attrs, - sg_phys((struct scatterlist *)sgl)); + __nvgpu_sgl_phys(g, sgl)); if (sg_dma_address((struct scatterlist *)sgl) == DMA_ERROR_CODE) return 0; diff --git a/drivers/gpu/nvgpu/common/mm/gmmu.c b/drivers/gpu/nvgpu/common/mm/gmmu.c index 3b57e781..44e540dc 100644 --- a/drivers/gpu/nvgpu/common/mm/gmmu.c +++ b/drivers/gpu/nvgpu/common/mm/gmmu.c @@ -543,7 +543,7 @@ static int __nvgpu_gmmu_do_update_page_table(struct vm_gk20a *vm, } phys_addr = g->ops.mm.gpu_phys_addr(g, attrs, - nvgpu_sgt_get_phys(sgt, sgl)) + space_to_skip; + nvgpu_sgt_get_phys(g, sgt, sgl)) + space_to_skip; chunk_length = min(length, nvgpu_sgt_get_length(sgt, sgl) - space_to_skip); @@ -629,7 +629,7 @@ static int __nvgpu_gmmu_update_page_table(struct vm_gk20a *vm, sgt ? "MAP" : "UNMAP", virt_addr, length, - sgt ? nvgpu_sgt_get_phys(sgt, sgt->sgl) : 0, + sgt ? nvgpu_sgt_get_phys(g, sgt, sgt->sgl) : 0, space_to_skip, page_size >> 10, nvgpu_gmmu_perm_str(attrs->rw_flag), diff --git a/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c b/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c index 2b32d869..4def4938 100644 --- a/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c +++ b/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c @@ -81,9 +81,10 @@ struct nvgpu_sgl *nvgpu_sgt_get_next(struct nvgpu_sgt *sgt, return sgt->ops->sgl_next(sgl); } -u64 nvgpu_sgt_get_phys(struct nvgpu_sgt *sgt, struct nvgpu_sgl *sgl) +u64 nvgpu_sgt_get_phys(struct gk20a *g, struct nvgpu_sgt *sgt, + struct nvgpu_sgl *sgl) { - return sgt->ops->sgl_phys(sgl); + return sgt->ops->sgl_phys(g, sgl); } u64 nvgpu_sgt_get_dma(struct nvgpu_sgt *sgt, struct nvgpu_sgl *sgl) @@ -156,7 +157,7 @@ u64 nvgpu_sgt_alignment(struct gk20a *g, struct nvgpu_sgt *sgt) * of the SGT. */ nvgpu_sgt_for_each_sgl(sgl, sgt) { - chunk_align = 1ULL << __ffs(nvgpu_sgt_get_phys(sgt, sgl) | + chunk_align = 1ULL << __ffs(nvgpu_sgt_get_phys(g, sgt, sgl) | nvgpu_sgt_get_length(sgt, sgl)); if (align) diff --git a/drivers/gpu/nvgpu/common/mm/page_allocator.c b/drivers/gpu/nvgpu/common/mm/page_allocator.c index 13ccc48b..773d33ef 100644 --- a/drivers/gpu/nvgpu/common/mm/page_allocator.c +++ b/drivers/gpu/nvgpu/common/mm/page_allocator.c @@ -160,7 +160,7 @@ static struct nvgpu_sgl *nvgpu_page_alloc_sgl_next(struct nvgpu_sgl *sgl) return (struct nvgpu_sgl *)sgl_impl->next; } -static u64 nvgpu_page_alloc_sgl_phys(struct nvgpu_sgl *sgl) +static u64 nvgpu_page_alloc_sgl_phys(struct gk20a *g, struct nvgpu_sgl *sgl) { struct nvgpu_mem_sgl *sgl_impl = (struct nvgpu_mem_sgl *)sgl; @@ -231,11 +231,12 @@ static void __nvgpu_free_pages(struct nvgpu_page_allocator *a, bool free_buddy_alloc) { struct nvgpu_sgl *sgl = alloc->sgt.sgl; + struct gk20a *g = a->owner->g; if (free_buddy_alloc) { while (sgl) { nvgpu_free(&a->source_allocator, - nvgpu_sgt_get_phys(&alloc->sgt, sgl)); + nvgpu_sgt_get_phys(g, &alloc->sgt, sgl)); sgl = nvgpu_sgt_get_next(&alloc->sgt, sgl); } } @@ -615,6 +616,7 @@ fail: static struct nvgpu_page_alloc *__nvgpu_alloc_pages( struct nvgpu_page_allocator *a, u64 len) { + struct gk20a *g = a->owner->g; struct nvgpu_page_alloc *alloc = NULL; struct nvgpu_sgl *sgl; u64 pages; @@ -635,7 +637,7 @@ static struct nvgpu_page_alloc *__nvgpu_alloc_pages( while (sgl) { palloc_dbg(a, " Chunk %2d: 0x%010llx + 0x%llx", i++, - nvgpu_sgt_get_phys(&alloc->sgt, sgl), + nvgpu_sgt_get_phys(g, &alloc->sgt, sgl), nvgpu_sgt_get_length(&alloc->sgt, sgl)); sgl = nvgpu_sgt_get_next(&alloc->sgt, sgl); } @@ -779,6 +781,7 @@ static u64 nvgpu_page_alloc_fixed(struct nvgpu_allocator *__a, struct nvgpu_page_allocator *a = page_allocator(__a); struct nvgpu_page_alloc *alloc = NULL; struct nvgpu_sgl *sgl; + struct gk20a *g = a->owner->g; u64 aligned_len, pages; int i = 0; @@ -802,7 +805,7 @@ static u64 nvgpu_page_alloc_fixed(struct nvgpu_allocator *__a, while (sgl) { palloc_dbg(a, " Chunk %2d: 0x%010llx + 0x%llx", i++, - nvgpu_sgt_get_phys(&alloc->sgt, sgl), + nvgpu_sgt_get_phys(g, &alloc->sgt, sgl), nvgpu_sgt_get_length(&alloc->sgt, sgl)); sgl = nvgpu_sgt_get_next(&alloc->sgt, sgl); } diff --git a/drivers/gpu/nvgpu/common/mm/vidmem.c b/drivers/gpu/nvgpu/common/mm/vidmem.c index e4137090..f534f45c 100644 --- a/drivers/gpu/nvgpu/common/mm/vidmem.c +++ b/drivers/gpu/nvgpu/common/mm/vidmem.c @@ -430,7 +430,7 @@ int nvgpu_vidmem_clear(struct gk20a *g, struct nvgpu_mem *mem) err = gk20a_ce_execute_ops(g, g->mm.vidmem.ce_ctx_id, 0, - nvgpu_sgt_get_phys(&alloc->sgt, sgl), + nvgpu_sgt_get_phys(g, &alloc->sgt, sgl), nvgpu_sgt_get_length(&alloc->sgt, sgl), 0x00000000, NVGPU_CE_DST_LOCATION_LOCAL_FB, @@ -445,7 +445,7 @@ int nvgpu_vidmem_clear(struct gk20a *g, struct nvgpu_mem *mem) } vidmem_dbg(g, " > [0x%llx +0x%llx]", - nvgpu_sgt_get_phys(&alloc->sgt, sgl), + nvgpu_sgt_get_phys(g, &alloc->sgt, sgl), nvgpu_sgt_get_length(&alloc->sgt, sgl)); gk20a_last_fence = gk20a_fence_out; -- cgit v1.2.2