diff options
Diffstat (limited to 'include/linux/iova.h')
-rw-r--r-- | include/linux/iova.h | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/include/linux/iova.h b/include/linux/iova.h index 92f7177db2ce..f27bb2c62fca 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h | |||
@@ -19,8 +19,21 @@ | |||
19 | /* iova structure */ | 19 | /* iova structure */ |
20 | struct iova { | 20 | struct iova { |
21 | struct rb_node node; | 21 | struct rb_node node; |
22 | unsigned long pfn_hi; /* IOMMU dish out addr hi */ | 22 | unsigned long pfn_hi; /* Highest allocated pfn */ |
23 | unsigned long pfn_lo; /* IOMMU dish out addr lo */ | 23 | unsigned long pfn_lo; /* Lowest allocated pfn */ |
24 | }; | ||
25 | |||
26 | struct iova_magazine; | ||
27 | struct iova_cpu_rcache; | ||
28 | |||
29 | #define IOVA_RANGE_CACHE_MAX_SIZE 6 /* log of max cached IOVA range size (in pages) */ | ||
30 | #define MAX_GLOBAL_MAGS 32 /* magazines per bin */ | ||
31 | |||
32 | struct iova_rcache { | ||
33 | spinlock_t lock; | ||
34 | unsigned long depot_size; | ||
35 | struct iova_magazine *depot[MAX_GLOBAL_MAGS]; | ||
36 | struct iova_cpu_rcache __percpu *cpu_rcaches; | ||
24 | }; | 37 | }; |
25 | 38 | ||
26 | /* holds all the iova translations for a domain */ | 39 | /* holds all the iova translations for a domain */ |
@@ -31,6 +44,7 @@ struct iova_domain { | |||
31 | unsigned long granule; /* pfn granularity for this domain */ | 44 | unsigned long granule; /* pfn granularity for this domain */ |
32 | unsigned long start_pfn; /* Lower limit for this domain */ | 45 | unsigned long start_pfn; /* Lower limit for this domain */ |
33 | unsigned long dma_32bit_pfn; | 46 | unsigned long dma_32bit_pfn; |
47 | struct iova_rcache rcaches[IOVA_RANGE_CACHE_MAX_SIZE]; /* IOVA range caches */ | ||
34 | }; | 48 | }; |
35 | 49 | ||
36 | static inline unsigned long iova_size(struct iova *iova) | 50 | static inline unsigned long iova_size(struct iova *iova) |
@@ -78,6 +92,10 @@ void __free_iova(struct iova_domain *iovad, struct iova *iova); | |||
78 | struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size, | 92 | struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size, |
79 | unsigned long limit_pfn, | 93 | unsigned long limit_pfn, |
80 | bool size_aligned); | 94 | bool size_aligned); |
95 | void free_iova_fast(struct iova_domain *iovad, unsigned long pfn, | ||
96 | unsigned long size); | ||
97 | unsigned long alloc_iova_fast(struct iova_domain *iovad, unsigned long size, | ||
98 | unsigned long limit_pfn); | ||
81 | struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo, | 99 | struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo, |
82 | unsigned long pfn_hi); | 100 | unsigned long pfn_hi); |
83 | void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); | 101 | void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); |
@@ -87,5 +105,6 @@ struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn); | |||
87 | void put_iova_domain(struct iova_domain *iovad); | 105 | void put_iova_domain(struct iova_domain *iovad); |
88 | struct iova *split_and_remove_iova(struct iova_domain *iovad, | 106 | struct iova *split_and_remove_iova(struct iova_domain *iovad, |
89 | struct iova *iova, unsigned long pfn_lo, unsigned long pfn_hi); | 107 | struct iova *iova, unsigned long pfn_lo, unsigned long pfn_hi); |
108 | void free_cpu_cached_iovas(unsigned int cpu, struct iova_domain *iovad); | ||
90 | 109 | ||
91 | #endif | 110 | #endif |