Lines Matching full:viommu
8 struct iommufd_viommu *viommu = in iommufd_viommu_destroy() local
11 if (viommu->ops && viommu->ops->destroy) in iommufd_viommu_destroy()
12 viommu->ops->destroy(viommu); in iommufd_viommu_destroy()
13 refcount_dec(&viommu->hwpt->common.obj.users); in iommufd_viommu_destroy()
14 xa_destroy(&viommu->vdevs); in iommufd_viommu_destroy()
26 struct iommufd_viommu *viommu; in iommufd_viommu_alloc_ioctl() local
53 * vIOMMU structure size in iommufd_viommu_alloc_ioctl()
55 if (WARN_ON_ONCE(viommu_size < sizeof(*viommu))) { in iommufd_viommu_alloc_ioctl()
71 viommu = (struct iommufd_viommu *)_iommufd_object_alloc_ucmd( in iommufd_viommu_alloc_ioctl()
73 if (IS_ERR(viommu)) { in iommufd_viommu_alloc_ioctl()
74 rc = PTR_ERR(viommu); in iommufd_viommu_alloc_ioctl()
78 xa_init(&viommu->vdevs); in iommufd_viommu_alloc_ioctl()
79 viommu->type = cmd->type; in iommufd_viommu_alloc_ioctl()
80 viommu->ictx = ucmd->ictx; in iommufd_viommu_alloc_ioctl()
81 viommu->hwpt = hwpt_paging; in iommufd_viommu_alloc_ioctl()
82 refcount_inc(&viommu->hwpt->common.obj.users); in iommufd_viommu_alloc_ioctl()
83 INIT_LIST_HEAD(&viommu->veventqs); in iommufd_viommu_alloc_ioctl()
84 init_rwsem(&viommu->veventqs_rwsem); in iommufd_viommu_alloc_ioctl()
90 viommu->iommu_dev = __iommu_get_iommu_dev(idev->dev); in iommufd_viommu_alloc_ioctl()
92 rc = ops->viommu_init(viommu, hwpt_paging->common.domain, in iommufd_viommu_alloc_ioctl()
97 /* It is a driver bug that viommu->ops isn't filled */ in iommufd_viommu_alloc_ioctl()
98 if (WARN_ON_ONCE(!viommu->ops)) { in iommufd_viommu_alloc_ioctl()
103 cmd->out_viommu_id = viommu->obj.id; in iommufd_viommu_alloc_ioctl()
117 struct iommufd_viommu *viommu = vdev->viommu; in iommufd_vdevice_abort() local
125 xa_cmpxchg(&viommu->vdevs, vdev->virt_id, vdev, NULL, GFP_KERNEL); in iommufd_vdevice_abort()
126 refcount_dec(&viommu->obj.users); in iommufd_vdevice_abort()
148 struct iommufd_viommu *viommu; in iommufd_vdevice_alloc_ioctl() local
157 viommu = iommufd_get_viommu(ucmd, cmd->viommu_id); in iommufd_vdevice_alloc_ioctl()
158 if (IS_ERR(viommu)) in iommufd_vdevice_alloc_ioctl()
159 return PTR_ERR(viommu); in iommufd_vdevice_alloc_ioctl()
167 if (viommu->iommu_dev != __iommu_get_iommu_dev(idev->dev)) { in iommufd_vdevice_alloc_ioctl()
183 if (viommu->ops && viommu->ops->vdevice_size) { in iommufd_vdevice_alloc_ioctl()
189 if (WARN_ON_ONCE(viommu->ops->vdevice_size < vdev_size || in iommufd_vdevice_alloc_ioctl()
190 !viommu->ops->vdevice_init)) { in iommufd_vdevice_alloc_ioctl()
194 vdev_size = viommu->ops->vdevice_size; in iommufd_vdevice_alloc_ioctl()
205 vdev->viommu = viommu; in iommufd_vdevice_alloc_ioctl()
206 refcount_inc(&viommu->obj.users); in iommufd_vdevice_alloc_ioctl()
221 curr = xa_cmpxchg(&viommu->vdevs, virt_id, NULL, vdev, GFP_KERNEL); in iommufd_vdevice_alloc_ioctl()
227 if (viommu->ops && viommu->ops->vdevice_init) { in iommufd_vdevice_alloc_ioctl()
228 rc = viommu->ops->vdevice_init(vdev); in iommufd_vdevice_alloc_ioctl()
248 iommufd_put_object(ucmd->ictx, &viommu->obj); in iommufd_vdevice_alloc_ioctl()
273 iommufd_hw_queue_destroy_access(hw_queue->viommu->ictx, in iommufd_hw_queue_destroy()
277 if (hw_queue->viommu) in iommufd_hw_queue_destroy()
278 refcount_dec(&hw_queue->viommu->obj.users); in iommufd_hw_queue_destroy()
291 struct iommufd_viommu *viommu, phys_addr_t *base_pa) in iommufd_hw_queue_alloc_phys() argument
319 access = iommufd_access_create_internal(viommu->ictx); in iommufd_hw_queue_alloc_phys()
325 rc = iommufd_access_attach_internal(access, viommu->hwpt->ioas); in iommufd_hw_queue_alloc_phys()
350 iommufd_access_destroy_internal(viommu->ictx, access); in iommufd_hw_queue_alloc_phys()
360 struct iommufd_viommu *viommu; in iommufd_hw_queue_alloc_ioctl() local
375 viommu = iommufd_get_viommu(ucmd, cmd->viommu_id); in iommufd_hw_queue_alloc_ioctl()
376 if (IS_ERR(viommu)) in iommufd_hw_queue_alloc_ioctl()
377 return PTR_ERR(viommu); in iommufd_hw_queue_alloc_ioctl()
379 if (!viommu->ops || !viommu->ops->get_hw_queue_size || in iommufd_hw_queue_alloc_ioctl()
380 !viommu->ops->hw_queue_init_phys) { in iommufd_hw_queue_alloc_ioctl()
385 hw_queue_size = viommu->ops->get_hw_queue_size(viommu, cmd->type); in iommufd_hw_queue_alloc_ioctl()
407 access = iommufd_hw_queue_alloc_phys(cmd, viommu, &base_pa); in iommufd_hw_queue_alloc_ioctl()
413 hw_queue->viommu = viommu; in iommufd_hw_queue_alloc_ioctl()
414 refcount_inc(&viommu->obj.users); in iommufd_hw_queue_alloc_ioctl()
420 rc = viommu->ops->hw_queue_init_phys(hw_queue, cmd->index, base_pa); in iommufd_hw_queue_alloc_ioctl()
428 iommufd_put_object(ucmd->ictx, &viommu->obj); in iommufd_hw_queue_alloc_ioctl()