iommufd.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES
  4. */
  5. #include <linux/vfio.h>
  6. #include <linux/iommufd.h>
  7. #include "vfio.h"
  8. MODULE_IMPORT_NS("IOMMUFD");
  9. MODULE_IMPORT_NS("IOMMUFD_VFIO");
  10. bool vfio_iommufd_device_has_compat_ioas(struct vfio_device *vdev,
  11. struct iommufd_ctx *ictx)
  12. {
  13. u32 ioas_id;
  14. return !iommufd_vfio_compat_ioas_get_id(ictx, &ioas_id);
  15. }
  16. int vfio_df_iommufd_bind(struct vfio_device_file *df)
  17. {
  18. struct vfio_device *vdev = df->device;
  19. struct iommufd_ctx *ictx = df->iommufd;
  20. lockdep_assert_held(&vdev->dev_set->lock);
  21. /* Returns 0 to permit device opening under noiommu mode */
  22. if (vfio_device_is_noiommu(vdev))
  23. return 0;
  24. return vdev->ops->bind_iommufd(vdev, ictx, &df->devid);
  25. }
  26. int vfio_iommufd_compat_attach_ioas(struct vfio_device *vdev,
  27. struct iommufd_ctx *ictx)
  28. {
  29. u32 ioas_id;
  30. int ret;
  31. lockdep_assert_held(&vdev->dev_set->lock);
  32. /* compat noiommu does not need to do ioas attach */
  33. if (vfio_device_is_noiommu(vdev))
  34. return 0;
  35. ret = iommufd_vfio_compat_ioas_get_id(ictx, &ioas_id);
  36. if (ret)
  37. return ret;
  38. /* The legacy path has no way to return the selected pt_id */
  39. return vdev->ops->attach_ioas(vdev, &ioas_id);
  40. }
  41. void vfio_df_iommufd_unbind(struct vfio_device_file *df)
  42. {
  43. struct vfio_device *vdev = df->device;
  44. lockdep_assert_held(&vdev->dev_set->lock);
  45. if (vfio_device_is_noiommu(vdev))
  46. return;
  47. if (vdev->ops->unbind_iommufd)
  48. vdev->ops->unbind_iommufd(vdev);
  49. }
  50. struct iommufd_ctx *vfio_iommufd_device_ictx(struct vfio_device *vdev)
  51. {
  52. if (vdev->iommufd_device)
  53. return iommufd_device_to_ictx(vdev->iommufd_device);
  54. return NULL;
  55. }
  56. EXPORT_SYMBOL_GPL(vfio_iommufd_device_ictx);
  57. static int vfio_iommufd_device_id(struct vfio_device *vdev)
  58. {
  59. if (vdev->iommufd_device)
  60. return iommufd_device_to_id(vdev->iommufd_device);
  61. return -EINVAL;
  62. }
  63. /*
  64. * Return devid for a device.
  65. * valid ID for the device that is owned by the ictx
  66. * -ENOENT = device is owned but there is no ID
  67. * -ENODEV or other error = device is not owned
  68. */
  69. int vfio_iommufd_get_dev_id(struct vfio_device *vdev, struct iommufd_ctx *ictx)
  70. {
  71. struct iommu_group *group;
  72. int devid;
  73. if (vfio_iommufd_device_ictx(vdev) == ictx)
  74. return vfio_iommufd_device_id(vdev);
  75. group = iommu_group_get(vdev->dev);
  76. if (!group)
  77. return -ENODEV;
  78. if (iommufd_ctx_has_group(ictx, group))
  79. devid = -ENOENT;
  80. else
  81. devid = -ENODEV;
  82. iommu_group_put(group);
  83. return devid;
  84. }
  85. EXPORT_SYMBOL_GPL(vfio_iommufd_get_dev_id);
  86. /*
  87. * The physical standard ops mean that the iommufd_device is bound to the
  88. * physical device vdev->dev that was provided to vfio_init_group_dev(). Drivers
  89. * using this ops set should call vfio_register_group_dev()
  90. */
  91. int vfio_iommufd_physical_bind(struct vfio_device *vdev,
  92. struct iommufd_ctx *ictx, u32 *out_device_id)
  93. {
  94. struct iommufd_device *idev;
  95. idev = iommufd_device_bind(ictx, vdev->dev, out_device_id);
  96. if (IS_ERR(idev))
  97. return PTR_ERR(idev);
  98. vdev->iommufd_device = idev;
  99. ida_init(&vdev->pasids);
  100. return 0;
  101. }
  102. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_bind);
  103. void vfio_iommufd_physical_unbind(struct vfio_device *vdev)
  104. {
  105. int pasid;
  106. lockdep_assert_held(&vdev->dev_set->lock);
  107. while ((pasid = ida_find_first(&vdev->pasids)) >= 0) {
  108. iommufd_device_detach(vdev->iommufd_device, pasid);
  109. ida_free(&vdev->pasids, pasid);
  110. }
  111. if (vdev->iommufd_attached) {
  112. iommufd_device_detach(vdev->iommufd_device, IOMMU_NO_PASID);
  113. vdev->iommufd_attached = false;
  114. }
  115. iommufd_device_unbind(vdev->iommufd_device);
  116. vdev->iommufd_device = NULL;
  117. }
  118. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_unbind);
  119. int vfio_iommufd_physical_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
  120. {
  121. int rc;
  122. lockdep_assert_held(&vdev->dev_set->lock);
  123. if (WARN_ON(!vdev->iommufd_device))
  124. return -EINVAL;
  125. if (vdev->iommufd_attached)
  126. rc = iommufd_device_replace(vdev->iommufd_device,
  127. IOMMU_NO_PASID, pt_id);
  128. else
  129. rc = iommufd_device_attach(vdev->iommufd_device,
  130. IOMMU_NO_PASID, pt_id);
  131. if (rc)
  132. return rc;
  133. vdev->iommufd_attached = true;
  134. return 0;
  135. }
  136. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_attach_ioas);
  137. void vfio_iommufd_physical_detach_ioas(struct vfio_device *vdev)
  138. {
  139. lockdep_assert_held(&vdev->dev_set->lock);
  140. if (WARN_ON(!vdev->iommufd_device) || !vdev->iommufd_attached)
  141. return;
  142. iommufd_device_detach(vdev->iommufd_device, IOMMU_NO_PASID);
  143. vdev->iommufd_attached = false;
  144. }
  145. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_detach_ioas);
  146. int vfio_iommufd_physical_pasid_attach_ioas(struct vfio_device *vdev,
  147. u32 pasid, u32 *pt_id)
  148. {
  149. int rc;
  150. lockdep_assert_held(&vdev->dev_set->lock);
  151. if (WARN_ON(!vdev->iommufd_device))
  152. return -EINVAL;
  153. if (ida_exists(&vdev->pasids, pasid))
  154. return iommufd_device_replace(vdev->iommufd_device,
  155. pasid, pt_id);
  156. rc = ida_alloc_range(&vdev->pasids, pasid, pasid, GFP_KERNEL);
  157. if (rc < 0)
  158. return rc;
  159. rc = iommufd_device_attach(vdev->iommufd_device, pasid, pt_id);
  160. if (rc)
  161. ida_free(&vdev->pasids, pasid);
  162. return rc;
  163. }
  164. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_pasid_attach_ioas);
  165. void vfio_iommufd_physical_pasid_detach_ioas(struct vfio_device *vdev,
  166. u32 pasid)
  167. {
  168. lockdep_assert_held(&vdev->dev_set->lock);
  169. if (WARN_ON(!vdev->iommufd_device))
  170. return;
  171. if (!ida_exists(&vdev->pasids, pasid))
  172. return;
  173. iommufd_device_detach(vdev->iommufd_device, pasid);
  174. ida_free(&vdev->pasids, pasid);
  175. }
  176. EXPORT_SYMBOL_GPL(vfio_iommufd_physical_pasid_detach_ioas);
  177. /*
  178. * The emulated standard ops mean that vfio_device is going to use the
  179. * "mdev path" and will call vfio_pin_pages()/vfio_dma_rw(). Drivers using this
  180. * ops set should call vfio_register_emulated_iommu_dev(). Drivers that do
  181. * not call vfio_pin_pages()/vfio_dma_rw() have no need to provide dma_unmap.
  182. */
  183. static void vfio_emulated_unmap(void *data, unsigned long iova,
  184. unsigned long length)
  185. {
  186. struct vfio_device *vdev = data;
  187. if (vdev->ops->dma_unmap)
  188. vdev->ops->dma_unmap(vdev, iova, length);
  189. }
  190. static const struct iommufd_access_ops vfio_user_ops = {
  191. .needs_pin_pages = 1,
  192. .unmap = vfio_emulated_unmap,
  193. };
  194. int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
  195. struct iommufd_ctx *ictx, u32 *out_device_id)
  196. {
  197. struct iommufd_access *user;
  198. lockdep_assert_held(&vdev->dev_set->lock);
  199. user = iommufd_access_create(ictx, &vfio_user_ops, vdev, out_device_id);
  200. if (IS_ERR(user))
  201. return PTR_ERR(user);
  202. vdev->iommufd_access = user;
  203. return 0;
  204. }
  205. EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_bind);
  206. void vfio_iommufd_emulated_unbind(struct vfio_device *vdev)
  207. {
  208. lockdep_assert_held(&vdev->dev_set->lock);
  209. if (vdev->iommufd_access) {
  210. iommufd_access_destroy(vdev->iommufd_access);
  211. vdev->iommufd_attached = false;
  212. vdev->iommufd_access = NULL;
  213. }
  214. }
  215. EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_unbind);
  216. int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
  217. {
  218. int rc;
  219. lockdep_assert_held(&vdev->dev_set->lock);
  220. if (vdev->iommufd_attached)
  221. rc = iommufd_access_replace(vdev->iommufd_access, *pt_id);
  222. else
  223. rc = iommufd_access_attach(vdev->iommufd_access, *pt_id);
  224. if (rc)
  225. return rc;
  226. vdev->iommufd_attached = true;
  227. return 0;
  228. }
  229. EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_attach_ioas);
  230. void vfio_iommufd_emulated_detach_ioas(struct vfio_device *vdev)
  231. {
  232. lockdep_assert_held(&vdev->dev_set->lock);
  233. if (WARN_ON(!vdev->iommufd_access) ||
  234. !vdev->iommufd_attached)
  235. return;
  236. iommufd_access_detach(vdev->iommufd_access);
  237. vdev->iommufd_attached = false;
  238. }
  239. EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_detach_ioas);