1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #ifndef USNIC_UIOM_H_
35 #define USNIC_UIOM_H_
36
37 #include <linux/list.h>
38 #include <linux/scatterlist.h>
39
40 #include "usnic_uiom_interval_tree.h"
41
42 struct ib_ucontext;
43
44 #define USNIC_UIOM_READ (1)
45 #define USNIC_UIOM_WRITE (2)
46
47 #define USNIC_UIOM_MAX_PD_CNT (1000)
48 #define USNIC_UIOM_MAX_MR_CNT (1000000)
49 #define USNIC_UIOM_MAX_MR_SIZE (~0UL)
50 #define USNIC_UIOM_PAGE_SIZE (PAGE_SIZE)
51
52 struct usnic_uiom_dev {
53 struct device *dev;
54 struct list_head link;
55 };
56
57 struct usnic_uiom_pd {
58 struct iommu_domain *domain;
59 spinlock_t lock;
60 struct rb_root_cached root;
61 struct list_head devs;
62 int dev_cnt;
63 };
64
65 struct usnic_uiom_reg {
66 struct usnic_uiom_pd *pd;
67 unsigned long va;
68 size_t length;
69 int offset;
70 int page_size;
71 int writable;
72 struct list_head chunk_list;
73 struct work_struct work;
74 struct mm_struct *owning_mm;
75 };
76
77 struct usnic_uiom_chunk {
78 struct list_head list;
79 int nents;
80 struct scatterlist page_list[0];
81 };
82
83 struct usnic_uiom_pd *usnic_uiom_alloc_pd(void);
84 void usnic_uiom_dealloc_pd(struct usnic_uiom_pd *pd);
85 int usnic_uiom_attach_dev_to_pd(struct usnic_uiom_pd *pd, struct device *dev);
86 void usnic_uiom_detach_dev_from_pd(struct usnic_uiom_pd *pd,
87 struct device *dev);
88 struct device **usnic_uiom_get_dev_list(struct usnic_uiom_pd *pd);
89 void usnic_uiom_free_dev_list(struct device **devs);
90 struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd,
91 unsigned long addr, size_t size,
92 int access, int dmasync);
93 void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr);
94 int usnic_uiom_init(char *drv_name);
95 #endif