xref: /openbmc/linux/include/linux/pds/pds_adminq.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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   */
pdsc_color_match(u8 color,bool done_color)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_ */
1270