Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/alpha/kernel/pci_iommu.c
10817 views
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
38
static inline unsigned long
39
mk_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
47
unsigned long
48
size_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
56
struct pci_iommu_arena * __init
57
iommu_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
111
struct pci_iommu_arena * __init
112
iommu_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 */
119
static long
120
iommu_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
143
again:
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
177
static long
178
iommu_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
209
static void
210
iommu_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
*/
224
static int pci_dac_dma_supported(struct pci_dev *dev, u64 mask)
225
{
226
dma_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
249
static dma_addr_t
250
pci_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. */
325
static 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
348
static 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
370
static 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
435
static 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
444
try_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
479
static 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
502
static void
503
sg_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 {
534
new_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
552
static int
553
sg_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
651
static 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
730
static 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
dma_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
810
static 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
*/
844
int
845
iommu_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
875
int
876
iommu_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
894
int
895
iommu_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
923
int
924
iommu_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
938
static int alpha_pci_mapping_error(struct device *dev, dma_addr_t dma_addr)
939
{
940
return dma_addr == 0;
941
}
942
943
static 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
953
struct 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
965
struct dma_map_ops *dma_ops = &alpha_pci_ops;
966
EXPORT_SYMBOL(dma_ops);
967
968