Commit | Line | Data |
---|---|---|
62fdd767 FY |
1 | /* Glue code to lib/swiotlb.c */ |
2 | ||
3 | #include <linux/pci.h> | |
5a0e3ad6 | 4 | #include <linux/gfp.h> |
62fdd767 FY |
5 | #include <linux/cache.h> |
6 | #include <linux/module.h> | |
7 | #include <linux/dma-mapping.h> | |
8 | ||
9 | #include <asm/swiotlb.h> | |
10 | #include <asm/dma.h> | |
11 | #include <asm/iommu.h> | |
12 | #include <asm/machvec.h> | |
13 | ||
14 | int swiotlb __read_mostly; | |
15 | EXPORT_SYMBOL(swiotlb); | |
16 | ||
97d9800d | 17 | static void *ia64_swiotlb_alloc_coherent(struct device *dev, size_t size, |
baa676fc AP |
18 | dma_addr_t *dma_handle, gfp_t gfp, |
19 | struct dma_attrs *attrs) | |
97d9800d | 20 | { |
e930438c | 21 | if (dev->coherent_dma_mask != DMA_BIT_MASK(64)) |
97d9800d FT |
22 | gfp |= GFP_DMA; |
23 | return swiotlb_alloc_coherent(dev, size, dma_handle, gfp); | |
24 | } | |
25 | ||
baa676fc AP |
26 | static void ia64_swiotlb_free_coherent(struct device *dev, size_t size, |
27 | void *vaddr, dma_addr_t dma_addr, | |
28 | struct dma_attrs *attrs) | |
29 | { | |
30 | swiotlb_free_coherent(dev, size, vaddr, dma_addr); | |
31 | } | |
32 | ||
160c1d8e | 33 | struct dma_map_ops swiotlb_dma_ops = { |
baa676fc AP |
34 | .alloc = ia64_swiotlb_alloc_coherent, |
35 | .free = ia64_swiotlb_free_coherent, | |
160c1d8e FT |
36 | .map_page = swiotlb_map_page, |
37 | .unmap_page = swiotlb_unmap_page, | |
38 | .map_sg = swiotlb_map_sg_attrs, | |
39 | .unmap_sg = swiotlb_unmap_sg_attrs, | |
62fdd767 FY |
40 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
41 | .sync_single_for_device = swiotlb_sync_single_for_device, | |
62fdd767 FY |
42 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
43 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | |
160c1d8e | 44 | .dma_supported = swiotlb_dma_supported, |
c82e4417 | 45 | .mapping_error = swiotlb_dma_mapping_error, |
62fdd767 FY |
46 | }; |
47 | ||
07716e4d | 48 | void __init swiotlb_dma_init(void) |
4d9b977c FT |
49 | { |
50 | dma_ops = &swiotlb_dma_ops; | |
ad32e8cb | 51 | swiotlb_init(1); |
4d9b977c FT |
52 | } |
53 | ||
62fdd767 FY |
54 | void __init pci_swiotlb_init(void) |
55 | { | |
ba6c5487 | 56 | if (!iommu_detected) { |
62fdd767 FY |
57 | #ifdef CONFIG_IA64_GENERIC |
58 | swiotlb = 1; | |
59 | printk(KERN_INFO "PCI-DMA: Re-initialize machine vector.\n"); | |
60 | machvec_init("dig"); | |
ad32e8cb | 61 | swiotlb_init(1); |
62fdd767 FY |
62 | dma_ops = &swiotlb_dma_ops; |
63 | #else | |
64 | panic("Unable to find Intel IOMMU"); | |
65 | #endif | |
66 | } | |
67 | } |