xref: /linux/drivers/cdx/controller/mc_cdx_pcol.h (revision 42874e4eb35bdfc54f8514685e50434098ba4f6c)
1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * Driver for AMD network controllers and boards
4  *
5  * Copyright (C) 2021, Xilinx, Inc.
6  * Copyright (C) 2022-2023, Advanced Micro Devices, Inc.
7  */
8 
9 #ifndef MC_CDX_PCOL_H
10 #define MC_CDX_PCOL_H
11 
12 /* The current version of the MCDI protocol. */
13 #define MCDI_PCOL_VERSION		2
14 
15 /*
16  * Each MCDI request starts with an MCDI_HEADER, which is a 32bit
17  * structure, filled in by the client.
18  *
19  *       0       7  8     16    20     22  23  24    31
20  *      | CODE | R | LEN | SEQ | Rsvd | E | R | XFLAGS |
21  *               |                      |   |
22  *               |                      |   \--- Response
23  *               |                      \------- Error
24  *               \------------------------------ Resync (always set)
25  *
26  * The client writes its request into MC shared memory, and rings the
27  * doorbell. Each request is completed either by the MC writing
28  * back into shared memory, or by writing out an event.
29  *
30  * All MCDI commands support completion by shared memory response. Each
31  * request may also contain additional data (accounted for by HEADER.LEN),
32  * and some responses may also contain additional data (again, accounted
33  * for by HEADER.LEN).
34  *
35  * Some MCDI commands support completion by event, in which any associated
36  * response data is included in the event.
37  *
38  * The protocol requires one response to be delivered for every request; a
39  * request should not be sent unless the response for the previous request
40  * has been received (either by polling shared memory, or by receiving
41  * an event).
42  */
43 
44 /** Request/Response structure */
45 #define MCDI_HEADER_OFST		0
46 #define MCDI_HEADER_CODE_LBN		0
47 #define MCDI_HEADER_CODE_WIDTH		7
48 #define MCDI_HEADER_RESYNC_LBN		7
49 #define MCDI_HEADER_RESYNC_WIDTH	1
50 #define MCDI_HEADER_DATALEN_LBN		8
51 #define MCDI_HEADER_DATALEN_WIDTH	8
52 #define MCDI_HEADER_SEQ_LBN		16
53 #define MCDI_HEADER_SEQ_WIDTH		4
54 #define MCDI_HEADER_RSVD_LBN		20
55 #define MCDI_HEADER_RSVD_WIDTH		1
56 #define MCDI_HEADER_NOT_EPOCH_LBN	21
57 #define MCDI_HEADER_NOT_EPOCH_WIDTH	1
58 #define MCDI_HEADER_ERROR_LBN		22
59 #define MCDI_HEADER_ERROR_WIDTH		1
60 #define MCDI_HEADER_RESPONSE_LBN	23
61 #define MCDI_HEADER_RESPONSE_WIDTH	1
62 #define MCDI_HEADER_XFLAGS_LBN		24
63 #define MCDI_HEADER_XFLAGS_WIDTH	8
64 /* Request response using event */
65 #define MCDI_HEADER_XFLAGS_EVREQ	0x01
66 /* Request (and signal) early doorbell return */
67 #define MCDI_HEADER_XFLAGS_DBRET	0x02
68 
69 /* Maximum number of payload bytes */
70 #define MCDI_CTL_SDU_LEN_MAX_V2		0x400
71 
72 #define MCDI_CTL_SDU_LEN_MAX MCDI_CTL_SDU_LEN_MAX_V2
73 
74 /*
75  * The MC can generate events for two reasons:
76  *   - To advance a shared memory request if XFLAGS_EVREQ was set
77  *   - As a notification (link state, i2c event), controlled
78  *     via MC_CMD_LOG_CTRL
79  *
80  * Both events share a common structure:
81  *
82  *  0      32     33      36    44     52     60
83  * | Data | Cont | Level | Src | Code | Rsvd |
84  *           |
85  *           \ There is another event pending in this notification
86  *
87  * If Code==CMDDONE, then the fields are further interpreted as:
88  *
89  *   - LEVEL==INFO    Command succeeded
90  *   - LEVEL==ERR     Command failed
91  *
92  *    0     8         16      24     32
93  *   | Seq | Datalen | Errno | Rsvd |
94  *
95  *   These fields are taken directly out of the standard MCDI header, i.e.,
96  *   LEVEL==ERR, Datalen == 0 => Reboot
97  *
98  * Events can be squirted out of the UART (using LOG_CTRL) without a
99  * MCDI header.  An event can be distinguished from a MCDI response by
100  * examining the first byte which is 0xc0.  This corresponds to the
101  * non-existent MCDI command MC_CMD_DEBUG_LOG.
102  *
103  *      0         7        8
104  *     | command | Resync |     = 0xc0
105  *
106  * Since the event is written in big-endian byte order, this works
107  * providing bits 56-63 of the event are 0xc0.
108  *
109  *      56     60  63
110  *     | Rsvd | Code |    = 0xc0
111  *
112  * Which means for convenience the event code is 0xc for all MC
113  * generated events.
114  */
115 
116 /*
117  * the errno value may be followed by the (0-based) number of the
118  * first argument that could not be processed.
119  */
120 #define MC_CMD_ERR_ARG_OFST		4
121 
122 /* MC_CMD_ERR MCDI error codes. */
123 /* Operation not permitted. */
124 #define MC_CMD_ERR_EPERM		0x1
125 /* Non-existent command target */
126 #define MC_CMD_ERR_ENOENT		0x2
127 /* assert() has killed the MC */
128 #define MC_CMD_ERR_EINTR		0x4
129 /* I/O failure */
130 #define MC_CMD_ERR_EIO			0x5
131 /* Already exists */
132 #define MC_CMD_ERR_EEXIST		0x6
133 /* Try again */
134 #define MC_CMD_ERR_EAGAIN		0xb
135 /* Out of memory */
136 #define MC_CMD_ERR_ENOMEM		0xc
137 /* Caller does not hold required locks */
138 #define MC_CMD_ERR_EACCES		0xd
139 /* Resource is currently unavailable (e.g. lock contention) */
140 #define MC_CMD_ERR_EBUSY		0x10
141 /* No such device */
142 #define MC_CMD_ERR_ENODEV		0x13
143 /* Invalid argument to target */
144 #define MC_CMD_ERR_EINVAL		0x16
145 /* No space */
146 #define MC_CMD_ERR_ENOSPC		0x1c
147 /* Read-only */
148 #define MC_CMD_ERR_EROFS		0x1e
149 /* Broken pipe */
150 #define MC_CMD_ERR_EPIPE		0x20
151 /* Out of range */
152 #define MC_CMD_ERR_ERANGE		0x22
153 /* Non-recursive resource is already acquired */
154 #define MC_CMD_ERR_EDEADLK		0x23
155 /* Operation not implemented */
156 #define MC_CMD_ERR_ENOSYS		0x26
157 /* Operation timed out */
158 #define MC_CMD_ERR_ETIME		0x3e
159 /* Link has been severed */
160 #define MC_CMD_ERR_ENOLINK		0x43
161 /* Protocol error */
162 #define MC_CMD_ERR_EPROTO		0x47
163 /* Bad message */
164 #define MC_CMD_ERR_EBADMSG		0x4a
165 /* Operation not supported */
166 #define MC_CMD_ERR_ENOTSUP		0x5f
167 /* Address not available */
168 #define MC_CMD_ERR_EADDRNOTAVAIL	0x63
169 /* Not connected */
170 #define MC_CMD_ERR_ENOTCONN		0x6b
171 /* Operation already in progress */
172 #define MC_CMD_ERR_EALREADY		0x72
173 /* Stale handle. The handle references resource that no longer exists */
174 #define MC_CMD_ERR_ESTALE		0x74
175 /* Resource allocation failed. */
176 #define MC_CMD_ERR_ALLOC_FAIL		0x1000
177 /* V-adaptor not found. */
178 #define MC_CMD_ERR_NO_VADAPTOR		0x1001
179 /* EVB port not found. */
180 #define MC_CMD_ERR_NO_EVB_PORT		0x1002
181 /* V-switch not found. */
182 #define MC_CMD_ERR_NO_VSWITCH		0x1003
183 /* Too many VLAN tags. */
184 #define MC_CMD_ERR_VLAN_LIMIT		0x1004
185 /* Bad PCI function number. */
186 #define MC_CMD_ERR_BAD_PCI_FUNC		0x1005
187 /* Invalid VLAN mode. */
188 #define MC_CMD_ERR_BAD_VLAN_MODE	0x1006
189 /* Invalid v-switch type. */
190 #define MC_CMD_ERR_BAD_VSWITCH_TYPE	0x1007
191 /* Invalid v-port type. */
192 #define MC_CMD_ERR_BAD_VPORT_TYPE	0x1008
193 /* MAC address exists. */
194 #define MC_CMD_ERR_MAC_EXIST		0x1009
195 /* Slave core not present */
196 #define MC_CMD_ERR_SLAVE_NOT_PRESENT	0x100a
197 /* The datapath is disabled. */
198 #define MC_CMD_ERR_DATAPATH_DISABLED	0x100b
199 /* The requesting client is not a function */
200 #define MC_CMD_ERR_CLIENT_NOT_FN	0x100c
201 /*
202  * The requested operation might require the command to be passed between
203  * MCs, and the transport doesn't support that. Should only ever been seen over
204  * the UART.
205  */
206 #define MC_CMD_ERR_NO_PRIVILEGE		0x1013
207 /*
208  * Workaround 26807 could not be turned on/off because some functions
209  * have already installed filters. See the comment at
210  * MC_CMD_WORKAROUND_BUG26807. May also returned for other operations such as
211  * sub-variant switching.
212  */
213 #define MC_CMD_ERR_FILTERS_PRESENT	0x1014
214 /* The clock whose frequency you've attempted to set doesn't exist */
215 #define MC_CMD_ERR_NO_CLOCK		0x1015
216 /*
217  * Returned by MC_CMD_TESTASSERT if the action that should have caused an
218  * assertion failed to do so.
219  */
220 #define MC_CMD_ERR_UNREACHABLE		0x1016
221 /*
222  * This command needs to be processed in the background but there were no
223  * resources to do so. Send it again after a command has completed.
224  */
225 #define MC_CMD_ERR_QUEUE_FULL		0x1017
226 /*
227  * The operation could not be completed because the PCIe link has gone
228  * away. This error code is never expected to be returned over the TLP
229  * transport.
230  */
231 #define MC_CMD_ERR_NO_PCIE		0x1018
232 /*
233  * The operation could not be completed because the datapath has gone
234  * away. This is distinct from MC_CMD_ERR_DATAPATH_DISABLED in that the
235  * datapath absence may be temporary
236  */
237 #define MC_CMD_ERR_NO_DATAPATH		0x1019
238 /* The operation could not complete because some VIs are allocated */
239 #define MC_CMD_ERR_VIS_PRESENT		0x101a
240 /*
241  * The operation could not complete because some PIO buffers are
242  * allocated
243  */
244 #define MC_CMD_ERR_PIOBUFS_PRESENT	0x101b
245 
246 /***********************************/
247 /*
248  * MC_CMD_CDX_BUS_ENUM_BUSES
249  * CDX bus hosts devices (functions) that are implemented using the Composable
250  * DMA subsystem and directly mapped into the memory space of the FGPA PSX
251  * Application Processors (APUs). As such, they only apply to the PSX APU side,
252  * not the host (PCIe). Unlike PCIe, these devices have no native configuration
253  * space or enumeration mechanism, so this message set provides a minimal
254  * interface for discovery and management (bus reset, FLR, BME) of such
255  * devices. This command returns the number of CDX buses present in the system.
256  */
257 #define MC_CMD_CDX_BUS_ENUM_BUSES				0x1
258 #define MC_CMD_CDX_BUS_ENUM_BUSES_MSGSET			0x1
259 #undef MC_CMD_0x1_PRIVILEGE_CTG
260 
261 #define MC_CMD_0x1_PRIVILEGE_CTG SRIOV_CTG_ADMIN
262 
263 /* MC_CMD_CDX_BUS_ENUM_BUSES_IN msgrequest */
264 #define MC_CMD_CDX_BUS_ENUM_BUSES_IN_LEN			0
265 
266 /* MC_CMD_CDX_BUS_ENUM_BUSES_OUT msgresponse */
267 #define MC_CMD_CDX_BUS_ENUM_BUSES_OUT_LEN			4
268 /*
269  * Number of CDX buses present in the system. Buses are numbered 0 to
270  * BUS_COUNT-1
271  */
272 #define MC_CMD_CDX_BUS_ENUM_BUSES_OUT_BUS_COUNT_OFST		0
273 #define MC_CMD_CDX_BUS_ENUM_BUSES_OUT_BUS_COUNT_LEN		4
274 
275 /***********************************/
276 /*
277  * MC_CMD_CDX_BUS_ENUM_DEVICES
278  * Enumerate CDX bus devices on a given bus
279  */
280 #define MC_CMD_CDX_BUS_ENUM_DEVICES				0x2
281 #define MC_CMD_CDX_BUS_ENUM_DEVICES_MSGSET			0x2
282 #undef MC_CMD_0x2_PRIVILEGE_CTG
283 
284 #define MC_CMD_0x2_PRIVILEGE_CTG SRIOV_CTG_ADMIN
285 
286 /* MC_CMD_CDX_BUS_ENUM_DEVICES_IN msgrequest */
287 #define MC_CMD_CDX_BUS_ENUM_DEVICES_IN_LEN			4
288 /*
289  * Bus number to enumerate, in range 0 to BUS_COUNT-1, as returned by
290  * MC_CMD_CDX_BUS_ENUM_BUSES_OUT
291  */
292 #define MC_CMD_CDX_BUS_ENUM_DEVICES_IN_BUS_OFST			0
293 #define MC_CMD_CDX_BUS_ENUM_DEVICES_IN_BUS_LEN			4
294 
295 /* MC_CMD_CDX_BUS_ENUM_DEVICES_OUT msgresponse */
296 #define MC_CMD_CDX_BUS_ENUM_DEVICES_OUT_LEN			4
297 /*
298  * Number of devices present on the bus. Devices on the bus are numbered 0 to
299  * DEVICE_COUNT-1. Returns EAGAIN if number of devices unknown or if the target
300  * devices are not ready (e.g. undergoing a bus reset)
301  */
302 #define MC_CMD_CDX_BUS_ENUM_DEVICES_OUT_DEVICE_COUNT_OFST	0
303 #define MC_CMD_CDX_BUS_ENUM_DEVICES_OUT_DEVICE_COUNT_LEN	4
304 
305 /***********************************/
306 /*
307  * MC_CMD_CDX_BUS_GET_DEVICE_CONFIG
308  * Returns device identification and MMIO/MSI resource data for a CDX device.
309  * The expected usage is for the caller to first retrieve the number of devices
310  * on the bus using MC_CMD_BUS_ENUM_DEVICES, then loop through the range (0,
311  * DEVICE_COUNT - 1), retrieving device resource data. May return EAGAIN if the
312  * number of exposed devices or device resources change during enumeration (due
313  * to e.g. a PL reload / bus reset), in which case the caller is expected to
314  * restart the enumeration loop. MMIO addresses are specified in terms of bus
315  * addresses (prior to any potential IOMMU translation). For versal-net, these
316  * are equivalent to APU physical addresses. Implementation note - for this to
317  * work, the implementation needs to keep state (generation count) per client.
318  */
319 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG					0x3
320 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_MSGSET					0x3
321 #undef MC_CMD_0x3_PRIVILEGE_CTG
322 
323 #define MC_CMD_0x3_PRIVILEGE_CTG SRIOV_CTG_ADMIN
324 
325 /* MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN msgrequest */
326 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN_LEN					8
327 /* Device bus number, in range 0 to BUS_COUNT-1 */
328 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN_BUS_OFST				0
329 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN_BUS_LEN				4
330 /* Device number relative to the bus, in range 0 to DEVICE_COUNT-1 for that bus */
331 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN_DEVICE_OFST				4
332 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_IN_DEVICE_LEN				4
333 
334 /* MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT msgresponse */
335 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_LEN				88
336 /* 16-bit Vendor identifier, compliant with PCI-SIG VendorID assignment. */
337 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_VENDOR_ID_OFST			0
338 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_VENDOR_ID_LEN			2
339 /* 16-bit Device ID assigned by the vendor */
340 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_ID_OFST			2
341 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_ID_LEN			2
342 /*
343  * 16-bit Subsystem Vendor ID, , compliant with PCI-SIG VendorID assignment.
344  * For further device differentiation, as required. 0 if unused.
345  */
346 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_VENDOR_ID_OFST		4
347 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_VENDOR_ID_LEN		2
348 /*
349  * 16-bit Subsystem Device ID assigned by the vendor. For further device
350  * differentiation, as required. 0 if unused.
351  */
352 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_DEVICE_ID_OFST		6
353 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_DEVICE_ID_LEN		2
354 /* 24-bit Device Class code, compliant with PCI-SIG Device Class codes */
355 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_CLASS_OFST			8
356 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_CLASS_LEN			3
357 /* 8-bit vendor-assigned revision */
358 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_REVISION_OFST		11
359 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_REVISION_LEN		1
360 /* Reserved (alignment) */
361 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_RESERVED_OFST			12
362 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_RESERVED_LEN			4
363 /* MMIO region 0 base address (bus address), 0 if unused */
364 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_OFST		16
365 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_LEN		8
366 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_LO_OFST		16
367 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_LO_LEN		4
368 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_LO_LBN		128
369 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_LO_WIDTH		32
370 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_HI_OFST		20
371 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_HI_LEN		4
372 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_HI_LBN		160
373 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_BASE_HI_WIDTH		32
374 /* MMIO region 0 size, 0 if unused */
375 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_OFST		24
376 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_LEN		8
377 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_LO_OFST		24
378 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_LO_LEN		4
379 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_LO_LBN		192
380 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_LO_WIDTH		32
381 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_HI_OFST		28
382 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_HI_LEN		4
383 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_HI_LBN		224
384 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION0_SIZE_HI_WIDTH		32
385 /* MMIO region 1 base address (bus address), 0 if unused */
386 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_OFST		32
387 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_LEN		8
388 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_LO_OFST		32
389 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_LO_LEN		4
390 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_LO_LBN		256
391 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_LO_WIDTH		32
392 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_HI_OFST		36
393 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_HI_LEN		4
394 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_HI_LBN		288
395 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_BASE_HI_WIDTH		32
396 /* MMIO region 1 size, 0 if unused */
397 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_OFST		40
398 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_LEN		8
399 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_LO_OFST		40
400 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_LO_LEN		4
401 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_LO_LBN		320
402 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_LO_WIDTH		32
403 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_HI_OFST		44
404 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_HI_LEN		4
405 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_HI_LBN		352
406 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION1_SIZE_HI_WIDTH		32
407 /* MMIO region 2 base address (bus address), 0 if unused */
408 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_OFST		48
409 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_LEN		8
410 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_LO_OFST		48
411 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_LO_LEN		4
412 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_LO_LBN		384
413 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_LO_WIDTH		32
414 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_HI_OFST		52
415 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_HI_LEN		4
416 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_HI_LBN		416
417 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_BASE_HI_WIDTH		32
418 /* MMIO region 2 size, 0 if unused */
419 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_OFST		56
420 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_LEN		8
421 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_LO_OFST		56
422 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_LO_LEN		4
423 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_LO_LBN		448
424 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_LO_WIDTH		32
425 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_HI_OFST		60
426 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_HI_LEN		4
427 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_HI_LBN		480
428 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION2_SIZE_HI_WIDTH		32
429 /* MMIO region 3 base address (bus address), 0 if unused */
430 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_OFST		64
431 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_LEN		8
432 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_LO_OFST		64
433 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_LO_LEN		4
434 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_LO_LBN		512
435 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_LO_WIDTH		32
436 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_HI_OFST		68
437 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_HI_LEN		4
438 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_HI_LBN		544
439 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_BASE_HI_WIDTH		32
440 /* MMIO region 3 size, 0 if unused */
441 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_OFST		72
442 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_LEN		8
443 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_LO_OFST		72
444 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_LO_LEN		4
445 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_LO_LBN		576
446 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_LO_WIDTH		32
447 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_HI_OFST		76
448 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_HI_LEN		4
449 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_HI_LBN		608
450 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MMIO_REGION3_SIZE_HI_WIDTH		32
451 /* MSI vector count */
452 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MSI_COUNT_OFST			80
453 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_MSI_COUNT_LEN			4
454 /* Requester ID used by device (SMMU StreamID, GIC ITS DeviceID) */
455 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_REQUESTER_ID_OFST			84
456 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_REQUESTER_ID_LEN			4
457 
458 /***********************************/
459 /*
460  * MC_CMD_CDX_BUS_DOWN
461  * Asserting reset on the CDX bus causes all devices on the bus to be quiesced.
462  * DMA bus mastering is disabled and any pending DMA request are flushed. Once
463  * the response is returned, the devices are guaranteed to no longer issue DMA
464  * requests or raise MSI interrupts. Further device MMIO accesses may have
465  * undefined results. While the bus reset is asserted, any of the enumeration
466  * or device configuration MCDIs will fail with EAGAIN. It is only legal to
467  * reload the relevant PL region containing CDX devices if the corresponding CDX
468  * bus is in reset. Depending on the implementation, the firmware may or may
469  * not enforce this restriction and it is up to the caller to make sure this
470  * requirement is satisfied.
471  */
472 #define MC_CMD_CDX_BUS_DOWN					0x4
473 #define MC_CMD_CDX_BUS_DOWN_MSGSET			0x4
474 
475 /* MC_CMD_CDX_BUS_DOWN_IN msgrequest */
476 #define MC_CMD_CDX_BUS_DOWN_IN_LEN			4
477 /* Bus number to put in reset, in range 0 to BUS_COUNT-1 */
478 #define MC_CMD_CDX_BUS_DOWN_IN_BUS_OFST		0
479 #define MC_CMD_CDX_BUS_DOWN_IN_BUS_LEN		4
480 
481 /*
482  * MC_CMD_CDX_BUS_DOWN_OUT msgresponse: The bus is quiesced, no further
483  * upstream traffic for devices on this bus.
484  */
485 #define MC_CMD_CDX_BUS_DOWN_OUT_LEN			0
486 
487 /***********************************/
488 /*
489  * MC_CMD_CDX_BUS_UP
490  * After bus reset is de-asserted, devices are in a state which is functionally
491  * equivalent to each device having been reset with MC_CMD_CDX_DEVICE_RESET. In
492  * other words, device logic is reset in a hardware-specific way, MMIO accesses
493  * are forwarded to the device, DMA bus mastering is disabled and needs to be
494  * re-enabled with MC_CMD_CDX_DEVICE_DMA_ENABLE once the driver is ready to
495  * start servicing DMA. If the underlying number of devices or device resources
496  * changed (e.g. if PL was reloaded) while the bus was in reset, the bus driver
497  * is expected to re-enumerate the bus. Returns EALREADY if the bus was already
498  * up before the call.
499  */
500 #define MC_CMD_CDX_BUS_UP					0x5
501 #define MC_CMD_CDX_BUS_UP_MSGSET			0x5
502 
503 /* MC_CMD_CDX_BUS_UP_IN msgrequest */
504 #define MC_CMD_CDX_BUS_UP_IN_LEN			4
505 /* Bus number to take out of reset, in range 0 to BUS_COUNT-1 */
506 #define MC_CMD_CDX_BUS_UP_IN_BUS_OFST		0
507 #define MC_CMD_CDX_BUS_UP_IN_BUS_LEN		4
508 
509 /* MC_CMD_CDX_BUS_UP_OUT msgresponse: The bus can now be enumerated. */
510 #define MC_CMD_CDX_BUS_UP_OUT_LEN			0
511 
512 /***********************************/
513 /*
514  * MC_CMD_CDX_DEVICE_RESET
515  * After this call completes, device DMA and interrupts are quiesced, devices
516  * logic is reset in a hardware-specific way and DMA bus mastering is disabled.
517  */
518 #define MC_CMD_CDX_DEVICE_RESET				0x6
519 #define MC_CMD_CDX_DEVICE_RESET_MSGSET			0x6
520 #undef MC_CMD_0x6_PRIVILEGE_CTG
521 
522 #define MC_CMD_0x6_PRIVILEGE_CTG SRIOV_CTG_ADMIN
523 
524 /* MC_CMD_CDX_DEVICE_RESET_IN msgrequest */
525 #define MC_CMD_CDX_DEVICE_RESET_IN_LEN			8
526 /* Device bus number, in range 0 to BUS_COUNT-1 */
527 #define MC_CMD_CDX_DEVICE_RESET_IN_BUS_OFST		0
528 #define MC_CMD_CDX_DEVICE_RESET_IN_BUS_LEN		4
529 /* Device number relative to the bus, in range 0 to DEVICE_COUNT-1 for that bus */
530 #define MC_CMD_CDX_DEVICE_RESET_IN_DEVICE_OFST		4
531 #define MC_CMD_CDX_DEVICE_RESET_IN_DEVICE_LEN		4
532 
533 /*
534  * MC_CMD_CDX_DEVICE_RESET_OUT msgresponse: The device is quiesced and all
535  * pending device initiated DMA has completed.
536  */
537 #define MC_CMD_CDX_DEVICE_RESET_OUT_LEN 0
538 
539 /***********************************/
540 /*
541  * MC_CMD_CDX_DEVICE_CONTROL_SET
542  * If BUS_MASTER is set to disabled, device DMA and interrupts are quiesced.
543  * Pending DMA requests and MSI interrupts are flushed and no further DMA or
544  * interrupts are issued after this command returns. If BUS_MASTER is set to
545  * enabled, device is allowed to initiate DMA. Whether interrupts are enabled
546  * also depends on the value of MSI_ENABLE bit. Note that, in this case, the
547  * device may start DMA before the host receives and processes the MCDI
548  * response. MSI_ENABLE masks or unmasks device interrupts only. Note that for
549  * interrupts to be delivered to the host, both BUS_MASTER and MSI_ENABLE needs
550  * to be set. MMIO_REGIONS_ENABLE enables or disables host accesses to device
551  * MMIO regions. Note that an implementation is allowed to permanently set this
552  * bit to 1, in which case MC_CMD_CDX_DEVICE_CONTROL_GET will always return 1
553  * for this bit, regardless of the value set here.
554  */
555 #define MC_CMD_CDX_DEVICE_CONTROL_SET					0x7
556 #define MC_CMD_CDX_DEVICE_CONTROL_SET_MSGSET				0x7
557 #undef MC_CMD_0x7_PRIVILEGE_CTG
558 
559 #define MC_CMD_0x7_PRIVILEGE_CTG SRIOV_CTG_ADMIN
560 
561 /* MC_CMD_CDX_DEVICE_CONTROL_SET_IN msgrequest */
562 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_LEN				12
563 /* Device bus number, in range 0 to BUS_COUNT-1 */
564 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_BUS_OFST			0
565 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_BUS_LEN			4
566 /* Device number relative to the bus, in range 0 to DEVICE_COUNT-1 for that bus */
567 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_DEVICE_OFST			4
568 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_DEVICE_LEN			4
569 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_FLAGS_OFST			8
570 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_FLAGS_LEN			4
571 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_BUS_MASTER_ENABLE_OFST		8
572 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_BUS_MASTER_ENABLE_LBN		0
573 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_BUS_MASTER_ENABLE_WIDTH	1
574 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MSI_ENABLE_OFST		8
575 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MSI_ENABLE_LBN			1
576 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MSI_ENABLE_WIDTH		1
577 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MMIO_REGIONS_ENABLE_OFST	8
578 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MMIO_REGIONS_ENABLE_LBN	2
579 #define MC_CMD_CDX_DEVICE_CONTROL_SET_IN_MMIO_REGIONS_ENABLE_WIDTH	1
580 
581 /* MC_CMD_CDX_DEVICE_CONTROL_SET_OUT msgresponse */
582 #define MC_CMD_CDX_DEVICE_CONTROL_SET_OUT_LEN				0
583 
584 /***********************************/
585 /*
586  * MC_CMD_CDX_DEVICE_CONTROL_GET
587  * Returns device DMA, interrupt and MMIO region access control bits. See
588  * MC_CMD_CDX_DEVICE_CONTROL_SET for definition of the available control bits.
589  */
590 #define MC_CMD_CDX_DEVICE_CONTROL_GET					0x8
591 #define MC_CMD_CDX_DEVICE_CONTROL_GET_MSGSET				0x8
592 #undef MC_CMD_0x8_PRIVILEGE_CTG
593 
594 #define MC_CMD_0x8_PRIVILEGE_CTG SRIOV_CTG_ADMIN
595 
596 /* MC_CMD_CDX_DEVICE_CONTROL_GET_IN msgrequest */
597 #define MC_CMD_CDX_DEVICE_CONTROL_GET_IN_LEN				8
598 /* Device bus number, in range 0 to BUS_COUNT-1 */
599 #define MC_CMD_CDX_DEVICE_CONTROL_GET_IN_BUS_OFST			0
600 #define MC_CMD_CDX_DEVICE_CONTROL_GET_IN_BUS_LEN			4
601 /* Device number relative to the bus, in range 0 to DEVICE_COUNT-1 for that bus */
602 #define MC_CMD_CDX_DEVICE_CONTROL_GET_IN_DEVICE_OFST			4
603 #define MC_CMD_CDX_DEVICE_CONTROL_GET_IN_DEVICE_LEN			4
604 
605 /* MC_CMD_CDX_DEVICE_CONTROL_GET_OUT msgresponse */
606 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_LEN				4
607 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_FLAGS_OFST			0
608 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_FLAGS_LEN			4
609 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_BUS_MASTER_ENABLE_OFST	0
610 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_BUS_MASTER_ENABLE_LBN		0
611 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_BUS_MASTER_ENABLE_WIDTH	1
612 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MSI_ENABLE_OFST		0
613 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MSI_ENABLE_LBN		1
614 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MSI_ENABLE_WIDTH		1
615 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MMIO_REGIONS_ENABLE_OFST	0
616 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MMIO_REGIONS_ENABLE_LBN	2
617 #define MC_CMD_CDX_DEVICE_CONTROL_GET_OUT_MMIO_REGIONS_ENABLE_WIDTH	1
618 
619 /***********************************/
620 /* MC_CMD_V2_EXTN - Encapsulation for a v2 extended command */
621 #define MC_CMD_V2_EXTN					0x7f
622 
623 /* MC_CMD_V2_EXTN_IN msgrequest */
624 #define MC_CMD_V2_EXTN_IN_LEN				4
625 /* the extended command number */
626 #define MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN		0
627 #define MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH		15
628 #define MC_CMD_V2_EXTN_IN_UNUSED_LBN			15
629 #define MC_CMD_V2_EXTN_IN_UNUSED_WIDTH			1
630 /* the actual length of the encapsulated command */
631 #define MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN		16
632 #define MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH		10
633 #define MC_CMD_V2_EXTN_IN_UNUSED2_LBN			26
634 #define MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH			2
635 /* Type of command/response */
636 #define MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN		28
637 #define MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH		4
638 /*
639  * enum: MCDI command directed to versal-net. MCDI responses of this type
640  * are not defined.
641  */
642 #define MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_PLATFORM	0x2
643 
644 #endif /* MC_CDX_PCOL_H */
645