Lines Matching refs:svmm

67 			struct nouveau_svmm *svmm;  member
88 struct nouveau_svmm *svmm; member
172 if (!cli->svm.svmm) { in nouveau_svmm_bind()
189 nouveau_dmem_migrate_vma(cli->drm, cli->svm.svmm, vma, addr, in nouveau_svmm_bind()
209 nouveau_svmm_part(struct nouveau_svmm *svmm, u64 inst) in nouveau_svmm_part() argument
212 if (svmm) { in nouveau_svmm_part()
213 mutex_lock(&svmm->vmm->cli->drm->svm->mutex); in nouveau_svmm_part()
214 ivmm = nouveau_ivmm_find(svmm->vmm->cli->drm->svm, inst); in nouveau_svmm_part()
219 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex); in nouveau_svmm_part()
225 nouveau_svmm_join(struct nouveau_svmm *svmm, u64 inst) in nouveau_svmm_join() argument
228 if (svmm) { in nouveau_svmm_join()
231 ivmm->svmm = svmm; in nouveau_svmm_join()
234 mutex_lock(&svmm->vmm->cli->drm->svm->mutex); in nouveau_svmm_join()
235 list_add(&ivmm->head, &svmm->vmm->cli->drm->svm->inst); in nouveau_svmm_join()
236 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex); in nouveau_svmm_join()
243 nouveau_svmm_invalidate(struct nouveau_svmm *svmm, u64 start, u64 limit) in nouveau_svmm_invalidate() argument
246 nvif_object_mthd(&svmm->vmm->vmm.object, NVIF_VMM_V0_PFNCLR, in nouveau_svmm_invalidate()
258 struct nouveau_svmm *svmm = in nouveau_svmm_invalidate_range_start() local
266 SVMM_DBG(svmm, "invalidate %016lx-%016lx", start, limit); in nouveau_svmm_invalidate_range_start()
268 mutex_lock(&svmm->mutex); in nouveau_svmm_invalidate_range_start()
269 if (unlikely(!svmm->vmm)) in nouveau_svmm_invalidate_range_start()
277 update->owner == svmm->vmm->cli->drm->dev) in nouveau_svmm_invalidate_range_start()
280 if (limit > svmm->unmanaged.start && start < svmm->unmanaged.limit) { in nouveau_svmm_invalidate_range_start()
281 if (start < svmm->unmanaged.start) { in nouveau_svmm_invalidate_range_start()
282 nouveau_svmm_invalidate(svmm, start, in nouveau_svmm_invalidate_range_start()
283 svmm->unmanaged.limit); in nouveau_svmm_invalidate_range_start()
285 start = svmm->unmanaged.limit; in nouveau_svmm_invalidate_range_start()
288 nouveau_svmm_invalidate(svmm, start, limit); in nouveau_svmm_invalidate_range_start()
291 mutex_unlock(&svmm->mutex); in nouveau_svmm_invalidate_range_start()
308 struct nouveau_svmm *svmm = *psvmm; in nouveau_svmm_fini() local
309 if (svmm) { in nouveau_svmm_fini()
310 mutex_lock(&svmm->mutex); in nouveau_svmm_fini()
311 svmm->vmm = NULL; in nouveau_svmm_fini()
312 mutex_unlock(&svmm->mutex); in nouveau_svmm_fini()
313 mmu_notifier_put(&svmm->notifier); in nouveau_svmm_fini()
323 struct nouveau_svmm *svmm; in nouveau_svmm_init() local
332 if (!(svmm = kzalloc(sizeof(*svmm), GFP_KERNEL))) in nouveau_svmm_init()
334 svmm->vmm = &cli->svm; in nouveau_svmm_init()
335 svmm->unmanaged.start = args->unmanaged_addr; in nouveau_svmm_init()
336 svmm->unmanaged.limit = args->unmanaged_addr + args->unmanaged_size; in nouveau_svmm_init()
337 mutex_init(&svmm->mutex); in nouveau_svmm_init()
362 svmm->notifier.ops = &nouveau_mn_ops; in nouveau_svmm_init()
363 ret = __mmu_notifier_register(&svmm->notifier, current->mm); in nouveau_svmm_init()
368 cli->svm.svmm = svmm; in nouveau_svmm_init()
378 kfree(svmm); in nouveau_svmm_init()
506 struct nouveau_svmm *svmm; member
517 range->owner == sn->svmm->vmm->cli->drm->dev) in nouveau_svm_range_invalidate()
528 mutex_lock(&sn->svmm->mutex); in nouveau_svm_range_invalidate()
529 else if (!mutex_trylock(&sn->svmm->mutex)) in nouveau_svm_range_invalidate()
532 mutex_unlock(&sn->svmm->mutex); in nouveau_svm_range_invalidate()
588 static int nouveau_atomic_range_fault(struct nouveau_svmm *svmm, in nouveau_atomic_range_fault() argument
595 struct mm_struct *mm = svmm->notifier.mm; in nouveau_atomic_range_fault()
623 mutex_lock(&svmm->mutex); in nouveau_atomic_range_fault()
627 mutex_unlock(&svmm->mutex); in nouveau_atomic_range_fault()
640 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, size, NULL); in nouveau_atomic_range_fault()
641 mutex_unlock(&svmm->mutex); in nouveau_atomic_range_fault()
651 static int nouveau_range_fault(struct nouveau_svmm *svmm, in nouveau_range_fault() argument
667 struct mm_struct *mm = svmm->notifier.mm; in nouveau_range_fault()
695 mutex_lock(&svmm->mutex); in nouveau_range_fault()
698 mutex_unlock(&svmm->mutex); in nouveau_range_fault()
706 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, size, NULL); in nouveau_range_fault()
707 mutex_unlock(&svmm->mutex); in nouveau_range_fault()
721 struct nouveau_svmm *svmm; in nouveau_svm_fault() local
761 for (fi = 0, svmm = NULL; fi < buffer->fault_nr; fi++) { in nouveau_svm_fault()
762 if (!svmm || buffer->fault[fi]->inst != inst) { in nouveau_svm_fault()
765 svmm = ivmm ? ivmm->svmm : NULL; in nouveau_svm_fault()
767 SVM_DBG(svm, "inst %016llx -> svm-%p", inst, svmm); in nouveau_svm_fault()
769 buffer->fault[fi]->svmm = svmm; in nouveau_svm_fault()
785 if (!(svmm = buffer->fault[fi]->svmm)) { in nouveau_svm_fault()
789 SVMM_DBG(svmm, "addr %016llx", buffer->fault[fi]->addr); in nouveau_svm_fault()
796 if (start < svmm->unmanaged.limit) in nouveau_svm_fault()
797 limit = min_t(u64, limit, svmm->unmanaged.start); in nouveau_svm_fault()
826 mm = svmm->notifier.mm; in nouveau_svm_fault()
832 notifier.svmm = svmm; in nouveau_svm_fault()
834 ret = nouveau_atomic_range_fault(svmm, svm->drm, in nouveau_svm_fault()
838 ret = nouveau_range_fault(svmm, svm->drm, &args.i, in nouveau_svm_fault()
854 if (buffer->fault[fn]->svmm != svmm || in nouveau_svm_fault()
925 nouveau_pfns_map(struct nouveau_svmm *svmm, struct mm_struct *mm, in nouveau_pfns_map() argument
934 mutex_lock(&svmm->mutex); in nouveau_pfns_map()
936 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, in nouveau_pfns_map()
939 mutex_unlock(&svmm->mutex); in nouveau_pfns_map()