• Home
  • Raw
  • Download

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()
676 if (data->domain) { in exynos_sysmmu_suspend()
694 if (data->domain) { in exynos_sysmmu_resume()
735 struct exynos_iommu_domain *domain; in exynos_iommu_domain_alloc() local
742 domain = kzalloc(sizeof(*domain), GFP_KERNEL); in exynos_iommu_domain_alloc()
743 if (!domain) in exynos_iommu_domain_alloc()
747 if (iommu_get_dma_cookie(&domain->domain) != 0) in exynos_iommu_domain_alloc()
753 domain->pgtable = (sysmmu_pte_t *)__get_free_pages(GFP_KERNEL, 2); in exynos_iommu_domain_alloc()
754 if (!domain->pgtable) in exynos_iommu_domain_alloc()
757 domain->lv2entcnt = (short *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); in exynos_iommu_domain_alloc()
758 if (!domain->lv2entcnt) in exynos_iommu_domain_alloc()
763 domain->pgtable[i] = ZERO_LV2LINK; in exynos_iommu_domain_alloc()
765 handle = dma_map_single(dma_dev, domain->pgtable, LV1TABLE_SIZE, in exynos_iommu_domain_alloc()
768 BUG_ON(handle != virt_to_phys(domain->pgtable)); in exynos_iommu_domain_alloc()
772 spin_lock_init(&domain->lock); in exynos_iommu_domain_alloc()
773 spin_lock_init(&domain->pgtablelock); in exynos_iommu_domain_alloc()
774 INIT_LIST_HEAD(&domain->clients); in exynos_iommu_domain_alloc()
776 domain->domain.geometry.aperture_start = 0; in exynos_iommu_domain_alloc()
777 domain->domain.geometry.aperture_end = ~0UL; in exynos_iommu_domain_alloc()
778 domain->domain.geometry.force_aperture = true; in exynos_iommu_domain_alloc()
780 return &domain->domain; in exynos_iommu_domain_alloc()
783 free_pages((unsigned long)domain->lv2entcnt, 1); in exynos_iommu_domain_alloc()
785 free_pages((unsigned long)domain->pgtable, 2); in exynos_iommu_domain_alloc()
788 iommu_put_dma_cookie(&domain->domain); in exynos_iommu_domain_alloc()
790 kfree(domain); in exynos_iommu_domain_alloc()
796 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_domain_free() local
801 WARN_ON(!list_empty(&domain->clients)); in exynos_iommu_domain_free()
803 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_domain_free()
805 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_domain_free()
809 data->domain = NULL; in exynos_iommu_domain_free()
814 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_domain_free()
819 dma_unmap_single(dma_dev, virt_to_phys(domain->pgtable), LV1TABLE_SIZE, in exynos_iommu_domain_free()
823 if (lv1ent_page(domain->pgtable + i)) { in exynos_iommu_domain_free()
824 phys_addr_t base = lv2table_base(domain->pgtable + i); in exynos_iommu_domain_free()
832 free_pages((unsigned long)domain->pgtable, 2); in exynos_iommu_domain_free()
833 free_pages((unsigned long)domain->lv2entcnt, 1); in exynos_iommu_domain_free()
834 kfree(domain); in exynos_iommu_domain_free()
840 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_detach_device() local
842 phys_addr_t pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_detach_device()
846 if (!has_sysmmu(dev) || owner->domain != iommu_domain) in exynos_iommu_detach_device()
858 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_detach_device()
859 list_for_each_entry_safe(data, next, &domain->clients, domain_node) { in exynos_iommu_detach_device()
862 data->domain = NULL; in exynos_iommu_detach_device()
866 owner->domain = NULL; in exynos_iommu_detach_device()
867 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_detach_device()
878 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_attach_device() local
881 phys_addr_t pagetable = virt_to_phys(domain->pgtable); in exynos_iommu_attach_device()
887 if (owner->domain) in exynos_iommu_attach_device()
888 exynos_iommu_detach_device(owner->domain, dev); in exynos_iommu_attach_device()
892 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_attach_device()
896 data->domain = domain; in exynos_iommu_attach_device()
897 list_add_tail(&data->domain_node, &domain->clients); in exynos_iommu_attach_device()
900 owner->domain = iommu_domain; in exynos_iommu_attach_device()
901 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_attach_device()
918 static sysmmu_pte_t *alloc_lv2entry(struct exynos_iommu_domain *domain, in alloc_lv2entry() argument
966 spin_lock(&domain->lock); in alloc_lv2entry()
967 list_for_each_entry(data, &domain->clients, domain_node) in alloc_lv2entry()
969 spin_unlock(&domain->lock); in alloc_lv2entry()
976 static int lv1set_section(struct exynos_iommu_domain *domain, in lv1set_section() argument
999 spin_lock(&domain->lock); in lv1set_section()
1006 list_for_each_entry(data, &domain->clients, domain_node) in lv1set_section()
1009 spin_unlock(&domain->lock); in lv1set_section()
1078 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_map() local
1084 BUG_ON(domain->pgtable == NULL); in exynos_iommu_map()
1087 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_map()
1089 entry = section_entry(domain->pgtable, iova); in exynos_iommu_map()
1092 ret = lv1set_section(domain, entry, iova, paddr, prot, in exynos_iommu_map()
1093 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1097 pent = alloc_lv2entry(domain, entry, iova, in exynos_iommu_map()
1098 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1104 &domain->lv2entcnt[lv1ent_offset(iova)]); in exynos_iommu_map()
1111 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_map()
1116 static void exynos_iommu_tlb_invalidate_entry(struct exynos_iommu_domain *domain, in exynos_iommu_tlb_invalidate_entry() argument
1122 spin_lock_irqsave(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1124 list_for_each_entry(data, &domain->clients, domain_node) in exynos_iommu_tlb_invalidate_entry()
1127 spin_unlock_irqrestore(&domain->lock, flags); in exynos_iommu_tlb_invalidate_entry()
1134 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_unmap() local
1140 BUG_ON(domain->pgtable == NULL); in exynos_iommu_unmap()
1142 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1144 ent = section_entry(domain->pgtable, iova); in exynos_iommu_unmap()
1176 domain->lv2entcnt[lv1ent_offset(iova)] += 1; in exynos_iommu_unmap()
1194 domain->lv2entcnt[lv1ent_offset(iova)] += SPAGES_PER_LPAGE; in exynos_iommu_unmap()
1196 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1198 exynos_iommu_tlb_invalidate_entry(domain, iova, size); in exynos_iommu_unmap()
1202 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_unmap()
1213 struct exynos_iommu_domain *domain = to_exynos_domain(iommu_domain); in exynos_iommu_iova_to_phys() local
1218 spin_lock_irqsave(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1220 entry = section_entry(domain->pgtable, iova); in exynos_iommu_iova_to_phys()
1233 spin_unlock_irqrestore(&domain->pgtablelock, flags); in exynos_iommu_iova_to_phys()
1272 if (owner->domain) { in exynos_iommu_release_device()
1276 WARN_ON(owner->domain != in exynos_iommu_release_device()
1278 exynos_iommu_detach_device(owner->domain, dev); in exynos_iommu_release_device()