xref: /linux/drivers/iommu/iommufd/iommufd_test.h (revision e9c717bee8f109ec5f708297d2cc9d8b59348855)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES.
3  */
4 #ifndef _UAPI_IOMMUFD_TEST_H
5 #define _UAPI_IOMMUFD_TEST_H
6 
7 #include <linux/types.h>
8 #include <linux/iommufd.h>
9 
10 enum {
11 	IOMMU_TEST_OP_ADD_RESERVED = 1,
12 	IOMMU_TEST_OP_MOCK_DOMAIN,
13 	IOMMU_TEST_OP_MD_CHECK_MAP,
14 	IOMMU_TEST_OP_MD_CHECK_REFS,
15 	IOMMU_TEST_OP_CREATE_ACCESS,
16 	IOMMU_TEST_OP_DESTROY_ACCESS_PAGES,
17 	IOMMU_TEST_OP_ACCESS_PAGES,
18 	IOMMU_TEST_OP_ACCESS_RW,
19 	IOMMU_TEST_OP_SET_TEMP_MEMORY_LIMIT,
20 	IOMMU_TEST_OP_MOCK_DOMAIN_REPLACE,
21 	IOMMU_TEST_OP_ACCESS_REPLACE_IOAS,
22 	IOMMU_TEST_OP_MOCK_DOMAIN_FLAGS,
23 	IOMMU_TEST_OP_DIRTY,
24 	IOMMU_TEST_OP_MD_CHECK_IOTLB,
25 };
26 
27 enum {
28 	MOCK_APERTURE_START = 1UL << 24,
29 	MOCK_APERTURE_LAST = (1UL << 31) - 1,
30 };
31 
32 enum {
33 	MOCK_FLAGS_ACCESS_WRITE = 1 << 0,
34 	MOCK_FLAGS_ACCESS_SYZ = 1 << 16,
35 };
36 
37 enum {
38 	MOCK_ACCESS_RW_WRITE = 1 << 0,
39 	MOCK_ACCESS_RW_SLOW_PATH = 1 << 2,
40 };
41 
42 enum {
43 	MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES = 1 << 0,
44 };
45 
46 enum {
47 	MOCK_FLAGS_DEVICE_NO_DIRTY = 1 << 0,
48 	MOCK_FLAGS_DEVICE_HUGE_IOVA = 1 << 1,
49 };
50 
51 enum {
52 	MOCK_NESTED_DOMAIN_IOTLB_ID_MAX = 3,
53 	MOCK_NESTED_DOMAIN_IOTLB_NUM = 4,
54 };
55 
56 struct iommu_test_cmd {
57 	__u32 size;
58 	__u32 op;
59 	__u32 id;
60 	__u32 __reserved;
61 	union {
62 		struct {
63 			__aligned_u64 start;
64 			__aligned_u64 length;
65 		} add_reserved;
66 		struct {
67 			__u32 out_stdev_id;
68 			__u32 out_hwpt_id;
69 			/* out_idev_id is the standard iommufd_bind object */
70 			__u32 out_idev_id;
71 		} mock_domain;
72 		struct {
73 			__u32 out_stdev_id;
74 			__u32 out_hwpt_id;
75 			__u32 out_idev_id;
76 			/* Expand mock_domain to set mock device flags */
77 			__u32 dev_flags;
78 		} mock_domain_flags;
79 		struct {
80 			__u32 pt_id;
81 		} mock_domain_replace;
82 		struct {
83 			__aligned_u64 iova;
84 			__aligned_u64 length;
85 			__aligned_u64 uptr;
86 		} check_map;
87 		struct {
88 			__aligned_u64 length;
89 			__aligned_u64 uptr;
90 			__u32 refs;
91 		} check_refs;
92 		struct {
93 			__u32 out_access_fd;
94 			__u32 flags;
95 		} create_access;
96 		struct {
97 			__u32 access_pages_id;
98 		} destroy_access_pages;
99 		struct {
100 			__u32 flags;
101 			__u32 out_access_pages_id;
102 			__aligned_u64 iova;
103 			__aligned_u64 length;
104 			__aligned_u64 uptr;
105 		} access_pages;
106 		struct {
107 			__aligned_u64 iova;
108 			__aligned_u64 length;
109 			__aligned_u64 uptr;
110 			__u32 flags;
111 		} access_rw;
112 		struct {
113 			__u32 limit;
114 		} memory_limit;
115 		struct {
116 			__u32 ioas_id;
117 		} access_replace_ioas;
118 		struct {
119 			__u32 flags;
120 			__aligned_u64 iova;
121 			__aligned_u64 length;
122 			__aligned_u64 page_size;
123 			__aligned_u64 uptr;
124 			__aligned_u64 out_nr_dirty;
125 		} dirty;
126 		struct {
127 			__u32 id;
128 			__u32 iotlb;
129 		} check_iotlb;
130 	};
131 	__u32 last;
132 };
133 #define IOMMU_TEST_CMD _IO(IOMMUFD_TYPE, IOMMUFD_CMD_BASE + 32)
134 
135 /* Mock structs for IOMMU_DEVICE_GET_HW_INFO ioctl */
136 #define IOMMU_HW_INFO_TYPE_SELFTEST	0xfeedbeef
137 #define IOMMU_HW_INFO_SELFTEST_REGVAL	0xdeadbeef
138 
139 struct iommu_test_hw_info {
140 	__u32 flags;
141 	__u32 test_reg;
142 };
143 
144 /* Should not be equal to any defined value in enum iommu_hwpt_data_type */
145 #define IOMMU_HWPT_DATA_SELFTEST 0xdead
146 #define IOMMU_TEST_IOTLB_DEFAULT 0xbadbeef
147 
148 /**
149  * struct iommu_hwpt_selftest
150  *
151  * @iotlb: default mock iotlb value, IOMMU_TEST_IOTLB_DEFAULT
152  */
153 struct iommu_hwpt_selftest {
154 	__u32 iotlb;
155 };
156 
157 /* Should not be equal to any defined value in enum iommu_hwpt_invalidate_data_type */
158 #define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST 0xdeadbeef
159 #define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST_INVALID 0xdadbeef
160 
161 /**
162  * struct iommu_hwpt_invalidate_selftest - Invalidation data for Mock driver
163  *                                         (IOMMU_HWPT_INVALIDATE_DATA_SELFTEST)
164  * @flags: Invalidate flags
165  * @iotlb_id: Invalidate iotlb entry index
166  *
167  * If IOMMU_TEST_INVALIDATE_ALL is set in @flags, @iotlb_id will be ignored
168  */
169 struct iommu_hwpt_invalidate_selftest {
170 #define IOMMU_TEST_INVALIDATE_FLAG_ALL	(1 << 0)
171 	__u32 flags;
172 	__u32 iotlb_id;
173 };
174 
175 #endif
176