diff options
Diffstat (limited to 'arch/arm64')
-rw-r--r-- | arch/arm64/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm64/include/asm/dma-mapping.h | 14 | ||||
-rw-r--r-- | arch/arm64/include/asm/io.h | 10 | ||||
-rw-r--r-- | arch/arm64/include/asm/xen/page-coherent.h | 47 | ||||
-rw-r--r-- | arch/arm64/xen/Makefile | 2 |
5 files changed, 72 insertions, 2 deletions
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 9714fe0403b7..88c8b6c1341a 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig | |||
@@ -220,6 +220,7 @@ config XEN_DOM0 | |||
220 | config XEN | 220 | config XEN |
221 | bool "Xen guest support on ARM64 (EXPERIMENTAL)" | 221 | bool "Xen guest support on ARM64 (EXPERIMENTAL)" |
222 | depends on ARM64 && OF | 222 | depends on ARM64 && OF |
223 | select SWIOTLB_XEN | ||
223 | help | 224 | help |
224 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM64. | 225 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM64. |
225 | 226 | ||
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h index 8d1810001aef..fd0c0c0e447a 100644 --- a/arch/arm64/include/asm/dma-mapping.h +++ b/arch/arm64/include/asm/dma-mapping.h | |||
@@ -23,11 +23,15 @@ | |||
23 | 23 | ||
24 | #include <asm-generic/dma-coherent.h> | 24 | #include <asm-generic/dma-coherent.h> |
25 | 25 | ||
26 | #include <xen/xen.h> | ||
27 | #include <asm/xen/hypervisor.h> | ||
28 | |||
26 | #define ARCH_HAS_DMA_GET_REQUIRED_MASK | 29 | #define ARCH_HAS_DMA_GET_REQUIRED_MASK |
27 | 30 | ||
31 | #define DMA_ERROR_CODE (~(dma_addr_t)0) | ||
28 | extern struct dma_map_ops *dma_ops; | 32 | extern struct dma_map_ops *dma_ops; |
29 | 33 | ||
30 | static inline struct dma_map_ops *get_dma_ops(struct device *dev) | 34 | static inline struct dma_map_ops *__generic_dma_ops(struct device *dev) |
31 | { | 35 | { |
32 | if (unlikely(!dev) || !dev->archdata.dma_ops) | 36 | if (unlikely(!dev) || !dev->archdata.dma_ops) |
33 | return dma_ops; | 37 | return dma_ops; |
@@ -35,6 +39,14 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev) | |||
35 | return dev->archdata.dma_ops; | 39 | return dev->archdata.dma_ops; |
36 | } | 40 | } |
37 | 41 | ||
42 | static inline struct dma_map_ops *get_dma_ops(struct device *dev) | ||
43 | { | ||
44 | if (xen_initial_domain()) | ||
45 | return xen_dma_ops; | ||
46 | else | ||
47 | return __generic_dma_ops(dev); | ||
48 | } | ||
49 | |||
38 | #include <asm-generic/dma-mapping-common.h> | 50 | #include <asm-generic/dma-mapping-common.h> |
39 | 51 | ||
40 | static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) | 52 | static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) |
diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index b56e5b5df881..4cc813eddacb 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h | |||
@@ -22,11 +22,14 @@ | |||
22 | #ifdef __KERNEL__ | 22 | #ifdef __KERNEL__ |
23 | 23 | ||
24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
25 | #include <linux/blk_types.h> | ||
25 | 26 | ||
26 | #include <asm/byteorder.h> | 27 | #include <asm/byteorder.h> |
27 | #include <asm/barrier.h> | 28 | #include <asm/barrier.h> |
28 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable.h> |
29 | 30 | ||
31 | #include <xen/xen.h> | ||
32 | |||
30 | /* | 33 | /* |
31 | * Generic IO read/write. These perform native-endian accesses. | 34 | * Generic IO read/write. These perform native-endian accesses. |
32 | */ | 35 | */ |
@@ -263,5 +266,12 @@ extern int devmem_is_allowed(unsigned long pfn); | |||
263 | */ | 266 | */ |
264 | #define xlate_dev_kmem_ptr(p) p | 267 | #define xlate_dev_kmem_ptr(p) p |
265 | 268 | ||
269 | struct bio_vec; | ||
270 | extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, | ||
271 | const struct bio_vec *vec2); | ||
272 | #define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ | ||
273 | (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) && \ | ||
274 | (!xen_domain() || xen_biovec_phys_mergeable(vec1, vec2))) | ||
275 | |||
266 | #endif /* __KERNEL__ */ | 276 | #endif /* __KERNEL__ */ |
267 | #endif /* __ASM_IO_H */ | 277 | #endif /* __ASM_IO_H */ |
diff --git a/arch/arm64/include/asm/xen/page-coherent.h b/arch/arm64/include/asm/xen/page-coherent.h new file mode 100644 index 000000000000..2820f1a6eebe --- /dev/null +++ b/arch/arm64/include/asm/xen/page-coherent.h | |||
@@ -0,0 +1,47 @@ | |||
1 | #ifndef _ASM_ARM64_XEN_PAGE_COHERENT_H | ||
2 | #define _ASM_ARM64_XEN_PAGE_COHERENT_H | ||
3 | |||
4 | #include <asm/page.h> | ||
5 | #include <linux/dma-attrs.h> | ||
6 | #include <linux/dma-mapping.h> | ||
7 | |||
8 | static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
9 | dma_addr_t *dma_handle, gfp_t flags, | ||
10 | struct dma_attrs *attrs) | ||
11 | { | ||
12 | return __generic_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs); | ||
13 | } | ||
14 | |||
15 | static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
16 | void *cpu_addr, dma_addr_t dma_handle, | ||
17 | struct dma_attrs *attrs) | ||
18 | { | ||
19 | __generic_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs); | ||
20 | } | ||
21 | |||
22 | static inline void xen_dma_map_page(struct device *hwdev, struct page *page, | ||
23 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
24 | struct dma_attrs *attrs) | ||
25 | { | ||
26 | __generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs); | ||
27 | } | ||
28 | |||
29 | static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, | ||
30 | size_t size, enum dma_data_direction dir, | ||
31 | struct dma_attrs *attrs) | ||
32 | { | ||
33 | __generic_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs); | ||
34 | } | ||
35 | |||
36 | static inline void xen_dma_sync_single_for_cpu(struct device *hwdev, | ||
37 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
38 | { | ||
39 | __generic_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir); | ||
40 | } | ||
41 | |||
42 | static inline void xen_dma_sync_single_for_device(struct device *hwdev, | ||
43 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
44 | { | ||
45 | __generic_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir); | ||
46 | } | ||
47 | #endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */ | ||
diff --git a/arch/arm64/xen/Makefile b/arch/arm64/xen/Makefile index be240404ba96..74a8d87e542b 100644 --- a/arch/arm64/xen/Makefile +++ b/arch/arm64/xen/Makefile | |||
@@ -1,2 +1,2 @@ | |||
1 | xen-arm-y += $(addprefix ../../arm/xen/, enlighten.o grant-table.o) | 1 | xen-arm-y += $(addprefix ../../arm/xen/, enlighten.o grant-table.o p2m.o mm.o) |
2 | obj-y := xen-arm.o hypercall.o | 2 | obj-y := xen-arm.o hypercall.o |