Lines Matching refs:arena
63 struct pci_iommu_arena *arena; in iommu_arena_new_node() local
77 arena = alloc_bootmem_node(NODE_DATA(nid), sizeof(*arena)); in iommu_arena_new_node()
78 if (!NODE_DATA(nid) || !arena) { in iommu_arena_new_node()
82 arena = alloc_bootmem(sizeof(*arena)); in iommu_arena_new_node()
85 arena->ptes = __alloc_bootmem_node(NODE_DATA(nid), mem_size, align, 0); in iommu_arena_new_node()
86 if (!NODE_DATA(nid) || !arena->ptes) { in iommu_arena_new_node()
90 arena->ptes = __alloc_bootmem(mem_size, align, 0); in iommu_arena_new_node()
95 arena = alloc_bootmem(sizeof(*arena)); in iommu_arena_new_node()
96 arena->ptes = __alloc_bootmem(mem_size, align, 0); in iommu_arena_new_node()
100 spin_lock_init(&arena->lock); in iommu_arena_new_node()
101 arena->hose = hose; in iommu_arena_new_node()
102 arena->dma_base = base; in iommu_arena_new_node()
103 arena->size = window_size; in iommu_arena_new_node()
104 arena->next_entry = 0; in iommu_arena_new_node()
108 arena->align_entry = 1; in iommu_arena_new_node()
110 return arena; in iommu_arena_new_node()
122 iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena, in iommu_arena_find_pages() argument
131 base = arena->dma_base >> PAGE_SHIFT; in iommu_arena_find_pages()
140 ptes = arena->ptes; in iommu_arena_find_pages()
141 nent = arena->size >> PAGE_SHIFT; in iommu_arena_find_pages()
142 p = ALIGN(arena->next_entry, mask + 1); in iommu_arena_find_pages()
164 alpha_mv.mv_pci_tbi(arena->hose, 0, -1); in iommu_arena_find_pages()
180 iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n, in iommu_arena_alloc() argument
187 spin_lock_irqsave(&arena->lock, flags); in iommu_arena_alloc()
190 ptes = arena->ptes; in iommu_arena_alloc()
191 mask = max(align, arena->align_entry) - 1; in iommu_arena_alloc()
192 p = iommu_arena_find_pages(dev, arena, n, mask); in iommu_arena_alloc()
194 spin_unlock_irqrestore(&arena->lock, flags); in iommu_arena_alloc()
205 arena->next_entry = p + n; in iommu_arena_alloc()
206 spin_unlock_irqrestore(&arena->lock, flags); in iommu_arena_alloc()
212 iommu_arena_free(struct pci_iommu_arena *arena, long ofs, long n) in iommu_arena_free() argument
217 p = arena->ptes + ofs; in iommu_arena_free()
257 struct pci_iommu_arena *arena; in pci_map_single_1() local
297 arena = hose->sg_pci; in pci_map_single_1()
298 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in pci_map_single_1()
299 arena = hose->sg_isa; in pci_map_single_1()
306 dma_ofs = iommu_arena_alloc(dev, arena, npages, align); in pci_map_single_1()
315 arena->ptes[i + dma_ofs] = mk_iommu_pte(paddr); in pci_map_single_1()
317 ret = arena->dma_base + dma_ofs * PAGE_SIZE; in pci_map_single_1()
378 struct pci_iommu_arena *arena; in alpha_pci_unmap_page() local
399 arena = hose->sg_pci; in alpha_pci_unmap_page()
400 if (!arena || dma_addr < arena->dma_base) in alpha_pci_unmap_page()
401 arena = hose->sg_isa; in alpha_pci_unmap_page()
403 dma_ofs = (dma_addr - arena->dma_base) >> PAGE_SHIFT; in alpha_pci_unmap_page()
404 if (dma_ofs * PAGE_SIZE >= arena->size) { in alpha_pci_unmap_page()
407 dma_addr, arena->dma_base, arena->size); in alpha_pci_unmap_page()
414 spin_lock_irqsave(&arena->lock, flags); in alpha_pci_unmap_page()
416 iommu_arena_free(arena, dma_ofs, npages); in alpha_pci_unmap_page()
421 if (dma_ofs >= arena->next_entry) in alpha_pci_unmap_page()
424 spin_unlock_irqrestore(&arena->lock, flags); in alpha_pci_unmap_page()
556 struct scatterlist *out, struct pci_iommu_arena *arena, in sg_fill() argument
597 dma_ofs = iommu_arena_alloc(dev, arena, npages, 0); in sg_fill()
606 return sg_fill(dev, leader, end, out, arena, max_dma, dac_allowed); in sg_fill()
609 out->dma_address = arena->dma_base + dma_ofs*PAGE_SIZE + paddr; in sg_fill()
617 ptes = &arena->ptes[dma_ofs]; in sg_fill()
660 struct pci_iommu_arena *arena; in alpha_pci_map_sg() local
687 arena = hose->sg_pci; in alpha_pci_map_sg()
688 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in alpha_pci_map_sg()
689 arena = hose->sg_isa; in alpha_pci_map_sg()
692 arena = NULL; in alpha_pci_map_sg()
701 if (sg_fill(dev, sg, end, out, arena, max_dma, dac_allowed) < 0) in alpha_pci_map_sg()
738 struct pci_iommu_arena *arena; in alpha_pci_unmap_sg() local
750 arena = hose->sg_pci; in alpha_pci_unmap_sg()
751 if (!arena || arena->dma_base + arena->size - 1 > max_dma) in alpha_pci_unmap_sg()
752 arena = hose->sg_isa; in alpha_pci_unmap_sg()
756 spin_lock_irqsave(&arena->lock, flags); in alpha_pci_unmap_sg()
788 ofs = (addr - arena->dma_base) >> PAGE_SHIFT; in alpha_pci_unmap_sg()
789 iommu_arena_free(arena, ofs, npages); in alpha_pci_unmap_sg()
799 if ((fend - arena->dma_base) >> PAGE_SHIFT >= arena->next_entry) in alpha_pci_unmap_sg()
802 spin_unlock_irqrestore(&arena->lock, flags); in alpha_pci_unmap_sg()
814 struct pci_iommu_arena *arena; in alpha_pci_supported() local
826 arena = hose->sg_isa; in alpha_pci_supported()
827 if (arena && arena->dma_base + arena->size - 1 <= mask) in alpha_pci_supported()
829 arena = hose->sg_pci; in alpha_pci_supported()
830 if (arena && arena->dma_base + arena->size - 1 <= mask) in alpha_pci_supported()
845 iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask) in iommu_reserve() argument
851 if (!arena) return -EINVAL; in iommu_reserve()
853 spin_lock_irqsave(&arena->lock, flags); in iommu_reserve()
856 ptes = arena->ptes; in iommu_reserve()
857 p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask); in iommu_reserve()
859 spin_unlock_irqrestore(&arena->lock, flags); in iommu_reserve()
869 arena->next_entry = p + pg_count; in iommu_reserve()
870 spin_unlock_irqrestore(&arena->lock, flags); in iommu_reserve()
876 iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count) in iommu_release() argument
881 if (!arena) return -EINVAL; in iommu_release()
883 ptes = arena->ptes; in iommu_release()
890 iommu_arena_free(arena, pg_start, pg_count); in iommu_release()
895 iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, in iommu_bind() argument
902 if (!arena) return -EINVAL; in iommu_bind()
904 spin_lock_irqsave(&arena->lock, flags); in iommu_bind()
906 ptes = arena->ptes; in iommu_bind()
910 spin_unlock_irqrestore(&arena->lock, flags); in iommu_bind()
918 spin_unlock_irqrestore(&arena->lock, flags); in iommu_bind()
924 iommu_unbind(struct pci_iommu_arena *arena, long pg_start, long pg_count) in iommu_unbind() argument
929 if (!arena) return -EINVAL; in iommu_unbind()
931 p = arena->ptes + pg_start; in iommu_unbind()