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 | * When IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID is set, the page response |
86 | * must have the same PASID value as the page request. When it is clear, |
87 | * the page response should not have a PASID. |
88 | * @pasid: Process Address Space ID |
89 | * @grpid: Page Request Group Index |
90 | * @perm: requested page permissions (IOMMU_FAULT_PERM_* values) |
91 | * @addr: page address |
92 | * @private_data: device-specific private information |
93 | */ |
94 | struct iommu_fault_page_request { |
95 | #define IOMMU_FAULT_PAGE_REQUEST_PASID_VALID (1 << 0) |
96 | #define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE (1 << 1) |
97 | #define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA (1 << 2) |
98 | #define IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID (1 << 3) |
99 | __u32 flags; |
100 | __u32 pasid; |
101 | __u32 grpid; |
102 | __u32 perm; |
103 | __u64 addr; |
104 | __u64 private_data[2]; |
105 | }; |
106 | |
107 | /** |
108 | * struct iommu_fault - Generic fault data |
109 | * @type: fault type from &enum iommu_fault_type |
110 | * @padding: reserved for future use (should be zero) |
111 | * @event: fault event, when @type is %IOMMU_FAULT_DMA_UNRECOV |
112 | * @prm: Page Request message, when @type is %IOMMU_FAULT_PAGE_REQ |
113 | * @padding2: sets the fault size to allow for future extensions |
114 | */ |
115 | struct iommu_fault { |
116 | __u32 type; |
117 | __u32 padding; |
118 | union { |
119 | struct iommu_fault_unrecoverable event; |
120 | struct iommu_fault_page_request prm; |
121 | __u8 padding2[56]; |
122 | }; |
123 | }; |
124 | |
125 | /** |
126 | * enum iommu_page_response_code - Return status of fault handlers |
127 | * @IOMMU_PAGE_RESP_SUCCESS: Fault has been handled and the page tables |
128 | * populated, retry the access. This is "Success" in PCI PRI. |
129 | * @IOMMU_PAGE_RESP_FAILURE: General error. Drop all subsequent faults from |
130 | * this device if possible. This is "Response Failure" in PCI PRI. |
131 | * @IOMMU_PAGE_RESP_INVALID: Could not handle this fault, don't retry the |
132 | * access. This is "Invalid Request" in PCI PRI. |
133 | */ |
134 | enum iommu_page_response_code { |
135 | IOMMU_PAGE_RESP_SUCCESS = 0, |
136 | IOMMU_PAGE_RESP_INVALID, |
137 | IOMMU_PAGE_RESP_FAILURE, |
138 | }; |
139 | |
140 | /** |
141 | * struct iommu_page_response - Generic page response information |
142 | * @argsz: User filled size of this data |
143 | * @version: API version of this structure |
144 | * @flags: encodes whether the corresponding fields are valid |
145 | * (IOMMU_FAULT_PAGE_RESPONSE_* values) |
146 | * @pasid: Process Address Space ID |
147 | * @grpid: Page Request Group Index |
148 | * @code: response code from &enum iommu_page_response_code |
149 | */ |
150 | struct iommu_page_response { |
151 | __u32 argsz; |
152 | #define IOMMU_PAGE_RESP_VERSION_1 1 |
153 | __u32 version; |
154 | #define IOMMU_PAGE_RESP_PASID_VALID (1 << 0) |
155 | __u32 flags; |
156 | __u32 pasid; |
157 | __u32 grpid; |
158 | __u32 code; |
159 | }; |
160 | |
161 | #endif /* _UAPI_IOMMU_H */ |
162 | |