From 8891fd82679da0ea1d09b4b415dc3b94fa4c0269 Mon Sep 17 00:00:00 2001 From: Alex Waterman Date: Wed, 27 Apr 2016 10:40:33 -0700 Subject: gpu: nvgpu: Add gk20a_gmmu_fixed_map() function Add a function to allow the kernel to do fixed mappings. Necessary for the semaphore functionality since there needs to be a common address in each VM for the semaphores. Bug 1732449 JIRA DNVGPU-12 Change-Id: I2b451db2d3cb3c003d951f7b0ffc87f6c91db7dc Signed-off-by: Alex Waterman Reviewed-on: http://git-master/r/1133789 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 44 ++++++++++++++++++++++++++++++++------ drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 7 ++++++ 2 files changed, 44 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 452d3e9c..31fad8ae 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -1990,18 +1990,24 @@ int gk20a_vm_map_compbits(struct vm_gk20a *vm, return 0; } -u64 gk20a_gmmu_map(struct vm_gk20a *vm, - struct sg_table **sgt, - u64 size, - u32 flags, - int rw_flag, - bool priv) +/* + * Core GMMU map function for the kernel to use. If @addr is 0 then the GPU + * VA will be allocated for you. If addr is non-zero then the buffer will be + * mapped at @addr. + */ +static u64 __gk20a_gmmu_map(struct vm_gk20a *vm, + struct sg_table **sgt, + u64 addr, + u64 size, + u32 flags, + int rw_flag, + bool priv) { struct gk20a *g = gk20a_from_vm(vm); u64 vaddr; mutex_lock(&vm->update_gmmu_lock); - vaddr = g->ops.mm.gmmu_map(vm, 0, /* already mapped? - No */ + vaddr = g->ops.mm.gmmu_map(vm, addr, *sgt, /* sg table */ 0, /* sg offset */ size, @@ -2022,6 +2028,30 @@ u64 gk20a_gmmu_map(struct vm_gk20a *vm, return vaddr; } +u64 gk20a_gmmu_map(struct vm_gk20a *vm, + struct sg_table **sgt, + u64 size, + u32 flags, + int rw_flag, + bool priv) +{ + return __gk20a_gmmu_map(vm, sgt, 0, size, flags, rw_flag, priv); +} + +/* + * Like gk20a_gmmu_map() except it works on a fixed address instead. + */ +u64 gk20a_gmmu_fixed_map(struct vm_gk20a *vm, + struct sg_table **sgt, + u64 addr, + u64 size, + u32 flags, + int rw_flag, + bool priv) +{ + return __gk20a_gmmu_map(vm, sgt, addr, size, flags, rw_flag, priv); +} + int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem) { return gk20a_gmmu_alloc_attr(g, 0, size, mem); diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 2c2df1a9..e7154c84 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -471,6 +471,13 @@ u64 gk20a_gmmu_map(struct vm_gk20a *vm, u32 flags, int rw_flag, bool priv); +u64 gk20a_gmmu_fixed_map(struct vm_gk20a *vm, + struct sg_table **sgt, + u64 addr, + u64 size, + u32 flags, + int rw_flag, + bool priv); int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, -- cgit v1.2.2