Lines Matching refs:svmm
64 struct nouveau_svmm *svmm;
80 struct nouveau_svmm *svmm;
164 if (!cli->svm.svmm) {
181 nouveau_dmem_migrate_vma(cli->drm, cli->svm.svmm, vma, addr,
201 nouveau_svmm_part(struct nouveau_svmm *svmm, u64 inst)
204 if (svmm) {
205 mutex_lock(&svmm->vmm->cli->drm->svm->mutex);
206 ivmm = nouveau_ivmm_find(svmm->vmm->cli->drm->svm, inst);
211 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex);
217 nouveau_svmm_join(struct nouveau_svmm *svmm, u64 inst)
220 if (svmm) {
223 ivmm->svmm = svmm;
226 mutex_lock(&svmm->vmm->cli->drm->svm->mutex);
227 list_add(&ivmm->head, &svmm->vmm->cli->drm->svm->inst);
228 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex);
235 nouveau_svmm_invalidate(struct nouveau_svmm *svmm, u64 start, u64 limit)
238 bool super = svmm->vmm->vmm.object.client->super;
239 svmm->vmm->vmm.object.client->super = true;
240 nvif_object_mthd(&svmm->vmm->vmm.object, NVIF_VMM_V0_PFNCLR,
245 svmm->vmm->vmm.object.client->super = super;
253 struct nouveau_svmm *svmm =
261 SVMM_DBG(svmm, "invalidate %016lx-%016lx", start, limit);
263 mutex_lock(&svmm->mutex);
264 if (unlikely(!svmm->vmm))
272 update->migrate_pgmap_owner == svmm->vmm->cli->drm->dev)
275 if (limit > svmm->unmanaged.start && start < svmm->unmanaged.limit) {
276 if (start < svmm->unmanaged.start) {
277 nouveau_svmm_invalidate(svmm, start,
278 svmm->unmanaged.limit);
280 start = svmm->unmanaged.limit;
283 nouveau_svmm_invalidate(svmm, start, limit);
286 mutex_unlock(&svmm->mutex);
303 struct nouveau_svmm *svmm = *psvmm;
304 if (svmm) {
305 mutex_lock(&svmm->mutex);
306 svmm->vmm = NULL;
307 mutex_unlock(&svmm->mutex);
308 mmu_notifier_put(&svmm->notifier);
318 struct nouveau_svmm *svmm;
327 if (!(svmm = kzalloc(sizeof(*svmm), GFP_KERNEL)))
329 svmm->vmm = &cli->svm;
330 svmm->unmanaged.start = args->unmanaged_addr;
331 svmm->unmanaged.limit = args->unmanaged_addr + args->unmanaged_size;
332 mutex_init(&svmm->mutex);
357 svmm->notifier.ops = &nouveau_mn_ops;
358 ret = __mmu_notifier_register(&svmm->notifier, current->mm);
361 /* Note, ownership of svmm transfers to mmu_notifier */
363 cli->svm.svmm = svmm;
373 kfree(svmm);
484 struct nouveau_svmm *svmm;
502 mutex_lock(&sn->svmm->mutex);
503 else if (!mutex_trylock(&sn->svmm->mutex))
506 mutex_unlock(&sn->svmm->mutex);
562 static int nouveau_range_fault(struct nouveau_svmm *svmm,
597 mutex_lock(&svmm->mutex);
600 mutex_unlock(&svmm->mutex);
608 svmm->vmm->vmm.object.client->super = true;
609 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, size, NULL);
610 svmm->vmm->vmm.object.client->super = false;
611 mutex_unlock(&svmm->mutex);
624 struct nouveau_svmm *svmm;
664 for (fi = 0, svmm = NULL; fi < buffer->fault_nr; fi++) {
665 if (!svmm || buffer->fault[fi]->inst != inst) {
668 svmm = ivmm ? ivmm->svmm : NULL;
670 SVM_DBG(svm, "inst %016llx -> svm-%p", inst, svmm);
672 buffer->fault[fi]->svmm = svmm;
688 if (!(svmm = buffer->fault[fi]->svmm)) {
692 SVMM_DBG(svmm, "addr %016llx", buffer->fault[fi]->addr);
699 if (start < svmm->unmanaged.limit)
700 limit = min_t(u64, limit, svmm->unmanaged.start);
727 mm = svmm->notifier.mm;
733 notifier.svmm = svmm;
738 ret = nouveau_range_fault(svmm, svm->drm, &args.i,
755 if (buffer->fault[fn]->svmm != svmm ||
814 nouveau_pfns_map(struct nouveau_svmm *svmm, struct mm_struct *mm,
823 mutex_lock(&svmm->mutex);
825 svmm->vmm->vmm.object.client->super = true;
826 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, sizeof(*args) +
828 svmm->vmm->vmm.object.client->super = false;
830 mutex_unlock(&svmm->mutex);