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 OR Linux-OpenIB) OR BSD-2-Clause */
2/* Copyright(c) 2023 Advanced Micro Devices, Inc. */
3
4#ifndef _PDS_CORE_IF_H_
5#define _PDS_CORE_IF_H_
6
7#define PCI_VENDOR_ID_PENSANDO 0x1dd8
8#define PCI_DEVICE_ID_PENSANDO_CORE_PF 0x100c
9#define PCI_DEVICE_ID_VIRTIO_NET_TRANS 0x1000
10#define PCI_DEVICE_ID_PENSANDO_IONIC_ETH_VF 0x1003
11#define PCI_DEVICE_ID_PENSANDO_VDPA_VF 0x100b
12#define PDS_CORE_BARS_MAX 4
13#define PDS_CORE_PCI_BAR_DBELL 1
14
15/* Bar0 */
16#define PDS_CORE_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */
17#define PDS_CORE_BAR0_SIZE 0x8000
18#define PDS_CORE_BAR0_DEV_INFO_REGS_OFFSET 0x0000
19#define PDS_CORE_BAR0_DEV_CMD_REGS_OFFSET 0x0800
20#define PDS_CORE_BAR0_DEV_CMD_DATA_REGS_OFFSET 0x0c00
21#define PDS_CORE_BAR0_INTR_STATUS_OFFSET 0x1000
22#define PDS_CORE_BAR0_INTR_CTRL_OFFSET 0x2000
23#define PDS_CORE_DEV_CMD_DONE 0x00000001
24
25#define PDS_CORE_DEVCMD_TIMEOUT 5
26
27#define PDS_CORE_CLIENT_ID 0
28#define PDS_CORE_ASIC_TYPE_CAPRI 0
29
30/*
31 * enum pds_core_cmd_opcode - Device commands
32 */
33enum pds_core_cmd_opcode {
34 /* Core init */
35 PDS_CORE_CMD_NOP = 0,
36 PDS_CORE_CMD_IDENTIFY = 1,
37 PDS_CORE_CMD_RESET = 2,
38 PDS_CORE_CMD_INIT = 3,
39
40 PDS_CORE_CMD_FW_DOWNLOAD = 4,
41 PDS_CORE_CMD_FW_CONTROL = 5,
42
43 /* SR/IOV commands */
44 PDS_CORE_CMD_VF_GETATTR = 60,
45 PDS_CORE_CMD_VF_SETATTR = 61,
46 PDS_CORE_CMD_VF_CTRL = 62,
47
48 /* Add commands before this line */
49 PDS_CORE_CMD_MAX,
50 PDS_CORE_CMD_COUNT
51};
52
53/*
54 * enum pds_core_status_code - Device command return codes
55 */
56enum pds_core_status_code {
57 PDS_RC_SUCCESS = 0, /* Success */
58 PDS_RC_EVERSION = 1, /* Incorrect version for request */
59 PDS_RC_EOPCODE = 2, /* Invalid cmd opcode */
60 PDS_RC_EIO = 3, /* I/O error */
61 PDS_RC_EPERM = 4, /* Permission denied */
62 PDS_RC_EQID = 5, /* Bad qid */
63 PDS_RC_EQTYPE = 6, /* Bad qtype */
64 PDS_RC_ENOENT = 7, /* No such element */
65 PDS_RC_EINTR = 8, /* operation interrupted */
66 PDS_RC_EAGAIN = 9, /* Try again */
67 PDS_RC_ENOMEM = 10, /* Out of memory */
68 PDS_RC_EFAULT = 11, /* Bad address */
69 PDS_RC_EBUSY = 12, /* Device or resource busy */
70 PDS_RC_EEXIST = 13, /* object already exists */
71 PDS_RC_EINVAL = 14, /* Invalid argument */
72 PDS_RC_ENOSPC = 15, /* No space left or alloc failure */
73 PDS_RC_ERANGE = 16, /* Parameter out of range */
74 PDS_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */
75 PDS_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */
76 PDS_RC_ENOSUPP = 19, /* Operation not supported */
77 PDS_RC_ERROR = 29, /* Generic error */
78 PDS_RC_ERDMA = 30, /* Generic RDMA error */
79 PDS_RC_EVFID = 31, /* VF ID does not exist */
80 PDS_RC_BAD_FW = 32, /* FW file is invalid or corrupted */
81 PDS_RC_ECLIENT = 33, /* No such client id */
82};
83
84/**
85 * struct pds_core_drv_identity - Driver identity information
86 * @drv_type: Driver type (enum pds_core_driver_type)
87 * @os_dist: OS distribution, numeric format
88 * @os_dist_str: OS distribution, string format
89 * @kernel_ver: Kernel version, numeric format
90 * @kernel_ver_str: Kernel version, string format
91 * @driver_ver_str: Driver version, string format
92 */
93struct pds_core_drv_identity {
94 __le32 drv_type;
95 __le32 os_dist;
96 char os_dist_str[128];
97 __le32 kernel_ver;
98 char kernel_ver_str[32];
99 char driver_ver_str[32];
100};
101
102#define PDS_DEV_TYPE_MAX 16
103/**
104 * struct pds_core_dev_identity - Device identity information
105 * @version: Version of device identify
106 * @type: Identify type (0 for now)
107 * @state: Device state
108 * @rsvd: Word boundary padding
109 * @nlifs: Number of LIFs provisioned
110 * @nintrs: Number of interrupts provisioned
111 * @ndbpgs_per_lif: Number of doorbell pages per LIF
112 * @intr_coal_mult: Interrupt coalescing multiplication factor
113 * Scale user-supplied interrupt coalescing
114 * value in usecs to device units using:
115 * device units = usecs * mult / div
116 * @intr_coal_div: Interrupt coalescing division factor
117 * Scale user-supplied interrupt coalescing
118 * value in usecs to device units using:
119 * device units = usecs * mult / div
120 * @vif_types: How many of each VIF device type is supported
121 */
122struct pds_core_dev_identity {
123 u8 version;
124 u8 type;
125 u8 state;
126 u8 rsvd;
127 __le32 nlifs;
128 __le32 nintrs;
129 __le32 ndbpgs_per_lif;
130 __le32 intr_coal_mult;
131 __le32 intr_coal_div;
132 __le16 vif_types[PDS_DEV_TYPE_MAX];
133};
134
135#define PDS_CORE_IDENTITY_VERSION_1 1
136
137/**
138 * struct pds_core_dev_identify_cmd - Driver/device identify command
139 * @opcode: Opcode PDS_CORE_CMD_IDENTIFY
140 * @ver: Highest version of identify supported by driver
141 *
142 * Expects to find driver identification info (struct pds_core_drv_identity)
143 * in cmd_regs->data. Driver should keep the devcmd interface locked
144 * while preparing the driver info.
145 */
146struct pds_core_dev_identify_cmd {
147 u8 opcode;
148 u8 ver;
149};
150
151/**
152 * struct pds_core_dev_identify_comp - Device identify command completion
153 * @status: Status of the command (enum pds_core_status_code)
154 * @ver: Version of identify returned by device
155 *
156 * Device identification info (struct pds_core_dev_identity) can be found
157 * in cmd_regs->data. Driver should keep the devcmd interface locked
158 * while reading the results.
159 */
160struct pds_core_dev_identify_comp {
161 u8 status;
162 u8 ver;
163};
164
165/**
166 * struct pds_core_dev_reset_cmd - Device reset command
167 * @opcode: Opcode PDS_CORE_CMD_RESET
168 *
169 * Resets and clears all LIFs, VDevs, and VIFs on the device.
170 */
171struct pds_core_dev_reset_cmd {
172 u8 opcode;
173};
174
175/**
176 * struct pds_core_dev_reset_comp - Reset command completion
177 * @status: Status of the command (enum pds_core_status_code)
178 */
179struct pds_core_dev_reset_comp {
180 u8 status;
181};
182
183/*
184 * struct pds_core_dev_init_data - Pointers and info needed for the Core
185 * initialization PDS_CORE_CMD_INIT command. The in and out structs are
186 * overlays on the pds_core_dev_cmd_regs.data space for passing data down
187 * to the firmware on init, and then returning initialization results.
188 */
189struct pds_core_dev_init_data_in {
190 __le64 adminq_q_base;
191 __le64 adminq_cq_base;
192 __le64 notifyq_cq_base;
193 __le32 flags;
194 __le16 intr_index;
195 u8 adminq_ring_size;
196 u8 notifyq_ring_size;
197};
198
199struct pds_core_dev_init_data_out {
200 __le32 core_hw_index;
201 __le32 adminq_hw_index;
202 __le32 notifyq_hw_index;
203 u8 adminq_hw_type;
204 u8 notifyq_hw_type;
205};
206
207/**
208 * struct pds_core_dev_init_cmd - Core device initialize
209 * @opcode: opcode PDS_CORE_CMD_INIT
210 *
211 * Initializes the core device and sets up the AdminQ and NotifyQ.
212 * Expects to find initialization data (struct pds_core_dev_init_data_in)
213 * in cmd_regs->data. Driver should keep the devcmd interface locked
214 * while preparing the driver info.
215 */
216struct pds_core_dev_init_cmd {
217 u8 opcode;
218};
219
220/**
221 * struct pds_core_dev_init_comp - Core init completion
222 * @status: Status of the command (enum pds_core_status_code)
223 *
224 * Initialization result data (struct pds_core_dev_init_data_in)
225 * is found in cmd_regs->data.
226 */
227struct pds_core_dev_init_comp {
228 u8 status;
229};
230
231/**
232 * struct pds_core_fw_download_cmd - Firmware download command
233 * @opcode: opcode
234 * @rsvd: Word boundary padding
235 * @addr: DMA address of the firmware buffer
236 * @offset: offset of the firmware buffer within the full image
237 * @length: number of valid bytes in the firmware buffer
238 */
239struct pds_core_fw_download_cmd {
240 u8 opcode;
241 u8 rsvd[3];
242 __le32 offset;
243 __le64 addr;
244 __le32 length;
245};
246
247/**
248 * struct pds_core_fw_download_comp - Firmware download completion
249 * @status: Status of the command (enum pds_core_status_code)
250 */
251struct pds_core_fw_download_comp {
252 u8 status;
253};
254
255/**
256 * enum pds_core_fw_control_oper - FW control operations
257 * @PDS_CORE_FW_INSTALL_ASYNC: Install firmware asynchronously
258 * @PDS_CORE_FW_INSTALL_STATUS: Firmware installation status
259 * @PDS_CORE_FW_ACTIVATE_ASYNC: Activate firmware asynchronously
260 * @PDS_CORE_FW_ACTIVATE_STATUS: Firmware activate status
261 * @PDS_CORE_FW_UPDATE_CLEANUP: Cleanup any firmware update leftovers
262 * @PDS_CORE_FW_GET_BOOT: Return current active firmware slot
263 * @PDS_CORE_FW_SET_BOOT: Set active firmware slot for next boot
264 * @PDS_CORE_FW_GET_LIST: Return list of installed firmware images
265 */
266enum pds_core_fw_control_oper {
267 PDS_CORE_FW_INSTALL_ASYNC = 0,
268 PDS_CORE_FW_INSTALL_STATUS = 1,
269 PDS_CORE_FW_ACTIVATE_ASYNC = 2,
270 PDS_CORE_FW_ACTIVATE_STATUS = 3,
271 PDS_CORE_FW_UPDATE_CLEANUP = 4,
272 PDS_CORE_FW_GET_BOOT = 5,
273 PDS_CORE_FW_SET_BOOT = 6,
274 PDS_CORE_FW_GET_LIST = 7,
275};
276
277enum pds_core_fw_slot {
278 PDS_CORE_FW_SLOT_INVALID = 0,
279 PDS_CORE_FW_SLOT_A = 1,
280 PDS_CORE_FW_SLOT_B = 2,
281 PDS_CORE_FW_SLOT_GOLD = 3,
282};
283
284/**
285 * struct pds_core_fw_control_cmd - Firmware control command
286 * @opcode: opcode
287 * @rsvd: Word boundary padding
288 * @oper: firmware control operation (enum pds_core_fw_control_oper)
289 * @slot: slot to operate on (enum pds_core_fw_slot)
290 */
291struct pds_core_fw_control_cmd {
292 u8 opcode;
293 u8 rsvd[3];
294 u8 oper;
295 u8 slot;
296};
297
298/**
299 * struct pds_core_fw_control_comp - Firmware control copletion
300 * @status: Status of the command (enum pds_core_status_code)
301 * @rsvd: Word alignment space
302 * @slot: Slot number (enum pds_core_fw_slot)
303 * @rsvd1: Struct padding
304 * @color: Color bit
305 */
306struct pds_core_fw_control_comp {
307 u8 status;
308 u8 rsvd[3];
309 u8 slot;
310 u8 rsvd1[10];
311 u8 color;
312};
313
314struct pds_core_fw_name_info {
315#define PDS_CORE_FWSLOT_BUFLEN 8
316#define PDS_CORE_FWVERS_BUFLEN 32
317 char slotname[PDS_CORE_FWSLOT_BUFLEN];
318 char fw_version[PDS_CORE_FWVERS_BUFLEN];
319};
320
321struct pds_core_fw_list_info {
322#define PDS_CORE_FWVERS_LIST_LEN 16
323 u8 num_fw_slots;
324 struct pds_core_fw_name_info fw_names[PDS_CORE_FWVERS_LIST_LEN];
325} __packed;
326
327enum pds_core_vf_attr {
328 PDS_CORE_VF_ATTR_SPOOFCHK = 1,
329 PDS_CORE_VF_ATTR_TRUST = 2,
330 PDS_CORE_VF_ATTR_MAC = 3,
331 PDS_CORE_VF_ATTR_LINKSTATE = 4,
332 PDS_CORE_VF_ATTR_VLAN = 5,
333 PDS_CORE_VF_ATTR_RATE = 6,
334 PDS_CORE_VF_ATTR_STATSADDR = 7,
335};
336
337/**
338 * enum pds_core_vf_link_status - Virtual Function link status
339 * @PDS_CORE_VF_LINK_STATUS_AUTO: Use link state of the uplink
340 * @PDS_CORE_VF_LINK_STATUS_UP: Link always up
341 * @PDS_CORE_VF_LINK_STATUS_DOWN: Link always down
342 */
343enum pds_core_vf_link_status {
344 PDS_CORE_VF_LINK_STATUS_AUTO = 0,
345 PDS_CORE_VF_LINK_STATUS_UP = 1,
346 PDS_CORE_VF_LINK_STATUS_DOWN = 2,
347};
348
349/**
350 * struct pds_core_vf_setattr_cmd - Set VF attributes on the NIC
351 * @opcode: Opcode
352 * @attr: Attribute type (enum pds_core_vf_attr)
353 * @vf_index: VF index
354 * @macaddr: mac address
355 * @vlanid: vlan ID
356 * @maxrate: max Tx rate in Mbps
357 * @spoofchk: enable address spoof checking
358 * @trust: enable VF trust
359 * @linkstate: set link up or down
360 * @stats: stats addr struct
361 * @stats.pa: set DMA address for VF stats
362 * @stats.len: length of VF stats space
363 * @pad: force union to specific size
364 */
365struct pds_core_vf_setattr_cmd {
366 u8 opcode;
367 u8 attr;
368 __le16 vf_index;
369 union {
370 u8 macaddr[6];
371 __le16 vlanid;
372 __le32 maxrate;
373 u8 spoofchk;
374 u8 trust;
375 u8 linkstate;
376 struct {
377 __le64 pa;
378 __le32 len;
379 } stats;
380 u8 pad[60];
381 } __packed;
382};
383
384struct pds_core_vf_setattr_comp {
385 u8 status;
386 u8 attr;
387 __le16 vf_index;
388 __le16 comp_index;
389 u8 rsvd[9];
390 u8 color;
391};
392
393/**
394 * struct pds_core_vf_getattr_cmd - Get VF attributes from the NIC
395 * @opcode: Opcode
396 * @attr: Attribute type (enum pds_core_vf_attr)
397 * @vf_index: VF index
398 */
399struct pds_core_vf_getattr_cmd {
400 u8 opcode;
401 u8 attr;
402 __le16 vf_index;
403};
404
405struct pds_core_vf_getattr_comp {
406 u8 status;
407 u8 attr;
408 __le16 vf_index;
409 union {
410 u8 macaddr[6];
411 __le16 vlanid;
412 __le32 maxrate;
413 u8 spoofchk;
414 u8 trust;
415 u8 linkstate;
416 __le64 stats_pa;
417 u8 pad[11];
418 } __packed;
419 u8 color;
420};
421
422enum pds_core_vf_ctrl_opcode {
423 PDS_CORE_VF_CTRL_START_ALL = 0,
424 PDS_CORE_VF_CTRL_START = 1,
425};
426
427/**
428 * struct pds_core_vf_ctrl_cmd - VF control command
429 * @opcode: Opcode for the command
430 * @ctrl_opcode: VF control operation type
431 * @vf_index: VF Index. It is unused if op START_ALL is used.
432 */
433
434struct pds_core_vf_ctrl_cmd {
435 u8 opcode;
436 u8 ctrl_opcode;
437 __le16 vf_index;
438};
439
440/**
441 * struct pds_core_vf_ctrl_comp - VF_CTRL command completion.
442 * @status: Status of the command (enum pds_core_status_code)
443 */
444struct pds_core_vf_ctrl_comp {
445 u8 status;
446};
447
448/*
449 * union pds_core_dev_cmd - Overlay of core device command structures
450 */
451union pds_core_dev_cmd {
452 u8 opcode;
453 u32 words[16];
454
455 struct pds_core_dev_identify_cmd identify;
456 struct pds_core_dev_init_cmd init;
457 struct pds_core_dev_reset_cmd reset;
458 struct pds_core_fw_download_cmd fw_download;
459 struct pds_core_fw_control_cmd fw_control;
460
461 struct pds_core_vf_setattr_cmd vf_setattr;
462 struct pds_core_vf_getattr_cmd vf_getattr;
463 struct pds_core_vf_ctrl_cmd vf_ctrl;
464};
465
466/*
467 * union pds_core_dev_comp - Overlay of core device completion structures
468 */
469union pds_core_dev_comp {
470 u8 status;
471 u8 bytes[16];
472
473 struct pds_core_dev_identify_comp identify;
474 struct pds_core_dev_reset_comp reset;
475 struct pds_core_dev_init_comp init;
476 struct pds_core_fw_download_comp fw_download;
477 struct pds_core_fw_control_comp fw_control;
478
479 struct pds_core_vf_setattr_comp vf_setattr;
480 struct pds_core_vf_getattr_comp vf_getattr;
481 struct pds_core_vf_ctrl_comp vf_ctrl;
482};
483
484/**
485 * struct pds_core_dev_hwstamp_regs - Hardware current timestamp registers
486 * @tick_low: Low 32 bits of hardware timestamp
487 * @tick_high: High 32 bits of hardware timestamp
488 */
489struct pds_core_dev_hwstamp_regs {
490 u32 tick_low;
491 u32 tick_high;
492};
493
494/**
495 * struct pds_core_dev_info_regs - Device info register format (read-only)
496 * @signature: Signature value of 0x44455649 ('DEVI')
497 * @version: Current version of info
498 * @asic_type: Asic type
499 * @asic_rev: Asic revision
500 * @fw_status: Firmware status
501 * bit 0 - 1 = fw running
502 * bit 4-7 - 4 bit generation number, changes on fw restart
503 * @fw_heartbeat: Firmware heartbeat counter
504 * @serial_num: Serial number
505 * @fw_version: Firmware version
506 * @oprom_regs: oprom_regs to store oprom debug enable/disable and bmp
507 * @rsvd_pad1024: Struct padding
508 * @hwstamp: Hardware current timestamp registers
509 * @rsvd_pad2048: Struct padding
510 */
511struct pds_core_dev_info_regs {
512#define PDS_CORE_DEVINFO_FWVERS_BUFLEN 32
513#define PDS_CORE_DEVINFO_SERIAL_BUFLEN 32
514 u32 signature;
515 u8 version;
516 u8 asic_type;
517 u8 asic_rev;
518#define PDS_CORE_FW_STS_F_STOPPED 0x00
519#define PDS_CORE_FW_STS_F_RUNNING 0x01
520#define PDS_CORE_FW_STS_F_GENERATION 0xF0
521 u8 fw_status;
522 __le32 fw_heartbeat;
523 char fw_version[PDS_CORE_DEVINFO_FWVERS_BUFLEN];
524 char serial_num[PDS_CORE_DEVINFO_SERIAL_BUFLEN];
525 u8 oprom_regs[32]; /* reserved */
526 u8 rsvd_pad1024[916];
527 struct pds_core_dev_hwstamp_regs hwstamp; /* on 1k boundary */
528 u8 rsvd_pad2048[1016];
529} __packed;
530
531/**
532 * struct pds_core_dev_cmd_regs - Device command register format (read-write)
533 * @doorbell: Device Cmd Doorbell, write-only
534 * Write a 1 to signal device to process cmd
535 * @done: Command completed indicator, poll for completion
536 * bit 0 == 1 when command is complete
537 * @cmd: Opcode-specific command bytes
538 * @comp: Opcode-specific response bytes
539 * @rsvd: Struct padding
540 * @data: Opcode-specific side-data
541 */
542struct pds_core_dev_cmd_regs {
543 u32 doorbell;
544 u32 done;
545 union pds_core_dev_cmd cmd;
546 union pds_core_dev_comp comp;
547 u8 rsvd[48];
548 u32 data[478];
549} __packed;
550
551/**
552 * struct pds_core_dev_regs - Device register format for bar 0 page 0
553 * @info: Device info registers
554 * @devcmd: Device command registers
555 */
556struct pds_core_dev_regs {
557 struct pds_core_dev_info_regs info;
558 struct pds_core_dev_cmd_regs devcmd;
559} __packed;
560
561#ifndef __CHECKER__
562static_assert(sizeof(struct pds_core_drv_identity) <= 1912);
563static_assert(sizeof(struct pds_core_dev_identity) <= 1912);
564static_assert(sizeof(union pds_core_dev_cmd) == 64);
565static_assert(sizeof(union pds_core_dev_comp) == 16);
566static_assert(sizeof(struct pds_core_dev_info_regs) == 2048);
567static_assert(sizeof(struct pds_core_dev_cmd_regs) == 2048);
568static_assert(sizeof(struct pds_core_dev_regs) == 4096);
569#endif /* __CHECKER__ */
570
571#endif /* _PDS_CORE_IF_H_ */