Lines Matching refs:access

737  * a valid cur_ioas (access->ioas). A caller passing in a valid new_ioas should
740 static int iommufd_access_change_ioas(struct iommufd_access *access,
743 u32 iopt_access_list_id = access->iopt_access_list_id;
744 struct iommufd_ioas *cur_ioas = access->ioas;
747 lockdep_assert_held(&access->ioas_lock);
750 if (cur_ioas != access->ioas_unpin)
758 * iommufd_access_unpin_pages() can continue using access->ioas_unpin.
760 access->ioas = NULL;
763 rc = iopt_add_access(&new_ioas->iopt, access);
765 access->ioas = cur_ioas;
772 if (access->ops->unmap) {
773 mutex_unlock(&access->ioas_lock);
774 access->ops->unmap(access->data, 0, ULONG_MAX);
775 mutex_lock(&access->ioas_lock);
777 iopt_remove_access(&cur_ioas->iopt, access, iopt_access_list_id);
781 access->ioas = new_ioas;
782 access->ioas_unpin = new_ioas;
787 static int iommufd_access_change_ioas_id(struct iommufd_access *access, u32 id)
789 struct iommufd_ioas *ioas = iommufd_get_ioas(access->ictx, id);
794 rc = iommufd_access_change_ioas(access, ioas);
795 iommufd_put_object(access->ictx, &ioas->obj);
801 struct iommufd_access *access =
804 mutex_lock(&access->ioas_lock);
805 if (access->ioas)
806 WARN_ON(iommufd_access_change_ioas(access, NULL));
807 mutex_unlock(&access->ioas_lock);
808 iommufd_ctx_put(access->ictx);
814 * @ops: Driver's ops to associate with the access
816 * @id: Output ID number to return to userspace for this access
828 struct iommufd_access *access;
831 * There is no uAPI for the access object, but to keep things symmetric
834 access = iommufd_object_alloc(ictx, access, IOMMUFD_OBJ_ACCESS);
835 if (IS_ERR(access))
836 return access;
838 access->data = data;
839 access->ops = ops;
842 access->iova_alignment = PAGE_SIZE;
844 access->iova_alignment = 1;
847 refcount_inc(&access->obj.users);
848 access->ictx = ictx;
850 iommufd_object_finalize(ictx, &access->obj);
851 *id = access->obj.id;
852 mutex_init(&access->ioas_lock);
853 return access;
859 * @access: The access to destroy
861 * The caller must stop using the access before destroying it.
863 void iommufd_access_destroy(struct iommufd_access *access)
865 iommufd_object_destroy_user(access->ictx, &access->obj);
869 void iommufd_access_detach(struct iommufd_access *access)
871 mutex_lock(&access->ioas_lock);
872 if (WARN_ON(!access->ioas)) {
873 mutex_unlock(&access->ioas_lock);
876 WARN_ON(iommufd_access_change_ioas(access, NULL));
877 mutex_unlock(&access->ioas_lock);
881 int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
885 mutex_lock(&access->ioas_lock);
886 if (WARN_ON(access->ioas)) {
887 mutex_unlock(&access->ioas_lock);
891 rc = iommufd_access_change_ioas_id(access, ioas_id);
892 mutex_unlock(&access->ioas_lock);
897 int iommufd_access_replace(struct iommufd_access *access, u32 ioas_id)
901 mutex_lock(&access->ioas_lock);
902 if (!access->ioas) {
903 mutex_unlock(&access->ioas_lock);
906 rc = iommufd_access_change_ioas_id(access, ioas_id);
907 mutex_unlock(&access->ioas_lock);
933 struct iommufd_access *access;
937 xa_for_each(&ioas->iopt.access_list, index, access) {
938 if (!iommufd_lock_obj(&access->obj))
942 access->ops->unmap(access->data, iova, length);
944 iommufd_put_object(access->ictx, &access->obj);
952 * @access: IOAS access to act on
954 * @length: Number of bytes to access
959 void iommufd_access_unpin_pages(struct iommufd_access *access,
971 mutex_lock(&access->ioas_lock);
976 if (WARN_ON(!access->ioas_unpin)) {
977 mutex_unlock(&access->ioas_lock);
980 iopt = &access->ioas_unpin->iopt;
991 mutex_unlock(&access->ioas_lock);
1016 * @access: IOAS access to act on
1018 * @length: Number of bytes to access
1023 * These can be kmap'd by the caller for CPU access.
1033 int iommufd_access_pin_pages(struct iommufd_access *access, unsigned long iova,
1045 WARN_ON(access->iova_alignment != PAGE_SIZE || !access->ops->unmap))
1053 mutex_lock(&access->ioas_lock);
1054 if (!access->ioas) {
1055 mutex_unlock(&access->ioas_lock);
1058 iopt = &access->ioas->iopt;
1090 mutex_unlock(&access->ioas_lock);
1105 mutex_unlock(&access->ioas_lock);
1112 * @access: IOAS access to act on
1115 * @length: Number of bytes to access
1122 int iommufd_access_rw(struct iommufd_access *access, unsigned long iova,
1136 mutex_lock(&access->ioas_lock);
1137 if (!access->ioas) {
1138 mutex_unlock(&access->ioas_lock);
1141 iopt = &access->ioas->iopt;
1169 mutex_unlock(&access->ioas_lock);