1 /*
2  * This file is auto-generated. Modifications will be lost.
3  *
4  * See https://android.googlesource.com/platform/bionic/+/master/libc/kernel/
5  * for more information.
6  */
7 #ifndef _UAPI_IOMMUFD_H
8 #define _UAPI_IOMMUFD_H
9 #include <linux/types.h>
10 #include <linux/ioctl.h>
11 #define IOMMUFD_TYPE (';')
12 enum {
13   IOMMUFD_CMD_BASE = 0x80,
14   IOMMUFD_CMD_DESTROY = IOMMUFD_CMD_BASE,
15   IOMMUFD_CMD_IOAS_ALLOC = 0x81,
16   IOMMUFD_CMD_IOAS_ALLOW_IOVAS = 0x82,
17   IOMMUFD_CMD_IOAS_COPY = 0x83,
18   IOMMUFD_CMD_IOAS_IOVA_RANGES = 0x84,
19   IOMMUFD_CMD_IOAS_MAP = 0x85,
20   IOMMUFD_CMD_IOAS_UNMAP = 0x86,
21   IOMMUFD_CMD_OPTION = 0x87,
22   IOMMUFD_CMD_VFIO_IOAS = 0x88,
23   IOMMUFD_CMD_HWPT_ALLOC = 0x89,
24   IOMMUFD_CMD_GET_HW_INFO = 0x8a,
25   IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING = 0x8b,
26   IOMMUFD_CMD_HWPT_GET_DIRTY_BITMAP = 0x8c,
27   IOMMUFD_CMD_HWPT_INVALIDATE = 0x8d,
28   IOMMUFD_CMD_FAULT_QUEUE_ALLOC = 0x8e,
29 };
30 struct iommu_destroy {
31   __u32 size;
32   __u32 id;
33 };
34 #define IOMMU_DESTROY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_DESTROY)
35 struct iommu_ioas_alloc {
36   __u32 size;
37   __u32 flags;
38   __u32 out_ioas_id;
39 };
40 #define IOMMU_IOAS_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOC)
41 struct iommu_iova_range {
42   __aligned_u64 start;
43   __aligned_u64 last;
44 };
45 struct iommu_ioas_iova_ranges {
46   __u32 size;
47   __u32 ioas_id;
48   __u32 num_iovas;
49   __u32 __reserved;
50   __aligned_u64 allowed_iovas;
51   __aligned_u64 out_iova_alignment;
52 };
53 #define IOMMU_IOAS_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_IOVA_RANGES)
54 struct iommu_ioas_allow_iovas {
55   __u32 size;
56   __u32 ioas_id;
57   __u32 num_iovas;
58   __u32 __reserved;
59   __aligned_u64 allowed_iovas;
60 };
61 #define IOMMU_IOAS_ALLOW_IOVAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOW_IOVAS)
62 enum iommufd_ioas_map_flags {
63   IOMMU_IOAS_MAP_FIXED_IOVA = 1 << 0,
64   IOMMU_IOAS_MAP_WRITEABLE = 1 << 1,
65   IOMMU_IOAS_MAP_READABLE = 1 << 2,
66 };
67 struct iommu_ioas_map {
68   __u32 size;
69   __u32 flags;
70   __u32 ioas_id;
71   __u32 __reserved;
72   __aligned_u64 user_va;
73   __aligned_u64 length;
74   __aligned_u64 iova;
75 };
76 #define IOMMU_IOAS_MAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_MAP)
77 struct iommu_ioas_copy {
78   __u32 size;
79   __u32 flags;
80   __u32 dst_ioas_id;
81   __u32 src_ioas_id;
82   __aligned_u64 length;
83   __aligned_u64 dst_iova;
84   __aligned_u64 src_iova;
85 };
86 #define IOMMU_IOAS_COPY _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_COPY)
87 struct iommu_ioas_unmap {
88   __u32 size;
89   __u32 ioas_id;
90   __aligned_u64 iova;
91   __aligned_u64 length;
92 };
93 #define IOMMU_IOAS_UNMAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_UNMAP)
94 enum iommufd_option {
95   IOMMU_OPTION_RLIMIT_MODE = 0,
96   IOMMU_OPTION_HUGE_PAGES = 1,
97 };
98 enum iommufd_option_ops {
99   IOMMU_OPTION_OP_SET = 0,
100   IOMMU_OPTION_OP_GET = 1,
101 };
102 struct iommu_option {
103   __u32 size;
104   __u32 option_id;
105   __u16 op;
106   __u16 __reserved;
107   __u32 object_id;
108   __aligned_u64 val64;
109 };
110 #define IOMMU_OPTION _IO(IOMMUFD_TYPE, IOMMUFD_CMD_OPTION)
111 enum iommufd_vfio_ioas_op {
112   IOMMU_VFIO_IOAS_GET = 0,
113   IOMMU_VFIO_IOAS_SET = 1,
114   IOMMU_VFIO_IOAS_CLEAR = 2,
115 };
116 struct iommu_vfio_ioas {
117   __u32 size;
118   __u32 ioas_id;
119   __u16 op;
120   __u16 __reserved;
121 };
122 #define IOMMU_VFIO_IOAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VFIO_IOAS)
123 enum iommufd_hwpt_alloc_flags {
124   IOMMU_HWPT_ALLOC_NEST_PARENT = 1 << 0,
125   IOMMU_HWPT_ALLOC_DIRTY_TRACKING = 1 << 1,
126   IOMMU_HWPT_FAULT_ID_VALID = 1 << 2,
127 };
128 enum iommu_hwpt_vtd_s1_flags {
129   IOMMU_VTD_S1_SRE = 1 << 0,
130   IOMMU_VTD_S1_EAFE = 1 << 1,
131   IOMMU_VTD_S1_WPE = 1 << 2,
132 };
133 struct iommu_hwpt_vtd_s1 {
134   __aligned_u64 flags;
135   __aligned_u64 pgtbl_addr;
136   __u32 addr_width;
137   __u32 __reserved;
138 };
139 enum iommu_hwpt_data_type {
140   IOMMU_HWPT_DATA_NONE = 0,
141   IOMMU_HWPT_DATA_VTD_S1 = 1,
142 };
143 struct iommu_hwpt_alloc {
144   __u32 size;
145   __u32 flags;
146   __u32 dev_id;
147   __u32 pt_id;
148   __u32 out_hwpt_id;
149   __u32 __reserved;
150   __u32 data_type;
151   __u32 data_len;
152   __aligned_u64 data_uptr;
153   __u32 fault_id;
154   __u32 __reserved2;
155 };
156 #define IOMMU_HWPT_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_ALLOC)
157 enum iommu_hw_info_vtd_flags {
158   IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17 = 1 << 0,
159 };
160 struct iommu_hw_info_vtd {
161   __u32 flags;
162   __u32 __reserved;
163   __aligned_u64 cap_reg;
164   __aligned_u64 ecap_reg;
165 };
166 enum iommu_hw_info_type {
167   IOMMU_HW_INFO_TYPE_NONE = 0,
168   IOMMU_HW_INFO_TYPE_INTEL_VTD = 1,
169 };
170 enum iommufd_hw_capabilities {
171   IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0,
172 };
173 struct iommu_hw_info {
174   __u32 size;
175   __u32 flags;
176   __u32 dev_id;
177   __u32 data_len;
178   __aligned_u64 data_uptr;
179   __u32 out_data_type;
180   __u32 __reserved;
181   __aligned_u64 out_capabilities;
182 };
183 #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO)
184 enum iommufd_hwpt_set_dirty_tracking_flags {
185   IOMMU_HWPT_DIRTY_TRACKING_ENABLE = 1,
186 };
187 struct iommu_hwpt_set_dirty_tracking {
188   __u32 size;
189   __u32 flags;
190   __u32 hwpt_id;
191   __u32 __reserved;
192 };
193 #define IOMMU_HWPT_SET_DIRTY_TRACKING _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_SET_DIRTY_TRACKING)
194 enum iommufd_hwpt_get_dirty_bitmap_flags {
195   IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR = 1,
196 };
197 struct iommu_hwpt_get_dirty_bitmap {
198   __u32 size;
199   __u32 hwpt_id;
200   __u32 flags;
201   __u32 __reserved;
202   __aligned_u64 iova;
203   __aligned_u64 length;
204   __aligned_u64 page_size;
205   __aligned_u64 data;
206 };
207 #define IOMMU_HWPT_GET_DIRTY_BITMAP _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_GET_DIRTY_BITMAP)
208 enum iommu_hwpt_invalidate_data_type {
209   IOMMU_HWPT_INVALIDATE_DATA_VTD_S1 = 0,
210 };
211 enum iommu_hwpt_vtd_s1_invalidate_flags {
212   IOMMU_VTD_INV_FLAGS_LEAF = 1 << 0,
213 };
214 struct iommu_hwpt_vtd_s1_invalidate {
215   __aligned_u64 addr;
216   __aligned_u64 npages;
217   __u32 flags;
218   __u32 __reserved;
219 };
220 struct iommu_hwpt_invalidate {
221   __u32 size;
222   __u32 hwpt_id;
223   __aligned_u64 data_uptr;
224   __u32 data_type;
225   __u32 entry_len;
226   __u32 entry_num;
227   __u32 __reserved;
228 };
229 #define IOMMU_HWPT_INVALIDATE _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_INVALIDATE)
230 enum iommu_hwpt_pgfault_flags {
231   IOMMU_PGFAULT_FLAGS_PASID_VALID = (1 << 0),
232   IOMMU_PGFAULT_FLAGS_LAST_PAGE = (1 << 1),
233 };
234 enum iommu_hwpt_pgfault_perm {
235   IOMMU_PGFAULT_PERM_READ = (1 << 0),
236   IOMMU_PGFAULT_PERM_WRITE = (1 << 1),
237   IOMMU_PGFAULT_PERM_EXEC = (1 << 2),
238   IOMMU_PGFAULT_PERM_PRIV = (1 << 3),
239 };
240 struct iommu_hwpt_pgfault {
241   __u32 flags;
242   __u32 dev_id;
243   __u32 pasid;
244   __u32 grpid;
245   __u32 perm;
246   __u64 addr;
247   __u32 length;
248   __u32 cookie;
249 };
250 enum iommufd_page_response_code {
251   IOMMUFD_PAGE_RESP_SUCCESS = 0,
252   IOMMUFD_PAGE_RESP_INVALID = 1,
253 };
254 struct iommu_hwpt_page_response {
255   __u32 cookie;
256   __u32 code;
257 };
258 struct iommu_fault_alloc {
259   __u32 size;
260   __u32 flags;
261   __u32 out_fault_id;
262   __u32 out_fault_fd;
263 };
264 #define IOMMU_FAULT_QUEUE_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_FAULT_QUEUE_ALLOC)
265 #endif
266