pci-swiotlb.c 2.1 KB
Newer Older
1 2 3 4 5
/* Glue code to lib/swiotlb.c */

#include <linux/pci.h>
#include <linux/cache.h>
#include <linux/module.h>
6 7
#include <linux/swiotlb.h>
#include <linux/bootmem.h>
8 9
#include <linux/dma-mapping.h>

10
#include <asm/iommu.h>
11 12 13 14 15
#include <asm/swiotlb.h>
#include <asm/dma.h>

int swiotlb __read_mostly;

16
void * __init swiotlb_alloc_boot(size_t size, unsigned long nslabs)
17 18 19 20 21 22 23 24 25
{
	return alloc_bootmem_low_pages(size);
}

void *swiotlb_alloc(unsigned order, unsigned long nslabs)
{
	return (void *)__get_free_pages(GFP_DMA | __GFP_NOWARN, order);
}

26
dma_addr_t swiotlb_phys_to_bus(struct device *hwdev, phys_addr_t paddr)
27 28 29 30 31 32 33 34 35
{
	return paddr;
}

phys_addr_t swiotlb_bus_to_phys(dma_addr_t baddr)
{
	return baddr;
}

36
int __weak swiotlb_arch_range_needs_mapping(phys_addr_t paddr, size_t size)
37 38 39 40
{
	return 0;
}

41 42 43 44 45 46 47 48 49 50 51 52
static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
					dma_addr_t *dma_handle, gfp_t flags)
{
	void *vaddr;

	vaddr = dma_generic_alloc_coherent(hwdev, size, dma_handle, flags);
	if (vaddr)
		return vaddr;

	return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags);
}

53
static struct dma_map_ops swiotlb_dma_ops = {
54
	.mapping_error = swiotlb_dma_mapping_error,
55
	.alloc_coherent = x86_swiotlb_alloc_coherent,
56 57 58 59 60 61 62
	.free_coherent = swiotlb_free_coherent,
	.sync_single_for_cpu = swiotlb_sync_single_for_cpu,
	.sync_single_for_device = swiotlb_sync_single_for_device,
	.sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu,
	.sync_single_range_for_device = swiotlb_sync_single_range_for_device,
	.sync_sg_for_cpu = swiotlb_sync_sg_for_cpu,
	.sync_sg_for_device = swiotlb_sync_sg_for_device,
63 64
	.map_sg = swiotlb_map_sg_attrs,
	.unmap_sg = swiotlb_unmap_sg_attrs,
65 66
	.map_page = swiotlb_map_page,
	.unmap_page = swiotlb_unmap_page,
67 68 69
	.dma_supported = NULL,
};

J
Jan Beulich 已提交
70
void __init pci_swiotlb_init(void)
71 72
{
	/* don't initialize swiotlb if iommu=off (no_iommu=1) */
73
#ifdef CONFIG_X86_64
Y
Yinghai Lu 已提交
74
	if (!iommu_detected && !no_iommu && max_pfn > MAX_DMA32_PFN)
75
	       swiotlb = 1;
76
#endif
A
Andi Kleen 已提交
77 78
	if (swiotlb_force)
		swiotlb = 1;
79 80
	if (swiotlb) {
		printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n");
J
Jon Mason 已提交
81
		swiotlb_init();
82 83 84
		dma_ops = &swiotlb_dma_ops;
	}
}