1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef __LINUX_IOMMU_H
20#define __LINUX_IOMMU_H
21
22#include <linux/errno.h>
23#include <linux/err.h>
24#include <linux/of.h>
25#include <linux/types.h>
26#include <linux/scatterlist.h>
27#include <trace/events/iommu.h>
28
29#define IOMMU_READ (1 << 0)
30#define IOMMU_WRITE (1 << 1)
31#define IOMMU_CACHE (1 << 2)
32#define IOMMU_NOEXEC (1 << 3)
33#define IOMMU_MMIO (1 << 4)
34
35struct iommu_ops;
36struct iommu_group;
37struct bus_type;
38struct device;
39struct iommu_domain;
40struct notifier_block;
41
42
43#define IOMMU_FAULT_READ 0x0
44#define IOMMU_FAULT_WRITE 0x1
45
46typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
47 struct device *, unsigned long, int, void *);
48
49struct iommu_domain_geometry {
50 dma_addr_t aperture_start;
51 dma_addr_t aperture_end;
52 bool force_aperture;
53};
54
55
56#define __IOMMU_DOMAIN_PAGING (1U << 0)
57#define __IOMMU_DOMAIN_DMA_API (1U << 1)
58
59#define __IOMMU_DOMAIN_PT (1U << 2)
60
61
62
63
64
65
66
67
68
69
70
71
72
73#define IOMMU_DOMAIN_BLOCKED (0U)
74#define IOMMU_DOMAIN_IDENTITY (__IOMMU_DOMAIN_PT)
75#define IOMMU_DOMAIN_UNMANAGED (__IOMMU_DOMAIN_PAGING)
76#define IOMMU_DOMAIN_DMA (__IOMMU_DOMAIN_PAGING | \
77 __IOMMU_DOMAIN_DMA_API)
78
79struct iommu_domain {
80 unsigned type;
81 const struct iommu_ops *ops;
82 unsigned long pgsize_bitmap;
83 iommu_fault_handler_t handler;
84 void *handler_token;
85 struct iommu_domain_geometry geometry;
86 void *iova_cookie;
87};
88
89enum iommu_cap {
90 IOMMU_CAP_CACHE_COHERENCY,
91
92 IOMMU_CAP_INTR_REMAP,
93 IOMMU_CAP_NOEXEC,
94};
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109enum iommu_attr {
110 DOMAIN_ATTR_GEOMETRY,
111 DOMAIN_ATTR_PAGING,
112 DOMAIN_ATTR_WINDOWS,
113 DOMAIN_ATTR_FSL_PAMU_STASH,
114 DOMAIN_ATTR_FSL_PAMU_ENABLE,
115 DOMAIN_ATTR_FSL_PAMUV1,
116 DOMAIN_ATTR_NESTING,
117 DOMAIN_ATTR_MAX,
118};
119
120
121
122
123
124
125
126
127struct iommu_dm_region {
128 struct list_head list;
129 phys_addr_t start;
130 size_t length;
131 int prot;
132};
133
134#ifdef CONFIG_IOMMU_API
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163struct iommu_ops {
164 bool (*capable)(enum iommu_cap);
165
166
167 struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
168 void (*domain_free)(struct iommu_domain *);
169
170 int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
171 void (*detach_dev)(struct iommu_domain *domain, struct device *dev);
172 int (*map)(struct iommu_domain *domain, unsigned long iova,
173 phys_addr_t paddr, size_t size, int prot);
174 size_t (*unmap)(struct iommu_domain *domain, unsigned long iova,
175 size_t size);
176 size_t (*map_sg)(struct iommu_domain *domain, unsigned long iova,
177 struct scatterlist *sg, unsigned int nents, int prot);
178 phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
179 int (*add_device)(struct device *dev);
180 void (*remove_device)(struct device *dev);
181 struct iommu_group *(*device_group)(struct device *dev);
182 int (*domain_get_attr)(struct iommu_domain *domain,
183 enum iommu_attr attr, void *data);
184 int (*domain_set_attr)(struct iommu_domain *domain,
185 enum iommu_attr attr, void *data);
186
187
188 void (*get_dm_regions)(struct device *dev, struct list_head *list);
189 void (*put_dm_regions)(struct device *dev, struct list_head *list);
190 void (*apply_dm_region)(struct device *dev, struct iommu_domain *domain,
191 struct iommu_dm_region *region);
192
193
194 int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
195 phys_addr_t paddr, u64 size, int prot);
196 void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
197
198 int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count);
199
200 u32 (*domain_get_windows)(struct iommu_domain *domain);
201
202 int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
203
204 unsigned long pgsize_bitmap;
205};
206
207#define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1
208#define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2
209#define IOMMU_GROUP_NOTIFY_BIND_DRIVER 3
210#define IOMMU_GROUP_NOTIFY_BOUND_DRIVER 4
211#define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER 5
212#define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER 6
213
214extern int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops);
215extern bool iommu_present(struct bus_type *bus);
216extern bool iommu_capable(struct bus_type *bus, enum iommu_cap cap);
217extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
218extern struct iommu_group *iommu_group_get_by_id(int id);
219extern void iommu_domain_free(struct iommu_domain *domain);
220extern int iommu_attach_device(struct iommu_domain *domain,
221 struct device *dev);
222extern void iommu_detach_device(struct iommu_domain *domain,
223 struct device *dev);
224extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev);
225extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
226 phys_addr_t paddr, size_t size, int prot);
227extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
228 size_t size);
229extern size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
230 struct scatterlist *sg,unsigned int nents,
231 int prot);
232extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova);
233extern void iommu_set_fault_handler(struct iommu_domain *domain,
234 iommu_fault_handler_t handler, void *token);
235
236extern void iommu_get_dm_regions(struct device *dev, struct list_head *list);
237extern void iommu_put_dm_regions(struct device *dev, struct list_head *list);
238extern int iommu_request_dm_for_dev(struct device *dev);
239
240extern int iommu_attach_group(struct iommu_domain *domain,
241 struct iommu_group *group);
242extern void iommu_detach_group(struct iommu_domain *domain,
243 struct iommu_group *group);
244extern struct iommu_group *iommu_group_alloc(void);
245extern void *iommu_group_get_iommudata(struct iommu_group *group);
246extern void iommu_group_set_iommudata(struct iommu_group *group,
247 void *iommu_data,
248 void (*release)(void *iommu_data));
249extern int iommu_group_set_name(struct iommu_group *group, const char *name);
250extern int iommu_group_add_device(struct iommu_group *group,
251 struct device *dev);
252extern void iommu_group_remove_device(struct device *dev);
253extern int iommu_group_for_each_dev(struct iommu_group *group, void *data,
254 int (*fn)(struct device *, void *));
255extern struct iommu_group *iommu_group_get(struct device *dev);
256extern void iommu_group_put(struct iommu_group *group);
257extern int iommu_group_register_notifier(struct iommu_group *group,
258 struct notifier_block *nb);
259extern int iommu_group_unregister_notifier(struct iommu_group *group,
260 struct notifier_block *nb);
261extern int iommu_group_id(struct iommu_group *group);
262extern struct iommu_group *iommu_group_get_for_dev(struct device *dev);
263extern struct iommu_domain *iommu_group_default_domain(struct iommu_group *);
264
265extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,
266 void *data);
267extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,
268 void *data);
269struct device *iommu_device_create(struct device *parent, void *drvdata,
270 const struct attribute_group **groups,
271 const char *fmt, ...) __printf(4, 5);
272void iommu_device_destroy(struct device *dev);
273int iommu_device_link(struct device *dev, struct device *link);
274void iommu_device_unlink(struct device *dev, struct device *link);
275
276
277extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr,
278 phys_addr_t offset, u64 size,
279 int prot);
280extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr);
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305static inline int report_iommu_fault(struct iommu_domain *domain,
306 struct device *dev, unsigned long iova, int flags)
307{
308 int ret = -ENOSYS;
309
310
311
312
313
314 if (domain->handler)
315 ret = domain->handler(domain, dev, iova, flags,
316 domain->handler_token);
317
318 trace_io_page_fault(dev, iova, flags);
319 return ret;
320}
321
322static inline size_t iommu_map_sg(struct iommu_domain *domain,
323 unsigned long iova, struct scatterlist *sg,
324 unsigned int nents, int prot)
325{
326 return domain->ops->map_sg(domain, iova, sg, nents, prot);
327}
328
329
330extern struct iommu_group *pci_device_group(struct device *dev);
331
332extern struct iommu_group *generic_device_group(struct device *dev);
333
334
335
336
337
338
339
340
341
342struct iommu_fwspec {
343 const struct iommu_ops *ops;
344 struct fwnode_handle *iommu_fwnode;
345 void *iommu_priv;
346 unsigned int num_ids;
347 u32 ids[1];
348};
349
350int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
351 const struct iommu_ops *ops);
352void iommu_fwspec_free(struct device *dev);
353int iommu_fwspec_add_ids(struct device *dev, u32 *ids, int num_ids);
354
355#else
356
357struct iommu_ops {};
358struct iommu_group {};
359struct iommu_fwspec {};
360
361static inline bool iommu_present(struct bus_type *bus)
362{
363 return false;
364}
365
366static inline bool iommu_capable(struct bus_type *bus, enum iommu_cap cap)
367{
368 return false;
369}
370
371static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
372{
373 return NULL;
374}
375
376static inline struct iommu_group *iommu_group_get_by_id(int id)
377{
378 return NULL;
379}
380
381static inline void iommu_domain_free(struct iommu_domain *domain)
382{
383}
384
385static inline int iommu_attach_device(struct iommu_domain *domain,
386 struct device *dev)
387{
388 return -ENODEV;
389}
390
391static inline void iommu_detach_device(struct iommu_domain *domain,
392 struct device *dev)
393{
394}
395
396static inline struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
397{
398 return NULL;
399}
400
401static inline int iommu_map(struct iommu_domain *domain, unsigned long iova,
402 phys_addr_t paddr, int gfp_order, int prot)
403{
404 return -ENODEV;
405}
406
407static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,
408 int gfp_order)
409{
410 return -ENODEV;
411}
412
413static inline size_t iommu_map_sg(struct iommu_domain *domain,
414 unsigned long iova, struct scatterlist *sg,
415 unsigned int nents, int prot)
416{
417 return -ENODEV;
418}
419
420static inline int iommu_domain_window_enable(struct iommu_domain *domain,
421 u32 wnd_nr, phys_addr_t paddr,
422 u64 size, int prot)
423{
424 return -ENODEV;
425}
426
427static inline void iommu_domain_window_disable(struct iommu_domain *domain,
428 u32 wnd_nr)
429{
430}
431
432static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
433{
434 return 0;
435}
436
437static inline void iommu_set_fault_handler(struct iommu_domain *domain,
438 iommu_fault_handler_t handler, void *token)
439{
440}
441
442static inline void iommu_get_dm_regions(struct device *dev,
443 struct list_head *list)
444{
445}
446
447static inline void iommu_put_dm_regions(struct device *dev,
448 struct list_head *list)
449{
450}
451
452static inline int iommu_request_dm_for_dev(struct device *dev)
453{
454 return -ENODEV;
455}
456
457static inline int iommu_attach_group(struct iommu_domain *domain,
458 struct iommu_group *group)
459{
460 return -ENODEV;
461}
462
463static inline void iommu_detach_group(struct iommu_domain *domain,
464 struct iommu_group *group)
465{
466}
467
468static inline struct iommu_group *iommu_group_alloc(void)
469{
470 return ERR_PTR(-ENODEV);
471}
472
473static inline void *iommu_group_get_iommudata(struct iommu_group *group)
474{
475 return NULL;
476}
477
478static inline void iommu_group_set_iommudata(struct iommu_group *group,
479 void *iommu_data,
480 void (*release)(void *iommu_data))
481{
482}
483
484static inline int iommu_group_set_name(struct iommu_group *group,
485 const char *name)
486{
487 return -ENODEV;
488}
489
490static inline int iommu_group_add_device(struct iommu_group *group,
491 struct device *dev)
492{
493 return -ENODEV;
494}
495
496static inline void iommu_group_remove_device(struct device *dev)
497{
498}
499
500static inline int iommu_group_for_each_dev(struct iommu_group *group,
501 void *data,
502 int (*fn)(struct device *, void *))
503{
504 return -ENODEV;
505}
506
507static inline struct iommu_group *iommu_group_get(struct device *dev)
508{
509 return NULL;
510}
511
512static inline void iommu_group_put(struct iommu_group *group)
513{
514}
515
516static inline int iommu_group_register_notifier(struct iommu_group *group,
517 struct notifier_block *nb)
518{
519 return -ENODEV;
520}
521
522static inline int iommu_group_unregister_notifier(struct iommu_group *group,
523 struct notifier_block *nb)
524{
525 return 0;
526}
527
528static inline int iommu_group_id(struct iommu_group *group)
529{
530 return -ENODEV;
531}
532
533static inline int iommu_domain_get_attr(struct iommu_domain *domain,
534 enum iommu_attr attr, void *data)
535{
536 return -EINVAL;
537}
538
539static inline int iommu_domain_set_attr(struct iommu_domain *domain,
540 enum iommu_attr attr, void *data)
541{
542 return -EINVAL;
543}
544
545static inline struct device *iommu_device_create(struct device *parent,
546 void *drvdata,
547 const struct attribute_group **groups,
548 const char *fmt, ...)
549{
550 return ERR_PTR(-ENODEV);
551}
552
553static inline void iommu_device_destroy(struct device *dev)
554{
555}
556
557static inline int iommu_device_link(struct device *dev, struct device *link)
558{
559 return -EINVAL;
560}
561
562static inline void iommu_device_unlink(struct device *dev, struct device *link)
563{
564}
565
566static inline int iommu_fwspec_init(struct device *dev,
567 struct fwnode_handle *iommu_fwnode,
568 const struct iommu_ops *ops)
569{
570 return -ENODEV;
571}
572
573static inline void iommu_fwspec_free(struct device *dev)
574{
575}
576
577static inline int iommu_fwspec_add_ids(struct device *dev, u32 *ids,
578 int num_ids)
579{
580 return -ENODEV;
581}
582
583#endif
584
585#endif
586