23 #include <linux/export.h>
25 #include <linux/string.h>
28 #include <linux/types.h>
29 #include <linux/ctype.h>
35 #include <asm/scatterlist.h>
41 #define OFFSET(val,align) ((unsigned long) \
42 ( (val) & ( (align) - 1)))
44 #define SLABS_PER_PAGE (1 << (PAGE_SHIFT - IO_TLB_SHIFT))
51 #define IO_TLB_MIN_SLABS ((1<<20) >> IO_TLB_SHIFT)
60 static char *io_tlb_start, *io_tlb_end;
66 static unsigned long io_tlb_nslabs;
71 static unsigned long io_tlb_overflow = 32*1024;
73 static void *io_tlb_overflow_buffer;
79 static unsigned int *io_tlb_list;
80 static unsigned int io_tlb_index;
93 static int late_alloc;
96 setup_io_tlb_npages(
char *
str)
105 if (!
strcmp(str,
"force"))
110 __setup(
"swiotlb=", setup_io_tlb_npages);
115 return io_tlb_nslabs;
133 printk(
KERN_INFO "software IO TLB [mem %#010llx-%#010llx] (%luMB) mapped at [%p-%p]\n",
134 (
unsigned long long)pstart, (
unsigned long long)pend - 1,
135 bytes >> 20, io_tlb_start, io_tlb_end - 1);
144 io_tlb_nslabs = nslabs;
146 io_tlb_end = io_tlb_start +
bytes;
154 for (i = 0; i < io_tlb_nslabs; i++)
163 if (!io_tlb_overflow_buffer)
164 panic(
"Cannot allocate SWIOTLB overflow buffer!\n");
174 swiotlb_init_with_default_size(
size_t default_size,
int verbose)
178 if (!io_tlb_nslabs) {
190 panic(
"Cannot allocate SWIOTLB buffer");
198 swiotlb_init_with_default_size(64 * (1<<20), verbose);
209 unsigned long bytes, req_nslabs = io_tlb_nslabs;
213 if (!io_tlb_nslabs) {
221 order =
get_order(io_tlb_nslabs << IO_TLB_SHIFT);
234 io_tlb_nslabs = req_nslabs;
239 "for software IO TLB\n", (
PAGE_SIZE << order) >> 20);
244 free_pages((
unsigned long)io_tlb_start, order);
255 io_tlb_nslabs = nslabs;
257 io_tlb_end = io_tlb_start +
bytes;
259 memset(io_tlb_start, 0, bytes);
271 for (i = 0; i < io_tlb_nslabs; i++)
279 if (!io_tlb_orig_addr)
289 if (!io_tlb_overflow_buffer)
301 io_tlb_orig_addr =
NULL;
315 if (!io_tlb_overflow_buffer)
319 free_pages((
unsigned long)io_tlb_overflow_buffer,
326 get_order(io_tlb_nslabs << IO_TLB_SHIFT));
367 memcpy(dma_addr, buffer + offset, sz);
369 memcpy(buffer + offset, dma_addr, sz);
393 unsigned int nslots, stride,
index,
wrap;
396 unsigned long offset_slots;
397 unsigned long max_slots;
399 mask = dma_get_seg_boundary(hwdev);
401 tbl_dma_addr &=
mask;
409 ?
ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT
429 index =
ALIGN(io_tlb_index, stride);
430 if (index >= io_tlb_nslabs)
438 if (index >= io_tlb_nslabs)
449 if (io_tlb_list[index] >= nslots) {
452 for (i = index; i < (
int) (index + nslots); i++)
455 io_tlb_list[i] = ++count;
462 io_tlb_index = ((index + nslots) < io_tlb_nslabs
463 ? (index + nslots) : 0);
468 if (index >= io_tlb_nslabs)
470 }
while (index != wrap);
473 spin_unlock_irqrestore(&io_tlb_lock, flags);
476 spin_unlock_irqrestore(&io_tlb_lock, flags);
483 for (i = 0; i < nslots; i++)
484 io_tlb_orig_addr[index+i] = phys + (i << IO_TLB_SHIFT);
500 dma_addr_t start_dma_addr = swiotlb_virt_to_bus(hwdev, io_tlb_start);
514 int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT;
532 io_tlb_list[index + nslots] : 0);
537 for (i = index + nslots - 1; i >=
index; i--)
538 io_tlb_list[i] = ++count;
544 io_tlb_list[i] = ++count;
546 spin_unlock_irqrestore(&io_tlb_lock, flags);
555 int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT;
558 phys += ((
unsigned long)dma_addr & ((1 << IO_TLB_SHIFT) - 1));
592 if (ret && swiotlb_virt_to_bus(hwdev, ret) + size - 1 > dma_mask) {
611 dev_addr = swiotlb_virt_to_bus(hwdev, ret);
614 if (dev_addr + size - 1 > dma_mask) {
615 printk(
"hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n",
616 (
unsigned long long)dma_mask,
617 (
unsigned long long)dev_addr);
623 *dma_handle = dev_addr;
635 if (!is_swiotlb_buffer(paddr))
655 "device %s\n", size, dev ? dev_name(dev) :
"?");
657 if (size <= io_tlb_overflow || !do_panic)
661 panic(
"DMA: Random memory could be DMA accessed\n");
663 panic(
"DMA: Random memory could be DMA written\n");
665 panic(
"DMA: Random memory could be DMA read\n");
676 unsigned long offset,
size_t size,
696 map = map_single(dev, phys, size, dir);
698 swiotlb_full(dev, size, dir, 1);
699 map = io_tlb_overflow_buffer;
702 dev_addr = swiotlb_virt_to_bus(dev, map);
709 dev_addr = swiotlb_virt_to_bus(dev, io_tlb_overflow_buffer);
731 if (is_swiotlb_buffer(paddr)) {
752 unmap_single(hwdev, dev_addr, size, dir);
775 if (is_swiotlb_buffer(paddr)) {
791 swiotlb_sync_single(hwdev, dev_addr, size, dir,
SYNC_FOR_CPU);
839 swiotlb_full(hwdev, sg->
length, dir, 0);
842 sgl[0].dma_length = 0;
848 sg->dma_length = sg->
length;
876 unmap_single(hwdev, sg->
dma_address, sg->dma_length, dir);
906 sg->dma_length, dir, target);
928 return (dma_addr == swiotlb_virt_to_bus(hwdev, io_tlb_overflow_buffer));
941 return swiotlb_virt_to_bus(hwdev, io_tlb_end - 1) <=
mask;