xref: /OK3568_Linux_fs/kernel/include/uapi/linux/iommu.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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