Lines Matching refs:vdomain

79 	struct viommu_domain		*vdomain;
313 static int viommu_add_mapping(struct viommu_domain *vdomain, u64 iova, u64 end,
328 spin_lock_irqsave(&vdomain->mappings_lock, irqflags);
329 interval_tree_insert(&mapping->iova, &vdomain->mappings);
330 spin_unlock_irqrestore(&vdomain->mappings_lock, irqflags);
338 * @vdomain: the domain
344 static size_t viommu_del_mappings(struct viommu_domain *vdomain,
352 spin_lock_irqsave(&vdomain->mappings_lock, flags);
353 next = interval_tree_iter_first(&vdomain->mappings, iova, end);
369 interval_tree_remove(node, &vdomain->mappings);
372 spin_unlock_irqrestore(&vdomain->mappings_lock, flags);
382 struct viommu_domain *vdomain)
386 u64 iova = vdomain->domain.geometry.aperture_start;
387 u64 limit = vdomain->domain.geometry.aperture_end;
389 unsigned long granule = 1UL << __ffs(vdomain->domain.pgsize_bitmap);
403 ret = viommu_add_mapping(vdomain, iova, resv_start - 1,
415 ret = viommu_add_mapping(vdomain, iova, limit, (phys_addr_t)iova,
422 viommu_del_mappings(vdomain, 0, iova);
433 static int viommu_replay_mappings(struct viommu_domain *vdomain)
441 spin_lock_irqsave(&vdomain->mappings_lock, flags);
442 node = interval_tree_iter_first(&vdomain->mappings, 0, -1UL);
447 .domain = cpu_to_le32(vdomain->id),
454 ret = viommu_send_req_sync(vdomain->viommu, &map, sizeof(map));
460 spin_unlock_irqrestore(&vdomain->mappings_lock, flags);
642 struct viommu_domain *vdomain;
649 vdomain = kzalloc(sizeof(*vdomain), GFP_KERNEL);
650 if (!vdomain)
653 mutex_init(&vdomain->mutex);
654 spin_lock_init(&vdomain->mappings_lock);
655 vdomain->mappings = RB_ROOT_CACHED;
657 return &vdomain->domain;
666 struct viommu_domain *vdomain = to_viommu_domain(domain);
681 vdomain->id = (unsigned int)ret;
686 vdomain->map_flags = viommu->map_flags;
687 vdomain->viommu = viommu;
692 vdomain->bypass = true;
696 ret = viommu_domain_map_identity(vdev, vdomain);
698 ida_free(&viommu->domain_ids, vdomain->id);
699 vdomain->viommu = NULL;
709 struct viommu_domain *vdomain = to_viommu_domain(domain);
712 viommu_del_mappings(vdomain, 0, ULLONG_MAX);
714 if (vdomain->viommu)
715 ida_free(&vdomain->viommu->domain_ids, vdomain->id);
717 kfree(vdomain);
727 struct viommu_domain *vdomain = to_viommu_domain(domain);
729 mutex_lock(&vdomain->mutex);
730 if (!vdomain->viommu) {
736 } else if (vdomain->viommu != vdev->viommu) {
739 mutex_unlock(&vdomain->mutex);
754 * vdev->vdomain is protected by group->mutex
756 if (vdev->vdomain)
757 vdev->vdomain->nr_endpoints--;
761 .domain = cpu_to_le32(vdomain->id),
764 if (vdomain->bypass)
770 ret = viommu_send_req_sync(vdomain->viommu, &req, sizeof(req));
775 if (!vdomain->nr_endpoints) {
780 ret = viommu_replay_mappings(vdomain);
785 vdomain->nr_endpoints++;
786 vdev->vdomain = vdomain;
795 struct viommu_domain *vdomain = vdev->vdomain;
798 if (!vdomain)
803 .domain = cpu_to_le32(vdomain->id),
810 vdomain->nr_endpoints--;
811 vdev->vdomain = NULL;
823 struct viommu_domain *vdomain = to_viommu_domain(domain);
829 if (flags & ~vdomain->map_flags)
832 ret = viommu_add_mapping(vdomain, iova, end, paddr, flags);
836 if (vdomain->nr_endpoints) {
839 .domain = cpu_to_le32(vdomain->id),
846 ret = viommu_add_req(vdomain->viommu, &map, sizeof(map));
848 viommu_del_mappings(vdomain, iova, end);
865 struct viommu_domain *vdomain = to_viommu_domain(domain);
868 unmapped = viommu_del_mappings(vdomain, iova, iova + size - 1);
873 if (!vdomain->nr_endpoints)
878 .domain = cpu_to_le32(vdomain->id),
883 ret = viommu_add_req(vdomain->viommu, &unmap, sizeof(unmap));
894 struct viommu_domain *vdomain = to_viommu_domain(domain);
896 spin_lock_irqsave(&vdomain->mappings_lock, flags);
897 node = interval_tree_iter_first(&vdomain->mappings, iova, iova);
902 spin_unlock_irqrestore(&vdomain->mappings_lock, flags);
910 struct viommu_domain *vdomain = to_viommu_domain(domain);
912 viommu_sync_req(vdomain->viommu);
918 struct viommu_domain *vdomain = to_viommu_domain(domain);
924 if (!vdomain->nr_endpoints)
926 return viommu_sync_req(vdomain->viommu);
931 struct viommu_domain *vdomain = to_viommu_domain(domain);
937 if (!vdomain->nr_endpoints)
939 viommu_sync_req(vdomain->viommu);