summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2016-07-11 09:02:57 -0400
committerVijayakumar Subbu <vsubbu@nvidia.com>2016-07-21 08:58:25 -0400
commit6706e4c40646cbde8a8106a13de285eda6ede701 (patch)
treeb691e4b538fa44608ee64fd0e176ae8c40da1e13 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent13231006671a1da11cfaf7a67e69430199820788 (diff)
gpu: nvgpu: support userspace vidmem mappings
When mapping a userspace buffer, determine if it was vidmem allocated from the aperture of the current gpu, and pass that information into page tables. Mapping a vidmem buffer to a gpu it wasn't allocated from is disallowed. This includes mapping vidmem to igpus and to possibly other dgpus on the system. Jira DNVGPU-19 Change-Id: Ia9d2d0133e77659ab96b36ed61eeb4cd5a2b7dff Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1169309 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 2dcc4363..1d32a41f 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -1935,6 +1935,20 @@ static struct dma_buf *gk20a_vidbuf_export(struct gk20a_vidmem_buf *buf)
1935} 1935}
1936#endif 1936#endif
1937 1937
1938static struct gk20a *gk20a_vidmem_buf_owner(struct dma_buf *dmabuf)
1939{
1940#if defined(CONFIG_GK20A_VIDMEM)
1941 struct gk20a_vidmem_buf *buf = dmabuf->priv;
1942
1943 if (dmabuf->ops != &gk20a_vidbuf_ops)
1944 return NULL;
1945
1946 return buf->g;
1947#else
1948 return NULL;
1949#endif
1950}
1951
1938int gk20a_vidmem_buf_alloc(struct gk20a *g, size_t bytes) 1952int gk20a_vidmem_buf_alloc(struct gk20a *g, size_t bytes)
1939{ 1953{
1940#if defined(CONFIG_GK20A_VIDMEM) 1954#if defined(CONFIG_GK20A_VIDMEM)
@@ -2010,6 +2024,8 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
2010 u32 ctag_map_win_ctagline = 0; 2024 u32 ctag_map_win_ctagline = 0;
2011 struct vm_reserved_va_node *va_node = NULL; 2025 struct vm_reserved_va_node *va_node = NULL;
2012 u32 ctag_offset; 2026 u32 ctag_offset;
2027 struct gk20a *buf_owner;
2028 enum gk20a_aperture aperture;
2013 2029
2014 if (user_mapped && vm->userspace_managed && 2030 if (user_mapped && vm->userspace_managed &&
2015 !(flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET)) { 2031 !(flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET)) {
@@ -2185,6 +2201,24 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
2185 ctag_offset += buffer_offset >> 2201 ctag_offset += buffer_offset >>
2186 ilog2(g->ops.fb.compression_page_size(g)); 2202 ilog2(g->ops.fb.compression_page_size(g));
2187 2203
2204 buf_owner = gk20a_vidmem_buf_owner(dmabuf);
2205 if (buf_owner == NULL) {
2206 /* Not nvgpu-allocated, assume system memory */
2207 aperture = APERTURE_SYSMEM;
2208 } else if (WARN_ON(buf_owner == g && !g->mm.vidmem_is_vidmem)) {
2209 /* Looks like our video memory, but this gpu doesn't support
2210 * it. Warn about a bug and bail out */
2211 err = -EINVAL;
2212 goto clean_up;
2213 } else if (buf_owner != g) {
2214 /* Someone else's vidmem */
2215 err = -EINVAL;
2216 goto clean_up;
2217 } else {
2218 /* Yay, buf_owner == g */
2219 aperture = APERTURE_VIDMEM;
2220 }
2221
2188 /* update gmmu ptes */ 2222 /* update gmmu ptes */
2189 map_offset = g->ops.mm.gmmu_map(vm, map_offset, 2223 map_offset = g->ops.mm.gmmu_map(vm, map_offset,
2190 bfr.sgt, 2224 bfr.sgt,
@@ -2198,7 +2232,7 @@ u64 gk20a_vm_map(struct vm_gk20a *vm,
2198 false, 2232 false,
2199 false, 2233 false,
2200 batch, 2234 batch,
2201 APERTURE_SYSMEM); /* no vidmem yet */ 2235 aperture);
2202 if (!map_offset) 2236 if (!map_offset)
2203 goto clean_up; 2237 goto clean_up;
2204 2238