Lines Matching defs:pasid_state

35 struct pasid_state {
57 struct pasid_state **states;
70 struct pasid_state *state;
151 static struct pasid_state **__get_pasid_state_ptr(struct device_state *dev_state,
154 struct pasid_state **root, **ptr;
177 root = (struct pasid_state **)*ptr;
185 struct pasid_state *pasid_state,
188 struct pasid_state **ptr;
203 *ptr = pasid_state;
215 struct pasid_state **ptr;
230 static struct pasid_state *get_pasid_state(struct device_state *dev_state,
233 struct pasid_state **ptr, *ret = NULL;
252 static void free_pasid_state(struct pasid_state *pasid_state)
254 kfree(pasid_state);
257 static void put_pasid_state(struct pasid_state *pasid_state)
259 if (refcount_dec_and_test(&pasid_state->count))
260 wake_up(&pasid_state->wq);
263 static void put_pasid_state_wait(struct pasid_state *pasid_state)
265 if (!refcount_dec_and_test(&pasid_state->count))
266 wait_event(pasid_state->wq, !refcount_read(&pasid_state->count));
267 free_pasid_state(pasid_state);
270 static void unbind_pasid(struct pasid_state *pasid_state)
274 domain = pasid_state->device_state->domain;
277 * Mark pasid_state as invalid, no more faults will we added to the
280 pasid_state->invalid = true;
286 amd_iommu_domain_clear_gcr3(domain, pasid_state->pasid);
292 static void free_pasid_states_level1(struct pasid_state **tbl)
304 static void free_pasid_states_level2(struct pasid_state **tbl)
306 struct pasid_state **ptr;
313 ptr = (struct pasid_state **)tbl[i];
320 struct pasid_state *pasid_state;
324 pasid_state = get_pasid_state(dev_state, i);
325 if (pasid_state == NULL)
328 put_pasid_state(pasid_state);
331 clear_pasid_state(dev_state, pasid_state->pasid);
337 mmu_notifier_unregister(&pasid_state->mn, pasid_state->mm);
339 put_pasid_state_wait(pasid_state); /* Reference taken in
356 static struct pasid_state *mn_to_state(struct mmu_notifier *mn)
358 return container_of(mn, struct pasid_state, mn);
365 struct pasid_state *pasid_state;
368 pasid_state = mn_to_state(mn);
369 dev_state = pasid_state->device_state;
372 amd_iommu_flush_page(dev_state->domain, pasid_state->pasid,
375 amd_iommu_flush_tlb(dev_state->domain, pasid_state->pasid);
380 struct pasid_state *pasid_state;
386 pasid_state = mn_to_state(mn);
387 dev_state = pasid_state->device_state;
388 run_inv_ctx_cb = !pasid_state->invalid;
391 dev_state->inv_ctx_cb(dev_state->pdev, pasid_state->pasid);
393 unbind_pasid(pasid_state);
401 static void set_pri_tag_status(struct pasid_state *pasid_state,
406 spin_lock_irqsave(&pasid_state->lock, flags);
407 pasid_state->pri[tag].status = status;
408 spin_unlock_irqrestore(&pasid_state->lock, flags);
412 struct pasid_state *pasid_state,
417 spin_lock_irqsave(&pasid_state->lock, flags);
418 if (atomic_dec_and_test(&pasid_state->pri[tag].inflight) &&
419 pasid_state->pri[tag].finish) {
420 amd_iommu_complete_ppr(dev_state->pdev, pasid_state->pasid,
421 pasid_state->pri[tag].status, tag);
422 pasid_state->pri[tag].finish = false;
423 pasid_state->pri[tag].status = PPR_SUCCESS;
425 spin_unlock_irqrestore(&pasid_state->lock, flags);
518 struct pasid_state *pasid_state;
551 pasid_state = get_pasid_state(dev_state, iommu_fault->pasid);
552 if (pasid_state == NULL || pasid_state->invalid) {
559 spin_lock_irqsave(&pasid_state->lock, flags);
560 atomic_inc(&pasid_state->pri[tag].inflight);
562 pasid_state->pri[tag].finish = true;
563 spin_unlock_irqrestore(&pasid_state->lock, flags);
568 finish_pri_tag(dev_state, pasid_state, tag);
574 fault->state = pasid_state;
587 if (ret != NOTIFY_OK && pasid_state)
588 put_pasid_state(pasid_state);
604 struct pasid_state *pasid_state;
626 pasid_state = kzalloc(sizeof(*pasid_state), GFP_KERNEL);
627 if (pasid_state == NULL)
631 refcount_set(&pasid_state->count, 1);
632 init_waitqueue_head(&pasid_state->wq);
633 spin_lock_init(&pasid_state->lock);
636 pasid_state->mm = mm;
637 pasid_state->device_state = dev_state;
638 pasid_state->pasid = pasid;
639 pasid_state->invalid = true; /* Mark as valid only if we are
641 pasid_state->mn.ops = &iommu_mn;
643 if (pasid_state->mm == NULL)
646 ret = mmu_notifier_register(&pasid_state->mn, mm);
650 ret = set_pasid_state(dev_state, pasid_state, pasid);
655 __pa(pasid_state->mm->pgd));
660 pasid_state->invalid = false;
675 mmu_notifier_unregister(&pasid_state->mn, mm);
679 free_pasid_state(pasid_state);
690 struct pasid_state *pasid_state;
707 pasid_state = get_pasid_state(dev_state, pasid);
708 if (pasid_state == NULL)
714 put_pasid_state(pasid_state);
717 clear_pasid_state(dev_state, pasid_state->pasid);
721 * to pasid_state->mm
723 mmu_notifier_unregister(&pasid_state->mn, pasid_state->mm);
725 put_pasid_state_wait(pasid_state); /* Reference taken in