Lines Matching refs:domain
238 struct iommu_domain *domain; /* domain this device is attached */ member
254 struct iommu_domain domain; /* generic domain data structure */ member
297 struct exynos_iommu_domain *domain; /* domain we belong to */ member
424 return container_of(dom, struct exynos_iommu_domain, domain); in to_exynos_domain()
586 if (data->domain) { in exynos_sysmmu_irq()
587 ret = report_iommu_fault(&data->domain->domain, data->master, in exynos_sysmmu_irq()
835 if (&data->domain->domain != &exynos_identity_domain) { in exynos_sysmmu_suspend()
853 if (&data->domain->domain != &exynos_identity_domain) { in exynos_sysmmu_resume()
894 struct exynos_iommu_domain *domain; in exynos_iommu_domain_alloc_paging() local
901 domain = kzalloc(sizeof(*domain), GFP_KERNEL); in exynos_iommu_domain_alloc_paging()
902 if (!domain) in exynos_iommu_domain_alloc_paging()
905 domain->pgtable = iommu_alloc_pages(GFP_KERNEL, 2); in exynos_iommu_domain_alloc_paging()
906 if (!domain->pgtable) in exynos_iommu_domain_alloc_paging()
909 domain->lv2entcnt = iommu_alloc_pages(GFP_KERNEL, 1); in exynos_iommu_domain_alloc_paging()
910 if (!domain->lv2entcnt) in exynos_iommu_domain_alloc_paging()
915 domain->pgtable[i] = ZERO_LV2LINK; in exynos_iommu_domain_alloc_paging()
917 handle = dma_map_single(dma_dev, domain->pgtable, LV1TABLE_SIZE, in exynos_iommu_domain_alloc_paging()
920 BUG_ON(handle != virt_to_phys(domain->pgtable)); in exynos_iommu_domain_alloc_paging()
924 spin_lock_init(&domain->lock); in exynos_iommu_domain_alloc_paging()
925 spin_lock_init(&domain->pgtablelock); in exynos_iommu_domain_alloc_paging()
926 INIT_LIST_HEAD(&domain->clients); in exynos_iommu_domain_alloc_paging()
928 domain->domain.geometry.aperture_start = 0; in exynos_iommu_domain_alloc_paging()
929 domain->domain.geometry.aperture_end = ~0UL; in exynos_iommu_domain_alloc_paging()
930 domain->domain.geometry.force_aperture = true; in exynos_iommu_domain_alloc_paging()
932 return &domain->domain; in exynos_iommu_domain_alloc_paging()
935 iommu_free_pages(domain->lv2entcnt, 1); in exynos_iommu_domain_alloc_paging()
937 iommu_free_pages(domain->pgtable, 2); in exynos_iommu_domain_alloc_paging()
939 kfree(domain); in exynos_iommu_domain_alloc_paging()
945 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_domain_free() local
950 WARN_ON(!list_empty(&domain->clients)); in exynos_iommu_domain_free()
952 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_domain_free()
954 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_domain_free()
958 data->domain = NULL; in exynos_iommu_domain_free()
963 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_domain_free()
965 dma_unmap_single(dma_dev, virt_to_phys(domain->pgtable), LV1TABLE_SIZE, in exynos_iommu_domain_free()
969 if (lv1ent_page(domain->pgtable + i)) { in exynos_iommu_domain_free()
970 phys_addr_t base = lv2table_base(domain->pgtable + i); in exynos_iommu_domain_free()
978 iommu_free_pages(domain->pgtable, 2); in exynos_iommu_domain_free()
979 iommu_free_pages(domain->lv2entcnt, 1); in exynos_iommu_domain_free()
980 kfree(domain); in exynos_iommu_domain_free()
987 struct exynos_iommu_domain *domain; in exynos_iommu_identity_attach() local
992 if (owner->domain == identity_domain) in exynos_iommu_identity_attach()
995 domain = to_exynos_domain(owner->domain); in exynos_iommu_identity_attach()
996 pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_identity_attach()
1007 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_identity_attach()
1008 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_identity_attach()
1011 data->domain = NULL; in exynos_iommu_identity_attach()
1015 owner->domain = identity_domain; in exynos_iommu_identity_attach()
1016 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_identity_attach()
1037 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_attach_device() local
1040 phys_addr_t pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_attach_device()
1050 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_attach_device()
1054 data->domain = domain; in exynos_iommu_attach_device()
1055 list_add_tail(&data->domain_node, &domain->clients); in exynos_iommu_attach_device()
1058 owner->domain = iommu_domain; in exynos_iommu_attach_device()
1059 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_attach_device()
1076 static sysmmu_pte_t *alloc_lv2entry(struct exynos_iommu_domain *domain, in alloc_lv2entry() argument
1124 spin_lock(&domain->lock); in alloc_lv2entry()
1125 list_for_each_entry(data, &domain->clients, domain_node) in alloc_lv2entry()
1127 spin_unlock(&domain->lock); in alloc_lv2entry()
1134 static int lv1set_section(struct exynos_iommu_domain *domain, in lv1set_section() argument
1157 spin_lock(&domain->lock); in lv1set_section()
1164 list_for_each_entry(data, &domain->clients, domain_node) in lv1set_section()
1167 spin_unlock(&domain->lock); in lv1set_section()
1236 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_map() local
1242 BUG_ON(domain->pgtable == NULL); in exynos_iommu_map()
1245 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_map()
1247 entry = section_entry(domain->pgtable, iova); in exynos_iommu_map()
1250 ret = lv1set_section(domain, entry, iova, paddr, prot, in exynos_iommu_map()
1251 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1255 pent = alloc_lv2entry(domain, entry, iova, in exynos_iommu_map()
1256 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1262 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1271 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_map()
1276 static void exynos_iommu_tlb_invalidate_entry(struct exynos_iommu_domain *domain, in exynos_iommu_tlb_invalidate_entry() argument
1282 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1284 list_for_each_entry(data, &domain->clients, domain_node) in exynos_iommu_tlb_invalidate_entry()
1287 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1294 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_unmap() local
1300 BUG_ON(domain->pgtable == NULL); in exynos_iommu_unmap()
1302 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1304 ent = section_entry(domain->pgtable, iova); in exynos_iommu_unmap()
1336 domain->lv2entcnt[lv1ent_offset(iova)] += 1; in exynos_iommu_unmap()
1354 domain->lv2entcnt[lv1ent_offset(iova)] += SPAGES_PER_LPAGE; in exynos_iommu_unmap()
1356 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1358 exynos_iommu_tlb_invalidate_entry(domain, iova, size); in exynos_iommu_unmap()
1362 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1373 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_iova_to_phys() local
1378 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1380 entry = section_entry(domain->pgtable, iova); in exynos_iommu_iova_to_phys()
1393 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1460 owner->domain = &exynos_identity_domain; in exynos_iommu_of_xlate()