Lines Matching refs:arena

63 	struct pci_iommu_arena *arena;  in iommu_arena_new_node()  local
74 arena = memblock_alloc(sizeof(*arena), SMP_CACHE_BYTES); in iommu_arena_new_node()
75 if (!arena) in iommu_arena_new_node()
77 sizeof(*arena)); in iommu_arena_new_node()
78 arena->ptes = memblock_alloc(mem_size, align); in iommu_arena_new_node()
79 if (!arena->ptes) in iommu_arena_new_node()
83 spin_lock_init(&arena->lock); in iommu_arena_new_node()
84 arena->hose = hose; in iommu_arena_new_node()
85 arena->dma_base = base; in iommu_arena_new_node()
86 arena->size = window_size; in iommu_arena_new_node()
87 arena->next_entry = 0; in iommu_arena_new_node()
91 arena->align_entry = 1; in iommu_arena_new_node()
93 return arena; in iommu_arena_new_node()
105 iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena, in iommu_arena_find_pages() argument
114 base = arena->dma_base >> PAGE_SHIFT; in iommu_arena_find_pages()
118 ptes = arena->ptes; in iommu_arena_find_pages()
119 nent = arena->size >> PAGE_SHIFT; in iommu_arena_find_pages()
120 p = ALIGN(arena->next_entry, mask + 1); in iommu_arena_find_pages()
142 alpha_mv.mv_pci_tbi(arena->hose, 0, -1); in iommu_arena_find_pages()
158 iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n, in iommu_arena_alloc() argument
165 spin_lock_irqsave(&arena->lock, flags); in iommu_arena_alloc()
168 ptes = arena->ptes; in iommu_arena_alloc()
169 mask = max(align, arena->align_entry) - 1; in iommu_arena_alloc()
170 p = iommu_arena_find_pages(dev, arena, n, mask); in iommu_arena_alloc()
172 spin_unlock_irqrestore(&arena->lock, flags); in iommu_arena_alloc()
183 arena->next_entry = p + n; in iommu_arena_alloc()
184 spin_unlock_irqrestore(&arena->lock, flags); in iommu_arena_alloc()
190 iommu_arena_free(struct pci_iommu_arena *arena, long ofs, long n) in iommu_arena_free() argument
195 p = arena->ptes + ofs; in iommu_arena_free()
235 struct pci_iommu_arena *arena; in pci_map_single_1() local
275 arena = hose->sg_pci; in pci_map_single_1()
276 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in pci_map_single_1()
277 arena = hose->sg_isa; in pci_map_single_1()
284 dma_ofs = iommu_arena_alloc(dev, arena, npages, align); in pci_map_single_1()
293 arena->ptes[i + dma_ofs] = mk_iommu_pte(paddr); in pci_map_single_1()
295 ret = arena->dma_base + dma_ofs * PAGE_SIZE; in pci_map_single_1()
356 struct pci_iommu_arena *arena; in alpha_pci_unmap_page() local
377 arena = hose->sg_pci; in alpha_pci_unmap_page()
378 if (!arena || dma_addr < arena->dma_base) in alpha_pci_unmap_page()
379 arena = hose->sg_isa; in alpha_pci_unmap_page()
381 dma_ofs = (dma_addr - arena->dma_base) >> PAGE_SHIFT; in alpha_pci_unmap_page()
382 if (dma_ofs * PAGE_SIZE >= arena->size) { in alpha_pci_unmap_page()
385 dma_addr, arena->dma_base, arena->size); in alpha_pci_unmap_page()
392 spin_lock_irqsave(&arena->lock, flags); in alpha_pci_unmap_page()
394 iommu_arena_free(arena, dma_ofs, npages); in alpha_pci_unmap_page()
399 if (dma_ofs >= arena->next_entry) in alpha_pci_unmap_page()
402 spin_unlock_irqrestore(&arena->lock, flags); in alpha_pci_unmap_page()
534 struct scatterlist *out, struct pci_iommu_arena *arena, in sg_fill() argument
575 dma_ofs = iommu_arena_alloc(dev, arena, npages, 0); in sg_fill()
584 return sg_fill(dev, leader, end, out, arena, max_dma, dac_allowed); in sg_fill()
587 out->dma_address = arena->dma_base + dma_ofs*PAGE_SIZE + paddr; in sg_fill()
595 ptes = &arena->ptes[dma_ofs]; in sg_fill()
638 struct pci_iommu_arena *arena; in alpha_pci_map_sg() local
667 arena = hose->sg_pci; in alpha_pci_map_sg()
668 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in alpha_pci_map_sg()
669 arena = hose->sg_isa; in alpha_pci_map_sg()
672 arena = NULL; in alpha_pci_map_sg()
681 if (sg_fill(dev, sg, end, out, arena, max_dma, dac_allowed) < 0) in alpha_pci_map_sg()
720 struct pci_iommu_arena *arena; in alpha_pci_unmap_sg() local
732 arena = hose->sg_pci; in alpha_pci_unmap_sg()
733 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in alpha_pci_unmap_sg()
734 arena = hose->sg_isa; in alpha_pci_unmap_sg()
738 spin_lock_irqsave(&arena->lock, flags); in alpha_pci_unmap_sg()
770 ofs = (addr - arena->dma_base) >> PAGE_SHIFT; in alpha_pci_unmap_sg()
771 iommu_arena_free(arena, ofs, npages); in alpha_pci_unmap_sg()
781 if ((fend - arena->dma_base) >> PAGE_SHIFT >= arena->next_entry) in alpha_pci_unmap_sg()
784 spin_unlock_irqrestore(&arena->lock, flags); in alpha_pci_unmap_sg()
796 struct pci_iommu_arena *arena; in alpha_pci_supported() local
808 arena = hose->sg_isa; in alpha_pci_supported()
809 if (arena && arena->dma_base + arena->size - 1 <= mask) in alpha_pci_supported()
811 arena = hose->sg_pci; in alpha_pci_supported()
812 if (arena && arena->dma_base + arena->size - 1 <= mask) in alpha_pci_supported()
827 iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask) in iommu_reserve() argument
833 if (!arena) return -EINVAL; in iommu_reserve()
835 spin_lock_irqsave(&arena->lock, flags); in iommu_reserve()
838 ptes = arena->ptes; in iommu_reserve()
839 p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask); in iommu_reserve()
841 spin_unlock_irqrestore(&arena->lock, flags); in iommu_reserve()
851 arena->next_entry = p + pg_count; in iommu_reserve()
852 spin_unlock_irqrestore(&arena->lock, flags); in iommu_reserve()
858 iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count) in iommu_release() argument
863 if (!arena) return -EINVAL; in iommu_release()
865 ptes = arena->ptes; in iommu_release()
872 iommu_arena_free(arena, pg_start, pg_count); in iommu_release()
877 iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, in iommu_bind() argument
884 if (!arena) return -EINVAL; in iommu_bind()
886 spin_lock_irqsave(&arena->lock, flags); in iommu_bind()
888 ptes = arena->ptes; in iommu_bind()
892 spin_unlock_irqrestore(&arena->lock, flags); in iommu_bind()
900 spin_unlock_irqrestore(&arena->lock, flags); in iommu_bind()
906 iommu_unbind(struct pci_iommu_arena *arena, long pg_start, long pg_count) in iommu_unbind() argument
911 if (!arena) return -EINVAL; in iommu_unbind()
913 p = arena->ptes + pg_start; in iommu_unbind()