Home | History | Annotate | Download | only in nouveau

Lines Matching defs:svmm

69 			struct nouveau_svmm *svmm;
79 struct nouveau_svmm *svmm;
206 /* Unlink channel instance from SVMM. */
208 nouveau_svmm_part(struct nouveau_svmm *svmm, u64 inst)
211 if (svmm) {
212 mutex_lock(&svmm->vmm->cli->drm->svm->mutex);
213 ivmm = nouveau_ivmm_find(svmm->vmm->cli->drm->svm, inst);
218 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex);
222 /* Link channel instance to SVMM. */
224 nouveau_svmm_join(struct nouveau_svmm *svmm, u64 inst)
227 if (svmm) {
230 ivmm->svmm = svmm;
233 mutex_lock(&svmm->vmm->cli->drm->svm->mutex);
234 list_add(&ivmm->head, &svmm->vmm->cli->drm->svm->inst);
235 mutex_unlock(&svmm->vmm->cli->drm->svm->mutex);
240 /* Invalidate SVMM address-range on GPU. */
242 nouveau_svmm_invalidate(struct nouveau_svmm *svmm, u64 start, u64 limit)
245 bool super = svmm->vmm->vmm.object.client->super;
246 svmm->vmm->vmm.object.client->super = true;
247 nvif_object_mthd(&svmm->vmm->vmm.object, NVIF_VMM_V0_PFNCLR,
252 svmm->vmm->vmm.object.client->super = super;
260 struct nouveau_svmm *svmm =
268 SVMM_DBG(svmm, "invalidate %016lx-%016lx", start, limit);
270 mutex_lock(&svmm->mutex);
271 if (unlikely(!svmm->vmm))
274 if (limit > svmm->unmanaged.start && start < svmm->unmanaged.limit) {
275 if (start < svmm->unmanaged.start) {
276 nouveau_svmm_invalidate(svmm, start,
277 svmm->unmanaged.limit);
279 start = svmm->unmanaged.limit;
282 nouveau_svmm_invalidate(svmm, start, limit);
285 mutex_unlock(&svmm->mutex);
302 struct nouveau_svmm *svmm = *psvmm;
303 if (svmm) {
304 mutex_lock(&svmm->mutex);
305 svmm->vmm = NULL;
306 mutex_unlock(&svmm->mutex);
307 mmu_notifier_put(&svmm->notifier);
308 mutex_destroy(&svmm->mutex);
318 struct nouveau_svmm *svmm;
323 if (!(svmm = kzalloc(sizeof(*svmm), GFP_KERNEL)))
325 svmm->vmm = &cli->svm;
326 svmm->unmanaged.start = args->unmanaged_addr;
327 svmm->unmanaged.limit = args->unmanaged_addr + args->unmanaged_size;
328 mutex_init(&svmm->mutex);
352 svmm->notifier.ops = &nouveau_mn_ops;
353 ret = __mmu_notifier_register(&svmm->notifier, current->mm);
356 /* Note, ownership of svmm transfers to mmu_notifier */
358 cli->svm.svmm = svmm;
368 mutex_destroy(&svmm->mutex);
369 kfree(svmm);
494 struct nouveau_svmm *svmm;
512 mutex_lock(&sn->svmm->mutex);
513 else if (!mutex_trylock(&sn->svmm->mutex))
516 mutex_unlock(&sn->svmm->mutex);
524 static int nouveau_range_fault(struct nouveau_svmm *svmm,
559 mutex_lock(&svmm->mutex);
562 mutex_unlock(&svmm->mutex);
570 svmm->vmm->vmm.object.client->super = true;
571 ret = nvif_object_ioctl(&svmm->vmm->vmm.object, data, size, NULL);
572 svmm->vmm->vmm.object.client->super = false;
573 mutex_unlock(&svmm->mutex);
586 struct nouveau_svmm *svmm;
622 * instance to SVMM translations, followed by address and access
628 /* Lookup SVMM structure for each unique instance pointer. */
630 for (fi = 0, svmm = NULL; fi < buffer->fault_nr; fi++) {
631 if (!svmm || buffer->fault[fi]->inst != inst) {
634 svmm = ivmm ? ivmm->svmm : NULL;
636 SVM_DBG(svm, "inst %016llx -> svm-%p", inst, svmm);
638 buffer->fault[fi]->svmm = svmm;
654 if (!(svmm = buffer->fault[fi]->svmm)) {
658 SVMM_DBG(svmm, "addr %016llx", buffer->fault[fi]->addr);
665 if (start < svmm->unmanaged.limit)
666 limit = min_t(u64, limit, svmm->unmanaged.start);
668 if (limit > svmm->unmanaged.start)
669 start = max_t(u64, start, svmm->unmanaged.limit);
670 SVMM_DBG(svmm, "wndw %016llx-%016llx", start, limit);
672 mm = svmm->notifier.mm;
684 SVMM_ERR(svmm, "wndw %016llx-%016llx", start, limit);
693 SVMM_DBG(svmm, "wndw %016llx-%016llx", start, limit);
696 SVMM_ERR(svmm, "addr %016llx", buffer->fault[fi]->addr);
723 * same SVMM as faults are ordered by access type such
730 buffer->fault[fn]->svmm == svmm &&
738 buffer->fault[fn]->svmm != svmm ||
749 SVMM_DBG(svmm, "wndw %016llx-%016llx covering %d fault(s)",
753 notifier.svmm = svmm;
755 svmm->notifier.mm,
760 svmm, svm->drm, &args,