Lines Matching refs:vdomain

79 	struct viommu_domain		*vdomain;  member
313 static int viommu_add_mapping(struct viommu_domain *vdomain, unsigned long iova, in viommu_add_mapping() argument
328 spin_lock_irqsave(&vdomain->mappings_lock, irqflags); in viommu_add_mapping()
329 interval_tree_insert(&mapping->iova, &vdomain->mappings); in viommu_add_mapping()
330 spin_unlock_irqrestore(&vdomain->mappings_lock, irqflags); in viommu_add_mapping()
345 static size_t viommu_del_mappings(struct viommu_domain *vdomain, in viommu_del_mappings() argument
354 spin_lock_irqsave(&vdomain->mappings_lock, flags); in viommu_del_mappings()
355 next = interval_tree_iter_first(&vdomain->mappings, iova, last); in viommu_del_mappings()
371 interval_tree_remove(node, &vdomain->mappings); in viommu_del_mappings()
374 spin_unlock_irqrestore(&vdomain->mappings_lock, flags); in viommu_del_mappings()
386 static int viommu_replay_mappings(struct viommu_domain *vdomain) in viommu_replay_mappings() argument
394 spin_lock_irqsave(&vdomain->mappings_lock, flags); in viommu_replay_mappings()
395 node = interval_tree_iter_first(&vdomain->mappings, 0, -1UL); in viommu_replay_mappings()
400 .domain = cpu_to_le32(vdomain->id), in viommu_replay_mappings()
407 ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map)); in viommu_replay_mappings()
413 spin_unlock_irqrestore(&vdomain->mappings_lock, flags); in viommu_replay_mappings()
588 struct viommu_domain *vdomain; in viommu_domain_alloc() local
593 vdomain = kzalloc(sizeof(*vdomain), GFP_KERNEL); in viommu_domain_alloc()
594 if (!vdomain) in viommu_domain_alloc()
597 mutex_init(&vdomain->mutex); in viommu_domain_alloc()
598 spin_lock_init(&vdomain->mappings_lock); in viommu_domain_alloc()
599 vdomain->mappings = RB_ROOT_CACHED; in viommu_domain_alloc()
602 iommu_get_dma_cookie(&vdomain->domain)) { in viommu_domain_alloc()
603 kfree(vdomain); in viommu_domain_alloc()
607 return &vdomain->domain; in viommu_domain_alloc()
616 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_domain_finalise() local
631 vdomain->id = (unsigned int)ret; in viommu_domain_finalise()
636 vdomain->map_flags = viommu->map_flags; in viommu_domain_finalise()
637 vdomain->viommu = viommu; in viommu_domain_finalise()
644 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_domain_free() local
649 viommu_del_mappings(vdomain, 0, 0); in viommu_domain_free()
651 if (vdomain->viommu) in viommu_domain_free()
652 ida_free(&vdomain->viommu->domain_ids, vdomain->id); in viommu_domain_free()
654 kfree(vdomain); in viommu_domain_free()
664 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_attach_dev() local
666 mutex_lock(&vdomain->mutex); in viommu_attach_dev()
667 if (!vdomain->viommu) { in viommu_attach_dev()
673 } else if (vdomain->viommu != vdev->viommu) { in viommu_attach_dev()
677 mutex_unlock(&vdomain->mutex); in viommu_attach_dev()
694 if (vdev->vdomain) in viommu_attach_dev()
695 vdev->vdomain->nr_endpoints--; in viommu_attach_dev()
699 .domain = cpu_to_le32(vdomain->id), in viommu_attach_dev()
705 ret = viommu_send_req_sync(vdomain->viommu, &req, sizeof(req)); in viommu_attach_dev()
710 if (!vdomain->nr_endpoints) { in viommu_attach_dev()
715 ret = viommu_replay_mappings(vdomain); in viommu_attach_dev()
720 vdomain->nr_endpoints++; in viommu_attach_dev()
721 vdev->vdomain = vdomain; in viommu_attach_dev()
732 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_map() local
738 if (flags & ~vdomain->map_flags) in viommu_map()
741 ret = viommu_add_mapping(vdomain, iova, paddr, size, flags); in viommu_map()
747 .domain = cpu_to_le32(vdomain->id), in viommu_map()
754 if (!vdomain->nr_endpoints) in viommu_map()
757 ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map)); in viommu_map()
759 viommu_del_mappings(vdomain, iova, size); in viommu_map()
770 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_unmap() local
772 unmapped = viommu_del_mappings(vdomain, iova, size); in viommu_unmap()
777 if (!vdomain->nr_endpoints) in viommu_unmap()
782 .domain = cpu_to_le32(vdomain->id), in viommu_unmap()
787 ret = viommu_add_req(vdomain->viommu, &unmap, sizeof(unmap)); in viommu_unmap()
798 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_iova_to_phys() local
800 spin_lock_irqsave(&vdomain->mappings_lock, flags); in viommu_iova_to_phys()
801 node = interval_tree_iter_first(&vdomain->mappings, iova, iova); in viommu_iova_to_phys()
806 spin_unlock_irqrestore(&vdomain->mappings_lock, flags); in viommu_iova_to_phys()
814 struct viommu_domain *vdomain = to_viommu_domain(domain); in viommu_iotlb_sync() local
816 viommu_sync_req(vdomain->viommu); in viommu_iotlb_sync()