summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2016-04-27 13:40:33 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-29 17:43:48 -0400
commit8891fd82679da0ea1d09b4b415dc3b94fa4c0269 (patch)
treeb1217f92db3702f2bb6d9344ffbd1980d9019616 /drivers/gpu/nvgpu/gk20a
parent556643179f1223555e352b48be31df3eda9390b6 (diff)
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 <alexw@nvidia.com> Reviewed-on: http://git-master/r/1133789 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c44
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h7
2 files changed, 44 insertions, 7 deletions
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,
1990 return 0; 1990 return 0;
1991} 1991}
1992 1992
1993u64 gk20a_gmmu_map(struct vm_gk20a *vm, 1993/*
1994 struct sg_table **sgt, 1994 * Core GMMU map function for the kernel to use. If @addr is 0 then the GPU
1995 u64 size, 1995 * VA will be allocated for you. If addr is non-zero then the buffer will be
1996 u32 flags, 1996 * mapped at @addr.
1997 int rw_flag, 1997 */
1998 bool priv) 1998static u64 __gk20a_gmmu_map(struct vm_gk20a *vm,
1999 struct sg_table **sgt,
2000 u64 addr,
2001 u64 size,
2002 u32 flags,
2003 int rw_flag,
2004 bool priv)
1999{ 2005{
2000 struct gk20a *g = gk20a_from_vm(vm); 2006 struct gk20a *g = gk20a_from_vm(vm);
2001 u64 vaddr; 2007 u64 vaddr;
2002 2008
2003 mutex_lock(&vm->update_gmmu_lock); 2009 mutex_lock(&vm->update_gmmu_lock);
2004 vaddr = g->ops.mm.gmmu_map(vm, 0, /* already mapped? - No */ 2010 vaddr = g->ops.mm.gmmu_map(vm, addr,
2005 *sgt, /* sg table */ 2011 *sgt, /* sg table */
2006 0, /* sg offset */ 2012 0, /* sg offset */
2007 size, 2013 size,
@@ -2022,6 +2028,30 @@ u64 gk20a_gmmu_map(struct vm_gk20a *vm,
2022 return vaddr; 2028 return vaddr;
2023} 2029}
2024 2030
2031u64 gk20a_gmmu_map(struct vm_gk20a *vm,
2032 struct sg_table **sgt,
2033 u64 size,
2034 u32 flags,
2035 int rw_flag,
2036 bool priv)
2037{
2038 return __gk20a_gmmu_map(vm, sgt, 0, size, flags, rw_flag, priv);
2039}
2040
2041/*
2042 * Like gk20a_gmmu_map() except it works on a fixed address instead.
2043 */
2044u64 gk20a_gmmu_fixed_map(struct vm_gk20a *vm,
2045 struct sg_table **sgt,
2046 u64 addr,
2047 u64 size,
2048 u32 flags,
2049 int rw_flag,
2050 bool priv)
2051{
2052 return __gk20a_gmmu_map(vm, sgt, addr, size, flags, rw_flag, priv);
2053}
2054
2025int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem) 2055int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem)
2026{ 2056{
2027 return gk20a_gmmu_alloc_attr(g, 0, size, mem); 2057 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,
471 u32 flags, 471 u32 flags,
472 int rw_flag, 472 int rw_flag,
473 bool priv); 473 bool priv);
474u64 gk20a_gmmu_fixed_map(struct vm_gk20a *vm,
475 struct sg_table **sgt,
476 u64 addr,
477 u64 size,
478 u32 flags,
479 int rw_flag,
480 bool priv);
474 481
475int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, 482int gk20a_gmmu_alloc_map(struct vm_gk20a *vm,
476 size_t size, 483 size_t size,