Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
9enum 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 */
17enum 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 */
50enum 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 */
67struct 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 */
81struct 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 */
98struct 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 */
114struct 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 */
125struct 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 */
132union 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 */
153struct 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 */
169struct 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 */
187struct 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 */
203struct 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
221enum pds_core_lif_type {
222 PDS_CORE_LIF_TYPE_DEFAULT = 0,
223};
224
225/**
226 * union pds_core_lif_config - LIF configuration
227 * @state: LIF state (enum pds_core_lif_state)
228 * @rsvd: Word boundary padding
229 * @name: LIF name
230 * @rsvd2: Word boundary padding
231 * @features: LIF features active (enum pds_core_hw_features)
232 * @queue_count: Queue counts per queue-type
233 * @words: Full union buffer size
234 */
235union pds_core_lif_config {
236 struct {
237 u8 state;
238 u8 rsvd[3];
239 char name[PDS_CORE_IFNAMSIZ];
240 u8 rsvd2[12];
241 __le64 features;
242 __le32 queue_count[PDS_CORE_QTYPE_MAX];
243 } __packed;
244 __le32 words[64];
245};
246
247/**
248 * struct pds_core_lif_status - LIF status register
249 * @eid: most recent NotifyQ event id
250 * @rsvd: full struct size
251 */
252struct pds_core_lif_status {
253 __le64 eid;
254 u8 rsvd[56];
255};
256
257/**
258 * struct pds_core_lif_info - LIF info structure
259 * @config: LIF configuration structure
260 * @status: LIF status structure
261 */
262struct pds_core_lif_info {
263 union pds_core_lif_config config;
264 struct pds_core_lif_status status;
265};
266
267/**
268 * struct pds_core_lif_identity - LIF identity information (type-specific)
269 * @features: LIF features (see enum pds_core_hw_features)
270 * @version: Identify structure version
271 * @hw_index: LIF hardware index
272 * @rsvd: Word boundary padding
273 * @max_nb_sessions: Maximum number of sessions supported
274 * @rsvd2: buffer padding
275 * @config: LIF config struct with features, q counts
276 */
277struct pds_core_lif_identity {
278 __le64 features;
279 u8 version;
280 u8 hw_index;
281 u8 rsvd[2];
282 __le32 max_nb_sessions;
283 u8 rsvd2[120];
284 union pds_core_lif_config config;
285};
286
287/**
288 * struct pds_core_lif_identify_cmd - Get LIF identity info command
289 * @opcode: Opcode PDS_AQ_CMD_LIF_IDENTIFY
290 * @type: LIF type (enum pds_core_lif_type)
291 * @client_id: Client identifier
292 * @ver: Version of identify returned by device
293 * @rsvd: Word boundary padding
294 * @ident_pa: DMA address to receive identity info
295 *
296 * Firmware will copy LIF identity data (struct pds_core_lif_identity)
297 * into the buffer address given.
298 */
299struct pds_core_lif_identify_cmd {
300 u8 opcode;
301 u8 type;
302 __le16 client_id;
303 u8 ver;
304 u8 rsvd[3];
305 __le64 ident_pa;
306};
307
308/**
309 * struct pds_core_lif_identify_comp - LIF identify command completion
310 * @status: Status of the command (enum pds_core_status_code)
311 * @ver: Version of identify returned by device
312 * @bytes: Bytes copied into the buffer
313 * @rsvd: Word boundary padding
314 * @color: Color bit
315 */
316struct pds_core_lif_identify_comp {
317 u8 status;
318 u8 ver;
319 __le16 bytes;
320 u8 rsvd[11];
321 u8 color;
322};
323
324/**
325 * struct pds_core_lif_init_cmd - LIF init command
326 * @opcode: Opcode PDS_AQ_CMD_LIF_INIT
327 * @type: LIF type (enum pds_core_lif_type)
328 * @client_id: Client identifier
329 * @rsvd: Word boundary padding
330 * @info_pa: Destination address for LIF info (struct pds_core_lif_info)
331 */
332struct pds_core_lif_init_cmd {
333 u8 opcode;
334 u8 type;
335 __le16 client_id;
336 __le32 rsvd;
337 __le64 info_pa;
338};
339
340/**
341 * struct pds_core_lif_init_comp - LIF init command completion
342 * @status: Status of the command (enum pds_core_status_code)
343 * @rsvd: Word boundary padding
344 * @hw_index: Hardware index of the initialized LIF
345 * @rsvd1: Word boundary padding
346 * @color: Color bit
347 */
348struct pds_core_lif_init_comp {
349 u8 status;
350 u8 rsvd;
351 __le16 hw_index;
352 u8 rsvd1[11];
353 u8 color;
354};
355
356/**
357 * struct pds_core_lif_reset_cmd - LIF reset command
358 * Will reset only the specified LIF.
359 * @opcode: Opcode PDS_AQ_CMD_LIF_RESET
360 * @rsvd: Word boundary padding
361 * @client_id: Client identifier
362 */
363struct pds_core_lif_reset_cmd {
364 u8 opcode;
365 u8 rsvd;
366 __le16 client_id;
367};
368
369/**
370 * enum pds_core_lif_attr - List of LIF attributes
371 * @PDS_CORE_LIF_ATTR_STATE: LIF state attribute
372 * @PDS_CORE_LIF_ATTR_NAME: LIF name attribute
373 * @PDS_CORE_LIF_ATTR_FEATURES: LIF features attribute
374 * @PDS_CORE_LIF_ATTR_STATS_CTRL: LIF statistics control attribute
375 */
376enum pds_core_lif_attr {
377 PDS_CORE_LIF_ATTR_STATE = 0,
378 PDS_CORE_LIF_ATTR_NAME = 1,
379 PDS_CORE_LIF_ATTR_FEATURES = 4,
380 PDS_CORE_LIF_ATTR_STATS_CTRL = 6,
381};
382
383/**
384 * struct pds_core_lif_setattr_cmd - Set LIF attributes on the NIC
385 * @opcode: Opcode PDS_AQ_CMD_LIF_SETATTR
386 * @attr: Attribute type (enum pds_core_lif_attr)
387 * @client_id: Client identifier
388 * @state: LIF state (enum pds_core_lif_state)
389 * @name: The name string, 0 terminated
390 * @features: Features (enum pds_core_hw_features)
391 * @stats_ctl: Stats control commands (enum pds_core_stats_ctl_cmd)
392 * @rsvd: Command Buffer padding
393 */
394struct pds_core_lif_setattr_cmd {
395 u8 opcode;
396 u8 attr;
397 __le16 client_id;
398 union {
399 u8 state;
400 char name[PDS_CORE_IFNAMSIZ];
401 __le64 features;
402 u8 stats_ctl;
403 u8 rsvd[60];
404 } __packed;
405};
406
407/**
408 * struct pds_core_lif_setattr_comp - LIF set attr command completion
409 * @status: Status of the command (enum pds_core_status_code)
410 * @rsvd: Word boundary padding
411 * @comp_index: Index in the descriptor ring for which this is the completion
412 * @features: Features (enum pds_core_hw_features)
413 * @rsvd2: Word boundary padding
414 * @color: Color bit
415 */
416struct pds_core_lif_setattr_comp {
417 u8 status;
418 u8 rsvd;
419 __le16 comp_index;
420 union {
421 __le64 features;
422 u8 rsvd2[11];
423 } __packed;
424 u8 color;
425};
426
427/**
428 * struct pds_core_lif_getattr_cmd - Get LIF attributes from the NIC
429 * @opcode: Opcode PDS_AQ_CMD_LIF_GETATTR
430 * @attr: Attribute type (enum pds_core_lif_attr)
431 * @client_id: Client identifier
432 */
433struct pds_core_lif_getattr_cmd {
434 u8 opcode;
435 u8 attr;
436 __le16 client_id;
437};
438
439/**
440 * struct pds_core_lif_getattr_comp - LIF get attr command completion
441 * @status: Status of the command (enum pds_core_status_code)
442 * @rsvd: Word boundary padding
443 * @comp_index: Index in the descriptor ring for which this is the completion
444 * @state: LIF state (enum pds_core_lif_state)
445 * @name: LIF name string, 0 terminated
446 * @features: Features (enum pds_core_hw_features)
447 * @rsvd2: Word boundary padding
448 * @color: Color bit
449 */
450struct pds_core_lif_getattr_comp {
451 u8 status;
452 u8 rsvd;
453 __le16 comp_index;
454 union {
455 u8 state;
456 __le64 features;
457 u8 rsvd2[11];
458 } __packed;
459 u8 color;
460};
461
462/**
463 * union pds_core_q_identity - Queue identity information
464 * @version: Queue type version that can be used with FW
465 * @supported: Bitfield of queue versions, first bit = ver 0
466 * @rsvd: Word boundary padding
467 * @features: Queue features
468 * @desc_sz: Descriptor size
469 * @comp_sz: Completion descriptor size
470 * @rsvd2: Word boundary padding
471 */
472struct pds_core_q_identity {
473 u8 version;
474 u8 supported;
475 u8 rsvd[6];
476#define PDS_CORE_QIDENT_F_CQ 0x01 /* queue has completion ring */
477 __le64 features;
478 __le16 desc_sz;
479 __le16 comp_sz;
480 u8 rsvd2[6];
481};
482
483/**
484 * struct pds_core_q_identify_cmd - queue identify command
485 * @opcode: Opcode PDS_AQ_CMD_Q_IDENTIFY
486 * @type: Logical queue type (enum pds_core_logical_qtype)
487 * @client_id: Client identifier
488 * @ver: Highest queue type version that the driver supports
489 * @rsvd: Word boundary padding
490 * @ident_pa: DMA address to receive the data (struct pds_core_q_identity)
491 */
492struct pds_core_q_identify_cmd {
493 u8 opcode;
494 u8 type;
495 __le16 client_id;
496 u8 ver;
497 u8 rsvd[3];
498 __le64 ident_pa;
499};
500
501/**
502 * struct pds_core_q_identify_comp - queue identify command completion
503 * @status: Status of the command (enum pds_core_status_code)
504 * @rsvd: Word boundary padding
505 * @comp_index: Index in the descriptor ring for which this is the completion
506 * @ver: Queue type version that can be used with FW
507 * @rsvd1: Word boundary padding
508 * @color: Color bit
509 */
510struct pds_core_q_identify_comp {
511 u8 status;
512 u8 rsvd;
513 __le16 comp_index;
514 u8 ver;
515 u8 rsvd1[10];
516 u8 color;
517};
518
519/**
520 * struct pds_core_q_init_cmd - Queue init command
521 * @opcode: Opcode PDS_AQ_CMD_Q_INIT
522 * @type: Logical queue type
523 * @client_id: Client identifier
524 * @ver: Queue type version
525 * @rsvd: Word boundary padding
526 * @index: (LIF, qtype) relative admin queue index
527 * @intr_index: Interrupt control register index, or Event queue index
528 * @pid: Process ID
529 * @flags:
530 * IRQ: Interrupt requested on completion
531 * ENA: Enable the queue. If ENA=0 the queue is initialized
532 * but remains disabled, to be later enabled with the
533 * Queue Enable command. If ENA=1, then queue is
534 * initialized and then enabled.
535 * @cos: Class of service for this queue
536 * @ring_size: Queue ring size, encoded as a log2(size), in
537 * number of descriptors. The actual ring size is
538 * (1 << ring_size). For example, to select a ring size
539 * of 64 descriptors write ring_size = 6. The minimum
540 * ring_size value is 2 for a ring of 4 descriptors.
541 * The maximum ring_size value is 12 for a ring of 4k
542 * descriptors. Values of ring_size <2 and >12 are
543 * reserved.
544 * @ring_base: Queue ring base address
545 * @cq_ring_base: Completion queue ring base address
546 */
547struct pds_core_q_init_cmd {
548 u8 opcode;
549 u8 type;
550 __le16 client_id;
551 u8 ver;
552 u8 rsvd[3];
553 __le32 index;
554 __le16 pid;
555 __le16 intr_index;
556 __le16 flags;
557#define PDS_CORE_QINIT_F_IRQ 0x01 /* Request interrupt on completion */
558#define PDS_CORE_QINIT_F_ENA 0x02 /* Enable the queue */
559 u8 cos;
560#define PDS_CORE_QSIZE_MIN_LG2 2
561#define PDS_CORE_QSIZE_MAX_LG2 12
562 u8 ring_size;
563 __le64 ring_base;
564 __le64 cq_ring_base;
565} __packed;
566
567/**
568 * struct pds_core_q_init_comp - Queue init command completion
569 * @status: Status of the command (enum pds_core_status_code)
570 * @rsvd: Word boundary padding
571 * @comp_index: Index in the descriptor ring for which this is the completion
572 * @hw_index: Hardware Queue ID
573 * @hw_type: Hardware Queue type
574 * @rsvd2: Word boundary padding
575 * @color: Color
576 */
577struct pds_core_q_init_comp {
578 u8 status;
579 u8 rsvd;
580 __le16 comp_index;
581 __le32 hw_index;
582 u8 hw_type;
583 u8 rsvd2[6];
584 u8 color;
585};
586
587union pds_core_adminq_cmd {
588 u8 opcode;
589 u8 bytes[64];
590
591 struct pds_core_client_reg_cmd client_reg;
592 struct pds_core_client_unreg_cmd client_unreg;
593 struct pds_core_client_request_cmd client_request;
594
595 struct pds_core_lif_identify_cmd lif_ident;
596 struct pds_core_lif_init_cmd lif_init;
597 struct pds_core_lif_reset_cmd lif_reset;
598 struct pds_core_lif_setattr_cmd lif_setattr;
599 struct pds_core_lif_getattr_cmd lif_getattr;
600
601 struct pds_core_q_identify_cmd q_ident;
602 struct pds_core_q_init_cmd q_init;
603};
604
605union pds_core_adminq_comp {
606 struct {
607 u8 status;
608 u8 rsvd;
609 __le16 comp_index;
610 u8 rsvd2[11];
611 u8 color;
612 };
613 u32 words[4];
614
615 struct pds_core_client_reg_comp client_reg;
616
617 struct pds_core_lif_identify_comp lif_ident;
618 struct pds_core_lif_init_comp lif_init;
619 struct pds_core_lif_setattr_comp lif_setattr;
620 struct pds_core_lif_getattr_comp lif_getattr;
621
622 struct pds_core_q_identify_comp q_ident;
623 struct pds_core_q_init_comp q_init;
624};
625
626#ifndef __CHECKER__
627static_assert(sizeof(union pds_core_adminq_cmd) == 64);
628static_assert(sizeof(union pds_core_adminq_comp) == 16);
629static_assert(sizeof(union pds_core_notifyq_comp) == 64);
630#endif /* __CHECKER__ */
631
632/* The color bit is a 'done' bit for the completion descriptors
633 * where the meaning alternates between '1' and '0' for alternating
634 * passes through the completion descriptor ring.
635 */
636static inline bool pdsc_color_match(u8 color, bool done_color)
637{
638 return (!!(color & PDS_COMP_COLOR_MASK)) == done_color;
639}
640
641struct pdsc;
642int pdsc_adminq_post(struct pdsc *pdsc,
643 union pds_core_adminq_cmd *cmd,
644 union pds_core_adminq_comp *comp,
645 bool fast_poll);
646
647#endif /* _PDS_CORE_ADMINQ_H_ */