Lines Matching refs:attach
355 struct iommufd_attach *attach; in iommufd_group_device_num() local
362 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_group_device_num()
363 if (attach) in iommufd_group_device_num()
364 xa_for_each(&attach->device_array, index, idev) in iommufd_group_device_num()
443 struct iommufd_attach *attach; in iommufd_device_is_attached() local
445 attach = xa_load(&idev->igroup->pasid_attach, pasid); in iommufd_device_is_attached()
446 return xa_load(&attach->device_array, idev->obj.id); in iommufd_device_is_attached()
465 struct iommufd_attach *attach; in iommufd_hwpt_pasid_compat() local
470 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_hwpt_pasid_compat()
471 if (attach && attach->hwpt && !attach->hwpt->pasid_compat) in iommufd_hwpt_pasid_compat()
609 struct iommufd_attach *attach; in iommufd_hw_pagetable_attach() local
614 attach = xa_cmpxchg(&igroup->pasid_attach, pasid, NULL, in iommufd_hw_pagetable_attach()
616 if (xa_is_err(attach)) { in iommufd_hw_pagetable_attach()
617 rc = xa_err(attach); in iommufd_hw_pagetable_attach()
621 if (!attach) { in iommufd_hw_pagetable_attach()
622 attach = kzalloc(sizeof(*attach), GFP_KERNEL); in iommufd_hw_pagetable_attach()
623 if (!attach) { in iommufd_hw_pagetable_attach()
627 xa_init(&attach->device_array); in iommufd_hw_pagetable_attach()
630 old_hwpt = attach->hwpt; in iommufd_hw_pagetable_attach()
632 rc = xa_insert(&attach->device_array, idev->obj.id, XA_ZERO_ENTRY, in iommufd_hw_pagetable_attach()
661 attach->hwpt = hwpt; in iommufd_hw_pagetable_attach()
662 WARN_ON(xa_is_err(xa_store(&igroup->pasid_attach, pasid, attach, in iommufd_hw_pagetable_attach()
666 WARN_ON(xa_is_err(xa_store(&attach->device_array, idev->obj.id, in iommufd_hw_pagetable_attach()
674 xa_release(&attach->device_array, idev->obj.id); in iommufd_hw_pagetable_attach()
677 kfree(attach); in iommufd_hw_pagetable_attach()
692 struct iommufd_attach *attach; in iommufd_hw_pagetable_detach() local
695 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_hw_pagetable_detach()
696 if (!attach) { in iommufd_hw_pagetable_detach()
701 hwpt = attach->hwpt; in iommufd_hw_pagetable_detach()
704 xa_erase(&attach->device_array, idev->obj.id); in iommufd_hw_pagetable_detach()
705 if (xa_empty(&attach->device_array)) { in iommufd_hw_pagetable_detach()
708 kfree(attach); in iommufd_hw_pagetable_detach()
734 struct iommufd_attach *attach; in iommufd_group_remove_reserved_iova() local
740 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_group_remove_reserved_iova()
741 xa_for_each(&attach->device_array, index, cur) in iommufd_group_remove_reserved_iova()
750 struct iommufd_attach *attach; in iommufd_group_do_replace_reserved_iova() local
757 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_group_do_replace_reserved_iova()
758 old_hwpt_paging = find_hwpt_paging(attach->hwpt); in iommufd_group_do_replace_reserved_iova()
760 xa_for_each(&attach->device_array, index, cur) { in iommufd_group_do_replace_reserved_iova()
787 struct iommufd_attach *attach; in iommufd_device_do_replace() local
793 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_device_do_replace()
794 if (!attach) { in iommufd_device_do_replace()
799 old_hwpt = attach->hwpt; in iommufd_device_do_replace()
801 WARN_ON(!old_hwpt || xa_empty(&attach->device_array)); in iommufd_device_do_replace()
828 attach->hwpt = hwpt; in iommufd_device_do_replace()