blob: dd6e334ab9e127d61338f27bb28de710689aa6ab [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/arch/alpha/kernel/pci_iommu.c
3 */
4
5#include <linux/kernel.h>
6#include <linux/mm.h>
7#include <linux/pci.h>
8#include <linux/slab.h>
9#include <linux/bootmem.h>
Jens Axboe944bda22007-10-23 12:31:05 +020010#include <linux/scatterlist.h>
Richard Henderson74fd1b62007-05-29 16:01:35 -070011#include <linux/log2.h>
FUJITA Tomonori7c536642008-02-04 22:27:58 -080012#include <linux/dma-mapping.h>
FUJITA Tomonorifd288412008-03-13 12:32:40 -070013#include <linux/iommu-helper.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014
15#include <asm/io.h>
16#include <asm/hwrpb.h>
17
18#include "proto.h"
19#include "pci_impl.h"
20
21
22#define DEBUG_ALLOC 0
23#if DEBUG_ALLOC > 0
24# define DBGA(args...) printk(KERN_DEBUG args)
25#else
26# define DBGA(args...)
27#endif
28#if DEBUG_ALLOC > 1
29# define DBGA2(args...) printk(KERN_DEBUG args)
30#else
31# define DBGA2(args...)
32#endif
33
34#define DEBUG_NODIRECT 0
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#define ISA_DMA_MASK 0x00ffffff
37
38static inline unsigned long
39mk_iommu_pte(unsigned long paddr)
40{
41 return (paddr >> (PAGE_SHIFT-1)) | 1;
42}
43
44static inline long
45calc_npages(long bytes)
46{
47 return (bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
48}
49
50
51/* Return the minimum of MAX or the first power of two larger
52 than main memory. */
53
54unsigned long
55size_for_memory(unsigned long max)
56{
57 unsigned long mem = max_low_pfn << PAGE_SHIFT;
58 if (mem < max)
Richard Henderson74fd1b62007-05-29 16:01:35 -070059 max = roundup_pow_of_two(mem);
Linus Torvalds1da177e2005-04-16 15:20:36 -070060 return max;
61}
62
Al Viroed5f6562007-07-26 17:34:19 +010063struct pci_iommu_arena * __init
Linus Torvalds1da177e2005-04-16 15:20:36 -070064iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
65 unsigned long window_size, unsigned long align)
66{
67 unsigned long mem_size;
68 struct pci_iommu_arena *arena;
69
70 mem_size = window_size / (PAGE_SIZE / sizeof(unsigned long));
71
72 /* Note that the TLB lookup logic uses bitwise concatenation,
73 not addition, so the required arena alignment is based on
74 the size of the window. Retain the align parameter so that
75 particular systems can over-align the arena. */
76 if (align < mem_size)
77 align = mem_size;
78
79
80#ifdef CONFIG_DISCONTIGMEM
81
82 if (!NODE_DATA(nid) ||
83 (NULL == (arena = alloc_bootmem_node(NODE_DATA(nid),
84 sizeof(*arena))))) {
85 printk("%s: couldn't allocate arena from node %d\n"
86 " falling back to system-wide allocation\n",
87 __FUNCTION__, nid);
88 arena = alloc_bootmem(sizeof(*arena));
89 }
90
91 if (!NODE_DATA(nid) ||
92 (NULL == (arena->ptes = __alloc_bootmem_node(NODE_DATA(nid),
93 mem_size,
94 align,
95 0)))) {
96 printk("%s: couldn't allocate arena ptes from node %d\n"
97 " falling back to system-wide allocation\n",
98 __FUNCTION__, nid);
99 arena->ptes = __alloc_bootmem(mem_size, align, 0);
100 }
101
102#else /* CONFIG_DISCONTIGMEM */
103
104 arena = alloc_bootmem(sizeof(*arena));
105 arena->ptes = __alloc_bootmem(mem_size, align, 0);
106
107#endif /* CONFIG_DISCONTIGMEM */
108
109 spin_lock_init(&arena->lock);
110 arena->hose = hose;
111 arena->dma_base = base;
112 arena->size = window_size;
113 arena->next_entry = 0;
114
115 /* Align allocations to a multiple of a page size. Not needed
116 unless there are chip bugs. */
117 arena->align_entry = 1;
118
119 return arena;
120}
121
Al Viroed5f6562007-07-26 17:34:19 +0100122struct pci_iommu_arena * __init
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123iommu_arena_new(struct pci_controller *hose, dma_addr_t base,
124 unsigned long window_size, unsigned long align)
125{
126 return iommu_arena_new_node(0, hose, base, window_size, align);
127}
128
129/* Must be called with the arena lock held */
130static long
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800131iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
132 long n, long mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133{
134 unsigned long *ptes;
135 long i, p, nent;
FUJITA Tomonori23d7e032008-03-04 14:28:57 -0800136 int pass = 0;
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800137 unsigned long base;
138 unsigned long boundary_size;
139
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800140 base = arena->dma_base >> PAGE_SHIFT;
Ivan Kokshayskyab875cf2008-03-09 16:31:17 +0300141 if (dev) {
142 boundary_size = dma_get_seg_boundary(dev) + 1;
Ivan Kokshayskyab875cf2008-03-09 16:31:17 +0300143 boundary_size >>= PAGE_SHIFT;
144 } else {
145 boundary_size = 1UL << (32 - PAGE_SHIFT);
146 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147
148 /* Search forward for the first mask-aligned sequence of N free ptes */
149 ptes = arena->ptes;
150 nent = arena->size >> PAGE_SHIFT;
FUJITA Tomonori3c5f1de2008-03-04 14:28:54 -0800151 p = ALIGN(arena->next_entry, mask + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152 i = 0;
FUJITA Tomonori23d7e032008-03-04 14:28:57 -0800153
154again:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155 while (i < n && p+i < nent) {
FUJITA Tomonorifd288412008-03-13 12:32:40 -0700156 if (!i && iommu_is_span_boundary(p, n, base, boundary_size)) {
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800157 p = ALIGN(p + 1, mask + 1);
158 goto again;
159 }
160
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161 if (ptes[p+i])
FUJITA Tomonori3c5f1de2008-03-04 14:28:54 -0800162 p = ALIGN(p + i + 1, mask + 1), i = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 else
164 i = i + 1;
165 }
166
167 if (i < n) {
FUJITA Tomonori23d7e032008-03-04 14:28:57 -0800168 if (pass < 1) {
169 /*
170 * Reached the end. Flush the TLB and restart
171 * the search from the beginning.
172 */
173 alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
FUJITA Tomonori23d7e032008-03-04 14:28:57 -0800175 pass++;
176 p = 0;
177 i = 0;
178 goto again;
179 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 return -1;
181 }
182
183 /* Success. It's the responsibility of the caller to mark them
184 in use before releasing the lock */
185 return p;
186}
187
188static long
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800189iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n,
190 unsigned int align)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191{
192 unsigned long flags;
193 unsigned long *ptes;
194 long i, p, mask;
195
196 spin_lock_irqsave(&arena->lock, flags);
197
198 /* Search for N empty ptes */
199 ptes = arena->ptes;
200 mask = max(align, arena->align_entry) - 1;
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800201 p = iommu_arena_find_pages(dev, arena, n, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 if (p < 0) {
203 spin_unlock_irqrestore(&arena->lock, flags);
204 return -1;
205 }
206
207 /* Success. Mark them all in use, ie not zero and invalid
208 for the iommu tlb that could load them from under us.
209 The chip specific bits will fill this in with something
210 kosher when we return. */
211 for (i = 0; i < n; ++i)
212 ptes[p+i] = IOMMU_INVALID_PTE;
213
214 arena->next_entry = p + n;
215 spin_unlock_irqrestore(&arena->lock, flags);
216
217 return p;
218}
219
220static void
221iommu_arena_free(struct pci_iommu_arena *arena, long ofs, long n)
222{
223 unsigned long *p;
224 long i;
225
226 p = arena->ptes + ofs;
227 for (i = 0; i < n; ++i)
228 p[i] = 0;
229}
230
Jan Beulichcaa51712007-07-09 11:55:51 -0700231/* True if the machine supports DAC addressing, and DEV can
232 make use of it given MASK. */
233static int pci_dac_dma_supported(struct pci_dev *hwdev, u64 mask);
234
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235/* Map a single buffer of the indicated size for PCI DMA in streaming
236 mode. The 32-bit PCI bus mastering address to use is returned.
237 Once the device is given the dma address, the device owns this memory
238 until either pci_unmap_single or pci_dma_sync_single is performed. */
239
240static dma_addr_t
241pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,
242 int dac_allowed)
243{
244 struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose;
245 dma_addr_t max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
246 struct pci_iommu_arena *arena;
247 long npages, dma_ofs, i;
248 unsigned long paddr;
249 dma_addr_t ret;
250 unsigned int align = 0;
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800251 struct device *dev = pdev ? &pdev->dev : NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252
253 paddr = __pa(cpu_addr);
254
255#if !DEBUG_NODIRECT
256 /* First check to see if we can use the direct map window. */
257 if (paddr + size + __direct_map_base - 1 <= max_dma
258 && paddr + size <= __direct_map_size) {
259 ret = paddr + __direct_map_base;
260
261 DBGA2("pci_map_single: [%p,%lx] -> direct %lx from %p\n",
262 cpu_addr, size, ret, __builtin_return_address(0));
263
264 return ret;
265 }
266#endif
267
268 /* Next, use DAC if selected earlier. */
269 if (dac_allowed) {
270 ret = paddr + alpha_mv.pci_dac_offset;
271
272 DBGA2("pci_map_single: [%p,%lx] -> DAC %lx from %p\n",
273 cpu_addr, size, ret, __builtin_return_address(0));
274
275 return ret;
276 }
277
278 /* If the machine doesn't define a pci_tbi routine, we have to
279 assume it doesn't support sg mapping, and, since we tried to
280 use direct_map above, it now must be considered an error. */
281 if (! alpha_mv.mv_pci_tbi) {
282 static int been_here = 0; /* Only print the message once. */
283 if (!been_here) {
284 printk(KERN_WARNING "pci_map_single: no HW sg\n");
285 been_here = 1;
286 }
287 return 0;
288 }
289
290 arena = hose->sg_pci;
291 if (!arena || arena->dma_base + arena->size - 1 > max_dma)
292 arena = hose->sg_isa;
293
294 npages = calc_npages((paddr & ~PAGE_MASK) + size);
295
296 /* Force allocation to 64KB boundary for ISA bridges. */
297 if (pdev && pdev == isa_bridge)
298 align = 8;
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800299 dma_ofs = iommu_arena_alloc(dev, arena, npages, align);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300 if (dma_ofs < 0) {
301 printk(KERN_WARNING "pci_map_single failed: "
302 "could not allocate dma page tables\n");
303 return 0;
304 }
305
306 paddr &= PAGE_MASK;
307 for (i = 0; i < npages; ++i, paddr += PAGE_SIZE)
308 arena->ptes[i + dma_ofs] = mk_iommu_pte(paddr);
309
310 ret = arena->dma_base + dma_ofs * PAGE_SIZE;
311 ret += (unsigned long)cpu_addr & ~PAGE_MASK;
312
313 DBGA2("pci_map_single: [%p,%lx] np %ld -> sg %lx from %p\n",
314 cpu_addr, size, npages, ret, __builtin_return_address(0));
315
316 return ret;
317}
318
319dma_addr_t
320pci_map_single(struct pci_dev *pdev, void *cpu_addr, size_t size, int dir)
321{
322 int dac_allowed;
323
324 if (dir == PCI_DMA_NONE)
325 BUG();
326
327 dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
328 return pci_map_single_1(pdev, cpu_addr, size, dac_allowed);
329}
Al Virocff52da2006-10-11 17:40:22 +0100330EXPORT_SYMBOL(pci_map_single);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331
332dma_addr_t
333pci_map_page(struct pci_dev *pdev, struct page *page, unsigned long offset,
334 size_t size, int dir)
335{
336 int dac_allowed;
337
338 if (dir == PCI_DMA_NONE)
339 BUG();
340
341 dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
342 return pci_map_single_1(pdev, (char *)page_address(page) + offset,
343 size, dac_allowed);
344}
Al Virocff52da2006-10-11 17:40:22 +0100345EXPORT_SYMBOL(pci_map_page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346
347/* Unmap a single streaming mode DMA translation. The DMA_ADDR and
348 SIZE must match what was provided for in a previous pci_map_single
349 call. All other usages are undefined. After this call, reads by
350 the cpu to the buffer are guaranteed to see whatever the device
351 wrote there. */
352
353void
354pci_unmap_single(struct pci_dev *pdev, dma_addr_t dma_addr, size_t size,
355 int direction)
356{
357 unsigned long flags;
358 struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose;
359 struct pci_iommu_arena *arena;
360 long dma_ofs, npages;
361
362 if (direction == PCI_DMA_NONE)
363 BUG();
364
365 if (dma_addr >= __direct_map_base
366 && dma_addr < __direct_map_base + __direct_map_size) {
367 /* Nothing to do. */
368
369 DBGA2("pci_unmap_single: direct [%lx,%lx] from %p\n",
370 dma_addr, size, __builtin_return_address(0));
371
372 return;
373 }
374
375 if (dma_addr > 0xffffffff) {
376 DBGA2("pci64_unmap_single: DAC [%lx,%lx] from %p\n",
377 dma_addr, size, __builtin_return_address(0));
378 return;
379 }
380
381 arena = hose->sg_pci;
382 if (!arena || dma_addr < arena->dma_base)
383 arena = hose->sg_isa;
384
385 dma_ofs = (dma_addr - arena->dma_base) >> PAGE_SHIFT;
386 if (dma_ofs * PAGE_SIZE >= arena->size) {
387 printk(KERN_ERR "Bogus pci_unmap_single: dma_addr %lx "
388 " base %lx size %x\n", dma_addr, arena->dma_base,
389 arena->size);
390 return;
391 BUG();
392 }
393
394 npages = calc_npages((dma_addr & ~PAGE_MASK) + size);
395
396 spin_lock_irqsave(&arena->lock, flags);
397
398 iommu_arena_free(arena, dma_ofs, npages);
399
400 /* If we're freeing ptes above the `next_entry' pointer (they
401 may have snuck back into the TLB since the last wrap flush),
402 we need to flush the TLB before reallocating the latter. */
403 if (dma_ofs >= arena->next_entry)
404 alpha_mv.mv_pci_tbi(hose, dma_addr, dma_addr + size - 1);
405
406 spin_unlock_irqrestore(&arena->lock, flags);
407
408 DBGA2("pci_unmap_single: sg [%lx,%lx] np %ld from %p\n",
409 dma_addr, size, npages, __builtin_return_address(0));
410}
Al Virocff52da2006-10-11 17:40:22 +0100411EXPORT_SYMBOL(pci_unmap_single);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412
413void
414pci_unmap_page(struct pci_dev *pdev, dma_addr_t dma_addr,
415 size_t size, int direction)
416{
417 pci_unmap_single(pdev, dma_addr, size, direction);
418}
Al Virocff52da2006-10-11 17:40:22 +0100419EXPORT_SYMBOL(pci_unmap_page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420
421/* Allocate and map kernel buffer using consistent mode DMA for PCI
422 device. Returns non-NULL cpu-view pointer to the buffer if
423 successful and sets *DMA_ADDRP to the pci side dma address as well,
424 else DMA_ADDRP is undefined. */
425
426void *
Ivan Kokshayskyc143d432008-04-02 13:04:43 -0700427__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
428 dma_addr_t *dma_addrp, gfp_t gfp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429{
430 void *cpu_addr;
431 long order = get_order(size);
Ivan Kokshayskyc143d432008-04-02 13:04:43 -0700432
433 gfp &= ~GFP_DMA;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434
435try_again:
436 cpu_addr = (void *)__get_free_pages(gfp, order);
437 if (! cpu_addr) {
438 printk(KERN_INFO "pci_alloc_consistent: "
439 "get_free_pages failed from %p\n",
440 __builtin_return_address(0));
441 /* ??? Really atomic allocation? Otherwise we could play
442 with vmalloc and sg if we can't find contiguous memory. */
443 return NULL;
444 }
445 memset(cpu_addr, 0, size);
446
447 *dma_addrp = pci_map_single_1(pdev, cpu_addr, size, 0);
448 if (*dma_addrp == 0) {
449 free_pages((unsigned long)cpu_addr, order);
450 if (alpha_mv.mv_pci_tbi || (gfp & GFP_DMA))
451 return NULL;
452 /* The address doesn't fit required mask and we
453 do not have iommu. Try again with GFP_DMA. */
454 gfp |= GFP_DMA;
455 goto try_again;
456 }
457
458 DBGA2("pci_alloc_consistent: %lx -> [%p,%x] from %p\n",
459 size, cpu_addr, *dma_addrp, __builtin_return_address(0));
460
461 return cpu_addr;
462}
Ivan Kokshayskyc143d432008-04-02 13:04:43 -0700463EXPORT_SYMBOL(__pci_alloc_consistent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464
465/* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must
466 be values that were returned from pci_alloc_consistent. SIZE must
467 be the same as what as passed into pci_alloc_consistent.
468 References to the memory and mappings associated with CPU_ADDR or
469 DMA_ADDR past this call are illegal. */
470
471void
472pci_free_consistent(struct pci_dev *pdev, size_t size, void *cpu_addr,
473 dma_addr_t dma_addr)
474{
475 pci_unmap_single(pdev, dma_addr, size, PCI_DMA_BIDIRECTIONAL);
476 free_pages((unsigned long)cpu_addr, get_order(size));
477
478 DBGA2("pci_free_consistent: [%x,%lx] from %p\n",
479 dma_addr, size, __builtin_return_address(0));
480}
Al Virocff52da2006-10-11 17:40:22 +0100481EXPORT_SYMBOL(pci_free_consistent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482
483/* Classify the elements of the scatterlist. Write dma_address
484 of each element with:
485 0 : Followers all physically adjacent.
486 1 : Followers all virtually adjacent.
487 -1 : Not leader, physically adjacent to previous.
488 -2 : Not leader, virtually adjacent to previous.
489 Write dma_length of each leader with the combined lengths of
490 the mergable followers. */
491
Jens Axboe58b053e2007-10-22 20:02:46 +0200492#define SG_ENT_VIRT_ADDRESS(SG) (sg_virt((SG)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493#define SG_ENT_PHYS_ADDRESS(SG) __pa(SG_ENT_VIRT_ADDRESS(SG))
494
495static void
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800496sg_classify(struct device *dev, struct scatterlist *sg, struct scatterlist *end,
497 int virt_ok)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498{
499 unsigned long next_paddr;
500 struct scatterlist *leader;
501 long leader_flag, leader_length;
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800502 unsigned int max_seg_size;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503
504 leader = sg;
505 leader_flag = 0;
506 leader_length = leader->length;
507 next_paddr = SG_ENT_PHYS_ADDRESS(leader) + leader_length;
508
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800509 /* we will not marge sg without device. */
510 max_seg_size = dev ? dma_get_max_seg_size(dev) : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 for (++sg; sg < end; ++sg) {
512 unsigned long addr, len;
513 addr = SG_ENT_PHYS_ADDRESS(sg);
514 len = sg->length;
515
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800516 if (leader_length + len > max_seg_size)
517 goto new_segment;
518
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 if (next_paddr == addr) {
520 sg->dma_address = -1;
521 leader_length += len;
522 } else if (((next_paddr | addr) & ~PAGE_MASK) == 0 && virt_ok) {
523 sg->dma_address = -2;
524 leader_flag = 1;
525 leader_length += len;
526 } else {
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800527new_segment:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 leader->dma_address = leader_flag;
529 leader->dma_length = leader_length;
530 leader = sg;
531 leader_flag = 0;
532 leader_length = len;
533 }
534
535 next_paddr = addr + len;
536 }
537
538 leader->dma_address = leader_flag;
539 leader->dma_length = leader_length;
540}
541
542/* Given a scatterlist leader, choose an allocation method and fill
543 in the blanks. */
544
545static int
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800546sg_fill(struct device *dev, struct scatterlist *leader, struct scatterlist *end,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 struct scatterlist *out, struct pci_iommu_arena *arena,
548 dma_addr_t max_dma, int dac_allowed)
549{
550 unsigned long paddr = SG_ENT_PHYS_ADDRESS(leader);
551 long size = leader->dma_length;
552 struct scatterlist *sg;
553 unsigned long *ptes;
554 long npages, dma_ofs, i;
555
556#if !DEBUG_NODIRECT
557 /* If everything is physically contiguous, and the addresses
558 fall into the direct-map window, use it. */
559 if (leader->dma_address == 0
560 && paddr + size + __direct_map_base - 1 <= max_dma
561 && paddr + size <= __direct_map_size) {
562 out->dma_address = paddr + __direct_map_base;
563 out->dma_length = size;
564
565 DBGA(" sg_fill: [%p,%lx] -> direct %lx\n",
566 __va(paddr), size, out->dma_address);
567
568 return 0;
569 }
570#endif
571
572 /* If physically contiguous and DAC is available, use it. */
573 if (leader->dma_address == 0 && dac_allowed) {
574 out->dma_address = paddr + alpha_mv.pci_dac_offset;
575 out->dma_length = size;
576
577 DBGA(" sg_fill: [%p,%lx] -> DAC %lx\n",
578 __va(paddr), size, out->dma_address);
579
580 return 0;
581 }
582
583 /* Otherwise, we'll use the iommu to make the pages virtually
584 contiguous. */
585
586 paddr &= ~PAGE_MASK;
587 npages = calc_npages(paddr + size);
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800588 dma_ofs = iommu_arena_alloc(dev, arena, npages, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 if (dma_ofs < 0) {
590 /* If we attempted a direct map above but failed, die. */
591 if (leader->dma_address == 0)
592 return -1;
593
594 /* Otherwise, break up the remaining virtually contiguous
595 hunks into individual direct maps and retry. */
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800596 sg_classify(dev, leader, end, 0);
597 return sg_fill(dev, leader, end, out, arena, max_dma, dac_allowed);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 }
599
600 out->dma_address = arena->dma_base + dma_ofs*PAGE_SIZE + paddr;
601 out->dma_length = size;
602
603 DBGA(" sg_fill: [%p,%lx] -> sg %lx np %ld\n",
604 __va(paddr), size, out->dma_address, npages);
605
606 /* All virtually contiguous. We need to find the length of each
607 physically contiguous subsegment to fill in the ptes. */
608 ptes = &arena->ptes[dma_ofs];
609 sg = leader;
610 do {
611#if DEBUG_ALLOC > 0
612 struct scatterlist *last_sg = sg;
613#endif
614
615 size = sg->length;
616 paddr = SG_ENT_PHYS_ADDRESS(sg);
617
618 while (sg+1 < end && (int) sg[1].dma_address == -1) {
619 size += sg[1].length;
620 sg++;
621 }
622
623 npages = calc_npages((paddr & ~PAGE_MASK) + size);
624
625 paddr &= PAGE_MASK;
626 for (i = 0; i < npages; ++i, paddr += PAGE_SIZE)
627 *ptes++ = mk_iommu_pte(paddr);
628
629#if DEBUG_ALLOC > 0
630 DBGA(" (%ld) [%p,%x] np %ld\n",
631 last_sg - leader, SG_ENT_VIRT_ADDRESS(last_sg),
632 last_sg->length, npages);
633 while (++last_sg <= sg) {
634 DBGA(" (%ld) [%p,%x] cont\n",
635 last_sg - leader, SG_ENT_VIRT_ADDRESS(last_sg),
636 last_sg->length);
637 }
638#endif
639 } while (++sg < end && (int) sg->dma_address < 0);
640
641 return 1;
642}
643
644int
645pci_map_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents,
646 int direction)
647{
648 struct scatterlist *start, *end, *out;
649 struct pci_controller *hose;
650 struct pci_iommu_arena *arena;
651 dma_addr_t max_dma;
652 int dac_allowed;
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800653 struct device *dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654
655 if (direction == PCI_DMA_NONE)
656 BUG();
657
658 dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
659
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800660 dev = pdev ? &pdev->dev : NULL;
661
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 /* Fast path single entry scatterlists. */
663 if (nents == 1) {
664 sg->dma_length = sg->length;
665 sg->dma_address
666 = pci_map_single_1(pdev, SG_ENT_VIRT_ADDRESS(sg),
667 sg->length, dac_allowed);
668 return sg->dma_address != 0;
669 }
670
671 start = sg;
672 end = sg + nents;
673
674 /* First, prepare information about the entries. */
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800675 sg_classify(dev, sg, end, alpha_mv.mv_pci_tbi != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
677 /* Second, figure out where we're going to map things. */
678 if (alpha_mv.mv_pci_tbi) {
679 hose = pdev ? pdev->sysdata : pci_isa_hose;
680 max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
681 arena = hose->sg_pci;
682 if (!arena || arena->dma_base + arena->size - 1 > max_dma)
683 arena = hose->sg_isa;
684 } else {
685 max_dma = -1;
686 arena = NULL;
687 hose = NULL;
688 }
689
690 /* Third, iterate over the scatterlist leaders and allocate
691 dma space as needed. */
692 for (out = sg; sg < end; ++sg) {
693 if ((int) sg->dma_address < 0)
694 continue;
FUJITA Tomonori7c536642008-02-04 22:27:58 -0800695 if (sg_fill(dev, sg, end, out, arena, max_dma, dac_allowed) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 goto error;
697 out++;
698 }
699
700 /* Mark the end of the list for pci_unmap_sg. */
701 if (out < end)
702 out->dma_length = 0;
703
704 if (out - start == 0)
705 printk(KERN_WARNING "pci_map_sg failed: no entries?\n");
706 DBGA("pci_map_sg: %ld entries\n", out - start);
707
708 return out - start;
709
710 error:
711 printk(KERN_WARNING "pci_map_sg failed: "
712 "could not allocate dma page tables\n");
713
714 /* Some allocation failed while mapping the scatterlist
715 entries. Unmap them now. */
716 if (out > start)
717 pci_unmap_sg(pdev, start, out - start, direction);
718 return 0;
719}
Al Virocff52da2006-10-11 17:40:22 +0100720EXPORT_SYMBOL(pci_map_sg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721
722/* Unmap a set of streaming mode DMA translations. Again, cpu read
723 rules concerning calls here are the same as for pci_unmap_single()
724 above. */
725
726void
727pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents,
728 int direction)
729{
730 unsigned long flags;
731 struct pci_controller *hose;
732 struct pci_iommu_arena *arena;
733 struct scatterlist *end;
734 dma_addr_t max_dma;
735 dma_addr_t fbeg, fend;
736
737 if (direction == PCI_DMA_NONE)
738 BUG();
739
740 if (! alpha_mv.mv_pci_tbi)
741 return;
742
743 hose = pdev ? pdev->sysdata : pci_isa_hose;
744 max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
745 arena = hose->sg_pci;
746 if (!arena || arena->dma_base + arena->size - 1 > max_dma)
747 arena = hose->sg_isa;
748
749 fbeg = -1, fend = 0;
750
751 spin_lock_irqsave(&arena->lock, flags);
752
753 for (end = sg + nents; sg < end; ++sg) {
754 dma64_addr_t addr;
755 size_t size;
756 long npages, ofs;
757 dma_addr_t tend;
758
759 addr = sg->dma_address;
760 size = sg->dma_length;
761 if (!size)
762 break;
763
764 if (addr > 0xffffffff) {
765 /* It's a DAC address -- nothing to do. */
766 DBGA(" (%ld) DAC [%lx,%lx]\n",
767 sg - end + nents, addr, size);
768 continue;
769 }
770
771 if (addr >= __direct_map_base
772 && addr < __direct_map_base + __direct_map_size) {
773 /* Nothing to do. */
774 DBGA(" (%ld) direct [%lx,%lx]\n",
775 sg - end + nents, addr, size);
776 continue;
777 }
778
779 DBGA(" (%ld) sg [%lx,%lx]\n",
780 sg - end + nents, addr, size);
781
782 npages = calc_npages((addr & ~PAGE_MASK) + size);
783 ofs = (addr - arena->dma_base) >> PAGE_SHIFT;
784 iommu_arena_free(arena, ofs, npages);
785
786 tend = addr + size - 1;
787 if (fbeg > addr) fbeg = addr;
788 if (fend < tend) fend = tend;
789 }
790
791 /* If we're freeing ptes above the `next_entry' pointer (they
792 may have snuck back into the TLB since the last wrap flush),
793 we need to flush the TLB before reallocating the latter. */
794 if ((fend - arena->dma_base) >> PAGE_SHIFT >= arena->next_entry)
795 alpha_mv.mv_pci_tbi(hose, fbeg, fend);
796
797 spin_unlock_irqrestore(&arena->lock, flags);
798
799 DBGA("pci_unmap_sg: %ld entries\n", nents - (end - sg));
800}
Al Virocff52da2006-10-11 17:40:22 +0100801EXPORT_SYMBOL(pci_unmap_sg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802
803
804/* Return whether the given PCI device DMA address mask can be
805 supported properly. */
806
807int
808pci_dma_supported(struct pci_dev *pdev, u64 mask)
809{
810 struct pci_controller *hose;
811 struct pci_iommu_arena *arena;
812
813 /* If there exists a direct map, and the mask fits either
814 the entire direct mapped space or the total system memory as
815 shifted by the map base */
816 if (__direct_map_size != 0
817 && (__direct_map_base + __direct_map_size - 1 <= mask ||
818 __direct_map_base + (max_low_pfn << PAGE_SHIFT) - 1 <= mask))
819 return 1;
820
821 /* Check that we have a scatter-gather arena that fits. */
822 hose = pdev ? pdev->sysdata : pci_isa_hose;
823 arena = hose->sg_isa;
824 if (arena && arena->dma_base + arena->size - 1 <= mask)
825 return 1;
826 arena = hose->sg_pci;
827 if (arena && arena->dma_base + arena->size - 1 <= mask)
828 return 1;
829
830 /* As last resort try ZONE_DMA. */
831 if (!__direct_map_base && MAX_DMA_ADDRESS - IDENT_ADDR - 1 <= mask)
832 return 1;
833
834 return 0;
835}
Al Virocff52da2006-10-11 17:40:22 +0100836EXPORT_SYMBOL(pci_dma_supported);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837
838
839/*
840 * AGP GART extensions to the IOMMU
841 */
842int
843iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask)
844{
845 unsigned long flags;
846 unsigned long *ptes;
847 long i, p;
848
849 if (!arena) return -EINVAL;
850
851 spin_lock_irqsave(&arena->lock, flags);
852
853 /* Search for N empty ptes. */
854 ptes = arena->ptes;
FUJITA Tomonoricf540142008-03-04 14:28:57 -0800855 p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 if (p < 0) {
857 spin_unlock_irqrestore(&arena->lock, flags);
858 return -1;
859 }
860
861 /* Success. Mark them all reserved (ie not zero and invalid)
862 for the iommu tlb that could load them from under us.
863 They will be filled in with valid bits by _bind() */
864 for (i = 0; i < pg_count; ++i)
865 ptes[p+i] = IOMMU_RESERVED_PTE;
866
867 arena->next_entry = p + pg_count;
868 spin_unlock_irqrestore(&arena->lock, flags);
869
870 return p;
871}
872
873int
874iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count)
875{
876 unsigned long *ptes;
877 long i;
878
879 if (!arena) return -EINVAL;
880
881 ptes = arena->ptes;
882
883 /* Make sure they're all reserved first... */
884 for(i = pg_start; i < pg_start + pg_count; i++)
885 if (ptes[i] != IOMMU_RESERVED_PTE)
886 return -EBUSY;
887
888 iommu_arena_free(arena, pg_start, pg_count);
889 return 0;
890}
891
892int
893iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count,
894 unsigned long *physaddrs)
895{
896 unsigned long flags;
897 unsigned long *ptes;
898 long i, j;
899
900 if (!arena) return -EINVAL;
901
902 spin_lock_irqsave(&arena->lock, flags);
903
904 ptes = arena->ptes;
905
906 for(j = pg_start; j < pg_start + pg_count; j++) {
907 if (ptes[j] != IOMMU_RESERVED_PTE) {
908 spin_unlock_irqrestore(&arena->lock, flags);
909 return -EBUSY;
910 }
911 }
912
913 for(i = 0, j = pg_start; i < pg_count; i++, j++)
914 ptes[j] = mk_iommu_pte(physaddrs[i]);
915
916 spin_unlock_irqrestore(&arena->lock, flags);
917
918 return 0;
919}
920
921int
922iommu_unbind(struct pci_iommu_arena *arena, long pg_start, long pg_count)
923{
924 unsigned long *p;
925 long i;
926
927 if (!arena) return -EINVAL;
928
929 p = arena->ptes + pg_start;
930 for(i = 0; i < pg_count; i++)
931 p[i] = IOMMU_RESERVED_PTE;
932
933 return 0;
934}
935
936/* True if the machine supports DAC addressing, and DEV can
937 make use of it given MASK. */
938
Jan Beulichcaa51712007-07-09 11:55:51 -0700939static int
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940pci_dac_dma_supported(struct pci_dev *dev, u64 mask)
941{
942 dma64_addr_t dac_offset = alpha_mv.pci_dac_offset;
943 int ok = 1;
944
945 /* If this is not set, the machine doesn't support DAC at all. */
946 if (dac_offset == 0)
947 ok = 0;
948
949 /* The device has to be able to address our DAC bit. */
950 if ((dac_offset & dev->dma_mask) != dac_offset)
951 ok = 0;
952
953 /* If both conditions above are met, we are fine. */
954 DBGA("pci_dac_dma_supported %s from %p\n",
955 ok ? "yes" : "no", __builtin_return_address(0));
956
957 return ok;
958}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959
960/* Helper for generic DMA-mapping functions. */
961
962struct pci_dev *
963alpha_gendev_to_pci(struct device *dev)
964{
965 if (dev && dev->bus == &pci_bus_type)
966 return to_pci_dev(dev);
967
968 /* Assume that non-PCI devices asking for DMA are either ISA or EISA,
969 BUG() otherwise. */
970 BUG_ON(!isa_bridge);
971
972 /* Assume non-busmaster ISA DMA when dma_mask is not set (the ISA
973 bridge is bus master then). */
974 if (!dev || !dev->dma_mask || !*dev->dma_mask)
975 return isa_bridge;
976
977 /* For EISA bus masters, return isa_bridge (it might have smaller
978 dma_mask due to wiring limitations). */
979 if (*dev->dma_mask >= isa_bridge->dma_mask)
980 return isa_bridge;
981
982 /* This assumes ISA bus master with dma_mask 0xffffff. */
983 return NULL;
984}
Al Virocff52da2006-10-11 17:40:22 +0100985EXPORT_SYMBOL(alpha_gendev_to_pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986
987int
988dma_set_mask(struct device *dev, u64 mask)
989{
990 if (!dev->dma_mask ||
991 !pci_dma_supported(alpha_gendev_to_pci(dev), mask))
992 return -EIO;
993
994 *dev->dma_mask = mask;
995
996 return 0;
997}
Al Virocff52da2006-10-11 17:40:22 +0100998EXPORT_SYMBOL(dma_set_mask);