Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | #ifndef _ASM_ARM_XEN_PAGE_H |
3 | #define _ASM_ARM_XEN_PAGE_H |
4 | |
5 | #include <asm/page.h> |
6 | |
7 | #include <linux/pfn.h> |
8 | #include <linux/types.h> |
9 | #include <linux/dma-mapping.h> |
10 | #include <linux/pgtable.h> |
11 | |
12 | #include <xen/xen.h> |
13 | #include <xen/interface/grant_table.h> |
14 | |
15 | #define phys_to_machine_mapping_valid(pfn) (1) |
16 | |
17 | /* Xen machine address */ |
18 | typedef struct xmaddr { |
19 | phys_addr_t maddr; |
20 | } xmaddr_t; |
21 | |
22 | /* Xen pseudo-physical address */ |
23 | typedef struct xpaddr { |
24 | phys_addr_t paddr; |
25 | } xpaddr_t; |
26 | |
27 | #define XMADDR(x) ((xmaddr_t) { .maddr = (x) }) |
28 | #define XPADDR(x) ((xpaddr_t) { .paddr = (x) }) |
29 | |
30 | #define INVALID_P2M_ENTRY (~0UL) |
31 | |
32 | /* |
33 | * The pseudo-physical frame (pfn) used in all the helpers is always based |
34 | * on Xen page granularity (i.e 4KB). |
35 | * |
36 | * A Linux page may be split across multiple non-contiguous Xen page so we |
37 | * have to keep track with frame based on 4KB page granularity. |
38 | * |
39 | * PV drivers should never make a direct usage of those helpers (particularly |
40 | * pfn_to_gfn and gfn_to_pfn). |
41 | */ |
42 | |
43 | unsigned long __pfn_to_mfn(unsigned long pfn); |
44 | extern struct rb_root phys_to_mach; |
45 | |
46 | /* Pseudo-physical <-> Guest conversion */ |
47 | static inline unsigned long pfn_to_gfn(unsigned long pfn) |
48 | { |
49 | return pfn; |
50 | } |
51 | |
52 | static inline unsigned long gfn_to_pfn(unsigned long gfn) |
53 | { |
54 | return gfn; |
55 | } |
56 | |
57 | /* Pseudo-physical <-> BUS conversion */ |
58 | static inline unsigned long pfn_to_bfn(unsigned long pfn) |
59 | { |
60 | unsigned long mfn; |
61 | |
62 | if (phys_to_mach.rb_node != NULL) { |
63 | mfn = __pfn_to_mfn(pfn); |
64 | if (mfn != INVALID_P2M_ENTRY) |
65 | return mfn; |
66 | } |
67 | |
68 | return pfn; |
69 | } |
70 | |
71 | static inline unsigned long bfn_to_pfn(unsigned long bfn) |
72 | { |
73 | return bfn; |
74 | } |
75 | |
76 | #define bfn_to_local_pfn(bfn) bfn_to_pfn(bfn) |
77 | |
78 | /* VIRT <-> GUEST conversion */ |
79 | #define virt_to_gfn(v) \ |
80 | ({ \ |
81 | WARN_ON_ONCE(!virt_addr_valid(v)); \ |
82 | pfn_to_gfn(virt_to_phys(v) >> XEN_PAGE_SHIFT); \ |
83 | }) |
84 | #define gfn_to_virt(m) (__va(gfn_to_pfn(m) << XEN_PAGE_SHIFT)) |
85 | |
86 | #define percpu_to_gfn(v) \ |
87 | (pfn_to_gfn(per_cpu_ptr_to_phys(v) >> XEN_PAGE_SHIFT)) |
88 | |
89 | /* Only used in PV code. But ARM guests are always HVM. */ |
90 | static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr) |
91 | { |
92 | BUG(); |
93 | } |
94 | |
95 | extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, |
96 | struct gnttab_map_grant_ref *kmap_ops, |
97 | struct page **pages, unsigned int count); |
98 | |
99 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, |
100 | struct gnttab_unmap_grant_ref *kunmap_ops, |
101 | struct page **pages, unsigned int count); |
102 | |
103 | bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); |
104 | bool __set_phys_to_machine_multi(unsigned long pfn, unsigned long mfn, |
105 | unsigned long nr_pages); |
106 | |
107 | static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) |
108 | { |
109 | return __set_phys_to_machine(pfn, mfn); |
110 | } |
111 | |
112 | bool xen_arch_need_swiotlb(struct device *dev, |
113 | phys_addr_t phys, |
114 | dma_addr_t dev_addr); |
115 | |
116 | #endif /* _ASM_ARM_XEN_PAGE_H */ |
117 |
Warning: This file is not a C or C++ file. It does not have highlighting.