Lines Matching full:access

1018  * a valid cur_ioas (access->ioas). A caller passing in a valid new_ioas should
1021 static int iommufd_access_change_ioas(struct iommufd_access *access, in iommufd_access_change_ioas() argument
1024 u32 iopt_access_list_id = access->iopt_access_list_id; in iommufd_access_change_ioas()
1025 struct iommufd_ioas *cur_ioas = access->ioas; in iommufd_access_change_ioas()
1028 lockdep_assert_held(&access->ioas_lock); in iommufd_access_change_ioas()
1031 if (cur_ioas != access->ioas_unpin) in iommufd_access_change_ioas()
1039 * iommufd_access_unpin_pages() can continue using access->ioas_unpin. in iommufd_access_change_ioas()
1041 access->ioas = NULL; in iommufd_access_change_ioas()
1044 rc = iopt_add_access(&new_ioas->iopt, access); in iommufd_access_change_ioas()
1046 access->ioas = cur_ioas; in iommufd_access_change_ioas()
1053 if (access->ops->unmap) { in iommufd_access_change_ioas()
1054 mutex_unlock(&access->ioas_lock); in iommufd_access_change_ioas()
1055 access->ops->unmap(access->data, 0, ULONG_MAX); in iommufd_access_change_ioas()
1056 mutex_lock(&access->ioas_lock); in iommufd_access_change_ioas()
1058 iopt_remove_access(&cur_ioas->iopt, access, iopt_access_list_id); in iommufd_access_change_ioas()
1062 access->ioas = new_ioas; in iommufd_access_change_ioas()
1063 access->ioas_unpin = new_ioas; in iommufd_access_change_ioas()
1068 static int iommufd_access_change_ioas_id(struct iommufd_access *access, u32 id) in iommufd_access_change_ioas_id() argument
1070 struct iommufd_ioas *ioas = iommufd_get_ioas(access->ictx, id); in iommufd_access_change_ioas_id()
1075 rc = iommufd_access_change_ioas(access, ioas); in iommufd_access_change_ioas_id()
1076 iommufd_put_object(access->ictx, &ioas->obj); in iommufd_access_change_ioas_id()
1082 struct iommufd_access *access = in iommufd_access_destroy_object() local
1085 mutex_lock(&access->ioas_lock); in iommufd_access_destroy_object()
1086 if (access->ioas) in iommufd_access_destroy_object()
1087 WARN_ON(iommufd_access_change_ioas(access, NULL)); in iommufd_access_destroy_object()
1088 mutex_unlock(&access->ioas_lock); in iommufd_access_destroy_object()
1089 iommufd_ctx_put(access->ictx); in iommufd_access_destroy_object()
1095 * @ops: Driver's ops to associate with the access
1097 * @id: Output ID number to return to userspace for this access
1109 struct iommufd_access *access; in iommufd_access_create() local
1112 * There is no uAPI for the access object, but to keep things symmetric in iommufd_access_create()
1115 access = iommufd_object_alloc(ictx, access, IOMMUFD_OBJ_ACCESS); in iommufd_access_create()
1116 if (IS_ERR(access)) in iommufd_access_create()
1117 return access; in iommufd_access_create()
1119 access->data = data; in iommufd_access_create()
1120 access->ops = ops; in iommufd_access_create()
1123 access->iova_alignment = PAGE_SIZE; in iommufd_access_create()
1125 access->iova_alignment = 1; in iommufd_access_create()
1128 refcount_inc(&access->obj.users); in iommufd_access_create()
1129 access->ictx = ictx; in iommufd_access_create()
1131 iommufd_object_finalize(ictx, &access->obj); in iommufd_access_create()
1132 *id = access->obj.id; in iommufd_access_create()
1133 mutex_init(&access->ioas_lock); in iommufd_access_create()
1134 return access; in iommufd_access_create()
1140 * @access: The access to destroy
1142 * The caller must stop using the access before destroying it.
1144 void iommufd_access_destroy(struct iommufd_access *access) in iommufd_access_destroy() argument
1146 iommufd_object_destroy_user(access->ictx, &access->obj); in iommufd_access_destroy()
1150 void iommufd_access_detach(struct iommufd_access *access) in iommufd_access_detach() argument
1152 mutex_lock(&access->ioas_lock); in iommufd_access_detach()
1153 if (WARN_ON(!access->ioas)) { in iommufd_access_detach()
1154 mutex_unlock(&access->ioas_lock); in iommufd_access_detach()
1157 WARN_ON(iommufd_access_change_ioas(access, NULL)); in iommufd_access_detach()
1158 mutex_unlock(&access->ioas_lock); in iommufd_access_detach()
1162 int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id) in iommufd_access_attach() argument
1166 mutex_lock(&access->ioas_lock); in iommufd_access_attach()
1167 if (WARN_ON(access->ioas)) { in iommufd_access_attach()
1168 mutex_unlock(&access->ioas_lock); in iommufd_access_attach()
1172 rc = iommufd_access_change_ioas_id(access, ioas_id); in iommufd_access_attach()
1173 mutex_unlock(&access->ioas_lock); in iommufd_access_attach()
1178 int iommufd_access_replace(struct iommufd_access *access, u32 ioas_id) in iommufd_access_replace() argument
1182 mutex_lock(&access->ioas_lock); in iommufd_access_replace()
1183 if (!access->ioas) { in iommufd_access_replace()
1184 mutex_unlock(&access->ioas_lock); in iommufd_access_replace()
1187 rc = iommufd_access_change_ioas_id(access, ioas_id); in iommufd_access_replace()
1188 mutex_unlock(&access->ioas_lock); in iommufd_access_replace()
1214 struct iommufd_access *access; in iommufd_access_notify_unmap() local
1218 xa_for_each(&ioas->iopt.access_list, index, access) { in iommufd_access_notify_unmap()
1219 if (!iommufd_lock_obj(&access->obj)) in iommufd_access_notify_unmap()
1223 access->ops->unmap(access->data, iova, length); in iommufd_access_notify_unmap()
1225 iommufd_put_object(access->ictx, &access->obj); in iommufd_access_notify_unmap()
1233 * @access: IOAS access to act on
1235 * @length: Number of bytes to access
1240 void iommufd_access_unpin_pages(struct iommufd_access *access, in iommufd_access_unpin_pages() argument
1252 mutex_lock(&access->ioas_lock); in iommufd_access_unpin_pages()
1257 if (WARN_ON(!access->ioas_unpin)) { in iommufd_access_unpin_pages()
1258 mutex_unlock(&access->ioas_lock); in iommufd_access_unpin_pages()
1261 iopt = &access->ioas_unpin->iopt; in iommufd_access_unpin_pages()
1272 mutex_unlock(&access->ioas_lock); in iommufd_access_unpin_pages()
1297 * @access: IOAS access to act on
1299 * @length: Number of bytes to access
1304 * These can be kmap'd by the caller for CPU access.
1314 int iommufd_access_pin_pages(struct iommufd_access *access, unsigned long iova, in iommufd_access_pin_pages() argument
1326 WARN_ON(access->iova_alignment != PAGE_SIZE || !access->ops->unmap)) in iommufd_access_pin_pages()
1334 mutex_lock(&access->ioas_lock); in iommufd_access_pin_pages()
1335 if (!access->ioas) { in iommufd_access_pin_pages()
1336 mutex_unlock(&access->ioas_lock); in iommufd_access_pin_pages()
1339 iopt = &access->ioas->iopt; in iommufd_access_pin_pages()
1371 mutex_unlock(&access->ioas_lock); in iommufd_access_pin_pages()
1386 mutex_unlock(&access->ioas_lock); in iommufd_access_pin_pages()
1393 * @access: IOAS access to act on
1396 * @length: Number of bytes to access
1403 int iommufd_access_rw(struct iommufd_access *access, unsigned long iova, in iommufd_access_rw() argument
1417 mutex_lock(&access->ioas_lock); in iommufd_access_rw()
1418 if (!access->ioas) { in iommufd_access_rw()
1419 mutex_unlock(&access->ioas_lock); in iommufd_access_rw()
1422 iopt = &access->ioas->iopt; in iommufd_access_rw()
1450 mutex_unlock(&access->ioas_lock); in iommufd_access_rw()