This source file includes following definitions.
- io_pgtable_tlb_flush_all
- io_pgtable_tlb_flush_walk
- io_pgtable_tlb_flush_leaf
- io_pgtable_tlb_add_page
1
2 #ifndef __IO_PGTABLE_H
3 #define __IO_PGTABLE_H
4
5 #include <linux/bitops.h>
6 #include <linux/iommu.h>
7
8
9
10
11 enum io_pgtable_fmt {
12 ARM_32_LPAE_S1,
13 ARM_32_LPAE_S2,
14 ARM_64_LPAE_S1,
15 ARM_64_LPAE_S2,
16 ARM_V7S,
17 ARM_MALI_LPAE,
18 IO_PGTABLE_NUM_FMTS,
19 };
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 struct iommu_flush_ops {
40 void (*tlb_flush_all)(void *cookie);
41 void (*tlb_flush_walk)(unsigned long iova, size_t size, size_t granule,
42 void *cookie);
43 void (*tlb_flush_leaf)(unsigned long iova, size_t size, size_t granule,
44 void *cookie);
45 void (*tlb_add_page)(struct iommu_iotlb_gather *gather,
46 unsigned long iova, size_t granule, void *cookie);
47 };
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 struct io_pgtable_cfg {
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 #define IO_PGTABLE_QUIRK_ARM_NS BIT(0)
88 #define IO_PGTABLE_QUIRK_NO_PERMS BIT(1)
89 #define IO_PGTABLE_QUIRK_TLBI_ON_MAP BIT(2)
90 #define IO_PGTABLE_QUIRK_ARM_MTK_EXT BIT(3)
91 #define IO_PGTABLE_QUIRK_NON_STRICT BIT(4)
92 unsigned long quirks;
93 unsigned long pgsize_bitmap;
94 unsigned int ias;
95 unsigned int oas;
96 bool coherent_walk;
97 const struct iommu_flush_ops *tlb;
98 struct device *iommu_dev;
99
100
101 union {
102 struct {
103 u64 ttbr[2];
104 u64 tcr;
105 u64 mair[2];
106 } arm_lpae_s1_cfg;
107
108 struct {
109 u64 vttbr;
110 u64 vtcr;
111 } arm_lpae_s2_cfg;
112
113 struct {
114 u32 ttbr[2];
115 u32 tcr;
116 u32 nmrr;
117 u32 prrr;
118 } arm_v7s_cfg;
119
120 struct {
121 u64 transtab;
122 u64 memattr;
123 } arm_mali_lpae_cfg;
124 };
125 };
126
127
128
129
130
131
132
133
134
135
136
137 struct io_pgtable_ops {
138 int (*map)(struct io_pgtable_ops *ops, unsigned long iova,
139 phys_addr_t paddr, size_t size, int prot);
140 size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova,
141 size_t size, struct iommu_iotlb_gather *gather);
142 phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
143 unsigned long iova);
144 };
145
146
147
148
149
150
151
152
153
154
155
156 struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt,
157 struct io_pgtable_cfg *cfg,
158 void *cookie);
159
160
161
162
163
164
165
166
167 void free_io_pgtable_ops(struct io_pgtable_ops *ops);
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 struct io_pgtable {
184 enum io_pgtable_fmt fmt;
185 void *cookie;
186 struct io_pgtable_cfg cfg;
187 struct io_pgtable_ops ops;
188 };
189
190 #define io_pgtable_ops_to_pgtable(x) container_of((x), struct io_pgtable, ops)
191
192 static inline void io_pgtable_tlb_flush_all(struct io_pgtable *iop)
193 {
194 iop->cfg.tlb->tlb_flush_all(iop->cookie);
195 }
196
197 static inline void
198 io_pgtable_tlb_flush_walk(struct io_pgtable *iop, unsigned long iova,
199 size_t size, size_t granule)
200 {
201 iop->cfg.tlb->tlb_flush_walk(iova, size, granule, iop->cookie);
202 }
203
204 static inline void
205 io_pgtable_tlb_flush_leaf(struct io_pgtable *iop, unsigned long iova,
206 size_t size, size_t granule)
207 {
208 iop->cfg.tlb->tlb_flush_leaf(iova, size, granule, iop->cookie);
209 }
210
211 static inline void
212 io_pgtable_tlb_add_page(struct io_pgtable *iop,
213 struct iommu_iotlb_gather * gather, unsigned long iova,
214 size_t granule)
215 {
216 if (iop->cfg.tlb->tlb_add_page)
217 iop->cfg.tlb->tlb_add_page(gather, iova, granule, iop->cookie);
218 }
219
220
221
222
223
224
225
226
227 struct io_pgtable_init_fns {
228 struct io_pgtable *(*alloc)(struct io_pgtable_cfg *cfg, void *cookie);
229 void (*free)(struct io_pgtable *iop);
230 };
231
232 extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s1_init_fns;
233 extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns;
234 extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns;
235 extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns;
236 extern struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns;
237 extern struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns;
238
239 #endif