1#include <linux/dma-mapping.h>
2#include <linux/dma-debug.h>
3#include <linux/dmar.h>
4#include <linux/export.h>
5#include <linux/bootmem.h>
6#include <linux/gfp.h>
7#include <linux/pci.h>
8#include <linux/kmemleak.h>
9
10#include <asm/proto.h>
11#include <asm/dma.h>
12#include <asm/iommu.h>
13#include <asm/gart.h>
14#include <asm/calgary.h>
15#include <asm/x86_init.h>
16#include <asm/iommu_table.h>
17
18static int forbid_dac __read_mostly;
19
20struct dma_map_ops *dma_ops = &nommu_dma_ops;
21EXPORT_SYMBOL(dma_ops);
22
23static int iommu_sac_force __read_mostly;
24
25#ifdef CONFIG_IOMMU_DEBUG
26int panic_on_overflow __read_mostly = 1;
27int force_iommu __read_mostly = 1;
28#else
29int panic_on_overflow __read_mostly = 0;
30int force_iommu __read_mostly = 0;
31#endif
32
33int iommu_merge __read_mostly = 0;
34
35int no_iommu __read_mostly;
36
37int iommu_detected __read_mostly = 0;
38
39
40
41
42
43
44
45
46int iommu_pass_through __read_mostly;
47
48extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];
49
50
51struct device x86_dma_fallback_dev = {
52 .init_name = "fallback device",
53 .coherent_dma_mask = ISA_DMA_BIT_MASK,
54 .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,
55};
56EXPORT_SYMBOL(x86_dma_fallback_dev);
57
58
59#define PREALLOC_DMA_DEBUG_ENTRIES 65536
60
61void __init pci_iommu_alloc(void)
62{
63 struct iommu_table_entry *p;
64
65 sort_iommu_table(__iommu_table, __iommu_table_end);
66 check_iommu_entries(__iommu_table, __iommu_table_end);
67
68 for (p = __iommu_table; p < __iommu_table_end; p++) {
69 if (p && p->detect && p->detect() > 0) {
70 p->flags |= IOMMU_DETECTED;
71 if (p->early_init)
72 p->early_init();
73 if (p->flags & IOMMU_FINISH_IF_DETECTED)
74 break;
75 }
76 }
77}
78void *dma_generic_alloc_coherent(struct device *dev, size_t size,
79 dma_addr_t *dma_addr, gfp_t flag,
80 struct dma_attrs *attrs)
81{
82 unsigned long dma_mask;
83 struct page *page;
84 unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
85 dma_addr_t addr;
86
87 dma_mask = dma_alloc_coherent_mask(dev, flag);
88
89 flag &= ~__GFP_ZERO;
90again:
91 page = NULL;
92
93 if (flag & __GFP_WAIT) {
94 page = dma_alloc_from_contiguous(dev, count, get_order(size));
95 if (page && page_to_phys(page) + size > dma_mask) {
96 dma_release_from_contiguous(dev, page, count);
97 page = NULL;
98 }
99 }
100
101 if (!page)
102 page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
103 if (!page)
104 return NULL;
105
106 addr = page_to_phys(page);
107 if (addr + size > dma_mask) {
108 __free_pages(page, get_order(size));
109
110 if (dma_mask < DMA_BIT_MASK(32) && !(flag & GFP_DMA)) {
111 flag = (flag & ~GFP_DMA32) | GFP_DMA;
112 goto again;
113 }
114
115 return NULL;
116 }
117 memset(page_address(page), 0, size);
118 *dma_addr = addr;
119 return page_address(page);
120}
121
122void dma_generic_free_coherent(struct device *dev, size_t size, void *vaddr,
123 dma_addr_t dma_addr, struct dma_attrs *attrs)
124{
125 unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
126 struct page *page = virt_to_page(vaddr);
127
128 if (!dma_release_from_contiguous(dev, page, count))
129 free_pages((unsigned long)vaddr, get_order(size));
130}
131
132bool arch_dma_alloc_attrs(struct device **dev, gfp_t *gfp)
133{
134 if (!*dev)
135 *dev = &x86_dma_fallback_dev;
136
137 *gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
138 *gfp = dma_alloc_coherent_gfp_flags(*dev, *gfp);
139
140 if (!is_device_dma_capable(*dev))
141 return false;
142 return true;
143
144}
145EXPORT_SYMBOL(arch_dma_alloc_attrs);
146
147
148
149
150
151static __init int iommu_setup(char *p)
152{
153 iommu_merge = 1;
154
155 if (!p)
156 return -EINVAL;
157
158 while (*p) {
159 if (!strncmp(p, "off", 3))
160 no_iommu = 1;
161
162 if (!strncmp(p, "force", 5))
163 force_iommu = 1;
164 if (!strncmp(p, "noforce", 7)) {
165 iommu_merge = 0;
166 force_iommu = 0;
167 }
168
169 if (!strncmp(p, "biomerge", 8)) {
170 iommu_merge = 1;
171 force_iommu = 1;
172 }
173 if (!strncmp(p, "panic", 5))
174 panic_on_overflow = 1;
175 if (!strncmp(p, "nopanic", 7))
176 panic_on_overflow = 0;
177 if (!strncmp(p, "merge", 5)) {
178 iommu_merge = 1;
179 force_iommu = 1;
180 }
181 if (!strncmp(p, "nomerge", 7))
182 iommu_merge = 0;
183 if (!strncmp(p, "forcesac", 8))
184 iommu_sac_force = 1;
185 if (!strncmp(p, "allowdac", 8))
186 forbid_dac = 0;
187 if (!strncmp(p, "nodac", 5))
188 forbid_dac = 1;
189 if (!strncmp(p, "usedac", 6)) {
190 forbid_dac = -1;
191 return 1;
192 }
193#ifdef CONFIG_SWIOTLB
194 if (!strncmp(p, "soft", 4))
195 swiotlb = 1;
196#endif
197 if (!strncmp(p, "pt", 2))
198 iommu_pass_through = 1;
199
200 gart_parse_options(p);
201
202#ifdef CONFIG_CALGARY_IOMMU
203 if (!strncmp(p, "calgary", 7))
204 use_calgary = 1;
205#endif
206
207 p += strcspn(p, ",");
208 if (*p == ',')
209 ++p;
210 }
211 return 0;
212}
213early_param("iommu", iommu_setup);
214
215int dma_supported(struct device *dev, u64 mask)
216{
217 struct dma_map_ops *ops = get_dma_ops(dev);
218
219#ifdef CONFIG_PCI
220 if (mask > 0xffffffff && forbid_dac > 0) {
221 dev_info(dev, "PCI: Disallowing DAC for device\n");
222 return 0;
223 }
224#endif
225
226 if (ops->dma_supported)
227 return ops->dma_supported(dev, mask);
228
229
230
231
232 if (mask < DMA_BIT_MASK(24))
233 return 0;
234
235
236
237
238
239
240
241
242
243
244
245
246
247 if (iommu_sac_force && (mask >= DMA_BIT_MASK(40))) {
248 dev_info(dev, "Force SAC with mask %Lx\n", mask);
249 return 0;
250 }
251
252 return 1;
253}
254EXPORT_SYMBOL(dma_supported);
255
256static int __init pci_iommu_init(void)
257{
258 struct iommu_table_entry *p;
259 dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
260
261#ifdef CONFIG_PCI
262 dma_debug_add_bus(&pci_bus_type);
263#endif
264 x86_init.iommu.iommu_init();
265
266 for (p = __iommu_table; p < __iommu_table_end; p++) {
267 if (p && (p->flags & IOMMU_DETECTED) && p->late_init)
268 p->late_init();
269 }
270
271 return 0;
272}
273
274rootfs_initcall(pci_iommu_init);
275
276#ifdef CONFIG_PCI
277
278
279static void via_no_dac(struct pci_dev *dev)
280{
281 if (forbid_dac == 0) {
282 dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n");
283 forbid_dac = 1;
284 }
285}
286DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID,
287 PCI_CLASS_BRIDGE_PCI, 8, via_no_dac);
288#endif
289