Lines Matching defs:idev

136 	struct iommufd_device *idev =
139 iommu_device_release_dma_owner(idev->dev);
140 iommufd_put_group(idev->igroup);
141 if (!iommufd_selftest_is_mock_dev(idev->dev))
142 iommufd_ctx_put(idev->ictx);
164 struct iommufd_device *idev;
203 idev = iommufd_object_alloc(ictx, idev, IOMMUFD_OBJ_DEVICE);
204 if (IS_ERR(idev)) {
205 rc = PTR_ERR(idev);
208 idev->ictx = ictx;
211 idev->dev = dev;
212 idev->enforce_cache_coherency =
215 refcount_inc(&idev->obj.users);
217 idev->igroup = igroup;
225 iommufd_object_finalize(ictx, &idev->obj);
226 *id = idev->obj.id;
227 return idev;
270 * @idev: Device returned by iommufd_device_bind()
277 void iommufd_device_unbind(struct iommufd_device *idev)
279 iommufd_object_destroy_user(idev->ictx, &idev->obj);
283 struct iommufd_ctx *iommufd_device_to_ictx(struct iommufd_device *idev)
285 return idev->ictx;
289 u32 iommufd_device_to_id(struct iommufd_device *idev)
291 return idev->obj.id;
329 struct iommufd_device *idev)
333 mutex_lock(&idev->igroup->lock);
335 if (idev->igroup->hwpt != NULL && idev->igroup->hwpt != hwpt) {
341 if (idev->enforce_cache_coherency) {
347 rc = iopt_table_enforce_dev_resv_regions(&hwpt->ioas->iopt, idev->dev,
348 &idev->igroup->sw_msi_start);
359 if (list_empty(&idev->igroup->device_list)) {
360 rc = iommufd_group_setup_msi(idev->igroup, hwpt);
364 rc = iommu_attach_group(hwpt->domain, idev->igroup->group);
367 idev->igroup->hwpt = hwpt;
370 list_add_tail(&idev->group_item, &idev->igroup->device_list);
371 mutex_unlock(&idev->igroup->lock);
374 iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev);
376 mutex_unlock(&idev->igroup->lock);
381 iommufd_hw_pagetable_detach(struct iommufd_device *idev)
383 struct iommufd_hw_pagetable *hwpt = idev->igroup->hwpt;
385 mutex_lock(&idev->igroup->lock);
386 list_del(&idev->group_item);
387 if (list_empty(&idev->igroup->device_list)) {
388 iommu_detach_group(hwpt->domain, idev->igroup->group);
389 idev->igroup->hwpt = NULL;
391 iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev);
392 mutex_unlock(&idev->igroup->lock);
399 iommufd_device_do_attach(struct iommufd_device *idev,
404 rc = iommufd_hw_pagetable_attach(hwpt, idev);
411 iommufd_device_do_replace(struct iommufd_device *idev,
414 struct iommufd_group *igroup = idev->igroup;
420 mutex_lock(&idev->igroup->lock);
428 mutex_unlock(&idev->igroup->lock);
452 rc = iommufd_group_setup_msi(idev->igroup, hwpt);
476 mutex_unlock(&idev->igroup->lock);
484 mutex_unlock(&idev->igroup->lock);
489 struct iommufd_device *idev, struct iommufd_hw_pagetable *hwpt);
497 iommufd_device_auto_get_domain(struct iommufd_device *idev,
524 destroy_hwpt = (*do_attach)(idev, hwpt);
542 hwpt = iommufd_hw_pagetable_alloc(idev->ictx, ioas, idev,
550 destroy_hwpt = (*do_attach)(idev, hwpt);
560 iommufd_object_finalize(idev->ictx, &hwpt->obj);
565 iommufd_object_abort_and_destroy(idev->ictx, &hwpt->obj);
571 static int iommufd_device_change_pt(struct iommufd_device *idev, u32 *pt_id,
577 pt_obj = iommufd_get_object(idev->ictx, *pt_id, IOMMUFD_OBJ_ANY);
586 destroy_hwpt = (*do_attach)(idev, hwpt);
595 destroy_hwpt = iommufd_device_auto_get_domain(idev, ioas, pt_id,
609 iommufd_hw_pagetable_put(idev->ictx, destroy_hwpt);
619 * @idev: device to attach
629 int iommufd_device_attach(struct iommufd_device *idev, u32 *pt_id)
633 rc = iommufd_device_change_pt(idev, pt_id, &iommufd_device_do_attach);
641 refcount_inc(&idev->obj.users);
648 * @idev: device to change
661 int iommufd_device_replace(struct iommufd_device *idev, u32 *pt_id)
663 return iommufd_device_change_pt(idev, pt_id,
670 * @idev: device to detach
672 * Undo iommufd_device_attach(). This disconnects the idev from the previously
675 void iommufd_device_detach(struct iommufd_device *idev)
679 hwpt = iommufd_hw_pagetable_detach(idev);
680 iommufd_hw_pagetable_put(idev->ictx, hwpt);
681 refcount_dec(&idev->obj.users);
1129 struct iommufd_device *idev;
1138 idev = iommufd_get_device(ucmd, cmd->dev_id);
1139 if (IS_ERR(idev))
1140 return PTR_ERR(idev);
1142 ops = dev_iommu_ops(idev->dev);
1144 data = ops->hw_info(idev->dev, &data_len, &cmd->out_data_type);
1192 iommufd_put_object(&idev->obj);