Lines Matching defs:pasid_state
34 struct pasid_state {
56 struct pasid_state **states;
69 struct pasid_state *state;
152 static struct pasid_state **__get_pasid_state_ptr(struct device_state *dev_state,
155 struct pasid_state **root, **ptr;
178 root = (struct pasid_state **)*ptr;
186 struct pasid_state *pasid_state,
189 struct pasid_state **ptr;
204 *ptr = pasid_state;
216 struct pasid_state **ptr;
231 static struct pasid_state *get_pasid_state(struct device_state *dev_state,
234 struct pasid_state **ptr, *ret = NULL;
253 static void free_pasid_state(struct pasid_state *pasid_state)
255 kfree(pasid_state);
258 static void put_pasid_state(struct pasid_state *pasid_state)
260 if (atomic_dec_and_test(&pasid_state->count))
261 wake_up(&pasid_state->wq);
264 static void put_pasid_state_wait(struct pasid_state *pasid_state)
266 atomic_dec(&pasid_state->count);
267 wait_event(pasid_state->wq, !atomic_read(&pasid_state->count));
268 free_pasid_state(pasid_state);
271 static void unbind_pasid(struct pasid_state *pasid_state)
275 domain = pasid_state->device_state->domain;
278 * Mark pasid_state as invalid, no more faults will we added to the
281 pasid_state->invalid = true;
287 amd_iommu_domain_clear_gcr3(domain, pasid_state->pasid);
293 static void free_pasid_states_level1(struct pasid_state **tbl)
305 static void free_pasid_states_level2(struct pasid_state **tbl)
307 struct pasid_state **ptr;
314 ptr = (struct pasid_state **)tbl[i];
321 struct pasid_state *pasid_state;
325 pasid_state = get_pasid_state(dev_state, i);
326 if (pasid_state == NULL)
329 put_pasid_state(pasid_state);
335 mmu_notifier_unregister(&pasid_state->mn, pasid_state->mm);
337 put_pasid_state_wait(pasid_state); /* Reference taken in
354 static struct pasid_state *mn_to_state(struct mmu_notifier *mn)
356 return container_of(mn, struct pasid_state, mn);
363 struct pasid_state *pasid_state;
366 pasid_state = mn_to_state(mn);
367 dev_state = pasid_state->device_state;
370 amd_iommu_flush_page(dev_state->domain, pasid_state->pasid,
373 amd_iommu_flush_tlb(dev_state->domain, pasid_state->pasid);
378 struct pasid_state *pasid_state;
384 pasid_state = mn_to_state(mn);
385 dev_state = pasid_state->device_state;
386 run_inv_ctx_cb = !pasid_state->invalid;
389 dev_state->inv_ctx_cb(dev_state->pdev, pasid_state->pasid);
391 unbind_pasid(pasid_state);
399 static void set_pri_tag_status(struct pasid_state *pasid_state,
404 spin_lock_irqsave(&pasid_state->lock, flags);
405 pasid_state->pri[tag].status = status;
406 spin_unlock_irqrestore(&pasid_state->lock, flags);
410 struct pasid_state *pasid_state,
415 spin_lock_irqsave(&pasid_state->lock, flags);
416 if (atomic_dec_and_test(&pasid_state->pri[tag].inflight) &&
417 pasid_state->pri[tag].finish) {
418 amd_iommu_complete_ppr(dev_state->pdev, pasid_state->pasid,
419 pasid_state->pri[tag].status, tag);
420 pasid_state->pri[tag].finish = false;
421 pasid_state->pri[tag].status = PPR_SUCCESS;
423 spin_unlock_irqrestore(&pasid_state->lock, flags);
516 struct pasid_state *pasid_state;
548 pasid_state = get_pasid_state(dev_state, iommu_fault->pasid);
549 if (pasid_state == NULL || pasid_state->invalid) {
556 spin_lock_irqsave(&pasid_state->lock, flags);
557 atomic_inc(&pasid_state->pri[tag].inflight);
559 pasid_state->pri[tag].finish = true;
560 spin_unlock_irqrestore(&pasid_state->lock, flags);
565 finish_pri_tag(dev_state, pasid_state, tag);
571 fault->state = pasid_state;
584 if (ret != NOTIFY_OK && pasid_state)
585 put_pasid_state(pasid_state);
601 struct pasid_state *pasid_state;
623 pasid_state = kzalloc(sizeof(*pasid_state), GFP_KERNEL);
624 if (pasid_state == NULL)
628 atomic_set(&pasid_state->count, 1);
629 init_waitqueue_head(&pasid_state->wq);
630 spin_lock_init(&pasid_state->lock);
633 pasid_state->mm = mm;
634 pasid_state->device_state = dev_state;
635 pasid_state->pasid = pasid;
636 pasid_state->invalid = true; /* Mark as valid only if we are
638 pasid_state->mn.ops = &iommu_mn;
640 if (pasid_state->mm == NULL)
643 mmu_notifier_register(&pasid_state->mn, mm);
645 ret = set_pasid_state(dev_state, pasid_state, pasid);
650 __pa(pasid_state->mm->pgd));
655 pasid_state->invalid = false;
670 mmu_notifier_unregister(&pasid_state->mn, mm);
674 free_pasid_state(pasid_state);
685 struct pasid_state *pasid_state;
702 pasid_state = get_pasid_state(dev_state, pasid);
703 if (pasid_state == NULL)
709 put_pasid_state(pasid_state);
712 clear_pasid_state(dev_state, pasid_state->pasid);
716 * to pasid_state->mm
718 mmu_notifier_unregister(&pasid_state->mn, pasid_state->mm);
720 put_pasid_state_wait(pasid_state); /* Reference taken in