aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-17 16:19:26 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-17 16:19:26 -0400
commite2fdae7e7c5a690b10b2d2891ec819e554dc033d (patch)
tree7b48f55eba9519aeee554a58be9d1ff8a8adffd6 /include/linux
parent6b6e177d632ee251c7c78d8f266a851ab9704879 (diff)
parentcb97201cb060d13da0b87fd1bf68208c7389c5b1 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Pull sparc updates from David Miller: "The PowerPC folks have a really nice scalable IOMMU pool allocator that we wanted to make use of for sparc. So here we have a series that abstracts out their code into a common layer that anyone can make use of. Sparc is converted, and the PowerPC folks have reviewed and ACK'd this series and plan to convert PowerPC over as well" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc: iommu-common: Fix PARISC compile-time warnings sparc: Make LDC use common iommu poll management functions sparc: Make sparc64 use scalable lib/iommu-common.c functions sparc: Break up monolithic iommu table/lock into finer graularity pools and lock
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/iommu-common.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/include/linux/iommu-common.h b/include/linux/iommu-common.h
new file mode 100644
index 000000000000..6be5c863f329
--- /dev/null
+++ b/include/linux/iommu-common.h
@@ -0,0 +1,55 @@
1#ifndef _LINUX_IOMMU_COMMON_H
2#define _LINUX_IOMMU_COMMON_H
3
4#include <linux/spinlock_types.h>
5#include <linux/device.h>
6#include <asm/page.h>
7
8#define IOMMU_POOL_HASHBITS 4
9#define IOMMU_NR_POOLS (1 << IOMMU_POOL_HASHBITS)
10
11struct iommu_pool {
12 unsigned long start;
13 unsigned long end;
14 unsigned long hint;
15 spinlock_t lock;
16};
17
18struct iommu_table;
19
20struct iommu_tbl_ops {
21 unsigned long (*cookie_to_index)(u64, void *);
22 void (*demap)(void *, unsigned long, unsigned long);
23 void (*reset)(struct iommu_table *);
24};
25
26struct iommu_table {
27 unsigned long page_table_map_base;
28 unsigned long page_table_shift;
29 unsigned long nr_pools;
30 const struct iommu_tbl_ops *iommu_tbl_ops;
31 unsigned long poolsize;
32 struct iommu_pool arena_pool[IOMMU_NR_POOLS];
33 u32 flags;
34#define IOMMU_HAS_LARGE_POOL 0x00000001
35 struct iommu_pool large_pool;
36 unsigned long *map;
37};
38
39extern void iommu_tbl_pool_init(struct iommu_table *iommu,
40 unsigned long num_entries,
41 u32 page_table_shift,
42 const struct iommu_tbl_ops *iommu_tbl_ops,
43 bool large_pool, u32 npools);
44
45extern unsigned long iommu_tbl_range_alloc(struct device *dev,
46 struct iommu_table *iommu,
47 unsigned long npages,
48 unsigned long *handle,
49 unsigned int pool_hash);
50
51extern void iommu_tbl_range_free(struct iommu_table *iommu,
52 u64 dma_addr, unsigned long npages,
53 bool do_demap, void *demap_arg);
54
55#endif