Lines Matching refs:domain

236 	struct iommu_domain *domain;	/* domain this device is attached */  member
252 struct iommu_domain domain; /* generic domain data structure */ member
272 struct exynos_iommu_domain *domain; /* domain we belong to */ member
283 return container_of(dom, struct exynos_iommu_domain, domain); in to_exynos_domain()
443 if (data->domain) in exynos_sysmmu_irq()
444 ret = report_iommu_fault(&data->domain->domain, in exynos_sysmmu_irq()
680 if (data->domain) { in exynos_sysmmu_suspend()
698 if (data->domain) { in exynos_sysmmu_resume()
739 struct exynos_iommu_domain *domain; in exynos_iommu_domain_alloc() local
746 domain = kzalloc(sizeof(*domain), GFP_KERNEL); in exynos_iommu_domain_alloc()
747 if (!domain) in exynos_iommu_domain_alloc()
751 if (iommu_get_dma_cookie(&domain->domain) != 0) in exynos_iommu_domain_alloc()
757 domain->pgtable = (sysmmu_pte_t *)__get_free_pages(GFP_KERNEL, 2); in exynos_iommu_domain_alloc()
758 if (!domain->pgtable) in exynos_iommu_domain_alloc()
761 domain->lv2entcnt = (short *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); in exynos_iommu_domain_alloc()
762 if (!domain->lv2entcnt) in exynos_iommu_domain_alloc()
767 domain->pgtable[i] = ZERO_LV2LINK; in exynos_iommu_domain_alloc()
769 handle = dma_map_single(dma_dev, domain->pgtable, LV1TABLE_SIZE, in exynos_iommu_domain_alloc()
772 BUG_ON(handle != virt_to_phys(domain->pgtable)); in exynos_iommu_domain_alloc()
776 spin_lock_init(&domain->lock); in exynos_iommu_domain_alloc()
777 spin_lock_init(&domain->pgtablelock); in exynos_iommu_domain_alloc()
778 INIT_LIST_HEAD(&domain->clients); in exynos_iommu_domain_alloc()
780 domain->domain.geometry.aperture_start = 0; in exynos_iommu_domain_alloc()
781 domain->domain.geometry.aperture_end = ~0UL; in exynos_iommu_domain_alloc()
782 domain->domain.geometry.force_aperture = true; in exynos_iommu_domain_alloc()
784 return &domain->domain; in exynos_iommu_domain_alloc()
787 free_pages((unsigned long)domain->lv2entcnt, 1); in exynos_iommu_domain_alloc()
789 free_pages((unsigned long)domain->pgtable, 2); in exynos_iommu_domain_alloc()
792 iommu_put_dma_cookie(&domain->domain); in exynos_iommu_domain_alloc()
794 kfree(domain); in exynos_iommu_domain_alloc()
800 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_domain_free() local
805 WARN_ON(!list_empty(&domain->clients)); in exynos_iommu_domain_free()
807 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_domain_free()
809 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_domain_free()
813 data->domain = NULL; in exynos_iommu_domain_free()
818 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_domain_free()
823 dma_unmap_single(dma_dev, virt_to_phys(domain->pgtable), LV1TABLE_SIZE, in exynos_iommu_domain_free()
827 if (lv1ent_page(domain->pgtable + i)) { in exynos_iommu_domain_free()
828 phys_addr_t base = lv2table_base(domain->pgtable + i); in exynos_iommu_domain_free()
836 free_pages((unsigned long)domain->pgtable, 2); in exynos_iommu_domain_free()
837 free_pages((unsigned long)domain->lv2entcnt, 1); in exynos_iommu_domain_free()
838 kfree(domain); in exynos_iommu_domain_free()
844 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_detach_device() local
846 phys_addr_t pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_detach_device()
850 if (!has_sysmmu(dev) || owner->domain != iommu_domain) in exynos_iommu_detach_device()
862 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_detach_device()
863 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_detach_device()
866 data->domain = NULL; in exynos_iommu_detach_device()
870 owner->domain = NULL; in exynos_iommu_detach_device()
871 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_detach_device()
882 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_attach_device() local
885 phys_addr_t pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_attach_device()
891 if (owner->domain) in exynos_iommu_attach_device()
892 exynos_iommu_detach_device(owner->domain, dev); in exynos_iommu_attach_device()
896 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_attach_device()
900 data->domain = domain; in exynos_iommu_attach_device()
901 list_add_tail(&data->domain_node, &domain->clients); in exynos_iommu_attach_device()
904 owner->domain = iommu_domain; in exynos_iommu_attach_device()
905 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_attach_device()
922 static sysmmu_pte_t *alloc_lv2entry(struct exynos_iommu_domain *domain, in alloc_lv2entry() argument
970 spin_lock(&domain->lock); in alloc_lv2entry()
971 list_for_each_entry(data, &domain->clients, domain_node) in alloc_lv2entry()
973 spin_unlock(&domain->lock); in alloc_lv2entry()
980 static int lv1set_section(struct exynos_iommu_domain *domain, in lv1set_section() argument
1003 spin_lock(&domain->lock); in lv1set_section()
1010 list_for_each_entry(data, &domain->clients, domain_node) in lv1set_section()
1013 spin_unlock(&domain->lock); in lv1set_section()
1082 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_map() local
1088 BUG_ON(domain->pgtable == NULL); in exynos_iommu_map()
1091 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_map()
1093 entry = section_entry(domain->pgtable, iova); in exynos_iommu_map()
1096 ret = lv1set_section(domain, entry, iova, paddr, prot, in exynos_iommu_map()
1097 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1101 pent = alloc_lv2entry(domain, entry, iova, in exynos_iommu_map()
1102 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1108 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1115 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_map()
1120 static void exynos_iommu_tlb_invalidate_entry(struct exynos_iommu_domain *domain, in exynos_iommu_tlb_invalidate_entry() argument
1126 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1128 list_for_each_entry(data, &domain->clients, domain_node) in exynos_iommu_tlb_invalidate_entry()
1131 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1138 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_unmap() local
1144 BUG_ON(domain->pgtable == NULL); in exynos_iommu_unmap()
1146 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1148 ent = section_entry(domain->pgtable, iova); in exynos_iommu_unmap()
1180 domain->lv2entcnt[lv1ent_offset(iova)] += 1; in exynos_iommu_unmap()
1198 domain->lv2entcnt[lv1ent_offset(iova)] += SPAGES_PER_LPAGE; in exynos_iommu_unmap()
1200 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1202 exynos_iommu_tlb_invalidate_entry(domain, iova, size); in exynos_iommu_unmap()
1206 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1217 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_iova_to_phys() local
1222 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1224 entry = section_entry(domain->pgtable, iova); in exynos_iommu_iova_to_phys()
1237 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1276 if (owner->domain) { in exynos_iommu_release_device()
1280 WARN_ON(owner->domain != in exynos_iommu_release_device()
1282 exynos_iommu_detach_device(owner->domain, dev); in exynos_iommu_release_device()