1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Virtio-iommu definition v0.12
4  *
5  * Copyright (C) 2019 Arm Ltd.
6  */
7 #ifndef _LINUX_VIRTIO_IOMMU_H
8 #define _LINUX_VIRTIO_IOMMU_H
9 
10 #include "standard-headers/linux/types.h"
11 
12 /* Feature bits */
13 #define VIRTIO_IOMMU_F_INPUT_RANGE		0
14 #define VIRTIO_IOMMU_F_DOMAIN_RANGE		1
15 #define VIRTIO_IOMMU_F_MAP_UNMAP		2
16 #define VIRTIO_IOMMU_F_BYPASS			3
17 #define VIRTIO_IOMMU_F_PROBE			4
18 #define VIRTIO_IOMMU_F_MMIO			5
19 #define VIRTIO_IOMMU_F_BYPASS_CONFIG		6
20 
21 struct virtio_iommu_range_64 {
22 	uint64_t					start;
23 	uint64_t					end;
24 };
25 
26 struct virtio_iommu_range_32 {
27 	uint32_t					start;
28 	uint32_t					end;
29 };
30 
31 struct virtio_iommu_config {
32 	/* Supported page sizes */
33 	uint64_t					page_size_mask;
34 	/* Supported IOVA range */
35 	struct virtio_iommu_range_64		input_range;
36 	/* Max domain ID size */
37 	struct virtio_iommu_range_32		domain_range;
38 	/* Probe buffer size */
39 	uint32_t					probe_size;
40 	uint8_t					bypass;
41 	uint8_t					reserved[3];
42 };
43 
44 /* Request types */
45 #define VIRTIO_IOMMU_T_ATTACH			0x01
46 #define VIRTIO_IOMMU_T_DETACH			0x02
47 #define VIRTIO_IOMMU_T_MAP			0x03
48 #define VIRTIO_IOMMU_T_UNMAP			0x04
49 #define VIRTIO_IOMMU_T_PROBE			0x05
50 
51 /* Status types */
52 #define VIRTIO_IOMMU_S_OK			0x00
53 #define VIRTIO_IOMMU_S_IOERR			0x01
54 #define VIRTIO_IOMMU_S_UNSUPP			0x02
55 #define VIRTIO_IOMMU_S_DEVERR			0x03
56 #define VIRTIO_IOMMU_S_INVAL			0x04
57 #define VIRTIO_IOMMU_S_RANGE			0x05
58 #define VIRTIO_IOMMU_S_NOENT			0x06
59 #define VIRTIO_IOMMU_S_FAULT			0x07
60 #define VIRTIO_IOMMU_S_NOMEM			0x08
61 
62 struct virtio_iommu_req_head {
63 	uint8_t					type;
64 	uint8_t					reserved[3];
65 };
66 
67 struct virtio_iommu_req_tail {
68 	uint8_t					status;
69 	uint8_t					reserved[3];
70 };
71 
72 #define VIRTIO_IOMMU_ATTACH_F_BYPASS		(1 << 0)
73 
74 struct virtio_iommu_req_attach {
75 	struct virtio_iommu_req_head		head;
76 	uint32_t					domain;
77 	uint32_t					endpoint;
78 	uint32_t					flags;
79 	uint8_t					reserved[4];
80 	struct virtio_iommu_req_tail		tail;
81 };
82 
83 struct virtio_iommu_req_detach {
84 	struct virtio_iommu_req_head		head;
85 	uint32_t					domain;
86 	uint32_t					endpoint;
87 	uint8_t					reserved[8];
88 	struct virtio_iommu_req_tail		tail;
89 };
90 
91 #define VIRTIO_IOMMU_MAP_F_READ			(1 << 0)
92 #define VIRTIO_IOMMU_MAP_F_WRITE		(1 << 1)
93 #define VIRTIO_IOMMU_MAP_F_MMIO			(1 << 2)
94 
95 #define VIRTIO_IOMMU_MAP_F_MASK			(VIRTIO_IOMMU_MAP_F_READ |	\
96 						 VIRTIO_IOMMU_MAP_F_WRITE |	\
97 						 VIRTIO_IOMMU_MAP_F_MMIO)
98 
99 struct virtio_iommu_req_map {
100 	struct virtio_iommu_req_head		head;
101 	uint32_t					domain;
102 	uint64_t					virt_start;
103 	uint64_t					virt_end;
104 	uint64_t					phys_start;
105 	uint32_t					flags;
106 	struct virtio_iommu_req_tail		tail;
107 };
108 
109 struct virtio_iommu_req_unmap {
110 	struct virtio_iommu_req_head		head;
111 	uint32_t					domain;
112 	uint64_t					virt_start;
113 	uint64_t					virt_end;
114 	uint8_t					reserved[4];
115 	struct virtio_iommu_req_tail		tail;
116 };
117 
118 #define VIRTIO_IOMMU_PROBE_T_NONE		0
119 #define VIRTIO_IOMMU_PROBE_T_RESV_MEM		1
120 
121 #define VIRTIO_IOMMU_PROBE_T_MASK		0xfff
122 
123 struct virtio_iommu_probe_property {
124 	uint16_t					type;
125 	uint16_t					length;
126 };
127 
128 #define VIRTIO_IOMMU_RESV_MEM_T_RESERVED	0
129 #define VIRTIO_IOMMU_RESV_MEM_T_MSI		1
130 
131 struct virtio_iommu_probe_resv_mem {
132 	struct virtio_iommu_probe_property	head;
133 	uint8_t					subtype;
134 	uint8_t					reserved[3];
135 	uint64_t					start;
136 	uint64_t					end;
137 };
138 
139 struct virtio_iommu_req_probe {
140 	struct virtio_iommu_req_head		head;
141 	uint32_t					endpoint;
142 	uint8_t					reserved[64];
143 
144 	uint8_t					properties[];
145 
146 	/*
147 	 * Tail follows the variable-length properties array. No padding,
148 	 * property lengths are all aligned on 8 bytes.
149 	 */
150 };
151 
152 /* Fault types */
153 #define VIRTIO_IOMMU_FAULT_R_UNKNOWN		0
154 #define VIRTIO_IOMMU_FAULT_R_DOMAIN		1
155 #define VIRTIO_IOMMU_FAULT_R_MAPPING		2
156 
157 #define VIRTIO_IOMMU_FAULT_F_READ		(1 << 0)
158 #define VIRTIO_IOMMU_FAULT_F_WRITE		(1 << 1)
159 #define VIRTIO_IOMMU_FAULT_F_EXEC		(1 << 2)
160 #define VIRTIO_IOMMU_FAULT_F_ADDRESS		(1 << 8)
161 
162 struct virtio_iommu_fault {
163 	uint8_t					reason;
164 	uint8_t					reserved[3];
165 	uint32_t					flags;
166 	uint32_t					endpoint;
167 	uint8_t					reserved2[4];
168 	uint64_t					address;
169 };
170 
171 #endif
172