Lines Matching refs:idev

37 	struct iommufd_device *idev =  in iommufd_device_destroy()  local
40 iommu_device_release_dma_owner(idev->dev); in iommufd_device_destroy()
41 iommu_group_put(idev->group); in iommufd_device_destroy()
42 iommufd_ctx_put(idev->ictx); in iommufd_device_destroy()
64 struct iommufd_device *idev; in iommufd_device_bind() local
83 idev = iommufd_object_alloc(ictx, idev, IOMMUFD_OBJ_DEVICE); in iommufd_device_bind()
84 if (IS_ERR(idev)) { in iommufd_device_bind()
85 rc = PTR_ERR(idev); in iommufd_device_bind()
88 idev->ictx = ictx; in iommufd_device_bind()
90 idev->dev = dev; in iommufd_device_bind()
91 idev->enforce_cache_coherency = in iommufd_device_bind()
94 refcount_inc(&idev->obj.users); in iommufd_device_bind()
96 idev->group = group; in iommufd_device_bind()
104 iommufd_object_finalize(ictx, &idev->obj); in iommufd_device_bind()
105 *id = idev->obj.id; in iommufd_device_bind()
106 return idev; in iommufd_device_bind()
125 void iommufd_device_unbind(struct iommufd_device *idev) in iommufd_device_unbind() argument
129 was_destroyed = iommufd_object_destroy_user(idev->ictx, &idev->obj); in iommufd_device_unbind()
134 static int iommufd_device_setup_msi(struct iommufd_device *idev, in iommufd_device_setup_msi() argument
171 if (!iommu_group_has_isolated_msi(idev->group)) { in iommufd_device_setup_msi()
176 idev->dev, in iommufd_device_setup_msi()
195 static int iommufd_device_do_attach(struct iommufd_device *idev, in iommufd_device_do_attach() argument
209 if (idev->enforce_cache_coherency && !hwpt->enforce_cache_coherency) { in iommufd_device_do_attach()
221 rc = iopt_table_enforce_group_resv_regions(&hwpt->ioas->iopt, idev->dev, in iommufd_device_do_attach()
222 idev->group, &sw_msi_start); in iommufd_device_do_attach()
226 rc = iommufd_device_setup_msi(idev, hwpt, sw_msi_start); in iommufd_device_do_attach()
234 if (!iommufd_hw_pagetable_has_group(hwpt, idev->group)) { in iommufd_device_do_attach()
235 rc = iommu_attach_group(hwpt->domain, idev->group); in iommufd_device_do_attach()
247 idev->hwpt = hwpt; in iommufd_device_do_attach()
249 list_add(&idev->devices_item, &hwpt->devices); in iommufd_device_do_attach()
254 iommu_detach_group(hwpt->domain, idev->group); in iommufd_device_do_attach()
256 iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev); in iommufd_device_do_attach()
267 static int iommufd_device_auto_get_domain(struct iommufd_device *idev, in iommufd_device_auto_get_domain() argument
283 rc = iommufd_device_do_attach(idev, hwpt); in iommufd_device_auto_get_domain()
295 hwpt = iommufd_hw_pagetable_alloc(idev->ictx, ioas, idev->dev); in iommufd_device_auto_get_domain()
302 rc = iommufd_device_do_attach(idev, hwpt); in iommufd_device_auto_get_domain()
308 iommufd_object_finalize(idev->ictx, &hwpt->obj); in iommufd_device_auto_get_domain()
312 iommufd_object_abort_and_destroy(idev->ictx, &hwpt->obj); in iommufd_device_auto_get_domain()
330 int iommufd_device_attach(struct iommufd_device *idev, u32 *pt_id) in iommufd_device_attach() argument
335 pt_obj = iommufd_get_object(idev->ictx, *pt_id, IOMMUFD_OBJ_ANY); in iommufd_device_attach()
344 rc = iommufd_device_do_attach(idev, hwpt); in iommufd_device_attach()
353 rc = iommufd_device_auto_get_domain(idev, ioas); in iommufd_device_attach()
363 refcount_inc(&idev->obj.users); in iommufd_device_attach()
364 *pt_id = idev->hwpt->obj.id; in iommufd_device_attach()
380 void iommufd_device_detach(struct iommufd_device *idev) in iommufd_device_detach() argument
382 struct iommufd_hw_pagetable *hwpt = idev->hwpt; in iommufd_device_detach()
386 list_del(&idev->devices_item); in iommufd_device_detach()
387 if (!iommufd_hw_pagetable_has_group(hwpt, idev->group)) { in iommufd_device_detach()
393 iommu_detach_group(hwpt->domain, idev->group); in iommufd_device_detach()
395 iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev); in iommufd_device_detach()
400 iommufd_object_destroy_user(idev->ictx, &hwpt->obj); in iommufd_device_detach()
404 idev->hwpt = NULL; in iommufd_device_detach()
406 refcount_dec(&idev->obj.users); in iommufd_device_detach()