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