Commit | Line | Data |
---|---|---|
19814ea2 | 1 | /* iommu_common.h: UltraSparc SBUS/PCI common iommu declarations. |
1da177e4 | 2 | * |
19814ea2 | 3 | * Copyright (C) 1999, 2008 David S. Miller (davem@davemloft.net) |
1da177e4 LT |
4 | */ |
5 | ||
19814ea2 DM |
6 | #ifndef _IOMMU_COMMON_H |
7 | #define _IOMMU_COMMON_H | |
8 | ||
1da177e4 LT |
9 | #include <linux/kernel.h> |
10 | #include <linux/types.h> | |
11 | #include <linux/sched.h> | |
12 | #include <linux/mm.h> | |
24c31eed | 13 | #include <linux/scatterlist.h> |
fde6a3c8 | 14 | #include <linux/device.h> |
f0880257 | 15 | #include <linux/iommu-helper.h> |
1da177e4 LT |
16 | |
17 | #include <asm/iommu.h> | |
18 | #include <asm/scatterlist.h> | |
19 | ||
20 | /* | |
21 | * These give mapping size of each iommu pte/tlb. | |
22 | */ | |
23 | #define IO_PAGE_SHIFT 13 | |
24 | #define IO_PAGE_SIZE (1UL << IO_PAGE_SHIFT) | |
25 | #define IO_PAGE_MASK (~(IO_PAGE_SIZE-1)) | |
27ac792c | 26 | #define IO_PAGE_ALIGN(addr) ALIGN(addr, IO_PAGE_SIZE) |
1da177e4 LT |
27 | |
28 | #define IO_TSB_ENTRIES (128*1024) | |
29 | #define IO_TSB_SIZE (IO_TSB_ENTRIES * 8) | |
30 | ||
31 | /* | |
32 | * This is the hardwired shift in the iotlb tag/data parts. | |
33 | */ | |
34 | #define IOMMU_PAGE_SHIFT 13 | |
35 | ||
38192d52 DM |
36 | #define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG)))) |
37 | ||
38 | static inline unsigned long iommu_num_pages(unsigned long vaddr, | |
39 | unsigned long slen) | |
40 | { | |
41 | unsigned long npages; | |
42 | ||
43 | npages = IO_PAGE_ALIGN(vaddr + slen) - (vaddr & IO_PAGE_MASK); | |
44 | npages >>= IO_PAGE_SHIFT; | |
45 | ||
46 | return npages; | |
47 | } | |
48 | ||
f0880257 FT |
49 | static inline int is_span_boundary(unsigned long entry, |
50 | unsigned long shift, | |
51 | unsigned long boundary_size, | |
52 | struct scatterlist *outs, | |
53 | struct scatterlist *sg) | |
54 | { | |
55 | unsigned long paddr = SG_ENT_PHYS_ADDRESS(outs); | |
56 | int nr = iommu_num_pages(paddr, outs->dma_length + sg->length); | |
57 | ||
58 | return iommu_is_span_boundary(entry, nr, shift, boundary_size); | |
59 | } | |
60 | ||
d284142c DM |
61 | extern unsigned long iommu_range_alloc(struct device *dev, |
62 | struct iommu *iommu, | |
63 | unsigned long npages, | |
64 | unsigned long *handle); | |
65 | extern void iommu_range_free(struct iommu *iommu, | |
66 | dma_addr_t dma_addr, | |
67 | unsigned long npages); | |
68 | ||
19814ea2 | 69 | #endif /* _IOMMU_COMMON_H */ |