Commit | Line | Data |
---|---|---|
09b55412 CM |
1 | /* |
2 | * SWIOTLB-based DMA API implementation | |
3 | * | |
4 | * Copyright (C) 2012 ARM Ltd. | |
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | */ | |
19 | ||
20 | #include <linux/gfp.h> | |
21 | #include <linux/export.h> | |
22 | #include <linux/slab.h> | |
23 | #include <linux/dma-mapping.h> | |
24 | #include <linux/vmalloc.h> | |
25 | #include <linux/swiotlb.h> | |
26 | ||
27 | #include <asm/cacheflush.h> | |
28 | ||
29 | struct dma_map_ops *dma_ops; | |
30 | EXPORT_SYMBOL(dma_ops); | |
31 | ||
32 | static void *arm64_swiotlb_alloc_coherent(struct device *dev, size_t size, | |
33 | dma_addr_t *dma_handle, gfp_t flags, | |
34 | struct dma_attrs *attrs) | |
35 | { | |
36 | if (IS_ENABLED(CONFIG_ZONE_DMA32) && | |
37 | dev->coherent_dma_mask <= DMA_BIT_MASK(32)) | |
38 | flags |= GFP_DMA32; | |
39 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); | |
40 | } | |
41 | ||
42 | static void arm64_swiotlb_free_coherent(struct device *dev, size_t size, | |
43 | void *vaddr, dma_addr_t dma_handle, | |
44 | struct dma_attrs *attrs) | |
45 | { | |
46 | swiotlb_free_coherent(dev, size, vaddr, dma_handle); | |
47 | } | |
48 | ||
49 | static struct dma_map_ops arm64_swiotlb_dma_ops = { | |
50 | .alloc = arm64_swiotlb_alloc_coherent, | |
51 | .free = arm64_swiotlb_free_coherent, | |
52 | .map_page = swiotlb_map_page, | |
53 | .unmap_page = swiotlb_unmap_page, | |
54 | .map_sg = swiotlb_map_sg_attrs, | |
55 | .unmap_sg = swiotlb_unmap_sg_attrs, | |
56 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, | |
57 | .sync_single_for_device = swiotlb_sync_single_for_device, | |
58 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, | |
59 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | |
60 | .dma_supported = swiotlb_dma_supported, | |
61 | .mapping_error = swiotlb_dma_mapping_error, | |
62 | }; | |
63 | ||
27222a3d | 64 | void __init arm64_swiotlb_init(void) |
09b55412 CM |
65 | { |
66 | dma_ops = &arm64_swiotlb_dma_ops; | |
27222a3d | 67 | swiotlb_init(1); |
09b55412 CM |
68 | } |
69 | ||
70 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 | |
71 | ||
72 | static int __init dma_debug_do_init(void) | |
73 | { | |
74 | dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); | |
75 | return 0; | |
76 | } | |
77 | fs_initcall(dma_debug_do_init); |