diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 36 |
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 | ||
1938 | static 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 | |||
1938 | int gk20a_vidmem_buf_alloc(struct gk20a *g, size_t bytes) | 1952 | int 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 | ||