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/iommufd.h> 8 #include <linux/types.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 IOMMU_TEST_OP_TRIGGER_IOPF, 26 IOMMU_TEST_OP_DEV_CHECK_CACHE, 27 IOMMU_TEST_OP_TRIGGER_VEVENT, 28 IOMMU_TEST_OP_PASID_ATTACH, 29 IOMMU_TEST_OP_PASID_REPLACE, 30 IOMMU_TEST_OP_PASID_DETACH, 31 IOMMU_TEST_OP_PASID_CHECK_HWPT, 32 IOMMU_TEST_OP_DMABUF_GET, 33 IOMMU_TEST_OP_DMABUF_REVOKE, 34 }; 35 36 enum { 37 MOCK_IOMMUPT_DEFAULT = 0, 38 MOCK_IOMMUPT_HUGE, 39 MOCK_IOMMUPT_AMDV1, 40 }; 41 42 /* These values are true for MOCK_IOMMUPT_DEFAULT */ 43 enum { 44 MOCK_APERTURE_START = 1UL << 24, 45 MOCK_APERTURE_LAST = (1UL << 31) - 1, 46 MOCK_PAGE_SIZE = 2048, 47 MOCK_HUGE_PAGE_SIZE = 512 * MOCK_PAGE_SIZE, 48 }; 49 50 enum { 51 MOCK_FLAGS_ACCESS_WRITE = 1 << 0, 52 MOCK_FLAGS_ACCESS_SYZ = 1 << 16, 53 }; 54 55 enum { 56 MOCK_ACCESS_RW_WRITE = 1 << 0, 57 MOCK_ACCESS_RW_SLOW_PATH = 1 << 2, 58 }; 59 60 enum { 61 MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES = 1 << 0, 62 }; 63 64 enum { 65 MOCK_FLAGS_DEVICE_NO_DIRTY = 1 << 0, 66 MOCK_FLAGS_DEVICE_PASID = 1 << 2, 67 }; 68 69 enum { 70 MOCK_NESTED_DOMAIN_IOTLB_ID_MAX = 3, 71 MOCK_NESTED_DOMAIN_IOTLB_NUM = 4, 72 }; 73 74 enum { 75 MOCK_DEV_CACHE_ID_MAX = 3, 76 MOCK_DEV_CACHE_NUM = 4, 77 }; 78 79 /* Reserved for special pasid replace test */ 80 #define IOMMU_TEST_PASID_RESERVED 1024 81 82 struct iommu_test_cmd { 83 __u32 size; 84 __u32 op; 85 __u32 id; 86 __u32 __reserved; 87 union { 88 struct { 89 __aligned_u64 start; 90 __aligned_u64 length; 91 } add_reserved; 92 struct { 93 __u32 out_stdev_id; 94 __u32 out_hwpt_id; 95 /* out_idev_id is the standard iommufd_bind object */ 96 __u32 out_idev_id; 97 } mock_domain; 98 struct { 99 __u32 out_stdev_id; 100 __u32 out_hwpt_id; 101 __u32 out_idev_id; 102 /* Expand mock_domain to set mock device flags */ 103 __u32 dev_flags; 104 } mock_domain_flags; 105 struct { 106 __u32 pt_id; 107 } mock_domain_replace; 108 struct { 109 __aligned_u64 iova; 110 __aligned_u64 length; 111 __aligned_u64 uptr; 112 } check_map; 113 struct { 114 __aligned_u64 length; 115 __aligned_u64 uptr; 116 __u32 refs; 117 } check_refs; 118 struct { 119 __u32 out_access_fd; 120 __u32 flags; 121 } create_access; 122 struct { 123 __u32 access_pages_id; 124 } destroy_access_pages; 125 struct { 126 __u32 flags; 127 __u32 out_access_pages_id; 128 __aligned_u64 iova; 129 __aligned_u64 length; 130 __aligned_u64 uptr; 131 } access_pages; 132 struct { 133 __aligned_u64 iova; 134 __aligned_u64 length; 135 __aligned_u64 uptr; 136 __u32 flags; 137 } access_rw; 138 struct { 139 __u32 limit; 140 } memory_limit; 141 struct { 142 __u32 ioas_id; 143 } access_replace_ioas; 144 struct { 145 __u32 flags; 146 __aligned_u64 iova; 147 __aligned_u64 length; 148 __aligned_u64 page_size; 149 __aligned_u64 uptr; 150 __aligned_u64 out_nr_dirty; 151 } dirty; 152 struct { 153 __u32 id; 154 __u32 iotlb; 155 } check_iotlb; 156 struct { 157 __u32 dev_id; 158 __u32 pasid; 159 __u32 grpid; 160 __u32 perm; 161 __u64 addr; 162 } trigger_iopf; 163 struct { 164 __u32 id; 165 __u32 cache; 166 } check_dev_cache; 167 struct { 168 __u32 dev_id; 169 } trigger_vevent; 170 struct { 171 __u32 pasid; 172 __u32 pt_id; 173 /* @id is stdev_id */ 174 } pasid_attach; 175 struct { 176 __u32 pasid; 177 __u32 pt_id; 178 /* @id is stdev_id */ 179 } pasid_replace; 180 struct { 181 __u32 pasid; 182 /* @id is stdev_id */ 183 } pasid_detach; 184 struct { 185 __u32 pasid; 186 __u32 hwpt_id; 187 /* @id is stdev_id */ 188 } pasid_check; 189 struct { 190 __u32 length; 191 __u32 open_flags; 192 } dmabuf_get; 193 struct { 194 __s32 dmabuf_fd; 195 __u32 revoked; 196 } dmabuf_revoke; 197 }; 198 __u32 last; 199 }; 200 #define IOMMU_TEST_CMD _IO(IOMMUFD_TYPE, IOMMUFD_CMD_BASE + 32) 201 202 /* Mock device/iommu PASID width */ 203 #define MOCK_PASID_WIDTH 20 204 205 /* Mock structs for IOMMU_DEVICE_GET_HW_INFO ioctl */ 206 #define IOMMU_HW_INFO_TYPE_SELFTEST 0xfeedbeef 207 #define IOMMU_HW_INFO_SELFTEST_REGVAL 0xdeadbeef 208 209 struct iommu_test_hw_info { 210 __u32 flags; 211 __u32 test_reg; 212 }; 213 214 /* Should not be equal to any defined value in enum iommu_hwpt_data_type */ 215 #define IOMMU_HWPT_DATA_SELFTEST 0xdead 216 #define IOMMU_TEST_IOTLB_DEFAULT 0xbadbeef 217 #define IOMMU_TEST_DEV_CACHE_DEFAULT 0xbaddad 218 219 /** 220 * struct iommu_hwpt_selftest 221 * 222 * @iotlb: default mock iotlb value, IOMMU_TEST_IOTLB_DEFAULT 223 */ 224 struct iommu_hwpt_selftest { 225 __u32 iotlb; 226 __u32 pagetable_type; 227 }; 228 229 /* Should not be equal to any defined value in enum iommu_hwpt_invalidate_data_type */ 230 #define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST 0xdeadbeef 231 #define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST_INVALID 0xdadbeef 232 233 /** 234 * struct iommu_hwpt_invalidate_selftest - Invalidation data for Mock driver 235 * (IOMMU_HWPT_INVALIDATE_DATA_SELFTEST) 236 * @flags: Invalidate flags 237 * @iotlb_id: Invalidate iotlb entry index 238 * 239 * If IOMMU_TEST_INVALIDATE_ALL is set in @flags, @iotlb_id will be ignored 240 */ 241 struct iommu_hwpt_invalidate_selftest { 242 #define IOMMU_TEST_INVALIDATE_FLAG_ALL (1 << 0) 243 __u32 flags; 244 __u32 iotlb_id; 245 }; 246 247 #define IOMMU_VIOMMU_TYPE_SELFTEST 0xdeadbeef 248 249 /** 250 * struct iommu_viommu_selftest - vIOMMU data for Mock driver 251 * (IOMMU_VIOMMU_TYPE_SELFTEST) 252 * @in_data: Input random data from user space 253 * @out_data: Output data (matching @in_data) to user space 254 * @out_mmap_offset: The offset argument for mmap syscall 255 * @out_mmap_length: The length argument for mmap syscall 256 * 257 * Simply set @out_data=@in_data for a loopback test 258 */ 259 struct iommu_viommu_selftest { 260 __u32 in_data; 261 __u32 out_data; 262 __aligned_u64 out_mmap_offset; 263 __aligned_u64 out_mmap_length; 264 }; 265 266 /* Should not be equal to any defined value in enum iommu_viommu_invalidate_data_type */ 267 #define IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST 0xdeadbeef 268 #define IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST_INVALID 0xdadbeef 269 270 /** 271 * struct iommu_viommu_invalidate_selftest - Invalidation data for Mock VIOMMU 272 * (IOMMU_VIOMMU_INVALIDATE_DATA_SELFTEST) 273 * @flags: Invalidate flags 274 * @cache_id: Invalidate cache entry index 275 * 276 * If IOMMU_TEST_INVALIDATE_ALL is set in @flags, @cache_id will be ignored 277 */ 278 struct iommu_viommu_invalidate_selftest { 279 #define IOMMU_TEST_INVALIDATE_FLAG_ALL (1 << 0) 280 __u32 flags; 281 __u32 vdev_id; 282 __u32 cache_id; 283 }; 284 285 #define IOMMU_VEVENTQ_TYPE_SELFTEST 0xbeefbeef 286 287 struct iommu_viommu_event_selftest { 288 __u32 virt_id; 289 }; 290 291 #define IOMMU_HW_QUEUE_TYPE_SELFTEST 0xdeadbeef 292 #define IOMMU_TEST_HW_QUEUE_MAX 2 293 294 #endif 295