1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * IOMMU user API definitions 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _UAPI_IOMMU_H 7*4882a593Smuzhiyun #define _UAPI_IOMMU_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define IOMMU_FAULT_PERM_READ (1 << 0) /* read */ 12*4882a593Smuzhiyun #define IOMMU_FAULT_PERM_WRITE (1 << 1) /* write */ 13*4882a593Smuzhiyun #define IOMMU_FAULT_PERM_EXEC (1 << 2) /* exec */ 14*4882a593Smuzhiyun #define IOMMU_FAULT_PERM_PRIV (1 << 3) /* privileged */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Generic fault types, can be expanded IRQ remapping fault */ 17*4882a593Smuzhiyun enum iommu_fault_type { 18*4882a593Smuzhiyun IOMMU_FAULT_DMA_UNRECOV = 1, /* unrecoverable fault */ 19*4882a593Smuzhiyun IOMMU_FAULT_PAGE_REQ, /* page request fault */ 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum iommu_fault_reason { 23*4882a593Smuzhiyun IOMMU_FAULT_REASON_UNKNOWN = 0, 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* Could not access the PASID table (fetch caused external abort) */ 26*4882a593Smuzhiyun IOMMU_FAULT_REASON_PASID_FETCH, 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* PASID entry is invalid or has configuration errors */ 29*4882a593Smuzhiyun IOMMU_FAULT_REASON_BAD_PASID_ENTRY, 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * PASID is out of range (e.g. exceeds the maximum PASID 33*4882a593Smuzhiyun * supported by the IOMMU) or disabled. 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun IOMMU_FAULT_REASON_PASID_INVALID, 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 38*4882a593Smuzhiyun * An external abort occurred fetching (or updating) a translation 39*4882a593Smuzhiyun * table descriptor 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun IOMMU_FAULT_REASON_WALK_EABT, 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * Could not access the page table entry (Bad address), 45*4882a593Smuzhiyun * actual translation fault 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun IOMMU_FAULT_REASON_PTE_FETCH, 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Protection flag check failed */ 50*4882a593Smuzhiyun IOMMU_FAULT_REASON_PERMISSION, 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* access flag check failed */ 53*4882a593Smuzhiyun IOMMU_FAULT_REASON_ACCESS, 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Output address of a translation stage caused Address Size fault */ 56*4882a593Smuzhiyun IOMMU_FAULT_REASON_OOR_ADDRESS, 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /** 60*4882a593Smuzhiyun * struct iommu_fault_unrecoverable - Unrecoverable fault data 61*4882a593Smuzhiyun * @reason: reason of the fault, from &enum iommu_fault_reason 62*4882a593Smuzhiyun * @flags: parameters of this fault (IOMMU_FAULT_UNRECOV_* values) 63*4882a593Smuzhiyun * @pasid: Process Address Space ID 64*4882a593Smuzhiyun * @perm: requested permission access using by the incoming transaction 65*4882a593Smuzhiyun * (IOMMU_FAULT_PERM_* values) 66*4882a593Smuzhiyun * @addr: offending page address 67*4882a593Smuzhiyun * @fetch_addr: address that caused a fetch abort, if any 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun struct iommu_fault_unrecoverable { 70*4882a593Smuzhiyun __u32 reason; 71*4882a593Smuzhiyun #define IOMMU_FAULT_UNRECOV_PASID_VALID (1 << 0) 72*4882a593Smuzhiyun #define IOMMU_FAULT_UNRECOV_ADDR_VALID (1 << 1) 73*4882a593Smuzhiyun #define IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID (1 << 2) 74*4882a593Smuzhiyun __u32 flags; 75*4882a593Smuzhiyun __u32 pasid; 76*4882a593Smuzhiyun __u32 perm; 77*4882a593Smuzhiyun __u64 addr; 78*4882a593Smuzhiyun __u64 fetch_addr; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /** 82*4882a593Smuzhiyun * struct iommu_fault_page_request - Page Request data 83*4882a593Smuzhiyun * @flags: encodes whether the corresponding fields are valid and whether this 84*4882a593Smuzhiyun * is the last page in group (IOMMU_FAULT_PAGE_REQUEST_* values). 85*4882a593Smuzhiyun * When IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID is set, the page response 86*4882a593Smuzhiyun * must have the same PASID value as the page request. When it is clear, 87*4882a593Smuzhiyun * the page response should not have a PASID. 88*4882a593Smuzhiyun * @pasid: Process Address Space ID 89*4882a593Smuzhiyun * @grpid: Page Request Group Index 90*4882a593Smuzhiyun * @perm: requested page permissions (IOMMU_FAULT_PERM_* values) 91*4882a593Smuzhiyun * @addr: page address 92*4882a593Smuzhiyun * @private_data: device-specific private information 93*4882a593Smuzhiyun */ 94*4882a593Smuzhiyun struct iommu_fault_page_request { 95*4882a593Smuzhiyun #define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID (1 << 0) 96*4882a593Smuzhiyun #define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE (1 << 1) 97*4882a593Smuzhiyun #define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA (1 << 2) 98*4882a593Smuzhiyun #define IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID (1 << 3) 99*4882a593Smuzhiyun __u32 flags; 100*4882a593Smuzhiyun __u32 pasid; 101*4882a593Smuzhiyun __u32 grpid; 102*4882a593Smuzhiyun __u32 perm; 103*4882a593Smuzhiyun __u64 addr; 104*4882a593Smuzhiyun __u64 private_data[2]; 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /** 108*4882a593Smuzhiyun * struct iommu_fault - Generic fault data 109*4882a593Smuzhiyun * @type: fault type from &enum iommu_fault_type 110*4882a593Smuzhiyun * @padding: reserved for future use (should be zero) 111*4882a593Smuzhiyun * @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV 112*4882a593Smuzhiyun * @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ 113*4882a593Smuzhiyun * @padding2: sets the fault size to allow for future extensions 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun struct iommu_fault { 116*4882a593Smuzhiyun __u32 type; 117*4882a593Smuzhiyun __u32 padding; 118*4882a593Smuzhiyun union { 119*4882a593Smuzhiyun struct iommu_fault_unrecoverable event; 120*4882a593Smuzhiyun struct iommu_fault_page_request prm; 121*4882a593Smuzhiyun __u8 padding2[56]; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /** 126*4882a593Smuzhiyun * enum iommu_page_response_code - Return status of fault handlers 127*4882a593Smuzhiyun * @IOMMU_PAGE_RESP_SUCCESS: Fault has been handled and the page tables 128*4882a593Smuzhiyun * populated, retry the access. This is "Success" in PCI PRI. 129*4882a593Smuzhiyun * @IOMMU_PAGE_RESP_FAILURE: General error. Drop all subsequent faults from 130*4882a593Smuzhiyun * this device if possible. This is "Response Failure" in PCI PRI. 131*4882a593Smuzhiyun * @IOMMU_PAGE_RESP_INVALID: Could not handle this fault, don't retry the 132*4882a593Smuzhiyun * access. This is "Invalid Request" in PCI PRI. 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun enum iommu_page_response_code { 135*4882a593Smuzhiyun IOMMU_PAGE_RESP_SUCCESS = 0, 136*4882a593Smuzhiyun IOMMU_PAGE_RESP_INVALID, 137*4882a593Smuzhiyun IOMMU_PAGE_RESP_FAILURE, 138*4882a593Smuzhiyun }; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /** 141*4882a593Smuzhiyun * struct iommu_page_response - Generic page response information 142*4882a593Smuzhiyun * @argsz: User filled size of this data 143*4882a593Smuzhiyun * @version: API version of this structure 144*4882a593Smuzhiyun * @flags: encodes whether the corresponding fields are valid 145*4882a593Smuzhiyun * (IOMMU_FAULT_PAGE_RESPONSE_* values) 146*4882a593Smuzhiyun * @pasid: Process Address Space ID 147*4882a593Smuzhiyun * @grpid: Page Request Group Index 148*4882a593Smuzhiyun * @code: response code from &enum iommu_page_response_code 149*4882a593Smuzhiyun */ 150*4882a593Smuzhiyun struct iommu_page_response { 151*4882a593Smuzhiyun __u32 argsz; 152*4882a593Smuzhiyun #define IOMMU_PAGE_RESP_VERSION_1 1 153*4882a593Smuzhiyun __u32 version; 154*4882a593Smuzhiyun #define IOMMU_PAGE_RESP_PASID_VALID (1 << 0) 155*4882a593Smuzhiyun __u32 flags; 156*4882a593Smuzhiyun __u32 pasid; 157*4882a593Smuzhiyun __u32 grpid; 158*4882a593Smuzhiyun __u32 code; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* defines the granularity of the invalidation */ 162*4882a593Smuzhiyun enum iommu_inv_granularity { 163*4882a593Smuzhiyun IOMMU_INV_GRANU_DOMAIN, /* domain-selective invalidation */ 164*4882a593Smuzhiyun IOMMU_INV_GRANU_PASID, /* PASID-selective invalidation */ 165*4882a593Smuzhiyun IOMMU_INV_GRANU_ADDR, /* page-selective invalidation */ 166*4882a593Smuzhiyun IOMMU_INV_GRANU_NR, /* number of invalidation granularities */ 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /** 170*4882a593Smuzhiyun * struct iommu_inv_addr_info - Address Selective Invalidation Structure 171*4882a593Smuzhiyun * 172*4882a593Smuzhiyun * @flags: indicates the granularity of the address-selective invalidation 173*4882a593Smuzhiyun * - If the PASID bit is set, the @pasid field is populated and the invalidation 174*4882a593Smuzhiyun * relates to cache entries tagged with this PASID and matching the address 175*4882a593Smuzhiyun * range. 176*4882a593Smuzhiyun * - If ARCHID bit is set, @archid is populated and the invalidation relates 177*4882a593Smuzhiyun * to cache entries tagged with this architecture specific ID and matching 178*4882a593Smuzhiyun * the address range. 179*4882a593Smuzhiyun * - Both PASID and ARCHID can be set as they may tag different caches. 180*4882a593Smuzhiyun * - If neither PASID or ARCHID is set, global addr invalidation applies. 181*4882a593Smuzhiyun * - The LEAF flag indicates whether only the leaf PTE caching needs to be 182*4882a593Smuzhiyun * invalidated and other paging structure caches can be preserved. 183*4882a593Smuzhiyun * @pasid: process address space ID 184*4882a593Smuzhiyun * @archid: architecture-specific ID 185*4882a593Smuzhiyun * @addr: first stage/level input address 186*4882a593Smuzhiyun * @granule_size: page/block size of the mapping in bytes 187*4882a593Smuzhiyun * @nb_granules: number of contiguous granules to be invalidated 188*4882a593Smuzhiyun */ 189*4882a593Smuzhiyun struct iommu_inv_addr_info { 190*4882a593Smuzhiyun #define IOMMU_INV_ADDR_FLAGS_PASID (1 << 0) 191*4882a593Smuzhiyun #define IOMMU_INV_ADDR_FLAGS_ARCHID (1 << 1) 192*4882a593Smuzhiyun #define IOMMU_INV_ADDR_FLAGS_LEAF (1 << 2) 193*4882a593Smuzhiyun __u32 flags; 194*4882a593Smuzhiyun __u32 archid; 195*4882a593Smuzhiyun __u64 pasid; 196*4882a593Smuzhiyun __u64 addr; 197*4882a593Smuzhiyun __u64 granule_size; 198*4882a593Smuzhiyun __u64 nb_granules; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /** 202*4882a593Smuzhiyun * struct iommu_inv_pasid_info - PASID Selective Invalidation Structure 203*4882a593Smuzhiyun * 204*4882a593Smuzhiyun * @flags: indicates the granularity of the PASID-selective invalidation 205*4882a593Smuzhiyun * - If the PASID bit is set, the @pasid field is populated and the invalidation 206*4882a593Smuzhiyun * relates to cache entries tagged with this PASID and matching the address 207*4882a593Smuzhiyun * range. 208*4882a593Smuzhiyun * - If the ARCHID bit is set, the @archid is populated and the invalidation 209*4882a593Smuzhiyun * relates to cache entries tagged with this architecture specific ID and 210*4882a593Smuzhiyun * matching the address range. 211*4882a593Smuzhiyun * - Both PASID and ARCHID can be set as they may tag different caches. 212*4882a593Smuzhiyun * - At least one of PASID or ARCHID must be set. 213*4882a593Smuzhiyun * @pasid: process address space ID 214*4882a593Smuzhiyun * @archid: architecture-specific ID 215*4882a593Smuzhiyun */ 216*4882a593Smuzhiyun struct iommu_inv_pasid_info { 217*4882a593Smuzhiyun #define IOMMU_INV_PASID_FLAGS_PASID (1 << 0) 218*4882a593Smuzhiyun #define IOMMU_INV_PASID_FLAGS_ARCHID (1 << 1) 219*4882a593Smuzhiyun __u32 flags; 220*4882a593Smuzhiyun __u32 archid; 221*4882a593Smuzhiyun __u64 pasid; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /** 225*4882a593Smuzhiyun * struct iommu_cache_invalidate_info - First level/stage invalidation 226*4882a593Smuzhiyun * information 227*4882a593Smuzhiyun * @argsz: User filled size of this data 228*4882a593Smuzhiyun * @version: API version of this structure 229*4882a593Smuzhiyun * @cache: bitfield that allows to select which caches to invalidate 230*4882a593Smuzhiyun * @granularity: defines the lowest granularity used for the invalidation: 231*4882a593Smuzhiyun * domain > PASID > addr 232*4882a593Smuzhiyun * @padding: reserved for future use (should be zero) 233*4882a593Smuzhiyun * @pasid_info: invalidation data when @granularity is %IOMMU_INV_GRANU_PASID 234*4882a593Smuzhiyun * @addr_info: invalidation data when @granularity is %IOMMU_INV_GRANU_ADDR 235*4882a593Smuzhiyun * 236*4882a593Smuzhiyun * Not all the combinations of cache/granularity are valid: 237*4882a593Smuzhiyun * 238*4882a593Smuzhiyun * +--------------+---------------+---------------+---------------+ 239*4882a593Smuzhiyun * | type / | DEV_IOTLB | IOTLB | PASID | 240*4882a593Smuzhiyun * | granularity | | | cache | 241*4882a593Smuzhiyun * +==============+===============+===============+===============+ 242*4882a593Smuzhiyun * | DOMAIN | N/A | Y | Y | 243*4882a593Smuzhiyun * +--------------+---------------+---------------+---------------+ 244*4882a593Smuzhiyun * | PASID | Y | Y | Y | 245*4882a593Smuzhiyun * +--------------+---------------+---------------+---------------+ 246*4882a593Smuzhiyun * | ADDR | Y | Y | N/A | 247*4882a593Smuzhiyun * +--------------+---------------+---------------+---------------+ 248*4882a593Smuzhiyun * 249*4882a593Smuzhiyun * Invalidations by %IOMMU_INV_GRANU_DOMAIN don't take any argument other than 250*4882a593Smuzhiyun * @version and @cache. 251*4882a593Smuzhiyun * 252*4882a593Smuzhiyun * If multiple cache types are invalidated simultaneously, they all 253*4882a593Smuzhiyun * must support the used granularity. 254*4882a593Smuzhiyun */ 255*4882a593Smuzhiyun struct iommu_cache_invalidate_info { 256*4882a593Smuzhiyun __u32 argsz; 257*4882a593Smuzhiyun #define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1 258*4882a593Smuzhiyun __u32 version; 259*4882a593Smuzhiyun /* IOMMU paging structure cache */ 260*4882a593Smuzhiyun #define IOMMU_CACHE_INV_TYPE_IOTLB (1 << 0) /* IOMMU IOTLB */ 261*4882a593Smuzhiyun #define IOMMU_CACHE_INV_TYPE_DEV_IOTLB (1 << 1) /* Device IOTLB */ 262*4882a593Smuzhiyun #define IOMMU_CACHE_INV_TYPE_PASID (1 << 2) /* PASID cache */ 263*4882a593Smuzhiyun #define IOMMU_CACHE_INV_TYPE_NR (3) 264*4882a593Smuzhiyun __u8 cache; 265*4882a593Smuzhiyun __u8 granularity; 266*4882a593Smuzhiyun __u8 padding[6]; 267*4882a593Smuzhiyun union { 268*4882a593Smuzhiyun struct iommu_inv_pasid_info pasid_info; 269*4882a593Smuzhiyun struct iommu_inv_addr_info addr_info; 270*4882a593Smuzhiyun } granu; 271*4882a593Smuzhiyun }; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /** 274*4882a593Smuzhiyun * struct iommu_gpasid_bind_data_vtd - Intel VT-d specific data on device and guest 275*4882a593Smuzhiyun * SVA binding. 276*4882a593Smuzhiyun * 277*4882a593Smuzhiyun * @flags: VT-d PASID table entry attributes 278*4882a593Smuzhiyun * @pat: Page attribute table data to compute effective memory type 279*4882a593Smuzhiyun * @emt: Extended memory type 280*4882a593Smuzhiyun * 281*4882a593Smuzhiyun * Only guest vIOMMU selectable and effective options are passed down to 282*4882a593Smuzhiyun * the host IOMMU. 283*4882a593Smuzhiyun */ 284*4882a593Smuzhiyun struct iommu_gpasid_bind_data_vtd { 285*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_SRE (1 << 0) /* supervisor request */ 286*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_EAFE (1 << 1) /* extended access enable */ 287*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_PCD (1 << 2) /* page-level cache disable */ 288*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_PWT (1 << 3) /* page-level write through */ 289*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_EMTE (1 << 4) /* extended mem type enable */ 290*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_CD (1 << 5) /* PASID-level cache disable */ 291*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_LAST (1 << 6) 292*4882a593Smuzhiyun __u64 flags; 293*4882a593Smuzhiyun __u32 pat; 294*4882a593Smuzhiyun __u32 emt; 295*4882a593Smuzhiyun }; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun #define IOMMU_SVA_VTD_GPASID_MTS_MASK (IOMMU_SVA_VTD_GPASID_CD | \ 298*4882a593Smuzhiyun IOMMU_SVA_VTD_GPASID_EMTE | \ 299*4882a593Smuzhiyun IOMMU_SVA_VTD_GPASID_PCD | \ 300*4882a593Smuzhiyun IOMMU_SVA_VTD_GPASID_PWT) 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /** 303*4882a593Smuzhiyun * struct iommu_gpasid_bind_data - Information about device and guest PASID binding 304*4882a593Smuzhiyun * @argsz: User filled size of this data 305*4882a593Smuzhiyun * @version: Version of this data structure 306*4882a593Smuzhiyun * @format: PASID table entry format 307*4882a593Smuzhiyun * @flags: Additional information on guest bind request 308*4882a593Smuzhiyun * @gpgd: Guest page directory base of the guest mm to bind 309*4882a593Smuzhiyun * @hpasid: Process address space ID used for the guest mm in host IOMMU 310*4882a593Smuzhiyun * @gpasid: Process address space ID used for the guest mm in guest IOMMU 311*4882a593Smuzhiyun * @addr_width: Guest virtual address width 312*4882a593Smuzhiyun * @padding: Reserved for future use (should be zero) 313*4882a593Smuzhiyun * @vtd: Intel VT-d specific data 314*4882a593Smuzhiyun * 315*4882a593Smuzhiyun * Guest to host PASID mapping can be an identity or non-identity, where guest 316*4882a593Smuzhiyun * has its own PASID space. For non-identify mapping, guest to host PASID lookup 317*4882a593Smuzhiyun * is needed when VM programs guest PASID into an assigned device. VMM may 318*4882a593Smuzhiyun * trap such PASID programming then request host IOMMU driver to convert guest 319*4882a593Smuzhiyun * PASID to host PASID based on this bind data. 320*4882a593Smuzhiyun */ 321*4882a593Smuzhiyun struct iommu_gpasid_bind_data { 322*4882a593Smuzhiyun __u32 argsz; 323*4882a593Smuzhiyun #define IOMMU_GPASID_BIND_VERSION_1 1 324*4882a593Smuzhiyun __u32 version; 325*4882a593Smuzhiyun #define IOMMU_PASID_FORMAT_INTEL_VTD 1 326*4882a593Smuzhiyun #define IOMMU_PASID_FORMAT_LAST 2 327*4882a593Smuzhiyun __u32 format; 328*4882a593Smuzhiyun __u32 addr_width; 329*4882a593Smuzhiyun #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */ 330*4882a593Smuzhiyun __u64 flags; 331*4882a593Smuzhiyun __u64 gpgd; 332*4882a593Smuzhiyun __u64 hpasid; 333*4882a593Smuzhiyun __u64 gpasid; 334*4882a593Smuzhiyun __u8 padding[8]; 335*4882a593Smuzhiyun /* Vendor specific data */ 336*4882a593Smuzhiyun union { 337*4882a593Smuzhiyun struct iommu_gpasid_bind_data_vtd vtd; 338*4882a593Smuzhiyun } vendor; 339*4882a593Smuzhiyun }; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun #endif /* _UAPI_IOMMU_H */ 342