• Home
  • Raw
  • Download

Lines Matching refs:dev_state

79 	struct device_state *dev_state;  member
102 static void free_pasid_states(struct device_state *dev_state);
116 struct device_state *dev_state; in __get_device_state() local
118 list_for_each_entry(dev_state, &state_list, list) { in __get_device_state()
119 if (dev_state->devid == devid) in __get_device_state()
120 return dev_state; in __get_device_state()
128 struct device_state *dev_state; in get_device_state() local
132 dev_state = __get_device_state(devid); in get_device_state()
133 if (dev_state != NULL) in get_device_state()
134 atomic_inc(&dev_state->count); in get_device_state()
137 return dev_state; in get_device_state()
140 static void free_device_state(struct device_state *dev_state) in free_device_state() argument
146 iommu_detach_device(dev_state->domain, &dev_state->pdev->dev); in free_device_state()
149 iommu_domain_free(dev_state->domain); in free_device_state()
152 kfree(dev_state); in free_device_state()
155 static void put_device_state(struct device_state *dev_state) in put_device_state() argument
157 if (atomic_dec_and_test(&dev_state->count)) in put_device_state()
158 wake_up(&dev_state->wq); in put_device_state()
161 static void put_device_state_wait(struct device_state *dev_state) in put_device_state_wait() argument
165 prepare_to_wait(&dev_state->wq, &wait, TASK_UNINTERRUPTIBLE); in put_device_state_wait()
166 if (!atomic_dec_and_test(&dev_state->count)) in put_device_state_wait()
168 finish_wait(&dev_state->wq, &wait); in put_device_state_wait()
170 free_device_state(dev_state); in put_device_state_wait()
174 static struct pasid_state **__get_pasid_state_ptr(struct device_state *dev_state, in __get_pasid_state_ptr() argument
180 level = dev_state->pasid_levels; in __get_pasid_state_ptr()
181 root = dev_state->states; in __get_pasid_state_ptr()
207 static int set_pasid_state(struct device_state *dev_state, in set_pasid_state() argument
215 spin_lock_irqsave(&dev_state->lock, flags); in set_pasid_state()
216 ptr = __get_pasid_state_ptr(dev_state, pasid, true); in set_pasid_state()
231 spin_unlock_irqrestore(&dev_state->lock, flags); in set_pasid_state()
236 static void clear_pasid_state(struct device_state *dev_state, int pasid) in clear_pasid_state() argument
241 spin_lock_irqsave(&dev_state->lock, flags); in clear_pasid_state()
242 ptr = __get_pasid_state_ptr(dev_state, pasid, true); in clear_pasid_state()
250 spin_unlock_irqrestore(&dev_state->lock, flags); in clear_pasid_state()
253 static struct pasid_state *get_pasid_state(struct device_state *dev_state, in get_pasid_state() argument
259 spin_lock_irqsave(&dev_state->lock, flags); in get_pasid_state()
260 ptr = __get_pasid_state_ptr(dev_state, pasid, false); in get_pasid_state()
270 spin_unlock_irqrestore(&dev_state->lock, flags); in get_pasid_state()
351 static void free_pasid_states(struct device_state *dev_state) in free_pasid_states() argument
356 for (i = 0; i < dev_state->max_pasids; ++i) { in free_pasid_states()
357 pasid_state = get_pasid_state(dev_state, i); in free_pasid_states()
373 put_device_state(dev_state); in free_pasid_states()
376 if (dev_state->pasid_levels == 2) in free_pasid_states()
377 free_pasid_states_level2(dev_state->states); in free_pasid_states()
378 else if (dev_state->pasid_levels == 1) in free_pasid_states()
379 free_pasid_states_level1(dev_state->states); in free_pasid_states()
380 else if (dev_state->pasid_levels != 0) in free_pasid_states()
383 free_page((unsigned long)dev_state->states); in free_pasid_states()
395 struct device_state *dev_state; in __mn_flush_page() local
398 dev_state = pasid_state->device_state; in __mn_flush_page()
400 amd_iommu_flush_page(dev_state->domain, pasid_state->pasid, address); in __mn_flush_page()
426 struct device_state *dev_state; in mn_invalidate_range_start() local
430 dev_state = pasid_state->device_state; in mn_invalidate_range_start()
434 amd_iommu_domain_set_gcr3(dev_state->domain, in mn_invalidate_range_start()
447 struct device_state *dev_state; in mn_invalidate_range_end() local
451 dev_state = pasid_state->device_state; in mn_invalidate_range_end()
456 amd_iommu_domain_set_gcr3(dev_state->domain, in mn_invalidate_range_end()
466 struct device_state *dev_state; in mn_release() local
472 dev_state = pasid_state->device_state; in mn_release()
476 dev_state->inv_ctx_cb(dev_state->pdev, pasid_state->pasid); in mn_release()
499 static void finish_pri_tag(struct device_state *dev_state, in finish_pri_tag() argument
508 amd_iommu_complete_ppr(dev_state->pdev, pasid_state->pasid, in finish_pri_tag()
531 } else if (fault->dev_state->inv_ppr_cb) { in do_fault()
534 status = fault->dev_state->inv_ppr_cb(fault->dev_state->pdev, in do_fault()
555 finish_pri_tag(fault->dev_state, fault->state, fault->tag); in do_fault()
566 struct device_state *dev_state; in ppr_notifier() local
578 dev_state = get_device_state(iommu_fault->device_id); in ppr_notifier()
579 if (dev_state == NULL) in ppr_notifier()
582 pasid_state = get_pasid_state(dev_state, iommu_fault->pasid); in ppr_notifier()
585 amd_iommu_complete_ppr(dev_state->pdev, iommu_fault->pasid, in ppr_notifier()
599 finish_pri_tag(dev_state, pasid_state, tag); in ppr_notifier()
603 fault->dev_state = dev_state; in ppr_notifier()
621 put_device_state(dev_state); in ppr_notifier()
635 struct device_state *dev_state; in amd_iommu_bind_pasid() local
646 dev_state = get_device_state(devid); in amd_iommu_bind_pasid()
648 if (dev_state == NULL) in amd_iommu_bind_pasid()
652 if (pasid < 0 || pasid >= dev_state->max_pasids) in amd_iommu_bind_pasid()
667 pasid_state->device_state = dev_state; in amd_iommu_bind_pasid()
678 ret = set_pasid_state(dev_state, pasid_state, pasid); in amd_iommu_bind_pasid()
682 ret = amd_iommu_domain_set_gcr3(dev_state->domain, pasid, in amd_iommu_bind_pasid()
700 clear_pasid_state(dev_state, pasid); in amd_iommu_bind_pasid()
710 put_device_state(dev_state); in amd_iommu_bind_pasid()
719 struct device_state *dev_state; in amd_iommu_unbind_pasid() local
728 dev_state = get_device_state(devid); in amd_iommu_unbind_pasid()
729 if (dev_state == NULL) in amd_iommu_unbind_pasid()
732 if (pasid < 0 || pasid >= dev_state->max_pasids) in amd_iommu_unbind_pasid()
735 pasid_state = get_pasid_state(dev_state, pasid); in amd_iommu_unbind_pasid()
745 clear_pasid_state(dev_state, pasid_state->pasid); in amd_iommu_unbind_pasid()
757 put_device_state(dev_state); in amd_iommu_unbind_pasid()
760 put_device_state(dev_state); in amd_iommu_unbind_pasid()
766 struct device_state *dev_state; in amd_iommu_init_device() local
781 dev_state = kzalloc(sizeof(*dev_state), GFP_KERNEL); in amd_iommu_init_device()
782 if (dev_state == NULL) in amd_iommu_init_device()
785 spin_lock_init(&dev_state->lock); in amd_iommu_init_device()
786 init_waitqueue_head(&dev_state->wq); in amd_iommu_init_device()
787 dev_state->pdev = pdev; in amd_iommu_init_device()
788 dev_state->devid = devid; in amd_iommu_init_device()
791 for (dev_state->pasid_levels = 0; (tmp - 1) & ~0x1ff; tmp >>= 9) in amd_iommu_init_device()
792 dev_state->pasid_levels += 1; in amd_iommu_init_device()
794 atomic_set(&dev_state->count, 1); in amd_iommu_init_device()
795 dev_state->max_pasids = pasids; in amd_iommu_init_device()
798 dev_state->states = (void *)get_zeroed_page(GFP_KERNEL); in amd_iommu_init_device()
799 if (dev_state->states == NULL) in amd_iommu_init_device()
802 dev_state->domain = iommu_domain_alloc(&pci_bus_type); in amd_iommu_init_device()
803 if (dev_state->domain == NULL) in amd_iommu_init_device()
806 amd_iommu_domain_direct_map(dev_state->domain); in amd_iommu_init_device()
808 ret = amd_iommu_domain_enable_v2(dev_state->domain, pasids); in amd_iommu_init_device()
812 ret = iommu_attach_device(dev_state->domain, &pdev->dev); in amd_iommu_init_device()
824 list_add_tail(&dev_state->list, &state_list); in amd_iommu_init_device()
831 iommu_domain_free(dev_state->domain); in amd_iommu_init_device()
834 free_page((unsigned long)dev_state->states); in amd_iommu_init_device()
837 kfree(dev_state); in amd_iommu_init_device()
845 struct device_state *dev_state; in amd_iommu_free_device() local
856 dev_state = __get_device_state(devid); in amd_iommu_free_device()
857 if (dev_state == NULL) { in amd_iommu_free_device()
862 list_del(&dev_state->list); in amd_iommu_free_device()
867 free_pasid_states(dev_state); in amd_iommu_free_device()
869 put_device_state_wait(dev_state); in amd_iommu_free_device()
876 struct device_state *dev_state; in amd_iommu_set_invalid_ppr_cb() local
889 dev_state = __get_device_state(devid); in amd_iommu_set_invalid_ppr_cb()
890 if (dev_state == NULL) in amd_iommu_set_invalid_ppr_cb()
893 dev_state->inv_ppr_cb = cb; in amd_iommu_set_invalid_ppr_cb()
907 struct device_state *dev_state; in amd_iommu_set_invalidate_ctx_cb() local
920 dev_state = __get_device_state(devid); in amd_iommu_set_invalidate_ctx_cb()
921 if (dev_state == NULL) in amd_iommu_set_invalidate_ctx_cb()
924 dev_state->inv_ctx_cb = cb; in amd_iommu_set_invalidate_ctx_cb()
975 struct device_state *dev_state; in amd_iommu_v2_exit() local
990 dev_state = get_device_state(i); in amd_iommu_v2_exit()
992 if (dev_state == NULL) in amd_iommu_v2_exit()
997 put_device_state(dev_state); in amd_iommu_v2_exit()
998 amd_iommu_free_device(dev_state->pdev); in amd_iommu_v2_exit()