diff options
-rw-r--r-- | drivers/xen/swiotlb-xen.c | 12 | ||||
-rw-r--r-- | include/linux/swiotlb.h | 1 | ||||
-rw-r--r-- | lib/swiotlb.c | 5 |
3 files changed, 15 insertions, 3 deletions
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 65ea21a97492..6e8c15a23201 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c | |||
@@ -147,9 +147,15 @@ void __init xen_swiotlb_init(int verbose) | |||
147 | { | 147 | { |
148 | unsigned long bytes; | 148 | unsigned long bytes; |
149 | int rc; | 149 | int rc; |
150 | 150 | unsigned long nr_tbl; | |
151 | xen_io_tlb_nslabs = (64 * 1024 * 1024 >> IO_TLB_SHIFT); | 151 | |
152 | xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, IO_TLB_SEGSIZE); | 152 | nr_tbl = swioltb_nr_tbl(); |
153 | if (nr_tbl) | ||
154 | xen_io_tlb_nslabs = nr_tbl; | ||
155 | else { | ||
156 | xen_io_tlb_nslabs = (64 * 1024 * 1024 >> IO_TLB_SHIFT); | ||
157 | xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, IO_TLB_SEGSIZE); | ||
158 | } | ||
153 | 159 | ||
154 | bytes = xen_io_tlb_nslabs << IO_TLB_SHIFT; | 160 | bytes = xen_io_tlb_nslabs << IO_TLB_SHIFT; |
155 | 161 | ||
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 8c0e349f4a6c..445702c60d04 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h | |||
@@ -24,6 +24,7 @@ extern int swiotlb_force; | |||
24 | 24 | ||
25 | extern void swiotlb_init(int verbose); | 25 | extern void swiotlb_init(int verbose); |
26 | extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); | 26 | extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); |
27 | extern unsigned long swioltb_nr_tbl(void); | ||
27 | 28 | ||
28 | /* | 29 | /* |
29 | * Enumeration for sync targets | 30 | * Enumeration for sync targets |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 93ca08b8a451..99093b396145 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -110,6 +110,11 @@ setup_io_tlb_npages(char *str) | |||
110 | __setup("swiotlb=", setup_io_tlb_npages); | 110 | __setup("swiotlb=", setup_io_tlb_npages); |
111 | /* make io_tlb_overflow tunable too? */ | 111 | /* make io_tlb_overflow tunable too? */ |
112 | 112 | ||
113 | unsigned long swioltb_nr_tbl(void) | ||
114 | { | ||
115 | return io_tlb_nslabs; | ||
116 | } | ||
117 | |||
113 | /* Note that this doesn't work with highmem page */ | 118 | /* Note that this doesn't work with highmem page */ |
114 | static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, | 119 | static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, |
115 | volatile void *address) | 120 | volatile void *address) |