diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vm.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/vm.c | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/vm.c b/drivers/gpu/nvgpu/os/linux/vm.c index baa77515..eb9ca8fd 100644 --- a/drivers/gpu/nvgpu/os/linux/vm.c +++ b/drivers/gpu/nvgpu/os/linux/vm.c | |||
@@ -175,8 +175,9 @@ struct nvgpu_mapped_buf *nvgpu_vm_find_mapping(struct vm_gk20a *vm, | |||
175 | 175 | ||
176 | int nvgpu_vm_map_linux(struct vm_gk20a *vm, | 176 | int nvgpu_vm_map_linux(struct vm_gk20a *vm, |
177 | struct dma_buf *dmabuf, | 177 | struct dma_buf *dmabuf, |
178 | u64 offset_align, | 178 | u64 map_addr, |
179 | u32 flags, | 179 | u32 flags, |
180 | u32 page_size, | ||
180 | s16 compr_kind, | 181 | s16 compr_kind, |
181 | s16 incompr_kind, | 182 | s16 incompr_kind, |
182 | int rw_flag, | 183 | int rw_flag, |
@@ -192,12 +193,8 @@ int nvgpu_vm_map_linux(struct vm_gk20a *vm, | |||
192 | struct nvgpu_sgt *nvgpu_sgt = NULL; | 193 | struct nvgpu_sgt *nvgpu_sgt = NULL; |
193 | struct nvgpu_mapped_buf *mapped_buffer = NULL; | 194 | struct nvgpu_mapped_buf *mapped_buffer = NULL; |
194 | struct dma_buf_attachment *attachment; | 195 | struct dma_buf_attachment *attachment; |
195 | u64 map_addr = 0ULL; | ||
196 | int err = 0; | 196 | int err = 0; |
197 | 197 | ||
198 | if (flags & NVGPU_VM_MAP_FIXED_OFFSET) | ||
199 | map_addr = offset_align; | ||
200 | |||
201 | sgt = gk20a_mm_pin(dev, dmabuf, &attachment); | 198 | sgt = gk20a_mm_pin(dev, dmabuf, &attachment); |
202 | if (IS_ERR(sgt)) { | 199 | if (IS_ERR(sgt)) { |
203 | nvgpu_warn(g, "Failed to pin dma_buf!"); | 200 | nvgpu_warn(g, "Failed to pin dma_buf!"); |
@@ -253,8 +250,9 @@ clean_up: | |||
253 | 250 | ||
254 | int nvgpu_vm_map_buffer(struct vm_gk20a *vm, | 251 | int nvgpu_vm_map_buffer(struct vm_gk20a *vm, |
255 | int dmabuf_fd, | 252 | int dmabuf_fd, |
256 | u64 *offset_align, | 253 | u64 *map_addr, |
257 | u32 flags, /*NVGPU_AS_MAP_BUFFER_FLAGS_*/ | 254 | u32 flags, /*NVGPU_AS_MAP_BUFFER_FLAGS_*/ |
255 | u32 page_size, | ||
258 | s16 compr_kind, | 256 | s16 compr_kind, |
259 | s16 incompr_kind, | 257 | s16 incompr_kind, |
260 | u64 buffer_offset, | 258 | u64 buffer_offset, |
@@ -274,8 +272,28 @@ int nvgpu_vm_map_buffer(struct vm_gk20a *vm, | |||
274 | return PTR_ERR(dmabuf); | 272 | return PTR_ERR(dmabuf); |
275 | } | 273 | } |
276 | 274 | ||
275 | /* | ||
276 | * For regular maps we do not accept either an input address or a | ||
277 | * buffer_offset. | ||
278 | */ | ||
279 | if (!(flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET) && | ||
280 | (buffer_offset || *map_addr)) { | ||
281 | nvgpu_err(g, | ||
282 | "Regular map with addr/buf offset is not supported!"); | ||
283 | return -EINVAL; | ||
284 | } | ||
285 | |||
286 | /* | ||
287 | * Map size is always buffer size for non fixed mappings. As such map | ||
288 | * size should be left as zero by userspace for non-fixed maps. | ||
289 | */ | ||
290 | if (mapping_size && !(flags & NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET)) { | ||
291 | nvgpu_err(g, "map_size && non-fixed-mapping!"); | ||
292 | return -EINVAL; | ||
293 | } | ||
294 | |||
277 | /* verify that we're not overflowing the buffer, i.e. | 295 | /* verify that we're not overflowing the buffer, i.e. |
278 | * (buffer_offset + mapping_size)> dmabuf->size. | 296 | * (buffer_offset + mapping_size) > dmabuf->size. |
279 | * | 297 | * |
280 | * Since buffer_offset + mapping_size could overflow, first check | 298 | * Since buffer_offset + mapping_size could overflow, first check |
281 | * that mapping size < dmabuf_size, at which point we can subtract | 299 | * that mapping size < dmabuf_size, at which point we can subtract |
@@ -284,7 +302,7 @@ int nvgpu_vm_map_buffer(struct vm_gk20a *vm, | |||
284 | if ((mapping_size > dmabuf->size) || | 302 | if ((mapping_size > dmabuf->size) || |
285 | (buffer_offset > (dmabuf->size - mapping_size))) { | 303 | (buffer_offset > (dmabuf->size - mapping_size))) { |
286 | nvgpu_err(g, | 304 | nvgpu_err(g, |
287 | "buf size %llx < (offset(%llx) + map_size(%llx))\n", | 305 | "buf size %llx < (offset(%llx) + map_size(%llx))", |
288 | (u64)dmabuf->size, buffer_offset, mapping_size); | 306 | (u64)dmabuf->size, buffer_offset, mapping_size); |
289 | dma_buf_put(dmabuf); | 307 | dma_buf_put(dmabuf); |
290 | return -EINVAL; | 308 | return -EINVAL; |
@@ -296,8 +314,9 @@ int nvgpu_vm_map_buffer(struct vm_gk20a *vm, | |||
296 | return err; | 314 | return err; |
297 | } | 315 | } |
298 | 316 | ||
299 | err = nvgpu_vm_map_linux(vm, dmabuf, *offset_align, | 317 | err = nvgpu_vm_map_linux(vm, dmabuf, *map_addr, |
300 | nvgpu_vm_translate_linux_flags(g, flags), | 318 | nvgpu_vm_translate_linux_flags(g, flags), |
319 | page_size, | ||
301 | compr_kind, incompr_kind, | 320 | compr_kind, incompr_kind, |
302 | gk20a_mem_flag_none, | 321 | gk20a_mem_flag_none, |
303 | buffer_offset, | 322 | buffer_offset, |
@@ -306,7 +325,7 @@ int nvgpu_vm_map_buffer(struct vm_gk20a *vm, | |||
306 | &ret_va); | 325 | &ret_va); |
307 | 326 | ||
308 | if (!err) | 327 | if (!err) |
309 | *offset_align = ret_va; | 328 | *map_addr = ret_va; |
310 | else | 329 | else |
311 | dma_buf_put(dmabuf); | 330 | dma_buf_put(dmabuf); |
312 | 331 | ||