Lines Matching refs:vdev
13 bool vfio_iommufd_device_has_compat_ioas(struct vfio_device *vdev, in vfio_iommufd_device_has_compat_ioas() argument
23 struct vfio_device *vdev = df->device; in vfio_df_iommufd_bind() local
26 lockdep_assert_held(&vdev->dev_set->lock); in vfio_df_iommufd_bind()
29 if (vfio_device_is_noiommu(vdev)) in vfio_df_iommufd_bind()
32 return vdev->ops->bind_iommufd(vdev, ictx, &df->devid); in vfio_df_iommufd_bind()
35 int vfio_iommufd_compat_attach_ioas(struct vfio_device *vdev, in vfio_iommufd_compat_attach_ioas() argument
41 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_compat_attach_ioas()
44 if (vfio_device_is_noiommu(vdev)) in vfio_iommufd_compat_attach_ioas()
52 return vdev->ops->attach_ioas(vdev, &ioas_id); in vfio_iommufd_compat_attach_ioas()
57 struct vfio_device *vdev = df->device; in vfio_df_iommufd_unbind() local
59 lockdep_assert_held(&vdev->dev_set->lock); in vfio_df_iommufd_unbind()
61 if (vfio_device_is_noiommu(vdev)) in vfio_df_iommufd_unbind()
64 if (vdev->ops->unbind_iommufd) in vfio_df_iommufd_unbind()
65 vdev->ops->unbind_iommufd(vdev); in vfio_df_iommufd_unbind()
68 struct iommufd_ctx *vfio_iommufd_device_ictx(struct vfio_device *vdev) in vfio_iommufd_device_ictx() argument
70 if (vdev->iommufd_device) in vfio_iommufd_device_ictx()
71 return iommufd_device_to_ictx(vdev->iommufd_device); in vfio_iommufd_device_ictx()
76 static int vfio_iommufd_device_id(struct vfio_device *vdev) in vfio_iommufd_device_id() argument
78 if (vdev->iommufd_device) in vfio_iommufd_device_id()
79 return iommufd_device_to_id(vdev->iommufd_device); in vfio_iommufd_device_id()
89 int vfio_iommufd_get_dev_id(struct vfio_device *vdev, struct iommufd_ctx *ictx) in vfio_iommufd_get_dev_id() argument
94 if (vfio_iommufd_device_ictx(vdev) == ictx) in vfio_iommufd_get_dev_id()
95 return vfio_iommufd_device_id(vdev); in vfio_iommufd_get_dev_id()
97 group = iommu_group_get(vdev->dev); in vfio_iommufd_get_dev_id()
117 int vfio_iommufd_physical_bind(struct vfio_device *vdev, in vfio_iommufd_physical_bind() argument
122 idev = iommufd_device_bind(ictx, vdev->dev, out_device_id); in vfio_iommufd_physical_bind()
125 vdev->iommufd_device = idev; in vfio_iommufd_physical_bind()
126 ida_init(&vdev->pasids); in vfio_iommufd_physical_bind()
131 void vfio_iommufd_physical_unbind(struct vfio_device *vdev) in vfio_iommufd_physical_unbind() argument
135 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_physical_unbind()
137 while ((pasid = ida_find_first(&vdev->pasids)) >= 0) { in vfio_iommufd_physical_unbind()
138 iommufd_device_detach(vdev->iommufd_device, pasid); in vfio_iommufd_physical_unbind()
139 ida_free(&vdev->pasids, pasid); in vfio_iommufd_physical_unbind()
142 if (vdev->iommufd_attached) { in vfio_iommufd_physical_unbind()
143 iommufd_device_detach(vdev->iommufd_device, IOMMU_NO_PASID); in vfio_iommufd_physical_unbind()
144 vdev->iommufd_attached = false; in vfio_iommufd_physical_unbind()
146 iommufd_device_unbind(vdev->iommufd_device); in vfio_iommufd_physical_unbind()
147 vdev->iommufd_device = NULL; in vfio_iommufd_physical_unbind()
151 int vfio_iommufd_physical_attach_ioas(struct vfio_device *vdev, u32 *pt_id) in vfio_iommufd_physical_attach_ioas() argument
155 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_physical_attach_ioas()
157 if (WARN_ON(!vdev->iommufd_device)) in vfio_iommufd_physical_attach_ioas()
160 if (vdev->iommufd_attached) in vfio_iommufd_physical_attach_ioas()
161 rc = iommufd_device_replace(vdev->iommufd_device, in vfio_iommufd_physical_attach_ioas()
164 rc = iommufd_device_attach(vdev->iommufd_device, in vfio_iommufd_physical_attach_ioas()
168 vdev->iommufd_attached = true; in vfio_iommufd_physical_attach_ioas()
173 void vfio_iommufd_physical_detach_ioas(struct vfio_device *vdev) in vfio_iommufd_physical_detach_ioas() argument
175 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_physical_detach_ioas()
177 if (WARN_ON(!vdev->iommufd_device) || !vdev->iommufd_attached) in vfio_iommufd_physical_detach_ioas()
180 iommufd_device_detach(vdev->iommufd_device, IOMMU_NO_PASID); in vfio_iommufd_physical_detach_ioas()
181 vdev->iommufd_attached = false; in vfio_iommufd_physical_detach_ioas()
185 int vfio_iommufd_physical_pasid_attach_ioas(struct vfio_device *vdev, in vfio_iommufd_physical_pasid_attach_ioas() argument
190 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_physical_pasid_attach_ioas()
192 if (WARN_ON(!vdev->iommufd_device)) in vfio_iommufd_physical_pasid_attach_ioas()
195 if (ida_exists(&vdev->pasids, pasid)) in vfio_iommufd_physical_pasid_attach_ioas()
196 return iommufd_device_replace(vdev->iommufd_device, in vfio_iommufd_physical_pasid_attach_ioas()
199 rc = ida_alloc_range(&vdev->pasids, pasid, pasid, GFP_KERNEL); in vfio_iommufd_physical_pasid_attach_ioas()
203 rc = iommufd_device_attach(vdev->iommufd_device, pasid, pt_id); in vfio_iommufd_physical_pasid_attach_ioas()
205 ida_free(&vdev->pasids, pasid); in vfio_iommufd_physical_pasid_attach_ioas()
211 void vfio_iommufd_physical_pasid_detach_ioas(struct vfio_device *vdev, in vfio_iommufd_physical_pasid_detach_ioas() argument
214 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_physical_pasid_detach_ioas()
216 if (WARN_ON(!vdev->iommufd_device)) in vfio_iommufd_physical_pasid_detach_ioas()
219 if (!ida_exists(&vdev->pasids, pasid)) in vfio_iommufd_physical_pasid_detach_ioas()
222 iommufd_device_detach(vdev->iommufd_device, pasid); in vfio_iommufd_physical_pasid_detach_ioas()
223 ida_free(&vdev->pasids, pasid); in vfio_iommufd_physical_pasid_detach_ioas()
237 struct vfio_device *vdev = data; in vfio_emulated_unmap() local
239 if (vdev->ops->dma_unmap) in vfio_emulated_unmap()
240 vdev->ops->dma_unmap(vdev, iova, length); in vfio_emulated_unmap()
248 int vfio_iommufd_emulated_bind(struct vfio_device *vdev, in vfio_iommufd_emulated_bind() argument
253 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_emulated_bind()
255 user = iommufd_access_create(ictx, &vfio_user_ops, vdev, out_device_id); in vfio_iommufd_emulated_bind()
258 vdev->iommufd_access = user; in vfio_iommufd_emulated_bind()
263 void vfio_iommufd_emulated_unbind(struct vfio_device *vdev) in vfio_iommufd_emulated_unbind() argument
265 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_emulated_unbind()
267 if (vdev->iommufd_access) { in vfio_iommufd_emulated_unbind()
268 iommufd_access_destroy(vdev->iommufd_access); in vfio_iommufd_emulated_unbind()
269 vdev->iommufd_attached = false; in vfio_iommufd_emulated_unbind()
270 vdev->iommufd_access = NULL; in vfio_iommufd_emulated_unbind()
275 int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id) in vfio_iommufd_emulated_attach_ioas() argument
279 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_emulated_attach_ioas()
281 if (vdev->iommufd_attached) in vfio_iommufd_emulated_attach_ioas()
282 rc = iommufd_access_replace(vdev->iommufd_access, *pt_id); in vfio_iommufd_emulated_attach_ioas()
284 rc = iommufd_access_attach(vdev->iommufd_access, *pt_id); in vfio_iommufd_emulated_attach_ioas()
287 vdev->iommufd_attached = true; in vfio_iommufd_emulated_attach_ioas()
292 void vfio_iommufd_emulated_detach_ioas(struct vfio_device *vdev) in vfio_iommufd_emulated_detach_ioas() argument
294 lockdep_assert_held(&vdev->dev_set->lock); in vfio_iommufd_emulated_detach_ioas()
296 if (WARN_ON(!vdev->iommufd_access) || in vfio_iommufd_emulated_detach_ioas()
297 !vdev->iommufd_attached) in vfio_iommufd_emulated_detach_ioas()
300 iommufd_access_detach(vdev->iommufd_access); in vfio_iommufd_emulated_detach_ioas()
301 vdev->iommufd_attached = false; in vfio_iommufd_emulated_detach_ioas()