• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 /*
3  * IOMMU user API definitions
4  */
5 
6 #ifndef _UAPI_IOMMU_H
7 #define _UAPI_IOMMU_H
8 
9 #include <linux/types.h>
10 
11 #define IOMMU_FAULT_PERM_READ	(1 << 0) /* read */
12 #define IOMMU_FAULT_PERM_WRITE	(1 << 1) /* write */
13 #define IOMMU_FAULT_PERM_EXEC	(1 << 2) /* exec */
14 #define IOMMU_FAULT_PERM_PRIV	(1 << 3) /* privileged */
15 
16 /* Generic fault types, can be expanded IRQ remapping fault */
17 enum iommu_fault_type {
18 	IOMMU_FAULT_DMA_UNRECOV = 1,	/* unrecoverable fault */
19 	IOMMU_FAULT_PAGE_REQ,		/* page request fault */
20 };
21 
22 enum iommu_fault_reason {
23 	IOMMU_FAULT_REASON_UNKNOWN = 0,
24 
25 	/* Could not access the PASID table (fetch caused external abort) */
26 	IOMMU_FAULT_REASON_PASID_FETCH,
27 
28 	/* PASID entry is invalid or has configuration errors */
29 	IOMMU_FAULT_REASON_BAD_PASID_ENTRY,
30 
31 	/*
32 	 * PASID is out of range (e.g. exceeds the maximum PASID
33 	 * supported by the IOMMU) or disabled.
34 	 */
35 	IOMMU_FAULT_REASON_PASID_INVALID,
36 
37 	/*
38 	 * An external abort occurred fetching (or updating) a translation
39 	 * table descriptor
40 	 */
41 	IOMMU_FAULT_REASON_WALK_EABT,
42 
43 	/*
44 	 * Could not access the page table entry (Bad address),
45 	 * actual translation fault
46 	 */
47 	IOMMU_FAULT_REASON_PTE_FETCH,
48 
49 	/* Protection flag check failed */
50 	IOMMU_FAULT_REASON_PERMISSION,
51 
52 	/* access flag check failed */
53 	IOMMU_FAULT_REASON_ACCESS,
54 
55 	/* Output address of a translation stage caused Address Size fault */
56 	IOMMU_FAULT_REASON_OOR_ADDRESS,
57 };
58 
59 /**
60  * struct iommu_fault_unrecoverable - Unrecoverable fault data
61  * @reason: reason of the fault, from &enum iommu_fault_reason
62  * @flags: parameters of this fault (IOMMU_FAULT_UNRECOV_* values)
63  * @pasid: Process Address Space ID
64  * @perm: requested permission access using by the incoming transaction
65  *        (IOMMU_FAULT_PERM_* values)
66  * @addr: offending page address
67  * @fetch_addr: address that caused a fetch abort, if any
68  */
69 struct iommu_fault_unrecoverable {
70 	__u32	reason;
71 #define IOMMU_FAULT_UNRECOV_PASID_VALID		(1 << 0)
72 #define IOMMU_FAULT_UNRECOV_ADDR_VALID		(1 << 1)
73 #define IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID	(1 << 2)
74 	__u32	flags;
75 	__u32	pasid;
76 	__u32	perm;
77 	__u64	addr;
78 	__u64	fetch_addr;
79 };
80 
81 /**
82  * struct iommu_fault_page_request - Page Request data
83  * @flags: encodes whether the corresponding fields are valid and whether this
84  *         is the last page in group (IOMMU_FAULT_PAGE_REQUEST_* values)
85  * @pasid: Process Address Space ID
86  * @grpid: Page Request Group Index
87  * @perm: requested page permissions (IOMMU_FAULT_PERM_* values)
88  * @addr: page address
89  * @private_data: device-specific private information
90  */
91 struct iommu_fault_page_request {
92 #define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID	(1 << 0)
93 #define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE	(1 << 1)
94 #define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA	(1 << 2)
95 	__u32	flags;
96 	__u32	pasid;
97 	__u32	grpid;
98 	__u32	perm;
99 	__u64	addr;
100 	__u64	private_data[2];
101 };
102 
103 /**
104  * struct iommu_fault - Generic fault data
105  * @type: fault type from &enum iommu_fault_type
106  * @padding: reserved for future use (should be zero)
107  * @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV
108  * @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ
109  * @padding2: sets the fault size to allow for future extensions
110  */
111 struct iommu_fault {
112 	__u32	type;
113 	__u32	padding;
114 	union {
115 		struct iommu_fault_unrecoverable event;
116 		struct iommu_fault_page_request prm;
117 		__u8 padding2[56];
118 	};
119 };
120 
121 /**
122  * enum iommu_page_response_code - Return status of fault handlers
123  * @IOMMU_PAGE_RESP_SUCCESS: Fault has been handled and the page tables
124  *	populated, retry the access. This is "Success" in PCI PRI.
125  * @IOMMU_PAGE_RESP_FAILURE: General error. Drop all subsequent faults from
126  *	this device if possible. This is "Response Failure" in PCI PRI.
127  * @IOMMU_PAGE_RESP_INVALID: Could not handle this fault, don't retry the
128  *	access. This is "Invalid Request" in PCI PRI.
129  */
130 enum iommu_page_response_code {
131 	IOMMU_PAGE_RESP_SUCCESS = 0,
132 	IOMMU_PAGE_RESP_INVALID,
133 	IOMMU_PAGE_RESP_FAILURE,
134 };
135 
136 /**
137  * struct iommu_page_response - Generic page response information
138  * @version: API version of this structure
139  * @flags: encodes whether the corresponding fields are valid
140  *         (IOMMU_FAULT_PAGE_RESPONSE_* values)
141  * @pasid: Process Address Space ID
142  * @grpid: Page Request Group Index
143  * @code: response code from &enum iommu_page_response_code
144  */
145 struct iommu_page_response {
146 #define IOMMU_PAGE_RESP_VERSION_1	1
147 	__u32	version;
148 #define IOMMU_PAGE_RESP_PASID_VALID	(1 << 0)
149 	__u32	flags;
150 	__u32	pasid;
151 	__u32	grpid;
152 	__u32	code;
153 };
154 
155 #endif /* _UAPI_IOMMU_H */
156