Merge drm/drm-next into drm-misc-next
[linux-2.6-microblaze.git] / include / linux / pds / pds_adminq.h
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   256
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  * @name:       LIF name string, 0 terminated
467  * @features:   Features (enum pds_core_hw_features)
468  * @rsvd2:      Word boundary padding
469  * @color:      Color bit
470  */
471 struct pds_core_lif_getattr_comp {
472         u8     status;
473         u8     rsvd;
474         __le16 comp_index;
475         union {
476                 u8      state;
477                 __le64  features;
478                 u8      rsvd2[11];
479         } __packed;
480         u8     color;
481 };
482
483 /**
484  * union pds_core_q_identity - Queue identity information
485  * @version:    Queue type version that can be used with FW
486  * @supported:  Bitfield of queue versions, first bit = ver 0
487  * @rsvd:       Word boundary padding
488  * @features:   Queue features
489  * @desc_sz:    Descriptor size
490  * @comp_sz:    Completion descriptor size
491  * @rsvd2:      Word boundary padding
492  */
493 struct pds_core_q_identity {
494         u8      version;
495         u8      supported;
496         u8      rsvd[6];
497 #define PDS_CORE_QIDENT_F_CQ    0x01    /* queue has completion ring */
498         __le64  features;
499         __le16  desc_sz;
500         __le16  comp_sz;
501         u8      rsvd2[6];
502 };
503
504 /**
505  * struct pds_core_q_identify_cmd - queue identify command
506  * @opcode:     Opcode PDS_AQ_CMD_Q_IDENTIFY
507  * @type:       Logical queue type (enum pds_core_logical_qtype)
508  * @client_id:  Client identifier
509  * @ver:        Highest queue type version that the driver supports
510  * @rsvd:       Word boundary padding
511  * @ident_pa:   DMA address to receive the data (struct pds_core_q_identity)
512  */
513 struct pds_core_q_identify_cmd {
514         u8     opcode;
515         u8     type;
516         __le16 client_id;
517         u8     ver;
518         u8     rsvd[3];
519         __le64 ident_pa;
520 };
521
522 /**
523  * struct pds_core_q_identify_comp - queue identify command completion
524  * @status:     Status of the command (enum pds_core_status_code)
525  * @rsvd:       Word boundary padding
526  * @comp_index: Index in the descriptor ring for which this is the completion
527  * @ver:        Queue type version that can be used with FW
528  * @rsvd1:      Word boundary padding
529  * @color:      Color bit
530  */
531 struct pds_core_q_identify_comp {
532         u8     status;
533         u8     rsvd;
534         __le16 comp_index;
535         u8     ver;
536         u8     rsvd1[10];
537         u8     color;
538 };
539
540 /**
541  * struct pds_core_q_init_cmd - Queue init command
542  * @opcode:       Opcode PDS_AQ_CMD_Q_INIT
543  * @type:         Logical queue type
544  * @client_id:    Client identifier
545  * @ver:          Queue type version
546  * @rsvd:         Word boundary padding
547  * @index:        (LIF, qtype) relative admin queue index
548  * @intr_index:   Interrupt control register index, or Event queue index
549  * @pid:          Process ID
550  * @flags:
551  *    IRQ:        Interrupt requested on completion
552  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
553  *                but remains disabled, to be later enabled with the
554  *                Queue Enable command. If ENA=1, then queue is
555  *                initialized and then enabled.
556  * @cos:          Class of service for this queue
557  * @ring_size:    Queue ring size, encoded as a log2(size), in
558  *                number of descriptors.  The actual ring size is
559  *                (1 << ring_size).  For example, to select a ring size
560  *                of 64 descriptors write ring_size = 6. The minimum
561  *                ring_size value is 2 for a ring of 4 descriptors.
562  *                The maximum ring_size value is 12 for a ring of 4k
563  *                descriptors. Values of ring_size <2 and >12 are
564  *                reserved.
565  * @ring_base:    Queue ring base address
566  * @cq_ring_base: Completion queue ring base address
567  */
568 struct pds_core_q_init_cmd {
569         u8     opcode;
570         u8     type;
571         __le16 client_id;
572         u8     ver;
573         u8     rsvd[3];
574         __le32 index;
575         __le16 pid;
576         __le16 intr_index;
577         __le16 flags;
578 #define PDS_CORE_QINIT_F_IRQ    0x01    /* Request interrupt on completion */
579 #define PDS_CORE_QINIT_F_ENA    0x02    /* Enable the queue */
580         u8     cos;
581 #define PDS_CORE_QSIZE_MIN_LG2  2
582 #define PDS_CORE_QSIZE_MAX_LG2  12
583         u8     ring_size;
584         __le64 ring_base;
585         __le64 cq_ring_base;
586 } __packed;
587
588 /**
589  * struct pds_core_q_init_comp - Queue init command completion
590  * @status:     Status of the command (enum pds_core_status_code)
591  * @rsvd:       Word boundary padding
592  * @comp_index: Index in the descriptor ring for which this is the completion
593  * @hw_index:   Hardware Queue ID
594  * @hw_type:    Hardware Queue type
595  * @rsvd2:      Word boundary padding
596  * @color:      Color
597  */
598 struct pds_core_q_init_comp {
599         u8     status;
600         u8     rsvd;
601         __le16 comp_index;
602         __le32 hw_index;
603         u8     hw_type;
604         u8     rsvd2[6];
605         u8     color;
606 };
607
608 /*
609  * enum pds_vdpa_cmd_opcode - vDPA Device commands
610  */
611 enum pds_vdpa_cmd_opcode {
612         PDS_VDPA_CMD_INIT               = 48,
613         PDS_VDPA_CMD_IDENT              = 49,
614         PDS_VDPA_CMD_RESET              = 51,
615         PDS_VDPA_CMD_VQ_RESET           = 52,
616         PDS_VDPA_CMD_VQ_INIT            = 53,
617         PDS_VDPA_CMD_STATUS_UPDATE      = 54,
618         PDS_VDPA_CMD_SET_FEATURES       = 55,
619         PDS_VDPA_CMD_SET_ATTR           = 56,
620 };
621
622 /**
623  * struct pds_vdpa_cmd - generic command
624  * @opcode:     Opcode
625  * @vdpa_index: Index for vdpa subdevice
626  * @vf_id:      VF id
627  */
628 struct pds_vdpa_cmd {
629         u8     opcode;
630         u8     vdpa_index;
631         __le16 vf_id;
632 };
633
634 /**
635  * struct pds_vdpa_init_cmd - INIT command
636  * @opcode:     Opcode PDS_VDPA_CMD_INIT
637  * @vdpa_index: Index for vdpa subdevice
638  * @vf_id:      VF id
639  */
640 struct pds_vdpa_init_cmd {
641         u8     opcode;
642         u8     vdpa_index;
643         __le16 vf_id;
644 };
645
646 /**
647  * struct pds_vdpa_ident - vDPA identification data
648  * @hw_features:        vDPA features supported by device
649  * @max_vqs:            max queues available (2 queues for a single queuepair)
650  * @max_qlen:           log(2) of maximum number of descriptors
651  * @min_qlen:           log(2) of minimum number of descriptors
652  *
653  * This struct is used in a DMA block that is set up for the PDS_VDPA_CMD_IDENT
654  * transaction.  Set up the DMA block and send the address in the IDENT cmd
655  * data, the DSC will write the ident information, then we can remove the DMA
656  * block after reading the answer.  If the completion status is 0, then there
657  * is valid information, else there was an error and the data should be invalid.
658  */
659 struct pds_vdpa_ident {
660         __le64 hw_features;
661         __le16 max_vqs;
662         __le16 max_qlen;
663         __le16 min_qlen;
664 };
665
666 /**
667  * struct pds_vdpa_ident_cmd - IDENT command
668  * @opcode:     Opcode PDS_VDPA_CMD_IDENT
669  * @rsvd:       Word boundary padding
670  * @vf_id:      VF id
671  * @len:        length of ident info DMA space
672  * @ident_pa:   address for DMA of ident info (struct pds_vdpa_ident)
673  *                      only used for this transaction, then forgotten by DSC
674  */
675 struct pds_vdpa_ident_cmd {
676         u8     opcode;
677         u8     rsvd;
678         __le16 vf_id;
679         __le32 len;
680         __le64 ident_pa;
681 };
682
683 /**
684  * struct pds_vdpa_status_cmd - STATUS_UPDATE command
685  * @opcode:     Opcode PDS_VDPA_CMD_STATUS_UPDATE
686  * @vdpa_index: Index for vdpa subdevice
687  * @vf_id:      VF id
688  * @status:     new status bits
689  */
690 struct pds_vdpa_status_cmd {
691         u8     opcode;
692         u8     vdpa_index;
693         __le16 vf_id;
694         u8     status;
695 };
696
697 /**
698  * enum pds_vdpa_attr - List of VDPA device attributes
699  * @PDS_VDPA_ATTR_MAC:          MAC address
700  * @PDS_VDPA_ATTR_MAX_VQ_PAIRS: Max virtqueue pairs
701  */
702 enum pds_vdpa_attr {
703         PDS_VDPA_ATTR_MAC          = 1,
704         PDS_VDPA_ATTR_MAX_VQ_PAIRS = 2,
705 };
706
707 /**
708  * struct pds_vdpa_setattr_cmd - SET_ATTR command
709  * @opcode:             Opcode PDS_VDPA_CMD_SET_ATTR
710  * @vdpa_index:         Index for vdpa subdevice
711  * @vf_id:              VF id
712  * @attr:               attribute to be changed (enum pds_vdpa_attr)
713  * @pad:                Word boundary padding
714  * @mac:                new mac address to be assigned as vdpa device address
715  * @max_vq_pairs:       new limit of virtqueue pairs
716  */
717 struct pds_vdpa_setattr_cmd {
718         u8     opcode;
719         u8     vdpa_index;
720         __le16 vf_id;
721         u8     attr;
722         u8     pad[3];
723         union {
724                 u8 mac[6];
725                 __le16 max_vq_pairs;
726         } __packed;
727 };
728
729 /**
730  * struct pds_vdpa_vq_init_cmd - queue init command
731  * @opcode: Opcode PDS_VDPA_CMD_VQ_INIT
732  * @vdpa_index: Index for vdpa subdevice
733  * @vf_id:      VF id
734  * @qid:        Queue id (bit0 clear = rx, bit0 set = tx, qid=N is ctrlq)
735  * @len:        log(2) of max descriptor count
736  * @desc_addr:  DMA address of descriptor area
737  * @avail_addr: DMA address of available descriptors (aka driver area)
738  * @used_addr:  DMA address of used descriptors (aka device area)
739  * @intr_index: interrupt index
740  * @avail_index:        initial device position in available ring
741  * @used_index: initial device position in used ring
742  */
743 struct pds_vdpa_vq_init_cmd {
744         u8     opcode;
745         u8     vdpa_index;
746         __le16 vf_id;
747         __le16 qid;
748         __le16 len;
749         __le64 desc_addr;
750         __le64 avail_addr;
751         __le64 used_addr;
752         __le16 intr_index;
753         __le16 avail_index;
754         __le16 used_index;
755 };
756
757 /**
758  * struct pds_vdpa_vq_init_comp - queue init completion
759  * @status:     Status of the command (enum pds_core_status_code)
760  * @hw_qtype:   HW queue type, used in doorbell selection
761  * @hw_qindex:  HW queue index, used in doorbell selection
762  * @rsvd:       Word boundary padding
763  * @color:      Color bit
764  */
765 struct pds_vdpa_vq_init_comp {
766         u8     status;
767         u8     hw_qtype;
768         __le16 hw_qindex;
769         u8     rsvd[11];
770         u8     color;
771 };
772
773 /**
774  * struct pds_vdpa_vq_reset_cmd - queue reset command
775  * @opcode:     Opcode PDS_VDPA_CMD_VQ_RESET
776  * @vdpa_index: Index for vdpa subdevice
777  * @vf_id:      VF id
778  * @qid:        Queue id
779  */
780 struct pds_vdpa_vq_reset_cmd {
781         u8     opcode;
782         u8     vdpa_index;
783         __le16 vf_id;
784         __le16 qid;
785 };
786
787 /**
788  * struct pds_vdpa_vq_reset_comp - queue reset completion
789  * @status:     Status of the command (enum pds_core_status_code)
790  * @rsvd0:      Word boundary padding
791  * @avail_index:        current device position in available ring
792  * @used_index: current device position in used ring
793  * @rsvd:       Word boundary padding
794  * @color:      Color bit
795  */
796 struct pds_vdpa_vq_reset_comp {
797         u8     status;
798         u8     rsvd0;
799         __le16 avail_index;
800         __le16 used_index;
801         u8     rsvd[9];
802         u8     color;
803 };
804
805 /**
806  * struct pds_vdpa_set_features_cmd - set hw features
807  * @opcode: Opcode PDS_VDPA_CMD_SET_FEATURES
808  * @vdpa_index: Index for vdpa subdevice
809  * @vf_id:      VF id
810  * @rsvd:       Word boundary padding
811  * @features:   Feature bit mask
812  */
813 struct pds_vdpa_set_features_cmd {
814         u8     opcode;
815         u8     vdpa_index;
816         __le16 vf_id;
817         __le32 rsvd;
818         __le64 features;
819 };
820
821 #define PDS_LM_DEVICE_STATE_LENGTH              65536
822 #define PDS_LM_CHECK_DEVICE_STATE_LENGTH(X) \
823                         PDS_CORE_SIZE_CHECK(union, PDS_LM_DEVICE_STATE_LENGTH, X)
824
825 /*
826  * enum pds_lm_cmd_opcode - Live Migration Device commands
827  */
828 enum pds_lm_cmd_opcode {
829         PDS_LM_CMD_HOST_VF_STATUS  = 1,
830
831         /* Device state commands */
832         PDS_LM_CMD_STATE_SIZE      = 16,
833         PDS_LM_CMD_SUSPEND         = 18,
834         PDS_LM_CMD_SUSPEND_STATUS  = 19,
835         PDS_LM_CMD_RESUME          = 20,
836         PDS_LM_CMD_SAVE            = 21,
837         PDS_LM_CMD_RESTORE         = 22,
838
839         /* Dirty page tracking commands */
840         PDS_LM_CMD_DIRTY_STATUS    = 32,
841         PDS_LM_CMD_DIRTY_ENABLE    = 33,
842         PDS_LM_CMD_DIRTY_DISABLE   = 34,
843         PDS_LM_CMD_DIRTY_READ_SEQ  = 35,
844         PDS_LM_CMD_DIRTY_WRITE_ACK = 36,
845 };
846
847 /**
848  * struct pds_lm_cmd - generic command
849  * @opcode:     Opcode
850  * @rsvd:       Word boundary padding
851  * @vf_id:      VF id
852  * @rsvd2:      Structure padding to 60 Bytes
853  */
854 struct pds_lm_cmd {
855         u8     opcode;
856         u8     rsvd;
857         __le16 vf_id;
858         u8     rsvd2[56];
859 };
860
861 /**
862  * struct pds_lm_state_size_cmd - STATE_SIZE command
863  * @opcode:     Opcode
864  * @rsvd:       Word boundary padding
865  * @vf_id:      VF id
866  */
867 struct pds_lm_state_size_cmd {
868         u8     opcode;
869         u8     rsvd;
870         __le16 vf_id;
871 };
872
873 /**
874  * struct pds_lm_state_size_comp - STATE_SIZE command completion
875  * @status:             Status of the command (enum pds_core_status_code)
876  * @rsvd:               Word boundary padding
877  * @comp_index:         Index in the desc ring for which this is the completion
878  * @size:               Size of the device state
879  * @rsvd2:              Word boundary padding
880  * @color:              Color bit
881  */
882 struct pds_lm_state_size_comp {
883         u8     status;
884         u8     rsvd;
885         __le16 comp_index;
886         union {
887                 __le64 size;
888                 u8     rsvd2[11];
889         } __packed;
890         u8     color;
891 };
892
893 enum pds_lm_suspend_resume_type {
894         PDS_LM_SUSPEND_RESUME_TYPE_FULL = 0,
895         PDS_LM_SUSPEND_RESUME_TYPE_P2P = 1,
896 };
897
898 /**
899  * struct pds_lm_suspend_cmd - SUSPEND command
900  * @opcode:     Opcode PDS_LM_CMD_SUSPEND
901  * @rsvd:       Word boundary padding
902  * @vf_id:      VF id
903  * @type:       Type of suspend (enum pds_lm_suspend_resume_type)
904  */
905 struct pds_lm_suspend_cmd {
906         u8     opcode;
907         u8     rsvd;
908         __le16 vf_id;
909         u8     type;
910 };
911
912 /**
913  * struct pds_lm_suspend_status_cmd - SUSPEND status command
914  * @opcode:     Opcode PDS_AQ_CMD_LM_SUSPEND_STATUS
915  * @rsvd:       Word boundary padding
916  * @vf_id:      VF id
917  * @type:       Type of suspend (enum pds_lm_suspend_resume_type)
918  */
919 struct pds_lm_suspend_status_cmd {
920         u8 opcode;
921         u8 rsvd;
922         __le16 vf_id;
923         u8 type;
924 };
925
926 /**
927  * struct pds_lm_resume_cmd - RESUME command
928  * @opcode:     Opcode PDS_LM_CMD_RESUME
929  * @rsvd:       Word boundary padding
930  * @vf_id:      VF id
931  * @type:       Type of resume (enum pds_lm_suspend_resume_type)
932  */
933 struct pds_lm_resume_cmd {
934         u8     opcode;
935         u8     rsvd;
936         __le16 vf_id;
937         u8     type;
938 };
939
940 /**
941  * struct pds_lm_sg_elem - Transmit scatter-gather (SG) descriptor element
942  * @addr:       DMA address of SG element data buffer
943  * @len:        Length of SG element data buffer, in bytes
944  * @rsvd:       Word boundary padding
945  */
946 struct pds_lm_sg_elem {
947         __le64 addr;
948         __le32 len;
949         __le16 rsvd[2];
950 };
951
952 /**
953  * struct pds_lm_save_cmd - SAVE command
954  * @opcode:     Opcode PDS_LM_CMD_SAVE
955  * @rsvd:       Word boundary padding
956  * @vf_id:      VF id
957  * @rsvd2:      Word boundary padding
958  * @sgl_addr:   IOVA address of the SGL to dma the device state
959  * @num_sge:    Total number of SG elements
960  */
961 struct pds_lm_save_cmd {
962         u8     opcode;
963         u8     rsvd;
964         __le16 vf_id;
965         u8     rsvd2[4];
966         __le64 sgl_addr;
967         __le32 num_sge;
968 } __packed;
969
970 /**
971  * struct pds_lm_restore_cmd - RESTORE command
972  * @opcode:     Opcode PDS_LM_CMD_RESTORE
973  * @rsvd:       Word boundary padding
974  * @vf_id:      VF id
975  * @rsvd2:      Word boundary padding
976  * @sgl_addr:   IOVA address of the SGL to dma the device state
977  * @num_sge:    Total number of SG elements
978  */
979 struct pds_lm_restore_cmd {
980         u8     opcode;
981         u8     rsvd;
982         __le16 vf_id;
983         u8     rsvd2[4];
984         __le64 sgl_addr;
985         __le32 num_sge;
986 } __packed;
987
988 /**
989  * union pds_lm_dev_state - device state information
990  * @words:      Device state words
991  */
992 union pds_lm_dev_state {
993         __le32 words[PDS_LM_DEVICE_STATE_LENGTH / sizeof(__le32)];
994 };
995
996 enum pds_lm_host_vf_status {
997         PDS_LM_STA_NONE = 0,
998         PDS_LM_STA_IN_PROGRESS,
999         PDS_LM_STA_MAX,
1000 };
1001
1002 /**
1003  * struct pds_lm_dirty_region_info - Memory region info for STATUS and ENABLE
1004  * @dma_base:           Base address of the DMA-contiguous memory region
1005  * @page_count:         Number of pages in the memory region
1006  * @page_size_log2:     Log2 page size in the memory region
1007  * @rsvd:               Word boundary padding
1008  */
1009 struct pds_lm_dirty_region_info {
1010         __le64 dma_base;
1011         __le32 page_count;
1012         u8     page_size_log2;
1013         u8     rsvd[3];
1014 };
1015
1016 /**
1017  * struct pds_lm_dirty_status_cmd - DIRTY_STATUS command
1018  * @opcode:             Opcode PDS_LM_CMD_DIRTY_STATUS
1019  * @rsvd:               Word boundary padding
1020  * @vf_id:              VF id
1021  * @max_regions:        Capacity of the region info buffer
1022  * @rsvd2:              Word boundary padding
1023  * @regions_dma:        DMA address of the region info buffer
1024  *
1025  * The minimum of max_regions (from the command) and num_regions (from the
1026  * completion) of struct pds_lm_dirty_region_info will be written to
1027  * regions_dma.
1028  *
1029  * The max_regions may be zero, in which case regions_dma is ignored.  In that
1030  * case, the completion will only report the maximum number of regions
1031  * supported by the device, and the number of regions currently enabled.
1032  */
1033 struct pds_lm_dirty_status_cmd {
1034         u8     opcode;
1035         u8     rsvd;
1036         __le16 vf_id;
1037         u8     max_regions;
1038         u8     rsvd2[3];
1039         __le64 regions_dma;
1040 } __packed;
1041
1042 /**
1043  * enum pds_lm_dirty_bmp_type - Type of dirty page bitmap
1044  * @PDS_LM_DIRTY_BMP_TYPE_NONE: No bitmap / disabled
1045  * @PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK: Seq/Ack bitmap representation
1046  */
1047 enum pds_lm_dirty_bmp_type {
1048         PDS_LM_DIRTY_BMP_TYPE_NONE     = 0,
1049         PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK  = 1,
1050 };
1051
1052 /**
1053  * struct pds_lm_dirty_status_comp - STATUS command completion
1054  * @status:             Status of the command (enum pds_core_status_code)
1055  * @rsvd:               Word boundary padding
1056  * @comp_index:         Index in the desc ring for which this is the completion
1057  * @max_regions:        Maximum number of regions supported by the device
1058  * @num_regions:        Number of regions currently enabled
1059  * @bmp_type:           Type of dirty bitmap representation
1060  * @rsvd2:              Word boundary padding
1061  * @bmp_type_mask:      Mask of supported bitmap types, bit index per type
1062  * @rsvd3:              Word boundary padding
1063  * @color:              Color bit
1064  *
1065  * This completion descriptor is used for STATUS, ENABLE, and DISABLE.
1066  */
1067 struct pds_lm_dirty_status_comp {
1068         u8     status;
1069         u8     rsvd;
1070         __le16 comp_index;
1071         u8     max_regions;
1072         u8     num_regions;
1073         u8     bmp_type;
1074         u8     rsvd2;
1075         __le32 bmp_type_mask;
1076         u8     rsvd3[3];
1077         u8     color;
1078 };
1079
1080 /**
1081  * struct pds_lm_dirty_enable_cmd - DIRTY_ENABLE command
1082  * @opcode:             Opcode PDS_LM_CMD_DIRTY_ENABLE
1083  * @rsvd:               Word boundary padding
1084  * @vf_id:              VF id
1085  * @bmp_type:           Type of dirty bitmap representation
1086  * @num_regions:        Number of entries in the region info buffer
1087  * @rsvd2:              Word boundary padding
1088  * @regions_dma:        DMA address of the region info buffer
1089  *
1090  * The num_regions must be nonzero, and less than or equal to the maximum
1091  * number of regions supported by the device.
1092  *
1093  * The memory regions should not overlap.
1094  *
1095  * The information should be initialized by the driver.  The device may modify
1096  * the information on successful completion, such as by size-aligning the
1097  * number of pages in a region.
1098  *
1099  * The modified number of pages will be greater than or equal to the page count
1100  * given in the enable command, and at least as coarsly aligned as the given
1101  * value.  For example, the count might be aligned to a multiple of 64, but
1102  * if the value is already a multiple of 128 or higher, it will not change.
1103  * If the driver requires its own minimum alignment of the number of pages, the
1104  * driver should account for that already in the region info of this command.
1105  *
1106  * This command uses struct pds_lm_dirty_status_comp for its completion.
1107  */
1108 struct pds_lm_dirty_enable_cmd {
1109         u8     opcode;
1110         u8     rsvd;
1111         __le16 vf_id;
1112         u8     bmp_type;
1113         u8     num_regions;
1114         u8     rsvd2[2];
1115         __le64 regions_dma;
1116 } __packed;
1117
1118 /**
1119  * struct pds_lm_dirty_disable_cmd - DIRTY_DISABLE command
1120  * @opcode:     Opcode PDS_LM_CMD_DIRTY_DISABLE
1121  * @rsvd:       Word boundary padding
1122  * @vf_id:      VF id
1123  *
1124  * Dirty page tracking will be disabled.  This may be called in any state, as
1125  * long as dirty page tracking is supported by the device, to ensure that dirty
1126  * page tracking is disabled.
1127  *
1128  * This command uses struct pds_lm_dirty_status_comp for its completion.  On
1129  * success, num_regions will be zero.
1130  */
1131 struct pds_lm_dirty_disable_cmd {
1132         u8     opcode;
1133         u8     rsvd;
1134         __le16 vf_id;
1135 };
1136
1137 /**
1138  * struct pds_lm_dirty_seq_ack_cmd - DIRTY_READ_SEQ or _WRITE_ACK command
1139  * @opcode:     Opcode PDS_LM_CMD_DIRTY_[READ_SEQ|WRITE_ACK]
1140  * @rsvd:       Word boundary padding
1141  * @vf_id:      VF id
1142  * @off_bytes:  Byte offset in the bitmap
1143  * @len_bytes:  Number of bytes to transfer
1144  * @num_sge:    Number of DMA scatter gather elements
1145  * @rsvd2:      Word boundary padding
1146  * @sgl_addr:   DMA address of scatter gather list
1147  *
1148  * Read bytes from the SEQ bitmap, or write bytes into the ACK bitmap.
1149  *
1150  * This command treats the entire bitmap as a byte buffer.  It does not
1151  * distinguish between guest memory regions.  The driver should refer to the
1152  * number of pages in each region, according to PDS_LM_CMD_DIRTY_STATUS, to
1153  * determine the region boundaries in the bitmap.  Each region will be
1154  * represented by exactly the number of bits as the page count for that region,
1155  * immediately following the last bit of the previous region.
1156  */
1157 struct pds_lm_dirty_seq_ack_cmd {
1158         u8     opcode;
1159         u8     rsvd;
1160         __le16 vf_id;
1161         __le32 off_bytes;
1162         __le32 len_bytes;
1163         __le16 num_sge;
1164         u8     rsvd2[2];
1165         __le64 sgl_addr;
1166 } __packed;
1167
1168 /**
1169  * struct pds_lm_host_vf_status_cmd - HOST_VF_STATUS command
1170  * @opcode:     Opcode PDS_LM_CMD_HOST_VF_STATUS
1171  * @rsvd:       Word boundary padding
1172  * @vf_id:      VF id
1173  * @status:     Current LM status of host VF driver (enum pds_lm_host_status)
1174  */
1175 struct pds_lm_host_vf_status_cmd {
1176         u8     opcode;
1177         u8     rsvd;
1178         __le16 vf_id;
1179         u8     status;
1180 };
1181
1182 union pds_core_adminq_cmd {
1183         u8     opcode;
1184         u8     bytes[64];
1185
1186         struct pds_core_client_reg_cmd     client_reg;
1187         struct pds_core_client_unreg_cmd   client_unreg;
1188         struct pds_core_client_request_cmd client_request;
1189
1190         struct pds_core_lif_identify_cmd  lif_ident;
1191         struct pds_core_lif_init_cmd      lif_init;
1192         struct pds_core_lif_reset_cmd     lif_reset;
1193         struct pds_core_lif_setattr_cmd   lif_setattr;
1194         struct pds_core_lif_getattr_cmd   lif_getattr;
1195
1196         struct pds_core_q_identify_cmd    q_ident;
1197         struct pds_core_q_init_cmd        q_init;
1198
1199         struct pds_vdpa_cmd               vdpa;
1200         struct pds_vdpa_init_cmd          vdpa_init;
1201         struct pds_vdpa_ident_cmd         vdpa_ident;
1202         struct pds_vdpa_status_cmd        vdpa_status;
1203         struct pds_vdpa_setattr_cmd       vdpa_setattr;
1204         struct pds_vdpa_set_features_cmd  vdpa_set_features;
1205         struct pds_vdpa_vq_init_cmd       vdpa_vq_init;
1206         struct pds_vdpa_vq_reset_cmd      vdpa_vq_reset;
1207
1208         struct pds_lm_suspend_cmd         lm_suspend;
1209         struct pds_lm_suspend_status_cmd  lm_suspend_status;
1210         struct pds_lm_resume_cmd          lm_resume;
1211         struct pds_lm_state_size_cmd      lm_state_size;
1212         struct pds_lm_save_cmd            lm_save;
1213         struct pds_lm_restore_cmd         lm_restore;
1214         struct pds_lm_host_vf_status_cmd  lm_host_vf_status;
1215         struct pds_lm_dirty_status_cmd    lm_dirty_status;
1216         struct pds_lm_dirty_enable_cmd    lm_dirty_enable;
1217         struct pds_lm_dirty_disable_cmd   lm_dirty_disable;
1218         struct pds_lm_dirty_seq_ack_cmd   lm_dirty_seq_ack;
1219 };
1220
1221 union pds_core_adminq_comp {
1222         struct {
1223                 u8     status;
1224                 u8     rsvd;
1225                 __le16 comp_index;
1226                 u8     rsvd2[11];
1227                 u8     color;
1228         };
1229         u32    words[4];
1230
1231         struct pds_core_client_reg_comp   client_reg;
1232
1233         struct pds_core_lif_identify_comp lif_ident;
1234         struct pds_core_lif_init_comp     lif_init;
1235         struct pds_core_lif_setattr_comp  lif_setattr;
1236         struct pds_core_lif_getattr_comp  lif_getattr;
1237
1238         struct pds_core_q_identify_comp   q_ident;
1239         struct pds_core_q_init_comp       q_init;
1240
1241         struct pds_vdpa_vq_init_comp      vdpa_vq_init;
1242         struct pds_vdpa_vq_reset_comp     vdpa_vq_reset;
1243
1244         struct pds_lm_state_size_comp     lm_state_size;
1245         struct pds_lm_dirty_status_comp   lm_dirty_status;
1246 };
1247
1248 #ifndef __CHECKER__
1249 static_assert(sizeof(union pds_core_adminq_cmd) == 64);
1250 static_assert(sizeof(union pds_core_adminq_comp) == 16);
1251 static_assert(sizeof(union pds_core_notifyq_comp) == 64);
1252 #endif /* __CHECKER__ */
1253
1254 /* The color bit is a 'done' bit for the completion descriptors
1255  * where the meaning alternates between '1' and '0' for alternating
1256  * passes through the completion descriptor ring.
1257  */
1258 static inline bool pdsc_color_match(u8 color, bool done_color)
1259 {
1260         return (!!(color & PDS_COMP_COLOR_MASK)) == done_color;
1261 }
1262
1263 struct pdsc;
1264 int pdsc_adminq_post(struct pdsc *pdsc,
1265                      union pds_core_adminq_cmd *cmd,
1266                      union pds_core_adminq_comp *comp,
1267                      bool fast_poll);
1268
1269 #endif /* _PDS_CORE_ADMINQ_H_ */