Lines Matching full:iommu

2  * iommu.c:  IOMMU specific routines for memory management.
27 #include <asm/iommu.h>
61 struct iommu_struct *iommu; in sbus_iommu_init() local
66 iommu = kmalloc(sizeof(struct iommu_struct), GFP_KERNEL); in sbus_iommu_init()
67 if (!iommu) { in sbus_iommu_init()
68 prom_printf("Unable to allocate iommu structure\n"); in sbus_iommu_init()
72 iommu->regs = of_ioremap(&op->resource[0], 0, PAGE_SIZE * 3, in sbus_iommu_init()
74 if (!iommu->regs) { in sbus_iommu_init()
75 prom_printf("Cannot map IOMMU registers\n"); in sbus_iommu_init()
78 impl = (iommu->regs->control & IOMMU_CTRL_IMPL) >> 28; in sbus_iommu_init()
79 vers = (iommu->regs->control & IOMMU_CTRL_VERS) >> 24; in sbus_iommu_init()
80 tmp = iommu->regs->control; in sbus_iommu_init()
83 iommu->regs->control = tmp; in sbus_iommu_init()
84 iommu_invalidate(iommu->regs); in sbus_iommu_init()
85 iommu->start = IOMMU_START; in sbus_iommu_init()
86 iommu->end = 0xffffffff; in sbus_iommu_init()
88 /* Allocate IOMMU page table */ in sbus_iommu_init()
95 prom_printf("Unable to allocate iommu table [0x%08x]\n", in sbus_iommu_init()
99 iommu->page_table = (iopte_t *)tmp; in sbus_iommu_init()
102 memset(iommu->page_table, 0, IOMMU_NPTES*sizeof(iopte_t)); in sbus_iommu_init()
105 iommu->regs->base = __pa((unsigned long) iommu->page_table) >> 4; in sbus_iommu_init()
106 iommu_invalidate(iommu->regs); in sbus_iommu_init()
110 prom_printf("Unable to allocate iommu bitmap [%d]\n", in sbus_iommu_init()
114 bit_map_init(&iommu->usemap, bitmap, IOMMU_NPTES); in sbus_iommu_init()
119 iommu->usemap.num_colors = vac_cache_size >> PAGE_SHIFT; in sbus_iommu_init()
121 iommu->usemap.num_colors = 1; in sbus_iommu_init()
123 printk(KERN_INFO "IOMMU: impl %d vers %d table 0x%p[%d B] map [%d b]\n", in sbus_iommu_init()
124 impl, vers, iommu->page_table, in sbus_iommu_init()
127 op->dev.archdata.iommu = iommu; in sbus_iommu_init()
134 for_each_node_by_name(dp, "iommu") { in iommu_init()
177 struct iommu_struct *iommu = dev->archdata.iommu; in iommu_get_one() local
184 ioptex = bit_map_string_get(&iommu->usemap, npages, page_to_pfn(page)); in iommu_get_one()
186 panic("iommu out"); in iommu_get_one()
187 busa0 = iommu->start + (ioptex << PAGE_SHIFT); in iommu_get_one()
188 iopte0 = &iommu->page_table[ioptex]; in iommu_get_one()
194 iommu_invalidate_page(iommu->regs, busa); in iommu_get_one()
301 struct iommu_struct *iommu = dev->archdata.iommu; in iommu_release_one() local
305 BUG_ON(busa < iommu->start); in iommu_release_one()
306 ioptex = (busa - iommu->start) >> PAGE_SHIFT; in iommu_release_one()
308 iopte_val(iommu->page_table[ioptex + i]) = 0; in iommu_release_one()
309 iommu_invalidate_page(iommu->regs, busa); in iommu_release_one()
312 bit_map_clear(&iommu->usemap, ioptex, npages); in iommu_release_one()
343 struct iommu_struct *iommu = dev->archdata.iommu; in iommu_map_dma_area() local
345 iopte_t *iopte = iommu->page_table; in iommu_map_dma_area()
354 ioptex = bit_map_string_get(&iommu->usemap, len >> PAGE_SHIFT, in iommu_map_dma_area()
357 panic("iommu out"); in iommu_map_dma_area()
394 * IOMMU page table modifications, and usage of non-cacheable in iommu_map_dma_area()
401 iommu_invalidate(iommu->regs); in iommu_map_dma_area()
403 *pba = iommu->start + (ioptex << PAGE_SHIFT); in iommu_map_dma_area()
409 struct iommu_struct *iommu = dev->archdata.iommu; in iommu_unmap_dma_area() local
410 iopte_t *iopte = iommu->page_table; in iommu_unmap_dma_area()
412 int ioptex = (busa - iommu->start) >> PAGE_SHIFT; in iommu_unmap_dma_area()
424 iommu_invalidate(iommu->regs); in iommu_unmap_dma_area()
425 bit_map_clear(&iommu->usemap, ioptex, len >> PAGE_SHIFT); in iommu_unmap_dma_area()