Lines Matching defs:access
687 * a valid cur_ioas (access->ioas). A caller passing in a valid new_ioas should
690 static int iommufd_access_change_ioas(struct iommufd_access *access,
693 u32 iopt_access_list_id = access->iopt_access_list_id;
694 struct iommufd_ioas *cur_ioas = access->ioas;
697 lockdep_assert_held(&access->ioas_lock);
700 if (cur_ioas != access->ioas_unpin)
708 * iommufd_access_unpin_pages() can continue using access->ioas_unpin.
710 access->ioas = NULL;
713 rc = iopt_add_access(&new_ioas->iopt, access);
715 access->ioas = cur_ioas;
722 if (access->ops->unmap) {
723 mutex_unlock(&access->ioas_lock);
724 access->ops->unmap(access->data, 0, ULONG_MAX);
725 mutex_lock(&access->ioas_lock);
727 iopt_remove_access(&cur_ioas->iopt, access, iopt_access_list_id);
731 access->ioas = new_ioas;
732 access->ioas_unpin = new_ioas;
737 static int iommufd_access_change_ioas_id(struct iommufd_access *access, u32 id)
739 struct iommufd_ioas *ioas = iommufd_get_ioas(access->ictx, id);
744 rc = iommufd_access_change_ioas(access, ioas);
751 struct iommufd_access *access =
754 mutex_lock(&access->ioas_lock);
755 if (access->ioas)
756 WARN_ON(iommufd_access_change_ioas(access, NULL));
757 mutex_unlock(&access->ioas_lock);
758 iommufd_ctx_put(access->ictx);
764 * @ops: Driver's ops to associate with the access
766 * @id: Output ID number to return to userspace for this access
778 struct iommufd_access *access;
781 * There is no uAPI for the access object, but to keep things symmetric
784 access = iommufd_object_alloc(ictx, access, IOMMUFD_OBJ_ACCESS);
785 if (IS_ERR(access))
786 return access;
788 access->data = data;
789 access->ops = ops;
792 access->iova_alignment = PAGE_SIZE;
794 access->iova_alignment = 1;
797 refcount_inc(&access->obj.users);
798 access->ictx = ictx;
800 iommufd_object_finalize(ictx, &access->obj);
801 *id = access->obj.id;
802 mutex_init(&access->ioas_lock);
803 return access;
809 * @access: The access to destroy
811 * The caller must stop using the access before destroying it.
813 void iommufd_access_destroy(struct iommufd_access *access)
815 iommufd_object_destroy_user(access->ictx, &access->obj);
819 void iommufd_access_detach(struct iommufd_access *access)
821 mutex_lock(&access->ioas_lock);
822 if (WARN_ON(!access->ioas)) {
823 mutex_unlock(&access->ioas_lock);
826 WARN_ON(iommufd_access_change_ioas(access, NULL));
827 mutex_unlock(&access->ioas_lock);
831 int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
835 mutex_lock(&access->ioas_lock);
836 if (WARN_ON(access->ioas)) {
837 mutex_unlock(&access->ioas_lock);
841 rc = iommufd_access_change_ioas_id(access, ioas_id);
842 mutex_unlock(&access->ioas_lock);
847 int iommufd_access_replace(struct iommufd_access *access, u32 ioas_id)
851 mutex_lock(&access->ioas_lock);
852 if (!access->ioas) {
853 mutex_unlock(&access->ioas_lock);
856 rc = iommufd_access_change_ioas_id(access, ioas_id);
857 mutex_unlock(&access->ioas_lock);
883 struct iommufd_access *access;
887 xa_for_each(&ioas->iopt.access_list, index, access) {
888 if (!iommufd_lock_obj(&access->obj))
892 access->ops->unmap(access->data, iova, length);
894 iommufd_put_object(&access->obj);
902 * @access: IOAS access to act on
904 * @length: Number of bytes to access
909 void iommufd_access_unpin_pages(struct iommufd_access *access,
921 mutex_lock(&access->ioas_lock);
926 if (WARN_ON(!access->ioas_unpin)) {
927 mutex_unlock(&access->ioas_lock);
930 iopt = &access->ioas_unpin->iopt;
941 mutex_unlock(&access->ioas_lock);
966 * @access: IOAS access to act on
968 * @length: Number of bytes to access
973 * These can be kmap'd by the caller for CPU access.
983 int iommufd_access_pin_pages(struct iommufd_access *access, unsigned long iova,
995 WARN_ON(access->iova_alignment != PAGE_SIZE || !access->ops->unmap))
1003 mutex_lock(&access->ioas_lock);
1004 if (!access->ioas) {
1005 mutex_unlock(&access->ioas_lock);
1008 iopt = &access->ioas->iopt;
1040 mutex_unlock(&access->ioas_lock);
1055 mutex_unlock(&access->ioas_lock);
1062 * @access: IOAS access to act on
1065 * @length: Number of bytes to access
1072 int iommufd_access_rw(struct iommufd_access *access, unsigned long iova,
1086 mutex_lock(&access->ioas_lock);
1087 if (!access->ioas) {
1088 mutex_unlock(&access->ioas_lock);
1091 iopt = &access->ioas->iopt;
1119 mutex_unlock(&access->ioas_lock);