1#include <linux/dma-mapping.h>
2#include <linux/dmar.h>
3#include <linux/bootmem.h>
4#include <linux/pci.h>
5
6#include <asm/proto.h>
7#include <asm/dma.h>
8#include <asm/iommu.h>
9#include <asm/calgary.h>
10#include <asm/amd_iommu.h>
11
12static int forbid_dac __read_mostly;
13
14struct dma_mapping_ops *dma_ops;
15EXPORT_SYMBOL(dma_ops);
16
17static int iommu_sac_force __read_mostly;
18
19#ifdef CONFIG_IOMMU_DEBUG
20int panic_on_overflow __read_mostly = 1;
21int force_iommu __read_mostly = 1;
22#else
23int panic_on_overflow __read_mostly = 0;
24int force_iommu __read_mostly = 0;
25#endif
26
27int iommu_merge __read_mostly = 0;
28
29int no_iommu __read_mostly;
30
31int iommu_detected __read_mostly = 0;
32
33
34
35int iommu_bio_merge __read_mostly = 0;
36EXPORT_SYMBOL(iommu_bio_merge);
37
38dma_addr_t bad_dma_address __read_mostly = 0;
39EXPORT_SYMBOL(bad_dma_address);
40
41
42
43
44struct device x86_dma_fallback_dev = {
45 .bus_id = "fallback device",
46 .coherent_dma_mask = DMA_32BIT_MASK,
47 .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,
48};
49EXPORT_SYMBOL(x86_dma_fallback_dev);
50
51int dma_set_mask(struct device *dev, u64 mask)
52{
53 if (!dev->dma_mask || !dma_supported(dev, mask))
54 return -EIO;
55
56 *dev->dma_mask = mask;
57
58 return 0;
59}
60EXPORT_SYMBOL(dma_set_mask);
61
62#ifdef CONFIG_X86_64
63static __initdata void *dma32_bootmem_ptr;
64static unsigned long dma32_bootmem_size __initdata = (128ULL<<20);
65
66static int __init parse_dma32_size_opt(char *p)
67{
68 if (!p)
69 return -EINVAL;
70 dma32_bootmem_size = memparse(p, &p);
71 return 0;
72}
73early_param("dma32_size", parse_dma32_size_opt);
74
75void __init dma32_reserve_bootmem(void)
76{
77 unsigned long size, align;
78 if (max_pfn <= MAX_DMA32_PFN)
79 return;
80
81
82
83
84
85 align = 64ULL<<20;
86 size = roundup(dma32_bootmem_size, align);
87 dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
88 512ULL<<20);
89 if (dma32_bootmem_ptr)
90 dma32_bootmem_size = size;
91 else
92 dma32_bootmem_size = 0;
93}
94static void __init dma32_free_bootmem(void)
95{
96
97 if (max_pfn <= MAX_DMA32_PFN)
98 return;
99
100 if (!dma32_bootmem_ptr)
101 return;
102
103 free_bootmem(__pa(dma32_bootmem_ptr), dma32_bootmem_size);
104
105 dma32_bootmem_ptr = NULL;
106 dma32_bootmem_size = 0;
107}
108
109void __init pci_iommu_alloc(void)
110{
111
112 dma32_free_bootmem();
113
114
115
116
117 gart_iommu_hole_init();
118
119 detect_calgary();
120
121 detect_intel_iommu();
122
123 amd_iommu_detect();
124
125 pci_swiotlb_init();
126}
127
128unsigned long iommu_nr_pages(unsigned long addr, unsigned long len)
129{
130 unsigned long size = roundup((addr & ~PAGE_MASK) + len, PAGE_SIZE);
131
132 return size >> PAGE_SHIFT;
133}
134EXPORT_SYMBOL(iommu_nr_pages);
135#endif
136
137void *dma_generic_alloc_coherent(struct device *dev, size_t size,
138 dma_addr_t *dma_addr, gfp_t flag)
139{
140 unsigned long dma_mask;
141 struct page *page;
142 dma_addr_t addr;
143
144 dma_mask = dma_alloc_coherent_mask(dev, flag);
145
146 flag |= __GFP_ZERO;
147again:
148 page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
149 if (!page)
150 return NULL;
151
152 addr = page_to_phys(page);
153 if (!is_buffer_dma_capable(dma_mask, addr, size)) {
154 __free_pages(page, get_order(size));
155
156 if (dma_mask < DMA_32BIT_MASK && !(flag & GFP_DMA)) {
157 flag = (flag & ~GFP_DMA32) | GFP_DMA;
158 goto again;
159 }
160
161 return NULL;
162 }
163
164 *dma_addr = addr;
165 return page_address(page);
166}
167
168
169
170
171
172static __init int iommu_setup(char *p)
173{
174 iommu_merge = 1;
175
176 if (!p)
177 return -EINVAL;
178
179 while (*p) {
180 if (!strncmp(p, "off", 3))
181 no_iommu = 1;
182
183 if (!strncmp(p, "force", 5))
184 force_iommu = 1;
185 if (!strncmp(p, "noforce", 7)) {
186 iommu_merge = 0;
187 force_iommu = 0;
188 }
189
190 if (!strncmp(p, "biomerge", 8)) {
191 iommu_bio_merge = 4096;
192 iommu_merge = 1;
193 force_iommu = 1;
194 }
195 if (!strncmp(p, "panic", 5))
196 panic_on_overflow = 1;
197 if (!strncmp(p, "nopanic", 7))
198 panic_on_overflow = 0;
199 if (!strncmp(p, "merge", 5)) {
200 iommu_merge = 1;
201 force_iommu = 1;
202 }
203 if (!strncmp(p, "nomerge", 7))
204 iommu_merge = 0;
205 if (!strncmp(p, "forcesac", 8))
206 iommu_sac_force = 1;
207 if (!strncmp(p, "allowdac", 8))
208 forbid_dac = 0;
209 if (!strncmp(p, "nodac", 5))
210 forbid_dac = -1;
211 if (!strncmp(p, "usedac", 6)) {
212 forbid_dac = -1;
213 return 1;
214 }
215#ifdef CONFIG_SWIOTLB
216 if (!strncmp(p, "soft", 4))
217 swiotlb = 1;
218#endif
219
220 gart_parse_options(p);
221
222#ifdef CONFIG_CALGARY_IOMMU
223 if (!strncmp(p, "calgary", 7))
224 use_calgary = 1;
225#endif
226
227 p += strcspn(p, ",");
228 if (*p == ',')
229 ++p;
230 }
231 return 0;
232}
233early_param("iommu", iommu_setup);
234
235int dma_supported(struct device *dev, u64 mask)
236{
237 struct dma_mapping_ops *ops = get_dma_ops(dev);
238
239#ifdef CONFIG_PCI
240 if (mask > 0xffffffff && forbid_dac > 0) {
241 dev_info(dev, "PCI: Disallowing DAC for device\n");
242 return 0;
243 }
244#endif
245
246 if (ops->dma_supported)
247 return ops->dma_supported(dev, mask);
248
249
250
251
252 if (mask < DMA_24BIT_MASK)
253 return 0;
254
255
256
257
258
259
260
261
262
263
264
265
266
267 if (iommu_sac_force && (mask >= DMA_40BIT_MASK)) {
268 dev_info(dev, "Force SAC with mask %Lx\n", mask);
269 return 0;
270 }
271
272 return 1;
273}
274EXPORT_SYMBOL(dma_supported);
275
276static int __init pci_iommu_init(void)
277{
278 calgary_iommu_init();
279
280 intel_iommu_init();
281
282 amd_iommu_init();
283
284 gart_iommu_init();
285
286 no_iommu_init();
287 return 0;
288}
289
290void pci_iommu_shutdown(void)
291{
292 gart_iommu_shutdown();
293}
294
295fs_initcall(pci_iommu_init);
296
297#ifdef CONFIG_PCI
298
299
300static __devinit void via_no_dac(struct pci_dev *dev)
301{
302 if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) {
303 printk(KERN_INFO "PCI: VIA PCI bridge detected."
304 "Disabling DAC.\n");
305 forbid_dac = 1;
306 }
307}
308DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac);
309#endif
310