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