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