xref: /linux/include/linux/pds/pds_adminq.h (revision f088104d837a991c65e51fa30bb4196169b3244d) !
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright(c) 2023 Advanced Micro Devices, Inc */
3 
4 #ifndef _PDS_CORE_ADMINQ_H_
5 #define _PDS_CORE_ADMINQ_H_
6 
7 #define PDSC_ADMINQ_MAX_POLL_INTERVAL	256000	/* usecs */
8 
9 enum pds_core_adminq_flags {
10 	PDS_AQ_FLAG_FASTPOLL	= BIT(1),	/* completion poll at 1ms */
11 };
12 
13 /*
14  * enum pds_core_adminq_opcode - AdminQ command opcodes
15  * These commands are only processed on AdminQ, not available in devcmd
16  */
17 enum pds_core_adminq_opcode {
18 	PDS_AQ_CMD_NOP			= 0,
19 
20 	/* Client control */
21 	PDS_AQ_CMD_CLIENT_REG		= 6,
22 	PDS_AQ_CMD_CLIENT_UNREG		= 7,
23 	PDS_AQ_CMD_CLIENT_CMD		= 8,
24 
25 	/* LIF commands */
26 	PDS_AQ_CMD_LIF_IDENTIFY		= 20,
27 	PDS_AQ_CMD_LIF_INIT		= 21,
28 	PDS_AQ_CMD_LIF_RESET		= 22,
29 	PDS_AQ_CMD_LIF_GETATTR		= 23,
30 	PDS_AQ_CMD_LIF_SETATTR		= 24,
31 	PDS_AQ_CMD_LIF_SETPHC		= 25,
32 
33 	PDS_AQ_CMD_RX_MODE_SET		= 30,
34 	PDS_AQ_CMD_RX_FILTER_ADD	= 31,
35 	PDS_AQ_CMD_RX_FILTER_DEL	= 32,
36 
37 	/* Queue commands */
38 	PDS_AQ_CMD_Q_IDENTIFY		= 39,
39 	PDS_AQ_CMD_Q_INIT		= 40,
40 	PDS_AQ_CMD_Q_CONTROL		= 41,
41 
42 	/* SR/IOV commands */
43 	PDS_AQ_CMD_VF_GETATTR		= 60,
44 	PDS_AQ_CMD_VF_SETATTR		= 61,
45 };
46 
47 /*
48  * enum pds_core_notifyq_opcode - NotifyQ event codes
49  */
50 enum pds_core_notifyq_opcode {
51 	PDS_EVENT_LINK_CHANGE		= 1,
52 	PDS_EVENT_RESET			= 2,
53 	PDS_EVENT_XCVR			= 5,
54 	PDS_EVENT_CLIENT		= 6,
55 };
56 
57 #define PDS_COMP_COLOR_MASK  0x80
58 
59 /**
60  * struct pds_core_notifyq_event - Generic event reporting structure
61  * @eid:   event number
62  * @ecode: event code
63  *
64  * This is the generic event report struct from which the other
65  * actual events will be formed.
66  */
67 struct pds_core_notifyq_event {
68 	__le64 eid;
69 	__le16 ecode;
70 };
71 
72 /**
73  * struct pds_core_link_change_event - Link change event notification
74  * @eid:		event number
75  * @ecode:		event code = PDS_EVENT_LINK_CHANGE
76  * @link_status:	link up/down, with error bits
77  * @link_speed:		speed of the network link
78  *
79  * Sent when the network link state changes between UP and DOWN
80  */
81 struct pds_core_link_change_event {
82 	__le64 eid;
83 	__le16 ecode;
84 	__le16 link_status;
85 	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
86 };
87 
88 /**
89  * struct pds_core_reset_event - Reset event notification
90  * @eid:		event number
91  * @ecode:		event code = PDS_EVENT_RESET
92  * @reset_code:		reset type
93  * @state:		0=pending, 1=complete, 2=error
94  *
95  * Sent when the NIC or some subsystem is going to be or
96  * has been reset.
97  */
98 struct pds_core_reset_event {
99 	__le64 eid;
100 	__le16 ecode;
101 	u8     reset_code;
102 	u8     state;
103 };
104 
105 /**
106  * struct pds_core_client_event - Client event notification
107  * @eid:		event number
108  * @ecode:		event code = PDS_EVENT_CLIENT
109  * @client_id:          client to sent event to
110  * @client_event:       wrapped event struct for the client
111  *
112  * Sent when an event needs to be passed on to a client
113  */
114 struct pds_core_client_event {
115 	__le64 eid;
116 	__le16 ecode;
117 	__le16 client_id;
118 	u8     client_event[54];
119 };
120 
121 /**
122  * struct pds_core_notifyq_cmd - Placeholder for building qcq
123  * @data:      anonymous field for building the qcq
124  */
125 struct pds_core_notifyq_cmd {
126 	__le32 data;	/* Not used but needed for qcq structure */
127 };
128 
129 /*
130  * union pds_core_notifyq_comp - Overlay of notifyq event structures
131  */
132 union pds_core_notifyq_comp {
133 	struct {
134 		__le64 eid;
135 		__le16 ecode;
136 	};
137 	struct pds_core_notifyq_event     event;
138 	struct pds_core_link_change_event link_change;
139 	struct pds_core_reset_event       reset;
140 	u8     data[64];
141 };
142 
143 #define PDS_DEVNAME_LEN		32
144 /**
145  * struct pds_core_client_reg_cmd - Register a new client with DSC
146  * @opcode:         opcode PDS_AQ_CMD_CLIENT_REG
147  * @rsvd:           word boundary padding
148  * @devname:        text name of client device
149  * @vif_type:       what type of device (enum pds_core_vif_types)
150  *
151  * Tell the DSC of the new client, and receive a client_id from DSC.
152  */
153 struct pds_core_client_reg_cmd {
154 	u8     opcode;
155 	u8     rsvd[3];
156 	char   devname[PDS_DEVNAME_LEN];
157 	u8     vif_type;
158 };
159 
160 /**
161  * struct pds_core_client_reg_comp - Client registration completion
162  * @status:     Status of the command (enum pdc_core_status_code)
163  * @rsvd:       Word boundary padding
164  * @comp_index: Index in the descriptor ring for which this is the completion
165  * @client_id:  New id assigned by DSC
166  * @rsvd1:      Word boundary padding
167  * @color:      Color bit
168  */
169 struct pds_core_client_reg_comp {
170 	u8     status;
171 	u8     rsvd;
172 	__le16 comp_index;
173 	__le16 client_id;
174 	u8     rsvd1[9];
175 	u8     color;
176 };
177 
178 /**
179  * struct pds_core_client_unreg_cmd - Unregister a client from DSC
180  * @opcode:     opcode PDS_AQ_CMD_CLIENT_UNREG
181  * @rsvd:       word boundary padding
182  * @client_id:  id of client being removed
183  *
184  * Tell the DSC this client is going away and remove its context
185  * This uses the generic completion.
186  */
187 struct pds_core_client_unreg_cmd {
188 	u8     opcode;
189 	u8     rsvd;
190 	__le16 client_id;
191 };
192 
193 /**
194  * struct pds_core_client_request_cmd - Pass along a wrapped client AdminQ cmd
195  * @opcode:     opcode PDS_AQ_CMD_CLIENT_CMD
196  * @rsvd:       word boundary padding
197  * @client_id:  id of client being removed
198  * @client_cmd: the wrapped client command
199  *
200  * Proxy post an adminq command for the client.
201  * This uses the generic completion.
202  */
203 struct pds_core_client_request_cmd {
204 	u8     opcode;
205 	u8     rsvd;
206 	__le16 client_id;
207 	u8     client_cmd[60];
208 };
209 
210 #define PDS_CORE_MAX_FRAGS		16
211 
212 #define PDS_CORE_QCQ_F_INITED		BIT(0)
213 #define PDS_CORE_QCQ_F_SG		BIT(1)
214 #define PDS_CORE_QCQ_F_INTR		BIT(2)
215 #define PDS_CORE_QCQ_F_TX_STATS		BIT(3)
216 #define PDS_CORE_QCQ_F_RX_STATS		BIT(4)
217 #define PDS_CORE_QCQ_F_NOTIFYQ		BIT(5)
218 #define PDS_CORE_QCQ_F_CMB_RINGS	BIT(6)
219 #define PDS_CORE_QCQ_F_CORE		BIT(7)
220 
221 enum pds_core_lif_type {
222 	PDS_CORE_LIF_TYPE_DEFAULT = 0,
223 };
224 
225 #define PDS_CORE_IFNAMSIZ		16
226 
227 /**
228  * enum pds_core_logical_qtype - Logical Queue Types
229  * @PDS_CORE_QTYPE_ADMINQ:    Administrative Queue
230  * @PDS_CORE_QTYPE_NOTIFYQ:   Notify Queue
231  * @PDS_CORE_QTYPE_RXQ:       Receive Queue
232  * @PDS_CORE_QTYPE_TXQ:       Transmit Queue
233  * @PDS_CORE_QTYPE_EQ:        Event Queue
234  * @PDS_CORE_QTYPE_MAX:       Max queue type supported
235  */
236 enum pds_core_logical_qtype {
237 	PDS_CORE_QTYPE_ADMINQ  = 0,
238 	PDS_CORE_QTYPE_NOTIFYQ = 1,
239 	PDS_CORE_QTYPE_RXQ     = 2,
240 	PDS_CORE_QTYPE_TXQ     = 3,
241 	PDS_CORE_QTYPE_EQ      = 4,
242 
243 	PDS_CORE_QTYPE_MAX     = 16   /* don't change - used in struct size */
244 };
245 
246 /**
247  * union pds_core_lif_config - LIF configuration
248  * @state:	    LIF state (enum pds_core_lif_state)
249  * @rsvd:           Word boundary padding
250  * @name:	    LIF name
251  * @rsvd2:          Word boundary padding
252  * @features:	    LIF features active (enum pds_core_hw_features)
253  * @queue_count:    Queue counts per queue-type
254  * @words:          Full union buffer size
255  */
256 union pds_core_lif_config {
257 	struct {
258 		u8     state;
259 		u8     rsvd[3];
260 		char   name[PDS_CORE_IFNAMSIZ];
261 		u8     rsvd2[12];
262 		__le64 features;
263 		__le32 queue_count[PDS_CORE_QTYPE_MAX];
264 	} __packed;
265 	__le32 words[64];
266 };
267 
268 /**
269  * struct pds_core_lif_status - LIF status register
270  * @eid:	     most recent NotifyQ event id
271  * @rsvd:            full struct size
272  */
273 struct pds_core_lif_status {
274 	__le64 eid;
275 	u8     rsvd[56];
276 };
277 
278 /**
279  * struct pds_core_lif_info - LIF info structure
280  * @config:	LIF configuration structure
281  * @status:	LIF status structure
282  */
283 struct pds_core_lif_info {
284 	union pds_core_lif_config config;
285 	struct pds_core_lif_status status;
286 };
287 
288 /**
289  * struct pds_core_lif_identity - LIF identity information (type-specific)
290  * @features:		LIF features (see enum pds_core_hw_features)
291  * @version:		Identify structure version
292  * @hw_index:		LIF hardware index
293  * @rsvd:		Word boundary padding
294  * @max_nb_sessions:	Maximum number of sessions supported
295  * @rsvd2:		buffer padding
296  * @config:		LIF config struct with features, q counts
297  */
298 struct pds_core_lif_identity {
299 	__le64 features;
300 	u8     version;
301 	u8     hw_index;
302 	u8     rsvd[2];
303 	__le32 max_nb_sessions;
304 	u8     rsvd2[120];
305 	union pds_core_lif_config config;
306 };
307 
308 /**
309  * struct pds_core_lif_identify_cmd - Get LIF identity info command
310  * @opcode:	Opcode PDS_AQ_CMD_LIF_IDENTIFY
311  * @type:	LIF type (enum pds_core_lif_type)
312  * @client_id:	Client identifier
313  * @ver:	Version of identify returned by device
314  * @rsvd:       Word boundary padding
315  * @ident_pa:	DMA address to receive identity info
316  *
317  * Firmware will copy LIF identity data (struct pds_core_lif_identity)
318  * into the buffer address given.
319  */
320 struct pds_core_lif_identify_cmd {
321 	u8     opcode;
322 	u8     type;
323 	__le16 client_id;
324 	u8     ver;
325 	u8     rsvd[3];
326 	__le64 ident_pa;
327 };
328 
329 /**
330  * struct pds_core_lif_identify_comp - LIF identify command completion
331  * @status:	Status of the command (enum pds_core_status_code)
332  * @ver:	Version of identify returned by device
333  * @bytes:	Bytes copied into the buffer
334  * @rsvd:       Word boundary padding
335  * @color:      Color bit
336  */
337 struct pds_core_lif_identify_comp {
338 	u8     status;
339 	u8     ver;
340 	__le16 bytes;
341 	u8     rsvd[11];
342 	u8     color;
343 };
344 
345 /**
346  * struct pds_core_lif_init_cmd - LIF init command
347  * @opcode:	Opcode PDS_AQ_CMD_LIF_INIT
348  * @type:	LIF type (enum pds_core_lif_type)
349  * @client_id:	Client identifier
350  * @rsvd:       Word boundary padding
351  * @info_pa:	Destination address for LIF info (struct pds_core_lif_info)
352  */
353 struct pds_core_lif_init_cmd {
354 	u8     opcode;
355 	u8     type;
356 	__le16 client_id;
357 	__le32 rsvd;
358 	__le64 info_pa;
359 };
360 
361 /**
362  * struct pds_core_lif_init_comp - LIF init command completion
363  * @status:	Status of the command (enum pds_core_status_code)
364  * @rsvd:       Word boundary padding
365  * @hw_index:	Hardware index of the initialized LIF
366  * @rsvd1:      Word boundary padding
367  * @color:      Color bit
368  */
369 struct pds_core_lif_init_comp {
370 	u8 status;
371 	u8 rsvd;
372 	__le16 hw_index;
373 	u8     rsvd1[11];
374 	u8     color;
375 };
376 
377 /**
378  * struct pds_core_lif_reset_cmd - LIF reset command
379  * Will reset only the specified LIF.
380  * @opcode:	Opcode PDS_AQ_CMD_LIF_RESET
381  * @rsvd:       Word boundary padding
382  * @client_id:	Client identifier
383  */
384 struct pds_core_lif_reset_cmd {
385 	u8     opcode;
386 	u8     rsvd;
387 	__le16 client_id;
388 };
389 
390 /**
391  * enum pds_core_lif_attr - List of LIF attributes
392  * @PDS_CORE_LIF_ATTR_STATE:		LIF state attribute
393  * @PDS_CORE_LIF_ATTR_NAME:		LIF name attribute
394  * @PDS_CORE_LIF_ATTR_FEATURES:		LIF features attribute
395  * @PDS_CORE_LIF_ATTR_STATS_CTRL:	LIF statistics control attribute
396  */
397 enum pds_core_lif_attr {
398 	PDS_CORE_LIF_ATTR_STATE		= 0,
399 	PDS_CORE_LIF_ATTR_NAME		= 1,
400 	PDS_CORE_LIF_ATTR_FEATURES	= 4,
401 	PDS_CORE_LIF_ATTR_STATS_CTRL	= 6,
402 };
403 
404 /**
405  * struct pds_core_lif_setattr_cmd - Set LIF attributes on the NIC
406  * @opcode:	Opcode PDS_AQ_CMD_LIF_SETATTR
407  * @attr:	Attribute type (enum pds_core_lif_attr)
408  * @client_id:	Client identifier
409  * @state:	LIF state (enum pds_core_lif_state)
410  * @name:	The name string, 0 terminated
411  * @features:	Features (enum pds_core_hw_features)
412  * @stats_ctl:	Stats control commands (enum pds_core_stats_ctl_cmd)
413  * @rsvd:       Command Buffer padding
414  */
415 struct pds_core_lif_setattr_cmd {
416 	u8     opcode;
417 	u8     attr;
418 	__le16 client_id;
419 	union {
420 		u8      state;
421 		char    name[PDS_CORE_IFNAMSIZ];
422 		__le64  features;
423 		u8      stats_ctl;
424 		u8      rsvd[60];
425 	} __packed;
426 };
427 
428 /**
429  * struct pds_core_lif_setattr_comp - LIF set attr command completion
430  * @status:	Status of the command (enum pds_core_status_code)
431  * @rsvd:       Word boundary padding
432  * @comp_index: Index in the descriptor ring for which this is the completion
433  * @features:	Features (enum pds_core_hw_features)
434  * @rsvd2:      Word boundary padding
435  * @color:	Color bit
436  */
437 struct pds_core_lif_setattr_comp {
438 	u8     status;
439 	u8     rsvd;
440 	__le16 comp_index;
441 	union {
442 		__le64  features;
443 		u8      rsvd2[11];
444 	} __packed;
445 	u8     color;
446 };
447 
448 /**
449  * struct pds_core_lif_getattr_cmd - Get LIF attributes from the NIC
450  * @opcode:	Opcode PDS_AQ_CMD_LIF_GETATTR
451  * @attr:	Attribute type (enum pds_core_lif_attr)
452  * @client_id:	Client identifier
453  */
454 struct pds_core_lif_getattr_cmd {
455 	u8     opcode;
456 	u8     attr;
457 	__le16 client_id;
458 };
459 
460 /**
461  * struct pds_core_lif_getattr_comp - LIF get attr command completion
462  * @status:	Status of the command (enum pds_core_status_code)
463  * @rsvd:       Word boundary padding
464  * @comp_index: Index in the descriptor ring for which this is the completion
465  * @state:	LIF state (enum pds_core_lif_state)
466  * @features:	Features (enum pds_core_hw_features)
467  * @rsvd2:      Word boundary padding
468  * @color:	Color bit
469  */
470 struct pds_core_lif_getattr_comp {
471 	u8     status;
472 	u8     rsvd;
473 	__le16 comp_index;
474 	union {
475 		u8      state;
476 		__le64  features;
477 		u8      rsvd2[11];
478 	} __packed;
479 	u8     color;
480 };
481 
482 /**
483  * union pds_core_q_identity - Queue identity information
484  * @version:	Queue type version that can be used with FW
485  * @supported:	Bitfield of queue versions, first bit = ver 0
486  * @rsvd:       Word boundary padding
487  * @features:	Queue features
488  * @desc_sz:	Descriptor size
489  * @comp_sz:	Completion descriptor size
490  * @rsvd2:      Word boundary padding
491  */
492 struct pds_core_q_identity {
493 	u8      version;
494 	u8      supported;
495 	u8      rsvd[6];
496 #define PDS_CORE_QIDENT_F_CQ	0x01	/* queue has completion ring */
497 	__le64  features;
498 	__le16  desc_sz;
499 	__le16  comp_sz;
500 	u8      rsvd2[6];
501 };
502 
503 /**
504  * struct pds_core_q_identify_cmd - queue identify command
505  * @opcode:	Opcode PDS_AQ_CMD_Q_IDENTIFY
506  * @type:	Logical queue type (enum pds_core_logical_qtype)
507  * @client_id:	Client identifier
508  * @ver:	Highest queue type version that the driver supports
509  * @rsvd:       Word boundary padding
510  * @ident_pa:   DMA address to receive the data (struct pds_core_q_identity)
511  */
512 struct pds_core_q_identify_cmd {
513 	u8     opcode;
514 	u8     type;
515 	__le16 client_id;
516 	u8     ver;
517 	u8     rsvd[3];
518 	__le64 ident_pa;
519 };
520 
521 /**
522  * struct pds_core_q_identify_comp - queue identify command completion
523  * @status:	Status of the command (enum pds_core_status_code)
524  * @rsvd:       Word boundary padding
525  * @comp_index:	Index in the descriptor ring for which this is the completion
526  * @ver:	Queue type version that can be used with FW
527  * @rsvd1:      Word boundary padding
528  * @color:      Color bit
529  */
530 struct pds_core_q_identify_comp {
531 	u8     status;
532 	u8     rsvd;
533 	__le16 comp_index;
534 	u8     ver;
535 	u8     rsvd1[10];
536 	u8     color;
537 };
538 
539 /**
540  * struct pds_core_q_init_cmd - Queue init command
541  * @opcode:	  Opcode PDS_AQ_CMD_Q_INIT
542  * @type:	  Logical queue type
543  * @client_id:	  Client identifier
544  * @ver:	  Queue type version
545  * @rsvd:         Word boundary padding
546  * @index:	  (LIF, qtype) relative admin queue index
547  * @intr_index:	  Interrupt control register index, or Event queue index
548  * @pid:	  Process ID
549  * @flags:
550  *    IRQ:	  Interrupt requested on completion
551  *    ENA:	  Enable the queue.  If ENA=0 the queue is initialized
552  *		  but remains disabled, to be later enabled with the
553  *		  Queue Enable command. If ENA=1, then queue is
554  *		  initialized and then enabled.
555  * @cos:	  Class of service for this queue
556  * @ring_size:	  Queue ring size, encoded as a log2(size), in
557  *		  number of descriptors.  The actual ring size is
558  *		  (1 << ring_size).  For example, to select a ring size
559  *		  of 64 descriptors write ring_size = 6. The minimum
560  *		  ring_size value is 2 for a ring of 4 descriptors.
561  *		  The maximum ring_size value is 12 for a ring of 4k
562  *		  descriptors. Values of ring_size <2 and >12 are
563  *		  reserved.
564  * @ring_base:	  Queue ring base address
565  * @cq_ring_base: Completion queue ring base address
566  */
567 struct pds_core_q_init_cmd {
568 	u8     opcode;
569 	u8     type;
570 	__le16 client_id;
571 	u8     ver;
572 	u8     rsvd[3];
573 	__le32 index;
574 	__le16 pid;
575 	__le16 intr_index;
576 	__le16 flags;
577 #define PDS_CORE_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
578 #define PDS_CORE_QINIT_F_ENA	0x02	/* Enable the queue */
579 	u8     cos;
580 #define PDS_CORE_QSIZE_MIN_LG2	2
581 #define PDS_CORE_QSIZE_MAX_LG2	12
582 	u8     ring_size;
583 	__le64 ring_base;
584 	__le64 cq_ring_base;
585 } __packed;
586 
587 /**
588  * struct pds_core_q_init_comp - Queue init command completion
589  * @status:	Status of the command (enum pds_core_status_code)
590  * @rsvd:       Word boundary padding
591  * @comp_index:	Index in the descriptor ring for which this is the completion
592  * @hw_index:	Hardware Queue ID
593  * @hw_type:	Hardware Queue type
594  * @rsvd2:      Word boundary padding
595  * @color:	Color
596  */
597 struct pds_core_q_init_comp {
598 	u8     status;
599 	u8     rsvd;
600 	__le16 comp_index;
601 	__le32 hw_index;
602 	u8     hw_type;
603 	u8     rsvd2[6];
604 	u8     color;
605 };
606 
607 /*
608  * enum pds_vdpa_cmd_opcode - vDPA Device commands
609  */
610 enum pds_vdpa_cmd_opcode {
611 	PDS_VDPA_CMD_INIT		= 48,
612 	PDS_VDPA_CMD_IDENT		= 49,
613 	PDS_VDPA_CMD_RESET		= 51,
614 	PDS_VDPA_CMD_VQ_RESET		= 52,
615 	PDS_VDPA_CMD_VQ_INIT		= 53,
616 	PDS_VDPA_CMD_STATUS_UPDATE	= 54,
617 	PDS_VDPA_CMD_SET_FEATURES	= 55,
618 	PDS_VDPA_CMD_SET_ATTR		= 56,
619 };
620 
621 /**
622  * struct pds_vdpa_cmd - generic command
623  * @opcode:	Opcode
624  * @vdpa_index:	Index for vdpa subdevice
625  * @vf_id:	VF id
626  */
627 struct pds_vdpa_cmd {
628 	u8     opcode;
629 	u8     vdpa_index;
630 	__le16 vf_id;
631 };
632 
633 /**
634  * struct pds_vdpa_init_cmd - INIT command
635  * @opcode:	Opcode PDS_VDPA_CMD_INIT
636  * @vdpa_index: Index for vdpa subdevice
637  * @vf_id:	VF id
638  */
639 struct pds_vdpa_init_cmd {
640 	u8     opcode;
641 	u8     vdpa_index;
642 	__le16 vf_id;
643 };
644 
645 /**
646  * struct pds_vdpa_ident - vDPA identification data
647  * @hw_features:	vDPA features supported by device
648  * @max_vqs:		max queues available (2 queues for a single queuepair)
649  * @max_qlen:		log(2) of maximum number of descriptors
650  * @min_qlen:		log(2) of minimum number of descriptors
651  *
652  * This struct is used in a DMA block that is set up for the PDS_VDPA_CMD_IDENT
653  * transaction.  Set up the DMA block and send the address in the IDENT cmd
654  * data, the DSC will write the ident information, then we can remove the DMA
655  * block after reading the answer.  If the completion status is 0, then there
656  * is valid information, else there was an error and the data should be invalid.
657  */
658 struct pds_vdpa_ident {
659 	__le64 hw_features;
660 	__le16 max_vqs;
661 	__le16 max_qlen;
662 	__le16 min_qlen;
663 };
664 
665 /**
666  * struct pds_vdpa_ident_cmd - IDENT command
667  * @opcode:	Opcode PDS_VDPA_CMD_IDENT
668  * @rsvd:       Word boundary padding
669  * @vf_id:	VF id
670  * @len:	length of ident info DMA space
671  * @ident_pa:	address for DMA of ident info (struct pds_vdpa_ident)
672  *			only used for this transaction, then forgotten by DSC
673  */
674 struct pds_vdpa_ident_cmd {
675 	u8     opcode;
676 	u8     rsvd;
677 	__le16 vf_id;
678 	__le32 len;
679 	__le64 ident_pa;
680 };
681 
682 /**
683  * struct pds_vdpa_status_cmd - STATUS_UPDATE command
684  * @opcode:	Opcode PDS_VDPA_CMD_STATUS_UPDATE
685  * @vdpa_index: Index for vdpa subdevice
686  * @vf_id:	VF id
687  * @status:	new status bits
688  */
689 struct pds_vdpa_status_cmd {
690 	u8     opcode;
691 	u8     vdpa_index;
692 	__le16 vf_id;
693 	u8     status;
694 };
695 
696 /**
697  * enum pds_vdpa_attr - List of VDPA device attributes
698  * @PDS_VDPA_ATTR_MAC:          MAC address
699  * @PDS_VDPA_ATTR_MAX_VQ_PAIRS: Max virtqueue pairs
700  */
701 enum pds_vdpa_attr {
702 	PDS_VDPA_ATTR_MAC          = 1,
703 	PDS_VDPA_ATTR_MAX_VQ_PAIRS = 2,
704 };
705 
706 /**
707  * struct pds_vdpa_setattr_cmd - SET_ATTR command
708  * @opcode:		Opcode PDS_VDPA_CMD_SET_ATTR
709  * @vdpa_index:		Index for vdpa subdevice
710  * @vf_id:		VF id
711  * @attr:		attribute to be changed (enum pds_vdpa_attr)
712  * @pad:		Word boundary padding
713  * @mac:		new mac address to be assigned as vdpa device address
714  * @max_vq_pairs:	new limit of virtqueue pairs
715  */
716 struct pds_vdpa_setattr_cmd {
717 	u8     opcode;
718 	u8     vdpa_index;
719 	__le16 vf_id;
720 	u8     attr;
721 	u8     pad[3];
722 	union {
723 		u8 mac[6];
724 		__le16 max_vq_pairs;
725 	} __packed;
726 };
727 
728 /**
729  * struct pds_vdpa_vq_init_cmd - queue init command
730  * @opcode: Opcode PDS_VDPA_CMD_VQ_INIT
731  * @vdpa_index:	Index for vdpa subdevice
732  * @vf_id:	VF id
733  * @qid:	Queue id (bit0 clear = rx, bit0 set = tx, qid=N is ctrlq)
734  * @len:	log(2) of max descriptor count
735  * @desc_addr:	DMA address of descriptor area
736  * @avail_addr:	DMA address of available descriptors (aka driver area)
737  * @used_addr:	DMA address of used descriptors (aka device area)
738  * @intr_index:	interrupt index
739  * @avail_index:	initial device position in available ring
740  * @used_index:	initial device position in used ring
741  */
742 struct pds_vdpa_vq_init_cmd {
743 	u8     opcode;
744 	u8     vdpa_index;
745 	__le16 vf_id;
746 	__le16 qid;
747 	__le16 len;
748 	__le64 desc_addr;
749 	__le64 avail_addr;
750 	__le64 used_addr;
751 	__le16 intr_index;
752 	__le16 avail_index;
753 	__le16 used_index;
754 };
755 
756 /**
757  * struct pds_vdpa_vq_init_comp - queue init completion
758  * @status:	Status of the command (enum pds_core_status_code)
759  * @hw_qtype:	HW queue type, used in doorbell selection
760  * @hw_qindex:	HW queue index, used in doorbell selection
761  * @rsvd:	Word boundary padding
762  * @color:	Color bit
763  */
764 struct pds_vdpa_vq_init_comp {
765 	u8     status;
766 	u8     hw_qtype;
767 	__le16 hw_qindex;
768 	u8     rsvd[11];
769 	u8     color;
770 };
771 
772 /**
773  * struct pds_vdpa_vq_reset_cmd - queue reset command
774  * @opcode:	Opcode PDS_VDPA_CMD_VQ_RESET
775  * @vdpa_index:	Index for vdpa subdevice
776  * @vf_id:	VF id
777  * @qid:	Queue id
778  */
779 struct pds_vdpa_vq_reset_cmd {
780 	u8     opcode;
781 	u8     vdpa_index;
782 	__le16 vf_id;
783 	__le16 qid;
784 };
785 
786 /**
787  * struct pds_vdpa_vq_reset_comp - queue reset completion
788  * @status:	Status of the command (enum pds_core_status_code)
789  * @rsvd0:	Word boundary padding
790  * @avail_index:	current device position in available ring
791  * @used_index:	current device position in used ring
792  * @rsvd:	Word boundary padding
793  * @color:	Color bit
794  */
795 struct pds_vdpa_vq_reset_comp {
796 	u8     status;
797 	u8     rsvd0;
798 	__le16 avail_index;
799 	__le16 used_index;
800 	u8     rsvd[9];
801 	u8     color;
802 };
803 
804 /**
805  * struct pds_vdpa_set_features_cmd - set hw features
806  * @opcode: Opcode PDS_VDPA_CMD_SET_FEATURES
807  * @vdpa_index:	Index for vdpa subdevice
808  * @vf_id:	VF id
809  * @rsvd:       Word boundary padding
810  * @features:	Feature bit mask
811  */
812 struct pds_vdpa_set_features_cmd {
813 	u8     opcode;
814 	u8     vdpa_index;
815 	__le16 vf_id;
816 	__le32 rsvd;
817 	__le64 features;
818 };
819 
820 #define PDS_LM_DEVICE_STATE_LENGTH		65536
821 #define PDS_LM_CHECK_DEVICE_STATE_LENGTH(X) \
822 			PDS_CORE_SIZE_CHECK(union, PDS_LM_DEVICE_STATE_LENGTH, X)
823 
824 /*
825  * enum pds_lm_cmd_opcode - Live Migration Device commands
826  */
827 enum pds_lm_cmd_opcode {
828 	PDS_LM_CMD_HOST_VF_STATUS  = 1,
829 
830 	/* Device state commands */
831 	PDS_LM_CMD_STATE_SIZE	   = 16,
832 	PDS_LM_CMD_SUSPEND         = 18,
833 	PDS_LM_CMD_SUSPEND_STATUS  = 19,
834 	PDS_LM_CMD_RESUME          = 20,
835 	PDS_LM_CMD_SAVE            = 21,
836 	PDS_LM_CMD_RESTORE         = 22,
837 
838 	/* Dirty page tracking commands */
839 	PDS_LM_CMD_DIRTY_STATUS    = 32,
840 	PDS_LM_CMD_DIRTY_ENABLE    = 33,
841 	PDS_LM_CMD_DIRTY_DISABLE   = 34,
842 	PDS_LM_CMD_DIRTY_READ_SEQ  = 35,
843 	PDS_LM_CMD_DIRTY_WRITE_ACK = 36,
844 };
845 
846 /**
847  * struct pds_lm_cmd - generic command
848  * @opcode:	Opcode
849  * @rsvd:	Word boundary padding
850  * @vf_id:	VF id
851  * @rsvd2:	Structure padding to 60 Bytes
852  */
853 struct pds_lm_cmd {
854 	u8     opcode;
855 	u8     rsvd;
856 	__le16 vf_id;
857 	u8     rsvd2[56];
858 };
859 
860 /**
861  * struct pds_lm_state_size_cmd - STATE_SIZE command
862  * @opcode:	Opcode
863  * @rsvd:	Word boundary padding
864  * @vf_id:	VF id
865  */
866 struct pds_lm_state_size_cmd {
867 	u8     opcode;
868 	u8     rsvd;
869 	__le16 vf_id;
870 };
871 
872 /**
873  * struct pds_lm_state_size_comp - STATE_SIZE command completion
874  * @status:		Status of the command (enum pds_core_status_code)
875  * @rsvd:		Word boundary padding
876  * @comp_index:		Index in the desc ring for which this is the completion
877  * @size:		Size of the device state
878  * @rsvd2:		Word boundary padding
879  * @color:		Color bit
880  */
881 struct pds_lm_state_size_comp {
882 	u8     status;
883 	u8     rsvd;
884 	__le16 comp_index;
885 	union {
886 		__le64 size;
887 		u8     rsvd2[11];
888 	} __packed;
889 	u8     color;
890 };
891 
892 enum pds_lm_suspend_resume_type {
893 	PDS_LM_SUSPEND_RESUME_TYPE_FULL = 0,
894 	PDS_LM_SUSPEND_RESUME_TYPE_P2P = 1,
895 };
896 
897 /**
898  * struct pds_lm_suspend_cmd - SUSPEND command
899  * @opcode:	Opcode PDS_LM_CMD_SUSPEND
900  * @rsvd:	Word boundary padding
901  * @vf_id:	VF id
902  * @type:	Type of suspend (enum pds_lm_suspend_resume_type)
903  */
904 struct pds_lm_suspend_cmd {
905 	u8     opcode;
906 	u8     rsvd;
907 	__le16 vf_id;
908 	u8     type;
909 };
910 
911 /**
912  * struct pds_lm_suspend_status_cmd - SUSPEND status command
913  * @opcode:	Opcode PDS_AQ_CMD_LM_SUSPEND_STATUS
914  * @rsvd:	Word boundary padding
915  * @vf_id:	VF id
916  * @type:	Type of suspend (enum pds_lm_suspend_resume_type)
917  */
918 struct pds_lm_suspend_status_cmd {
919 	u8 opcode;
920 	u8 rsvd;
921 	__le16 vf_id;
922 	u8 type;
923 };
924 
925 /**
926  * struct pds_lm_resume_cmd - RESUME command
927  * @opcode:	Opcode PDS_LM_CMD_RESUME
928  * @rsvd:	Word boundary padding
929  * @vf_id:	VF id
930  * @type:	Type of resume (enum pds_lm_suspend_resume_type)
931  */
932 struct pds_lm_resume_cmd {
933 	u8     opcode;
934 	u8     rsvd;
935 	__le16 vf_id;
936 	u8     type;
937 };
938 
939 /**
940  * struct pds_lm_sg_elem - Transmit scatter-gather (SG) descriptor element
941  * @addr:	DMA address of SG element data buffer
942  * @len:	Length of SG element data buffer, in bytes
943  * @rsvd:	Word boundary padding
944  */
945 struct pds_lm_sg_elem {
946 	__le64 addr;
947 	__le32 len;
948 	__le16 rsvd[2];
949 };
950 
951 /**
952  * struct pds_lm_save_cmd - SAVE command
953  * @opcode:	Opcode PDS_LM_CMD_SAVE
954  * @rsvd:	Word boundary padding
955  * @vf_id:	VF id
956  * @rsvd2:	Word boundary padding
957  * @sgl_addr:	IOVA address of the SGL to dma the device state
958  * @num_sge:	Total number of SG elements
959  */
960 struct pds_lm_save_cmd {
961 	u8     opcode;
962 	u8     rsvd;
963 	__le16 vf_id;
964 	u8     rsvd2[4];
965 	__le64 sgl_addr;
966 	__le32 num_sge;
967 } __packed;
968 
969 /**
970  * struct pds_lm_restore_cmd - RESTORE command
971  * @opcode:	Opcode PDS_LM_CMD_RESTORE
972  * @rsvd:	Word boundary padding
973  * @vf_id:	VF id
974  * @rsvd2:	Word boundary padding
975  * @sgl_addr:	IOVA address of the SGL to dma the device state
976  * @num_sge:	Total number of SG elements
977  */
978 struct pds_lm_restore_cmd {
979 	u8     opcode;
980 	u8     rsvd;
981 	__le16 vf_id;
982 	u8     rsvd2[4];
983 	__le64 sgl_addr;
984 	__le32 num_sge;
985 } __packed;
986 
987 /**
988  * union pds_lm_dev_state - device state information
989  * @words:	Device state words
990  */
991 union pds_lm_dev_state {
992 	__le32 words[PDS_LM_DEVICE_STATE_LENGTH / sizeof(__le32)];
993 };
994 
995 enum pds_lm_host_vf_status {
996 	PDS_LM_STA_NONE = 0,
997 	PDS_LM_STA_IN_PROGRESS,
998 	PDS_LM_STA_MAX,
999 };
1000 
1001 /**
1002  * struct pds_lm_dirty_region_info - Memory region info for STATUS and ENABLE
1003  * @dma_base:		Base address of the DMA-contiguous memory region
1004  * @page_count:		Number of pages in the memory region
1005  * @page_size_log2:	Log2 page size in the memory region
1006  * @rsvd:		Word boundary padding
1007  */
1008 struct pds_lm_dirty_region_info {
1009 	__le64 dma_base;
1010 	__le32 page_count;
1011 	u8     page_size_log2;
1012 	u8     rsvd[3];
1013 };
1014 
1015 /**
1016  * struct pds_lm_dirty_status_cmd - DIRTY_STATUS command
1017  * @opcode:		Opcode PDS_LM_CMD_DIRTY_STATUS
1018  * @rsvd:		Word boundary padding
1019  * @vf_id:		VF id
1020  * @max_regions:	Capacity of the region info buffer
1021  * @rsvd2:		Word boundary padding
1022  * @regions_dma:	DMA address of the region info buffer
1023  *
1024  * The minimum of max_regions (from the command) and num_regions (from the
1025  * completion) of struct pds_lm_dirty_region_info will be written to
1026  * regions_dma.
1027  *
1028  * The max_regions may be zero, in which case regions_dma is ignored.  In that
1029  * case, the completion will only report the maximum number of regions
1030  * supported by the device, and the number of regions currently enabled.
1031  */
1032 struct pds_lm_dirty_status_cmd {
1033 	u8     opcode;
1034 	u8     rsvd;
1035 	__le16 vf_id;
1036 	u8     max_regions;
1037 	u8     rsvd2[3];
1038 	__le64 regions_dma;
1039 } __packed;
1040 
1041 /**
1042  * enum pds_lm_dirty_bmp_type - Type of dirty page bitmap
1043  * @PDS_LM_DIRTY_BMP_TYPE_NONE: No bitmap / disabled
1044  * @PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK: Seq/Ack bitmap representation
1045  */
1046 enum pds_lm_dirty_bmp_type {
1047 	PDS_LM_DIRTY_BMP_TYPE_NONE     = 0,
1048 	PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK  = 1,
1049 };
1050 
1051 /**
1052  * struct pds_lm_dirty_status_comp - STATUS command completion
1053  * @status:		Status of the command (enum pds_core_status_code)
1054  * @rsvd:		Word boundary padding
1055  * @comp_index:		Index in the desc ring for which this is the completion
1056  * @max_regions:	Maximum number of regions supported by the device
1057  * @num_regions:	Number of regions currently enabled
1058  * @bmp_type:		Type of dirty bitmap representation
1059  * @rsvd2:		Word boundary padding
1060  * @bmp_type_mask:	Mask of supported bitmap types, bit index per type
1061  * @rsvd3:		Word boundary padding
1062  * @color:		Color bit
1063  *
1064  * This completion descriptor is used for STATUS, ENABLE, and DISABLE.
1065  */
1066 struct pds_lm_dirty_status_comp {
1067 	u8     status;
1068 	u8     rsvd;
1069 	__le16 comp_index;
1070 	u8     max_regions;
1071 	u8     num_regions;
1072 	u8     bmp_type;
1073 	u8     rsvd2;
1074 	__le32 bmp_type_mask;
1075 	u8     rsvd3[3];
1076 	u8     color;
1077 };
1078 
1079 /**
1080  * struct pds_lm_dirty_enable_cmd - DIRTY_ENABLE command
1081  * @opcode:		Opcode PDS_LM_CMD_DIRTY_ENABLE
1082  * @rsvd:		Word boundary padding
1083  * @vf_id:		VF id
1084  * @bmp_type:		Type of dirty bitmap representation
1085  * @num_regions:	Number of entries in the region info buffer
1086  * @rsvd2:		Word boundary padding
1087  * @regions_dma:	DMA address of the region info buffer
1088  *
1089  * The num_regions must be nonzero, and less than or equal to the maximum
1090  * number of regions supported by the device.
1091  *
1092  * The memory regions should not overlap.
1093  *
1094  * The information should be initialized by the driver.  The device may modify
1095  * the information on successful completion, such as by size-aligning the
1096  * number of pages in a region.
1097  *
1098  * The modified number of pages will be greater than or equal to the page count
1099  * given in the enable command, and at least as coarsly aligned as the given
1100  * value.  For example, the count might be aligned to a multiple of 64, but
1101  * if the value is already a multiple of 128 or higher, it will not change.
1102  * If the driver requires its own minimum alignment of the number of pages, the
1103  * driver should account for that already in the region info of this command.
1104  *
1105  * This command uses struct pds_lm_dirty_status_comp for its completion.
1106  */
1107 struct pds_lm_dirty_enable_cmd {
1108 	u8     opcode;
1109 	u8     rsvd;
1110 	__le16 vf_id;
1111 	u8     bmp_type;
1112 	u8     num_regions;
1113 	u8     rsvd2[2];
1114 	__le64 regions_dma;
1115 } __packed;
1116 
1117 /**
1118  * struct pds_lm_dirty_disable_cmd - DIRTY_DISABLE command
1119  * @opcode:	Opcode PDS_LM_CMD_DIRTY_DISABLE
1120  * @rsvd:	Word boundary padding
1121  * @vf_id:	VF id
1122  *
1123  * Dirty page tracking will be disabled.  This may be called in any state, as
1124  * long as dirty page tracking is supported by the device, to ensure that dirty
1125  * page tracking is disabled.
1126  *
1127  * This command uses struct pds_lm_dirty_status_comp for its completion.  On
1128  * success, num_regions will be zero.
1129  */
1130 struct pds_lm_dirty_disable_cmd {
1131 	u8     opcode;
1132 	u8     rsvd;
1133 	__le16 vf_id;
1134 };
1135 
1136 /**
1137  * struct pds_lm_dirty_seq_ack_cmd - DIRTY_READ_SEQ or _WRITE_ACK command
1138  * @opcode:	Opcode PDS_LM_CMD_DIRTY_[READ_SEQ|WRITE_ACK]
1139  * @rsvd:	Word boundary padding
1140  * @vf_id:	VF id
1141  * @off_bytes:	Byte offset in the bitmap
1142  * @len_bytes:	Number of bytes to transfer
1143  * @num_sge:	Number of DMA scatter gather elements
1144  * @rsvd2:	Word boundary padding
1145  * @sgl_addr:	DMA address of scatter gather list
1146  *
1147  * Read bytes from the SEQ bitmap, or write bytes into the ACK bitmap.
1148  *
1149  * This command treats the entire bitmap as a byte buffer.  It does not
1150  * distinguish between guest memory regions.  The driver should refer to the
1151  * number of pages in each region, according to PDS_LM_CMD_DIRTY_STATUS, to
1152  * determine the region boundaries in the bitmap.  Each region will be
1153  * represented by exactly the number of bits as the page count for that region,
1154  * immediately following the last bit of the previous region.
1155  */
1156 struct pds_lm_dirty_seq_ack_cmd {
1157 	u8     opcode;
1158 	u8     rsvd;
1159 	__le16 vf_id;
1160 	__le32 off_bytes;
1161 	__le32 len_bytes;
1162 	__le16 num_sge;
1163 	u8     rsvd2[2];
1164 	__le64 sgl_addr;
1165 } __packed;
1166 
1167 /**
1168  * struct pds_lm_host_vf_status_cmd - HOST_VF_STATUS command
1169  * @opcode:	Opcode PDS_LM_CMD_HOST_VF_STATUS
1170  * @rsvd:	Word boundary padding
1171  * @vf_id:	VF id
1172  * @status:	Current LM status of host VF driver (enum pds_lm_host_status)
1173  */
1174 struct pds_lm_host_vf_status_cmd {
1175 	u8     opcode;
1176 	u8     rsvd;
1177 	__le16 vf_id;
1178 	u8     status;
1179 };
1180 
1181 enum pds_fwctl_cmd_opcode {
1182 	PDS_FWCTL_CMD_IDENT = 70,
1183 	PDS_FWCTL_CMD_RPC   = 71,
1184 	PDS_FWCTL_CMD_QUERY = 72,
1185 };
1186 
1187 /**
1188  * struct pds_fwctl_cmd - Firmware control command structure
1189  * @opcode: Opcode
1190  * @rsvd:   Reserved
1191  * @ep:     Endpoint identifier
1192  * @op:     Operation identifier
1193  */
1194 struct pds_fwctl_cmd {
1195 	u8     opcode;
1196 	u8     rsvd[3];
1197 	__le32 ep;
1198 	__le32 op;
1199 } __packed;
1200 
1201 /**
1202  * struct pds_fwctl_comp - Firmware control completion structure
1203  * @status:     Status of the firmware control operation
1204  * @rsvd:       Reserved
1205  * @comp_index: Completion index in little-endian format
1206  * @rsvd2:      Reserved
1207  * @color:      Color bit indicating the state of the completion
1208  */
1209 struct pds_fwctl_comp {
1210 	u8     status;
1211 	u8     rsvd;
1212 	__le16 comp_index;
1213 	u8     rsvd2[11];
1214 	u8     color;
1215 } __packed;
1216 
1217 /**
1218  * struct pds_fwctl_ident_cmd - Firmware control identification command structure
1219  * @opcode:   Operation code for the command
1220  * @rsvd:     Reserved
1221  * @version:  Interface version
1222  * @rsvd2:    Reserved
1223  * @len:      Length of the identification data
1224  * @ident_pa: Physical address of the identification data
1225  */
1226 struct pds_fwctl_ident_cmd {
1227 	u8     opcode;
1228 	u8     rsvd;
1229 	u8     version;
1230 	u8     rsvd2;
1231 	__le32 len;
1232 	__le64 ident_pa;
1233 } __packed;
1234 
1235 /* future feature bits here
1236  * enum pds_fwctl_features {
1237  * };
1238  * (compilers don't like empty enums)
1239  */
1240 
1241 /**
1242  * struct pds_fwctl_ident - Firmware control identification structure
1243  * @features:    Supported features (enum pds_fwctl_features)
1244  * @version:     Interface version
1245  * @rsvd:        Reserved
1246  * @max_req_sz:  Maximum request size
1247  * @max_resp_sz: Maximum response size
1248  * @max_req_sg_elems:  Maximum number of request SGs
1249  * @max_resp_sg_elems: Maximum number of response SGs
1250  */
1251 struct pds_fwctl_ident {
1252 	__le64 features;
1253 	u8     version;
1254 	u8     rsvd[3];
1255 	__le32 max_req_sz;
1256 	__le32 max_resp_sz;
1257 	u8     max_req_sg_elems;
1258 	u8     max_resp_sg_elems;
1259 } __packed;
1260 
1261 enum pds_fwctl_query_entity {
1262 	PDS_FWCTL_RPC_ROOT	= 0,
1263 	PDS_FWCTL_RPC_ENDPOINT	= 1,
1264 	PDS_FWCTL_RPC_OPERATION	= 2,
1265 };
1266 
1267 #define PDS_FWCTL_RPC_OPCODE_CMD_SHIFT	0
1268 #define PDS_FWCTL_RPC_OPCODE_CMD_MASK	GENMASK(15, PDS_FWCTL_RPC_OPCODE_CMD_SHIFT)
1269 #define PDS_FWCTL_RPC_OPCODE_VER_SHIFT	16
1270 #define PDS_FWCTL_RPC_OPCODE_VER_MASK	GENMASK(23, PDS_FWCTL_RPC_OPCODE_VER_SHIFT)
1271 
1272 #define PDS_FWCTL_RPC_OPCODE_GET_CMD(op)  FIELD_GET(PDS_FWCTL_RPC_OPCODE_CMD_MASK, op)
1273 #define PDS_FWCTL_RPC_OPCODE_GET_VER(op)  FIELD_GET(PDS_FWCTL_RPC_OPCODE_VER_MASK, op)
1274 
1275 #define PDS_FWCTL_RPC_OPCODE_CMP(op1, op2) \
1276 	(PDS_FWCTL_RPC_OPCODE_GET_CMD(op1) == PDS_FWCTL_RPC_OPCODE_GET_CMD(op2) && \
1277 	 PDS_FWCTL_RPC_OPCODE_GET_VER(op1) <= PDS_FWCTL_RPC_OPCODE_GET_VER(op2))
1278 
1279 /*
1280  * FW command attributes that map to the FWCTL scope values
1281  */
1282 #define PDSFC_FW_CMD_ATTR_READ               0x00
1283 #define PDSFC_FW_CMD_ATTR_DEBUG_READ         0x02
1284 #define PDSFC_FW_CMD_ATTR_WRITE              0x04
1285 #define PDSFC_FW_CMD_ATTR_DEBUG_WRITE        0x08
1286 #define PDSFC_FW_CMD_ATTR_SYNC               0x10
1287 
1288 /**
1289  * struct pds_fwctl_query_cmd - Firmware control query command structure
1290  * @opcode: Operation code for the command
1291  * @entity:  Entity type to query (enum pds_fwctl_query_entity)
1292  * @version: Version of the query data structure supported by the driver
1293  * @rsvd:    Reserved
1294  * @query_data_buf_len: Length of the query data buffer
1295  * @query_data_buf_pa:  Physical address of the query data buffer
1296  * @ep:      Endpoint identifier to query  (when entity is PDS_FWCTL_RPC_ENDPOINT)
1297  * @op:      Operation identifier to query (when entity is PDS_FWCTL_RPC_OPERATION)
1298  *
1299  * This structure is used to send a query command to the firmware control
1300  * interface. The structure is packed to ensure there is no padding between
1301  * the fields.
1302  */
1303 struct pds_fwctl_query_cmd {
1304 	u8     opcode;
1305 	u8     entity;
1306 	u8     version;
1307 	u8     rsvd;
1308 	__le32 query_data_buf_len;
1309 	__le64 query_data_buf_pa;
1310 	union {
1311 		__le32 ep;
1312 		__le32 op;
1313 	};
1314 } __packed;
1315 
1316 /**
1317  * struct pds_fwctl_query_comp - Firmware control query completion structure
1318  * @status:     Status of the query command
1319  * @rsvd:       Reserved
1320  * @comp_index: Completion index in little-endian format
1321  * @version:    Version of the query data structure returned by firmware. This
1322  *		 should be less than or equal to the version supported by the driver
1323  * @rsvd2:      Reserved
1324  * @color:      Color bit indicating the state of the completion
1325  */
1326 struct pds_fwctl_query_comp {
1327 	u8     status;
1328 	u8     rsvd;
1329 	__le16 comp_index;
1330 	u8     version;
1331 	u8     rsvd2[2];
1332 	u8     color;
1333 } __packed;
1334 
1335 /**
1336  * struct pds_fwctl_query_data_endpoint - query data for entity PDS_FWCTL_RPC_ROOT
1337  * @id: The identifier for the data endpoint
1338  */
1339 struct pds_fwctl_query_data_endpoint {
1340 	__le32 id;
1341 } __packed;
1342 
1343 /**
1344  * struct pds_fwctl_query_data_operation - query data for entity PDS_FWCTL_RPC_ENDPOINT
1345  * @id:    Operation identifier
1346  * @scope: Scope of the operation (enum fwctl_rpc_scope)
1347  * @rsvd:  Reserved
1348  */
1349 struct pds_fwctl_query_data_operation {
1350 	__le32 id;
1351 	u8     scope;
1352 	u8     rsvd[3];
1353 } __packed;
1354 
1355 /**
1356  * struct pds_fwctl_query_data - query data structure
1357  * @version:     Version of the query data structure
1358  * @rsvd:        Reserved
1359  * @num_entries: Number of entries in the union
1360  * @entries:     Array of query data entries, depending on the entity type
1361  */
1362 struct pds_fwctl_query_data {
1363 	u8      version;
1364 	u8      rsvd[3];
1365 	__le32  num_entries;
1366 	u8      entries[] __counted_by_le(num_entries);
1367 } __packed;
1368 
1369 /**
1370  * struct pds_fwctl_rpc_cmd - Firmware control RPC command
1371  * @opcode:        opcode PDS_FWCTL_CMD_RPC
1372  * @rsvd:          Reserved
1373  * @flags:         Indicates indirect request and/or response handling
1374  * @ep:            Endpoint identifier
1375  * @op:            Operation identifier
1376  * @inline_req0:   Buffer for inline request
1377  * @inline_req1:   Buffer for inline request
1378  * @req_pa:        Physical address of request data
1379  * @req_sz:        Size of the request
1380  * @req_sg_elems:  Number of request SGs
1381  * @req_rsvd:      Reserved
1382  * @inline_req2:   Buffer for inline request
1383  * @resp_pa:       Physical address of response data
1384  * @resp_sz:       Size of the response
1385  * @resp_sg_elems: Number of response SGs
1386  * @resp_rsvd:     Reserved
1387  */
1388 struct pds_fwctl_rpc_cmd {
1389 	u8     opcode;
1390 	u8     rsvd;
1391 	__le16 flags;
1392 #define PDS_FWCTL_RPC_IND_REQ		0x1
1393 #define PDS_FWCTL_RPC_IND_RESP		0x2
1394 	__le32 ep;
1395 	__le32 op;
1396 	u8 inline_req0[16];
1397 	union {
1398 		u8 inline_req1[16];
1399 		struct {
1400 			__le64 req_pa;
1401 			__le32 req_sz;
1402 			u8     req_sg_elems;
1403 			u8     req_rsvd[3];
1404 		};
1405 	};
1406 	union {
1407 		u8 inline_req2[16];
1408 		struct {
1409 			__le64 resp_pa;
1410 			__le32 resp_sz;
1411 			u8     resp_sg_elems;
1412 			u8     resp_rsvd[3];
1413 		};
1414 	};
1415 } __packed;
1416 
1417 /**
1418  * struct pds_sg_elem - Transmit scatter-gather (SG) descriptor element
1419  * @addr:	DMA address of SG element data buffer
1420  * @len:	Length of SG element data buffer, in bytes
1421  * @rsvd:	Reserved
1422  */
1423 struct pds_sg_elem {
1424 	__le64 addr;
1425 	__le32 len;
1426 	u8     rsvd[4];
1427 } __packed;
1428 
1429 /**
1430  * struct pds_fwctl_rpc_comp - Completion of a firmware control RPC
1431  * @status:     Status of the command
1432  * @rsvd:       Reserved
1433  * @comp_index: Completion index of the command
1434  * @err:        Error code, if any, from the RPC
1435  * @resp_sz:    Size of the response
1436  * @rsvd2:      Reserved
1437  * @color:      Color bit indicating the state of the completion
1438  */
1439 struct pds_fwctl_rpc_comp {
1440 	u8     status;
1441 	u8     rsvd;
1442 	__le16 comp_index;
1443 	__le32 err;
1444 	__le32 resp_sz;
1445 	u8     rsvd2[3];
1446 	u8     color;
1447 } __packed;
1448 
1449 union pds_core_adminq_cmd {
1450 	u8     opcode;
1451 	u8     bytes[64];
1452 
1453 	struct pds_core_client_reg_cmd     client_reg;
1454 	struct pds_core_client_unreg_cmd   client_unreg;
1455 	struct pds_core_client_request_cmd client_request;
1456 
1457 	struct pds_core_lif_identify_cmd  lif_ident;
1458 	struct pds_core_lif_init_cmd      lif_init;
1459 	struct pds_core_lif_reset_cmd     lif_reset;
1460 	struct pds_core_lif_setattr_cmd   lif_setattr;
1461 	struct pds_core_lif_getattr_cmd   lif_getattr;
1462 
1463 	struct pds_core_q_identify_cmd    q_ident;
1464 	struct pds_core_q_init_cmd        q_init;
1465 
1466 	struct pds_vdpa_cmd		  vdpa;
1467 	struct pds_vdpa_init_cmd	  vdpa_init;
1468 	struct pds_vdpa_ident_cmd	  vdpa_ident;
1469 	struct pds_vdpa_status_cmd	  vdpa_status;
1470 	struct pds_vdpa_setattr_cmd	  vdpa_setattr;
1471 	struct pds_vdpa_set_features_cmd  vdpa_set_features;
1472 	struct pds_vdpa_vq_init_cmd	  vdpa_vq_init;
1473 	struct pds_vdpa_vq_reset_cmd	  vdpa_vq_reset;
1474 
1475 	struct pds_lm_suspend_cmd	  lm_suspend;
1476 	struct pds_lm_suspend_status_cmd  lm_suspend_status;
1477 	struct pds_lm_resume_cmd	  lm_resume;
1478 	struct pds_lm_state_size_cmd	  lm_state_size;
1479 	struct pds_lm_save_cmd		  lm_save;
1480 	struct pds_lm_restore_cmd	  lm_restore;
1481 	struct pds_lm_host_vf_status_cmd  lm_host_vf_status;
1482 	struct pds_lm_dirty_status_cmd	  lm_dirty_status;
1483 	struct pds_lm_dirty_enable_cmd	  lm_dirty_enable;
1484 	struct pds_lm_dirty_disable_cmd	  lm_dirty_disable;
1485 	struct pds_lm_dirty_seq_ack_cmd	  lm_dirty_seq_ack;
1486 
1487 	struct pds_fwctl_cmd		  fwctl;
1488 	struct pds_fwctl_ident_cmd	  fwctl_ident;
1489 	struct pds_fwctl_rpc_cmd	  fwctl_rpc;
1490 	struct pds_fwctl_query_cmd	  fwctl_query;
1491 };
1492 
1493 union pds_core_adminq_comp {
1494 	struct {
1495 		u8     status;
1496 		u8     rsvd;
1497 		__le16 comp_index;
1498 		u8     rsvd2[11];
1499 		u8     color;
1500 	};
1501 	u32    words[4];
1502 
1503 	struct pds_core_client_reg_comp   client_reg;
1504 
1505 	struct pds_core_lif_identify_comp lif_ident;
1506 	struct pds_core_lif_init_comp     lif_init;
1507 	struct pds_core_lif_setattr_comp  lif_setattr;
1508 	struct pds_core_lif_getattr_comp  lif_getattr;
1509 
1510 	struct pds_core_q_identify_comp   q_ident;
1511 	struct pds_core_q_init_comp       q_init;
1512 
1513 	struct pds_vdpa_vq_init_comp	  vdpa_vq_init;
1514 	struct pds_vdpa_vq_reset_comp	  vdpa_vq_reset;
1515 
1516 	struct pds_lm_state_size_comp	  lm_state_size;
1517 	struct pds_lm_dirty_status_comp	  lm_dirty_status;
1518 
1519 	struct pds_fwctl_comp		  fwctl;
1520 	struct pds_fwctl_rpc_comp	  fwctl_rpc;
1521 	struct pds_fwctl_query_comp	  fwctl_query;
1522 };
1523 
1524 #ifndef __CHECKER__
1525 static_assert(sizeof(union pds_core_adminq_cmd) == 64);
1526 static_assert(sizeof(union pds_core_adminq_comp) == 16);
1527 static_assert(sizeof(union pds_core_notifyq_comp) == 64);
1528 #endif /* __CHECKER__ */
1529 
1530 /* The color bit is a 'done' bit for the completion descriptors
1531  * where the meaning alternates between '1' and '0' for alternating
1532  * passes through the completion descriptor ring.
1533  */
pdsc_color_match(u8 color,bool done_color)1534 static inline bool pdsc_color_match(u8 color, bool done_color)
1535 {
1536 	return (!!(color & PDS_COMP_COLOR_MASK)) == done_color;
1537 }
1538 
1539 struct pdsc;
1540 int pdsc_adminq_post(struct pdsc *pdsc,
1541 		     union pds_core_adminq_cmd *cmd,
1542 		     union pds_core_adminq_comp *comp,
1543 		     bool fast_poll);
1544 
1545 #endif /* _PDS_CORE_ADMINQ_H_ */
1546