diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 35 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 22 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/mm_vgpu.c | 9 |
3 files changed, 42 insertions, 24 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index b1d709f0..709f2fd2 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |||
@@ -1274,7 +1274,8 @@ static struct vm_reserved_va_node *addr_to_reservation(struct vm_gk20a *vm, | |||
1274 | u64 addr) | 1274 | u64 addr) |
1275 | { | 1275 | { |
1276 | struct vm_reserved_va_node *va_node; | 1276 | struct vm_reserved_va_node *va_node; |
1277 | list_for_each_entry(va_node, &vm->reserved_va_list, reserved_va_list) | 1277 | nvgpu_list_for_each_entry(va_node, &vm->reserved_va_list, |
1278 | vm_reserved_va_node, reserved_va_list) | ||
1278 | if (addr >= va_node->vaddr_start && | 1279 | if (addr >= va_node->vaddr_start && |
1279 | addr < (u64)va_node->vaddr_start + (u64)va_node->size) | 1280 | addr < (u64)va_node->vaddr_start + (u64)va_node->size) |
1280 | return va_node; | 1281 | return va_node; |
@@ -2429,7 +2430,7 @@ u64 gk20a_vm_map(struct vm_gk20a *vm, | |||
2429 | mapped_buffer->user_mapped = user_mapped ? 1 : 0; | 2430 | mapped_buffer->user_mapped = user_mapped ? 1 : 0; |
2430 | mapped_buffer->own_mem_ref = user_mapped; | 2431 | mapped_buffer->own_mem_ref = user_mapped; |
2431 | INIT_LIST_HEAD(&mapped_buffer->unmap_list); | 2432 | INIT_LIST_HEAD(&mapped_buffer->unmap_list); |
2432 | INIT_LIST_HEAD(&mapped_buffer->va_buffers_list); | 2433 | nvgpu_init_list_node(&mapped_buffer->va_buffers_list); |
2433 | kref_init(&mapped_buffer->ref); | 2434 | kref_init(&mapped_buffer->ref); |
2434 | 2435 | ||
2435 | err = insert_mapped_buffer(&vm->mapped_buffers, mapped_buffer); | 2436 | err = insert_mapped_buffer(&vm->mapped_buffers, mapped_buffer); |
@@ -2444,7 +2445,7 @@ u64 gk20a_vm_map(struct vm_gk20a *vm, | |||
2444 | gk20a_dbg_info("allocated va @ 0x%llx", map_offset); | 2445 | gk20a_dbg_info("allocated va @ 0x%llx", map_offset); |
2445 | 2446 | ||
2446 | if (va_node) { | 2447 | if (va_node) { |
2447 | list_add_tail(&mapped_buffer->va_buffers_list, | 2448 | nvgpu_list_add_tail(&mapped_buffer->va_buffers_list, |
2448 | &va_node->va_buffers_list); | 2449 | &va_node->va_buffers_list); |
2449 | mapped_buffer->va_node = va_node; | 2450 | mapped_buffer->va_node = va_node; |
2450 | } | 2451 | } |
@@ -3877,8 +3878,8 @@ void gk20a_vm_unmap_locked(struct mapped_buffer_node *mapped_buffer, | |||
3877 | 3878 | ||
3878 | /* remove from mapped buffer tree and remove list, free */ | 3879 | /* remove from mapped buffer tree and remove list, free */ |
3879 | rb_erase(&mapped_buffer->node, &vm->mapped_buffers); | 3880 | rb_erase(&mapped_buffer->node, &vm->mapped_buffers); |
3880 | if (!list_empty(&mapped_buffer->va_buffers_list)) | 3881 | if (!nvgpu_list_empty(&mapped_buffer->va_buffers_list)) |
3881 | list_del(&mapped_buffer->va_buffers_list); | 3882 | nvgpu_list_del(&mapped_buffer->va_buffers_list); |
3882 | 3883 | ||
3883 | /* keep track of mapped buffers */ | 3884 | /* keep track of mapped buffers */ |
3884 | if (mapped_buffer->user_mapped) | 3885 | if (mapped_buffer->user_mapped) |
@@ -3960,9 +3961,10 @@ static void gk20a_vm_remove_support_nofree(struct vm_gk20a *vm) | |||
3960 | } | 3961 | } |
3961 | 3962 | ||
3962 | /* destroy remaining reserved memory areas */ | 3963 | /* destroy remaining reserved memory areas */ |
3963 | list_for_each_entry_safe(va_node, va_node_tmp, &vm->reserved_va_list, | 3964 | nvgpu_list_for_each_entry_safe(va_node, va_node_tmp, |
3964 | reserved_va_list) { | 3965 | &vm->reserved_va_list, |
3965 | list_del(&va_node->reserved_va_list); | 3966 | vm_reserved_va_node, reserved_va_list) { |
3967 | nvgpu_list_del(&va_node->reserved_va_list); | ||
3966 | nvgpu_kfree(vm->mm->g, va_node); | 3968 | nvgpu_kfree(vm->mm->g, va_node); |
3967 | } | 3969 | } |
3968 | 3970 | ||
@@ -4395,7 +4397,7 @@ int gk20a_init_vm(struct mm_gk20a *mm, | |||
4395 | 4397 | ||
4396 | nvgpu_mutex_init(&vm->update_gmmu_lock); | 4398 | nvgpu_mutex_init(&vm->update_gmmu_lock); |
4397 | kref_init(&vm->ref); | 4399 | kref_init(&vm->ref); |
4398 | INIT_LIST_HEAD(&vm->reserved_va_list); | 4400 | nvgpu_init_list_node(&vm->reserved_va_list); |
4399 | 4401 | ||
4400 | /* | 4402 | /* |
4401 | * This is only necessary for channel address spaces. The best way to | 4403 | * This is only necessary for channel address spaces. The best way to |
@@ -4539,8 +4541,8 @@ int gk20a_vm_alloc_space(struct gk20a_as_share *as_share, | |||
4539 | va_node->vaddr_start = vaddr_start; | 4541 | va_node->vaddr_start = vaddr_start; |
4540 | va_node->size = (u64)args->page_size * (u64)args->pages; | 4542 | va_node->size = (u64)args->page_size * (u64)args->pages; |
4541 | va_node->pgsz_idx = pgsz_idx; | 4543 | va_node->pgsz_idx = pgsz_idx; |
4542 | INIT_LIST_HEAD(&va_node->va_buffers_list); | 4544 | nvgpu_init_list_node(&va_node->va_buffers_list); |
4543 | INIT_LIST_HEAD(&va_node->reserved_va_list); | 4545 | nvgpu_init_list_node(&va_node->reserved_va_list); |
4544 | 4546 | ||
4545 | nvgpu_mutex_acquire(&vm->update_gmmu_lock); | 4547 | nvgpu_mutex_acquire(&vm->update_gmmu_lock); |
4546 | 4548 | ||
@@ -4569,7 +4571,7 @@ int gk20a_vm_alloc_space(struct gk20a_as_share *as_share, | |||
4569 | 4571 | ||
4570 | va_node->sparse = true; | 4572 | va_node->sparse = true; |
4571 | } | 4573 | } |
4572 | list_add_tail(&va_node->reserved_va_list, &vm->reserved_va_list); | 4574 | nvgpu_list_add_tail(&va_node->reserved_va_list, &vm->reserved_va_list); |
4573 | 4575 | ||
4574 | nvgpu_mutex_release(&vm->update_gmmu_lock); | 4576 | nvgpu_mutex_release(&vm->update_gmmu_lock); |
4575 | 4577 | ||
@@ -4608,13 +4610,14 @@ int gk20a_vm_free_space(struct gk20a_as_share *as_share, | |||
4608 | /* Decrement the ref count on all buffers in this va_node. This | 4610 | /* Decrement the ref count on all buffers in this va_node. This |
4609 | * allows userspace to let the kernel free mappings that are | 4611 | * allows userspace to let the kernel free mappings that are |
4610 | * only used by this va_node. */ | 4612 | * only used by this va_node. */ |
4611 | list_for_each_entry_safe(buffer, n, | 4613 | nvgpu_list_for_each_entry_safe(buffer, n, |
4612 | &va_node->va_buffers_list, va_buffers_list) { | 4614 | &va_node->va_buffers_list, |
4613 | list_del_init(&buffer->va_buffers_list); | 4615 | mapped_buffer_node, va_buffers_list) { |
4616 | nvgpu_list_del(&buffer->va_buffers_list); | ||
4614 | kref_put(&buffer->ref, gk20a_vm_unmap_locked_kref); | 4617 | kref_put(&buffer->ref, gk20a_vm_unmap_locked_kref); |
4615 | } | 4618 | } |
4616 | 4619 | ||
4617 | list_del(&va_node->reserved_va_list); | 4620 | nvgpu_list_del(&va_node->reserved_va_list); |
4618 | 4621 | ||
4619 | /* if this was a sparse mapping, free the va */ | 4622 | /* if this was a sparse mapping, free the va */ |
4620 | if (va_node->sparse) | 4623 | if (va_node->sparse) |
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index db99535a..3bca7aad 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |||
@@ -200,7 +200,7 @@ struct mapped_buffer_node { | |||
200 | struct vm_gk20a *vm; | 200 | struct vm_gk20a *vm; |
201 | struct rb_node node; | 201 | struct rb_node node; |
202 | struct list_head unmap_list; | 202 | struct list_head unmap_list; |
203 | struct list_head va_buffers_list; | 203 | struct nvgpu_list_node va_buffers_list; |
204 | struct vm_reserved_va_node *va_node; | 204 | struct vm_reserved_va_node *va_node; |
205 | u64 addr; | 205 | u64 addr; |
206 | u64 size; | 206 | u64 size; |
@@ -226,15 +226,29 @@ struct mapped_buffer_node { | |||
226 | bool va_allocated; | 226 | bool va_allocated; |
227 | }; | 227 | }; |
228 | 228 | ||
229 | static inline struct mapped_buffer_node * | ||
230 | mapped_buffer_node_from_va_buffers_list(struct nvgpu_list_node *node) | ||
231 | { | ||
232 | return (struct mapped_buffer_node *) | ||
233 | ((uintptr_t)node - offsetof(struct mapped_buffer_node, va_buffers_list)); | ||
234 | }; | ||
235 | |||
229 | struct vm_reserved_va_node { | 236 | struct vm_reserved_va_node { |
230 | struct list_head reserved_va_list; | 237 | struct nvgpu_list_node reserved_va_list; |
231 | struct list_head va_buffers_list; | 238 | struct nvgpu_list_node va_buffers_list; |
232 | u32 pgsz_idx; | 239 | u32 pgsz_idx; |
233 | u64 vaddr_start; | 240 | u64 vaddr_start; |
234 | u64 size; | 241 | u64 size; |
235 | bool sparse; | 242 | bool sparse; |
236 | }; | 243 | }; |
237 | 244 | ||
245 | static inline struct vm_reserved_va_node * | ||
246 | vm_reserved_va_node_from_reserved_va_list(struct nvgpu_list_node *node) | ||
247 | { | ||
248 | return (struct vm_reserved_va_node *) | ||
249 | ((uintptr_t)node - offsetof(struct vm_reserved_va_node, reserved_va_list)); | ||
250 | }; | ||
251 | |||
238 | struct gk20a_mmu_level { | 252 | struct gk20a_mmu_level { |
239 | int hi_bit[2]; | 253 | int hi_bit[2]; |
240 | int lo_bit[2]; | 254 | int lo_bit[2]; |
@@ -296,7 +310,7 @@ struct vm_gk20a { | |||
296 | 310 | ||
297 | struct rb_root mapped_buffers; | 311 | struct rb_root mapped_buffers; |
298 | 312 | ||
299 | struct list_head reserved_va_list; | 313 | struct nvgpu_list_node reserved_va_list; |
300 | 314 | ||
301 | #ifdef CONFIG_TEGRA_GR_VIRTUALIZATION | 315 | #ifdef CONFIG_TEGRA_GR_VIRTUALIZATION |
302 | u64 handle; | 316 | u64 handle; |
diff --git a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c index 494bbe66..7d0f7e9c 100644 --- a/drivers/gpu/nvgpu/vgpu/mm_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/mm_vgpu.c | |||
@@ -220,9 +220,10 @@ static void vgpu_vm_remove_support(struct vm_gk20a *vm) | |||
220 | } | 220 | } |
221 | 221 | ||
222 | /* destroy remaining reserved memory areas */ | 222 | /* destroy remaining reserved memory areas */ |
223 | list_for_each_entry_safe(va_node, va_node_tmp, &vm->reserved_va_list, | 223 | nvgpu_list_for_each_entry_safe(va_node, va_node_tmp, |
224 | reserved_va_list) { | 224 | &vm->reserved_va_list, |
225 | list_del(&va_node->reserved_va_list); | 225 | vm_reserved_va_node, reserved_va_list) { |
226 | nvgpu_list_del(&va_node->reserved_va_list); | ||
226 | nvgpu_kfree(g, va_node); | 227 | nvgpu_kfree(g, va_node); |
227 | } | 228 | } |
228 | 229 | ||
@@ -409,7 +410,7 @@ static int vgpu_vm_alloc_share(struct gk20a_as_share *as_share, | |||
409 | 410 | ||
410 | nvgpu_mutex_init(&vm->update_gmmu_lock); | 411 | nvgpu_mutex_init(&vm->update_gmmu_lock); |
411 | kref_init(&vm->ref); | 412 | kref_init(&vm->ref); |
412 | INIT_LIST_HEAD(&vm->reserved_va_list); | 413 | nvgpu_init_list_node(&vm->reserved_va_list); |
413 | 414 | ||
414 | vm->enable_ctag = true; | 415 | vm->enable_ctag = true; |
415 | 416 | ||