xref: /linux/include/linux/pds/pds_core_if.h (revision f7b5bd72)
155435ea7SShannon Nelson /* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) OR BSD-2-Clause */
255435ea7SShannon Nelson /* Copyright(c) 2023 Advanced Micro Devices, Inc. */
355435ea7SShannon Nelson 
455435ea7SShannon Nelson #ifndef _PDS_CORE_IF_H_
555435ea7SShannon Nelson #define _PDS_CORE_IF_H_
655435ea7SShannon Nelson 
755435ea7SShannon Nelson #define PCI_VENDOR_ID_PENSANDO			0x1dd8
855435ea7SShannon Nelson #define PCI_DEVICE_ID_PENSANDO_CORE_PF		0x100c
955435ea7SShannon Nelson #define PCI_DEVICE_ID_VIRTIO_NET_TRANS		0x1000
1055435ea7SShannon Nelson #define PCI_DEVICE_ID_PENSANDO_IONIC_ETH_VF	0x1003
1155435ea7SShannon Nelson #define PCI_DEVICE_ID_PENSANDO_VDPA_VF		0x100b
1255435ea7SShannon Nelson #define PDS_CORE_BARS_MAX			4
1355435ea7SShannon Nelson #define PDS_CORE_PCI_BAR_DBELL			1
1455435ea7SShannon Nelson 
1555435ea7SShannon Nelson /* Bar0 */
1655435ea7SShannon Nelson #define PDS_CORE_DEV_INFO_SIGNATURE		0x44455649 /* 'DEVI' */
1755435ea7SShannon Nelson #define PDS_CORE_BAR0_SIZE			0x8000
1855435ea7SShannon Nelson #define PDS_CORE_BAR0_DEV_INFO_REGS_OFFSET	0x0000
1955435ea7SShannon Nelson #define PDS_CORE_BAR0_DEV_CMD_REGS_OFFSET	0x0800
2055435ea7SShannon Nelson #define PDS_CORE_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
2155435ea7SShannon Nelson #define PDS_CORE_BAR0_INTR_STATUS_OFFSET	0x1000
2255435ea7SShannon Nelson #define PDS_CORE_BAR0_INTR_CTRL_OFFSET		0x2000
2355435ea7SShannon Nelson #define PDS_CORE_DEV_CMD_DONE			0x00000001
2455435ea7SShannon Nelson 
2555435ea7SShannon Nelson #define PDS_CORE_DEVCMD_TIMEOUT			5
2655435ea7SShannon Nelson 
2755435ea7SShannon Nelson #define PDS_CORE_CLIENT_ID			0
2855435ea7SShannon Nelson #define PDS_CORE_ASIC_TYPE_CAPRI		0
2955435ea7SShannon Nelson 
3055435ea7SShannon Nelson /*
3155435ea7SShannon Nelson  * enum pds_core_cmd_opcode - Device commands
3255435ea7SShannon Nelson  */
3355435ea7SShannon Nelson enum pds_core_cmd_opcode {
3455435ea7SShannon Nelson 	/* Core init */
3555435ea7SShannon Nelson 	PDS_CORE_CMD_NOP		= 0,
3655435ea7SShannon Nelson 	PDS_CORE_CMD_IDENTIFY		= 1,
3755435ea7SShannon Nelson 	PDS_CORE_CMD_RESET		= 2,
3855435ea7SShannon Nelson 	PDS_CORE_CMD_INIT		= 3,
3955435ea7SShannon Nelson 
4055435ea7SShannon Nelson 	PDS_CORE_CMD_FW_DOWNLOAD	= 4,
4155435ea7SShannon Nelson 	PDS_CORE_CMD_FW_CONTROL		= 5,
4255435ea7SShannon Nelson 
4355435ea7SShannon Nelson 	/* SR/IOV commands */
4455435ea7SShannon Nelson 	PDS_CORE_CMD_VF_GETATTR		= 60,
4555435ea7SShannon Nelson 	PDS_CORE_CMD_VF_SETATTR		= 61,
4655435ea7SShannon Nelson 	PDS_CORE_CMD_VF_CTRL		= 62,
4755435ea7SShannon Nelson 
4855435ea7SShannon Nelson 	/* Add commands before this line */
4955435ea7SShannon Nelson 	PDS_CORE_CMD_MAX,
5055435ea7SShannon Nelson 	PDS_CORE_CMD_COUNT
5155435ea7SShannon Nelson };
5255435ea7SShannon Nelson 
5355435ea7SShannon Nelson /*
5455435ea7SShannon Nelson  * enum pds_core_status_code - Device command return codes
5555435ea7SShannon Nelson  */
5655435ea7SShannon Nelson enum pds_core_status_code {
5755435ea7SShannon Nelson 	PDS_RC_SUCCESS	= 0,	/* Success */
5855435ea7SShannon Nelson 	PDS_RC_EVERSION	= 1,	/* Incorrect version for request */
5955435ea7SShannon Nelson 	PDS_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
6055435ea7SShannon Nelson 	PDS_RC_EIO	= 3,	/* I/O error */
6155435ea7SShannon Nelson 	PDS_RC_EPERM	= 4,	/* Permission denied */
6255435ea7SShannon Nelson 	PDS_RC_EQID	= 5,	/* Bad qid */
6355435ea7SShannon Nelson 	PDS_RC_EQTYPE	= 6,	/* Bad qtype */
6455435ea7SShannon Nelson 	PDS_RC_ENOENT	= 7,	/* No such element */
6555435ea7SShannon Nelson 	PDS_RC_EINTR	= 8,	/* operation interrupted */
6655435ea7SShannon Nelson 	PDS_RC_EAGAIN	= 9,	/* Try again */
6755435ea7SShannon Nelson 	PDS_RC_ENOMEM	= 10,	/* Out of memory */
6855435ea7SShannon Nelson 	PDS_RC_EFAULT	= 11,	/* Bad address */
6955435ea7SShannon Nelson 	PDS_RC_EBUSY	= 12,	/* Device or resource busy */
7055435ea7SShannon Nelson 	PDS_RC_EEXIST	= 13,	/* object already exists */
7155435ea7SShannon Nelson 	PDS_RC_EINVAL	= 14,	/* Invalid argument */
7255435ea7SShannon Nelson 	PDS_RC_ENOSPC	= 15,	/* No space left or alloc failure */
7355435ea7SShannon Nelson 	PDS_RC_ERANGE	= 16,	/* Parameter out of range */
7455435ea7SShannon Nelson 	PDS_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
7555435ea7SShannon Nelson 	PDS_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
7655435ea7SShannon Nelson 	PDS_RC_ENOSUPP	= 19,	/* Operation not supported */
7755435ea7SShannon Nelson 	PDS_RC_ERROR	= 29,	/* Generic error */
7855435ea7SShannon Nelson 	PDS_RC_ERDMA	= 30,	/* Generic RDMA error */
7955435ea7SShannon Nelson 	PDS_RC_EVFID	= 31,	/* VF ID does not exist */
8055435ea7SShannon Nelson 	PDS_RC_BAD_FW	= 32,	/* FW file is invalid or corrupted */
8155435ea7SShannon Nelson 	PDS_RC_ECLIENT	= 33,   /* No such client id */
82*f7b5bd72SShannon Nelson 	PDS_RC_BAD_PCI	= 255,  /* Broken PCI when reading status */
8355435ea7SShannon Nelson };
8455435ea7SShannon Nelson 
8555435ea7SShannon Nelson /**
8655435ea7SShannon Nelson  * struct pds_core_drv_identity - Driver identity information
8755435ea7SShannon Nelson  * @drv_type:         Driver type (enum pds_core_driver_type)
8855435ea7SShannon Nelson  * @os_dist:          OS distribution, numeric format
8955435ea7SShannon Nelson  * @os_dist_str:      OS distribution, string format
9055435ea7SShannon Nelson  * @kernel_ver:       Kernel version, numeric format
9155435ea7SShannon Nelson  * @kernel_ver_str:   Kernel version, string format
9255435ea7SShannon Nelson  * @driver_ver_str:   Driver version, string format
9355435ea7SShannon Nelson  */
9455435ea7SShannon Nelson struct pds_core_drv_identity {
9555435ea7SShannon Nelson 	__le32 drv_type;
9655435ea7SShannon Nelson 	__le32 os_dist;
9755435ea7SShannon Nelson 	char   os_dist_str[128];
9855435ea7SShannon Nelson 	__le32 kernel_ver;
9955435ea7SShannon Nelson 	char   kernel_ver_str[32];
10055435ea7SShannon Nelson 	char   driver_ver_str[32];
10155435ea7SShannon Nelson };
10255435ea7SShannon Nelson 
10355435ea7SShannon Nelson #define PDS_DEV_TYPE_MAX	16
10455435ea7SShannon Nelson /**
10555435ea7SShannon Nelson  * struct pds_core_dev_identity - Device identity information
10655435ea7SShannon Nelson  * @version:	      Version of device identify
10755435ea7SShannon Nelson  * @type:	      Identify type (0 for now)
10855435ea7SShannon Nelson  * @state:	      Device state
10955435ea7SShannon Nelson  * @rsvd:	      Word boundary padding
11055435ea7SShannon Nelson  * @nlifs:	      Number of LIFs provisioned
11155435ea7SShannon Nelson  * @nintrs:	      Number of interrupts provisioned
11255435ea7SShannon Nelson  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
11355435ea7SShannon Nelson  * @intr_coal_mult:   Interrupt coalescing multiplication factor
11455435ea7SShannon Nelson  *		      Scale user-supplied interrupt coalescing
11555435ea7SShannon Nelson  *		      value in usecs to device units using:
11655435ea7SShannon Nelson  *		      device units = usecs * mult / div
11755435ea7SShannon Nelson  * @intr_coal_div:    Interrupt coalescing division factor
11855435ea7SShannon Nelson  *		      Scale user-supplied interrupt coalescing
11955435ea7SShannon Nelson  *		      value in usecs to device units using:
12055435ea7SShannon Nelson  *		      device units = usecs * mult / div
12155435ea7SShannon Nelson  * @vif_types:        How many of each VIF device type is supported
12255435ea7SShannon Nelson  */
12355435ea7SShannon Nelson struct pds_core_dev_identity {
12455435ea7SShannon Nelson 	u8     version;
12555435ea7SShannon Nelson 	u8     type;
12655435ea7SShannon Nelson 	u8     state;
12755435ea7SShannon Nelson 	u8     rsvd;
12855435ea7SShannon Nelson 	__le32 nlifs;
12955435ea7SShannon Nelson 	__le32 nintrs;
13055435ea7SShannon Nelson 	__le32 ndbpgs_per_lif;
13155435ea7SShannon Nelson 	__le32 intr_coal_mult;
13255435ea7SShannon Nelson 	__le32 intr_coal_div;
13355435ea7SShannon Nelson 	__le16 vif_types[PDS_DEV_TYPE_MAX];
13455435ea7SShannon Nelson };
13555435ea7SShannon Nelson 
13655435ea7SShannon Nelson #define PDS_CORE_IDENTITY_VERSION_1	1
13755435ea7SShannon Nelson 
13855435ea7SShannon Nelson /**
13955435ea7SShannon Nelson  * struct pds_core_dev_identify_cmd - Driver/device identify command
14055435ea7SShannon Nelson  * @opcode:	Opcode PDS_CORE_CMD_IDENTIFY
14155435ea7SShannon Nelson  * @ver:	Highest version of identify supported by driver
14255435ea7SShannon Nelson  *
14355435ea7SShannon Nelson  * Expects to find driver identification info (struct pds_core_drv_identity)
14455435ea7SShannon Nelson  * in cmd_regs->data.  Driver should keep the devcmd interface locked
14555435ea7SShannon Nelson  * while preparing the driver info.
14655435ea7SShannon Nelson  */
14755435ea7SShannon Nelson struct pds_core_dev_identify_cmd {
14855435ea7SShannon Nelson 	u8 opcode;
14955435ea7SShannon Nelson 	u8 ver;
15055435ea7SShannon Nelson };
15155435ea7SShannon Nelson 
15255435ea7SShannon Nelson /**
15355435ea7SShannon Nelson  * struct pds_core_dev_identify_comp - Device identify command completion
15455435ea7SShannon Nelson  * @status:	Status of the command (enum pds_core_status_code)
15555435ea7SShannon Nelson  * @ver:	Version of identify returned by device
15655435ea7SShannon Nelson  *
15755435ea7SShannon Nelson  * Device identification info (struct pds_core_dev_identity) can be found
15855435ea7SShannon Nelson  * in cmd_regs->data.  Driver should keep the devcmd interface locked
15955435ea7SShannon Nelson  * while reading the results.
16055435ea7SShannon Nelson  */
16155435ea7SShannon Nelson struct pds_core_dev_identify_comp {
16255435ea7SShannon Nelson 	u8 status;
16355435ea7SShannon Nelson 	u8 ver;
16455435ea7SShannon Nelson };
16555435ea7SShannon Nelson 
16655435ea7SShannon Nelson /**
16755435ea7SShannon Nelson  * struct pds_core_dev_reset_cmd - Device reset command
16855435ea7SShannon Nelson  * @opcode:	Opcode PDS_CORE_CMD_RESET
16955435ea7SShannon Nelson  *
17055435ea7SShannon Nelson  * Resets and clears all LIFs, VDevs, and VIFs on the device.
17155435ea7SShannon Nelson  */
17255435ea7SShannon Nelson struct pds_core_dev_reset_cmd {
17355435ea7SShannon Nelson 	u8 opcode;
17455435ea7SShannon Nelson };
17555435ea7SShannon Nelson 
17655435ea7SShannon Nelson /**
17755435ea7SShannon Nelson  * struct pds_core_dev_reset_comp - Reset command completion
17855435ea7SShannon Nelson  * @status:	Status of the command (enum pds_core_status_code)
17955435ea7SShannon Nelson  */
18055435ea7SShannon Nelson struct pds_core_dev_reset_comp {
18155435ea7SShannon Nelson 	u8 status;
18255435ea7SShannon Nelson };
18355435ea7SShannon Nelson 
18455435ea7SShannon Nelson /*
18555435ea7SShannon Nelson  * struct pds_core_dev_init_data - Pointers and info needed for the Core
18655435ea7SShannon Nelson  * initialization PDS_CORE_CMD_INIT command.  The in and out structs are
18755435ea7SShannon Nelson  * overlays on the pds_core_dev_cmd_regs.data space for passing data down
18855435ea7SShannon Nelson  * to the firmware on init, and then returning initialization results.
18955435ea7SShannon Nelson  */
19055435ea7SShannon Nelson struct pds_core_dev_init_data_in {
19155435ea7SShannon Nelson 	__le64 adminq_q_base;
19255435ea7SShannon Nelson 	__le64 adminq_cq_base;
19355435ea7SShannon Nelson 	__le64 notifyq_cq_base;
19455435ea7SShannon Nelson 	__le32 flags;
19555435ea7SShannon Nelson 	__le16 intr_index;
19655435ea7SShannon Nelson 	u8     adminq_ring_size;
19755435ea7SShannon Nelson 	u8     notifyq_ring_size;
19855435ea7SShannon Nelson };
19955435ea7SShannon Nelson 
20055435ea7SShannon Nelson struct pds_core_dev_init_data_out {
20155435ea7SShannon Nelson 	__le32 core_hw_index;
20255435ea7SShannon Nelson 	__le32 adminq_hw_index;
20355435ea7SShannon Nelson 	__le32 notifyq_hw_index;
20455435ea7SShannon Nelson 	u8     adminq_hw_type;
20555435ea7SShannon Nelson 	u8     notifyq_hw_type;
20655435ea7SShannon Nelson };
20755435ea7SShannon Nelson 
20855435ea7SShannon Nelson /**
20955435ea7SShannon Nelson  * struct pds_core_dev_init_cmd - Core device initialize
21055435ea7SShannon Nelson  * @opcode:          opcode PDS_CORE_CMD_INIT
21155435ea7SShannon Nelson  *
21255435ea7SShannon Nelson  * Initializes the core device and sets up the AdminQ and NotifyQ.
21355435ea7SShannon Nelson  * Expects to find initialization data (struct pds_core_dev_init_data_in)
21455435ea7SShannon Nelson  * in cmd_regs->data.  Driver should keep the devcmd interface locked
21555435ea7SShannon Nelson  * while preparing the driver info.
21655435ea7SShannon Nelson  */
21755435ea7SShannon Nelson struct pds_core_dev_init_cmd {
21855435ea7SShannon Nelson 	u8     opcode;
21955435ea7SShannon Nelson };
22055435ea7SShannon Nelson 
22155435ea7SShannon Nelson /**
22255435ea7SShannon Nelson  * struct pds_core_dev_init_comp - Core init completion
22355435ea7SShannon Nelson  * @status:     Status of the command (enum pds_core_status_code)
22455435ea7SShannon Nelson  *
22555435ea7SShannon Nelson  * Initialization result data (struct pds_core_dev_init_data_in)
22655435ea7SShannon Nelson  * is found in cmd_regs->data.
22755435ea7SShannon Nelson  */
22855435ea7SShannon Nelson struct pds_core_dev_init_comp {
22955435ea7SShannon Nelson 	u8     status;
23055435ea7SShannon Nelson };
23155435ea7SShannon Nelson 
23255435ea7SShannon Nelson /**
23355435ea7SShannon Nelson  * struct pds_core_fw_download_cmd - Firmware download command
23455435ea7SShannon Nelson  * @opcode:     opcode
23555435ea7SShannon Nelson  * @rsvd:	Word boundary padding
23655435ea7SShannon Nelson  * @addr:       DMA address of the firmware buffer
23755435ea7SShannon Nelson  * @offset:     offset of the firmware buffer within the full image
23855435ea7SShannon Nelson  * @length:     number of valid bytes in the firmware buffer
23955435ea7SShannon Nelson  */
24055435ea7SShannon Nelson struct pds_core_fw_download_cmd {
24155435ea7SShannon Nelson 	u8     opcode;
24255435ea7SShannon Nelson 	u8     rsvd[3];
24355435ea7SShannon Nelson 	__le32 offset;
24455435ea7SShannon Nelson 	__le64 addr;
24555435ea7SShannon Nelson 	__le32 length;
24655435ea7SShannon Nelson };
24755435ea7SShannon Nelson 
24855435ea7SShannon Nelson /**
24955435ea7SShannon Nelson  * struct pds_core_fw_download_comp - Firmware download completion
25055435ea7SShannon Nelson  * @status:     Status of the command (enum pds_core_status_code)
25155435ea7SShannon Nelson  */
25255435ea7SShannon Nelson struct pds_core_fw_download_comp {
25355435ea7SShannon Nelson 	u8     status;
25455435ea7SShannon Nelson };
25555435ea7SShannon Nelson 
25655435ea7SShannon Nelson /**
25755435ea7SShannon Nelson  * enum pds_core_fw_control_oper - FW control operations
25855435ea7SShannon Nelson  * @PDS_CORE_FW_INSTALL_ASYNC:     Install firmware asynchronously
25955435ea7SShannon Nelson  * @PDS_CORE_FW_INSTALL_STATUS:    Firmware installation status
26055435ea7SShannon Nelson  * @PDS_CORE_FW_ACTIVATE_ASYNC:    Activate firmware asynchronously
26155435ea7SShannon Nelson  * @PDS_CORE_FW_ACTIVATE_STATUS:   Firmware activate status
26255435ea7SShannon Nelson  * @PDS_CORE_FW_UPDATE_CLEANUP:    Cleanup any firmware update leftovers
26355435ea7SShannon Nelson  * @PDS_CORE_FW_GET_BOOT:          Return current active firmware slot
26455435ea7SShannon Nelson  * @PDS_CORE_FW_SET_BOOT:          Set active firmware slot for next boot
26555435ea7SShannon Nelson  * @PDS_CORE_FW_GET_LIST:          Return list of installed firmware images
26655435ea7SShannon Nelson  */
26755435ea7SShannon Nelson enum pds_core_fw_control_oper {
26855435ea7SShannon Nelson 	PDS_CORE_FW_INSTALL_ASYNC          = 0,
26955435ea7SShannon Nelson 	PDS_CORE_FW_INSTALL_STATUS         = 1,
27055435ea7SShannon Nelson 	PDS_CORE_FW_ACTIVATE_ASYNC         = 2,
27155435ea7SShannon Nelson 	PDS_CORE_FW_ACTIVATE_STATUS        = 3,
27255435ea7SShannon Nelson 	PDS_CORE_FW_UPDATE_CLEANUP         = 4,
27355435ea7SShannon Nelson 	PDS_CORE_FW_GET_BOOT               = 5,
27455435ea7SShannon Nelson 	PDS_CORE_FW_SET_BOOT               = 6,
27555435ea7SShannon Nelson 	PDS_CORE_FW_GET_LIST               = 7,
27655435ea7SShannon Nelson };
27755435ea7SShannon Nelson 
27855435ea7SShannon Nelson enum pds_core_fw_slot {
27955435ea7SShannon Nelson 	PDS_CORE_FW_SLOT_INVALID    = 0,
28055435ea7SShannon Nelson 	PDS_CORE_FW_SLOT_A	    = 1,
28155435ea7SShannon Nelson 	PDS_CORE_FW_SLOT_B          = 2,
28255435ea7SShannon Nelson 	PDS_CORE_FW_SLOT_GOLD       = 3,
28355435ea7SShannon Nelson };
28455435ea7SShannon Nelson 
28555435ea7SShannon Nelson /**
28655435ea7SShannon Nelson  * struct pds_core_fw_control_cmd - Firmware control command
28755435ea7SShannon Nelson  * @opcode:    opcode
28855435ea7SShannon Nelson  * @rsvd:      Word boundary padding
28955435ea7SShannon Nelson  * @oper:      firmware control operation (enum pds_core_fw_control_oper)
29055435ea7SShannon Nelson  * @slot:      slot to operate on (enum pds_core_fw_slot)
29155435ea7SShannon Nelson  */
29255435ea7SShannon Nelson struct pds_core_fw_control_cmd {
29355435ea7SShannon Nelson 	u8  opcode;
29455435ea7SShannon Nelson 	u8  rsvd[3];
29555435ea7SShannon Nelson 	u8  oper;
29655435ea7SShannon Nelson 	u8  slot;
29755435ea7SShannon Nelson };
29855435ea7SShannon Nelson 
29955435ea7SShannon Nelson /**
30055435ea7SShannon Nelson  * struct pds_core_fw_control_comp - Firmware control copletion
30155435ea7SShannon Nelson  * @status:	Status of the command (enum pds_core_status_code)
30255435ea7SShannon Nelson  * @rsvd:	Word alignment space
30355435ea7SShannon Nelson  * @slot:	Slot number (enum pds_core_fw_slot)
30455435ea7SShannon Nelson  * @rsvd1:	Struct padding
30555435ea7SShannon Nelson  * @color:	Color bit
30655435ea7SShannon Nelson  */
30755435ea7SShannon Nelson struct pds_core_fw_control_comp {
30855435ea7SShannon Nelson 	u8     status;
30955435ea7SShannon Nelson 	u8     rsvd[3];
31055435ea7SShannon Nelson 	u8     slot;
31155435ea7SShannon Nelson 	u8     rsvd1[10];
31255435ea7SShannon Nelson 	u8     color;
31355435ea7SShannon Nelson };
31455435ea7SShannon Nelson 
31555435ea7SShannon Nelson struct pds_core_fw_name_info {
31655435ea7SShannon Nelson #define PDS_CORE_FWSLOT_BUFLEN		8
31755435ea7SShannon Nelson #define PDS_CORE_FWVERS_BUFLEN		32
31855435ea7SShannon Nelson 	char   slotname[PDS_CORE_FWSLOT_BUFLEN];
31955435ea7SShannon Nelson 	char   fw_version[PDS_CORE_FWVERS_BUFLEN];
32055435ea7SShannon Nelson };
32155435ea7SShannon Nelson 
32255435ea7SShannon Nelson struct pds_core_fw_list_info {
32355435ea7SShannon Nelson #define PDS_CORE_FWVERS_LIST_LEN	16
32455435ea7SShannon Nelson 	u8 num_fw_slots;
32555435ea7SShannon Nelson 	struct pds_core_fw_name_info fw_names[PDS_CORE_FWVERS_LIST_LEN];
32655435ea7SShannon Nelson } __packed;
32755435ea7SShannon Nelson 
32855435ea7SShannon Nelson enum pds_core_vf_attr {
32955435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_SPOOFCHK	= 1,
33055435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_TRUST		= 2,
33155435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_MAC		= 3,
33255435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_LINKSTATE	= 4,
33355435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_VLAN		= 5,
33455435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_RATE		= 6,
33555435ea7SShannon Nelson 	PDS_CORE_VF_ATTR_STATSADDR	= 7,
33655435ea7SShannon Nelson };
33755435ea7SShannon Nelson 
33855435ea7SShannon Nelson /**
33955435ea7SShannon Nelson  * enum pds_core_vf_link_status - Virtual Function link status
34055435ea7SShannon Nelson  * @PDS_CORE_VF_LINK_STATUS_AUTO:   Use link state of the uplink
34155435ea7SShannon Nelson  * @PDS_CORE_VF_LINK_STATUS_UP:     Link always up
34255435ea7SShannon Nelson  * @PDS_CORE_VF_LINK_STATUS_DOWN:   Link always down
34355435ea7SShannon Nelson  */
34455435ea7SShannon Nelson enum pds_core_vf_link_status {
34555435ea7SShannon Nelson 	PDS_CORE_VF_LINK_STATUS_AUTO = 0,
34655435ea7SShannon Nelson 	PDS_CORE_VF_LINK_STATUS_UP   = 1,
34755435ea7SShannon Nelson 	PDS_CORE_VF_LINK_STATUS_DOWN = 2,
34855435ea7SShannon Nelson };
34955435ea7SShannon Nelson 
35055435ea7SShannon Nelson /**
35155435ea7SShannon Nelson  * struct pds_core_vf_setattr_cmd - Set VF attributes on the NIC
35255435ea7SShannon Nelson  * @opcode:     Opcode
35355435ea7SShannon Nelson  * @attr:       Attribute type (enum pds_core_vf_attr)
35455435ea7SShannon Nelson  * @vf_index:   VF index
35555435ea7SShannon Nelson  * @macaddr:	mac address
35655435ea7SShannon Nelson  * @vlanid:	vlan ID
35755435ea7SShannon Nelson  * @maxrate:	max Tx rate in Mbps
35855435ea7SShannon Nelson  * @spoofchk:	enable address spoof checking
35955435ea7SShannon Nelson  * @trust:	enable VF trust
36055435ea7SShannon Nelson  * @linkstate:	set link up or down
36155435ea7SShannon Nelson  * @stats:	stats addr struct
36255435ea7SShannon Nelson  * @stats.pa:	set DMA address for VF stats
36355435ea7SShannon Nelson  * @stats.len:	length of VF stats space
36455435ea7SShannon Nelson  * @pad:	force union to specific size
36555435ea7SShannon Nelson  */
36655435ea7SShannon Nelson struct pds_core_vf_setattr_cmd {
36755435ea7SShannon Nelson 	u8     opcode;
36855435ea7SShannon Nelson 	u8     attr;
36955435ea7SShannon Nelson 	__le16 vf_index;
37055435ea7SShannon Nelson 	union {
37155435ea7SShannon Nelson 		u8     macaddr[6];
37255435ea7SShannon Nelson 		__le16 vlanid;
37355435ea7SShannon Nelson 		__le32 maxrate;
37455435ea7SShannon Nelson 		u8     spoofchk;
37555435ea7SShannon Nelson 		u8     trust;
37655435ea7SShannon Nelson 		u8     linkstate;
37755435ea7SShannon Nelson 		struct {
37855435ea7SShannon Nelson 			__le64 pa;
37955435ea7SShannon Nelson 			__le32 len;
38055435ea7SShannon Nelson 		} stats;
38155435ea7SShannon Nelson 		u8     pad[60];
38255435ea7SShannon Nelson 	} __packed;
38355435ea7SShannon Nelson };
38455435ea7SShannon Nelson 
38555435ea7SShannon Nelson struct pds_core_vf_setattr_comp {
38655435ea7SShannon Nelson 	u8     status;
38755435ea7SShannon Nelson 	u8     attr;
38855435ea7SShannon Nelson 	__le16 vf_index;
38955435ea7SShannon Nelson 	__le16 comp_index;
39055435ea7SShannon Nelson 	u8     rsvd[9];
39155435ea7SShannon Nelson 	u8     color;
39255435ea7SShannon Nelson };
39355435ea7SShannon Nelson 
39455435ea7SShannon Nelson /**
39555435ea7SShannon Nelson  * struct pds_core_vf_getattr_cmd - Get VF attributes from the NIC
39655435ea7SShannon Nelson  * @opcode:     Opcode
39755435ea7SShannon Nelson  * @attr:       Attribute type (enum pds_core_vf_attr)
39855435ea7SShannon Nelson  * @vf_index:   VF index
39955435ea7SShannon Nelson  */
40055435ea7SShannon Nelson struct pds_core_vf_getattr_cmd {
40155435ea7SShannon Nelson 	u8     opcode;
40255435ea7SShannon Nelson 	u8     attr;
40355435ea7SShannon Nelson 	__le16 vf_index;
40455435ea7SShannon Nelson };
40555435ea7SShannon Nelson 
40655435ea7SShannon Nelson struct pds_core_vf_getattr_comp {
40755435ea7SShannon Nelson 	u8     status;
40855435ea7SShannon Nelson 	u8     attr;
40955435ea7SShannon Nelson 	__le16 vf_index;
41055435ea7SShannon Nelson 	union {
41155435ea7SShannon Nelson 		u8     macaddr[6];
41255435ea7SShannon Nelson 		__le16 vlanid;
41355435ea7SShannon Nelson 		__le32 maxrate;
41455435ea7SShannon Nelson 		u8     spoofchk;
41555435ea7SShannon Nelson 		u8     trust;
41655435ea7SShannon Nelson 		u8     linkstate;
41755435ea7SShannon Nelson 		__le64 stats_pa;
41855435ea7SShannon Nelson 		u8     pad[11];
41955435ea7SShannon Nelson 	} __packed;
42055435ea7SShannon Nelson 	u8     color;
42155435ea7SShannon Nelson };
42255435ea7SShannon Nelson 
42355435ea7SShannon Nelson enum pds_core_vf_ctrl_opcode {
42455435ea7SShannon Nelson 	PDS_CORE_VF_CTRL_START_ALL	= 0,
42555435ea7SShannon Nelson 	PDS_CORE_VF_CTRL_START		= 1,
42655435ea7SShannon Nelson };
42755435ea7SShannon Nelson 
42855435ea7SShannon Nelson /**
42955435ea7SShannon Nelson  * struct pds_core_vf_ctrl_cmd - VF control command
43055435ea7SShannon Nelson  * @opcode:         Opcode for the command
43155435ea7SShannon Nelson  * @ctrl_opcode:    VF control operation type
43255435ea7SShannon Nelson  * @vf_index:       VF Index. It is unused if op START_ALL is used.
43355435ea7SShannon Nelson  */
43455435ea7SShannon Nelson 
43555435ea7SShannon Nelson struct pds_core_vf_ctrl_cmd {
43655435ea7SShannon Nelson 	u8	opcode;
43755435ea7SShannon Nelson 	u8	ctrl_opcode;
43855435ea7SShannon Nelson 	__le16	vf_index;
43955435ea7SShannon Nelson };
44055435ea7SShannon Nelson 
44155435ea7SShannon Nelson /**
44255435ea7SShannon Nelson  * struct pds_core_vf_ctrl_comp - VF_CTRL command completion.
44355435ea7SShannon Nelson  * @status:     Status of the command (enum pds_core_status_code)
44455435ea7SShannon Nelson  */
44555435ea7SShannon Nelson struct pds_core_vf_ctrl_comp {
44655435ea7SShannon Nelson 	u8	status;
44755435ea7SShannon Nelson };
44855435ea7SShannon Nelson 
44955435ea7SShannon Nelson /*
45055435ea7SShannon Nelson  * union pds_core_dev_cmd - Overlay of core device command structures
45155435ea7SShannon Nelson  */
45255435ea7SShannon Nelson union pds_core_dev_cmd {
45355435ea7SShannon Nelson 	u8     opcode;
45455435ea7SShannon Nelson 	u32    words[16];
45555435ea7SShannon Nelson 
45655435ea7SShannon Nelson 	struct pds_core_dev_identify_cmd identify;
45755435ea7SShannon Nelson 	struct pds_core_dev_init_cmd     init;
45855435ea7SShannon Nelson 	struct pds_core_dev_reset_cmd    reset;
45955435ea7SShannon Nelson 	struct pds_core_fw_download_cmd  fw_download;
46055435ea7SShannon Nelson 	struct pds_core_fw_control_cmd   fw_control;
46155435ea7SShannon Nelson 
46255435ea7SShannon Nelson 	struct pds_core_vf_setattr_cmd   vf_setattr;
46355435ea7SShannon Nelson 	struct pds_core_vf_getattr_cmd   vf_getattr;
46455435ea7SShannon Nelson 	struct pds_core_vf_ctrl_cmd      vf_ctrl;
46555435ea7SShannon Nelson };
46655435ea7SShannon Nelson 
46755435ea7SShannon Nelson /*
46855435ea7SShannon Nelson  * union pds_core_dev_comp - Overlay of core device completion structures
46955435ea7SShannon Nelson  */
47055435ea7SShannon Nelson union pds_core_dev_comp {
47155435ea7SShannon Nelson 	u8                                status;
47255435ea7SShannon Nelson 	u8                                bytes[16];
47355435ea7SShannon Nelson 
47455435ea7SShannon Nelson 	struct pds_core_dev_identify_comp identify;
47555435ea7SShannon Nelson 	struct pds_core_dev_reset_comp    reset;
47655435ea7SShannon Nelson 	struct pds_core_dev_init_comp     init;
47755435ea7SShannon Nelson 	struct pds_core_fw_download_comp  fw_download;
47855435ea7SShannon Nelson 	struct pds_core_fw_control_comp   fw_control;
47955435ea7SShannon Nelson 
48055435ea7SShannon Nelson 	struct pds_core_vf_setattr_comp   vf_setattr;
48155435ea7SShannon Nelson 	struct pds_core_vf_getattr_comp   vf_getattr;
48255435ea7SShannon Nelson 	struct pds_core_vf_ctrl_comp      vf_ctrl;
48355435ea7SShannon Nelson };
48455435ea7SShannon Nelson 
48555435ea7SShannon Nelson /**
48655435ea7SShannon Nelson  * struct pds_core_dev_hwstamp_regs - Hardware current timestamp registers
48755435ea7SShannon Nelson  * @tick_low:        Low 32 bits of hardware timestamp
48855435ea7SShannon Nelson  * @tick_high:       High 32 bits of hardware timestamp
48955435ea7SShannon Nelson  */
49055435ea7SShannon Nelson struct pds_core_dev_hwstamp_regs {
49155435ea7SShannon Nelson 	u32    tick_low;
49255435ea7SShannon Nelson 	u32    tick_high;
49355435ea7SShannon Nelson };
49455435ea7SShannon Nelson 
49555435ea7SShannon Nelson /**
49655435ea7SShannon Nelson  * struct pds_core_dev_info_regs - Device info register format (read-only)
49755435ea7SShannon Nelson  * @signature:       Signature value of 0x44455649 ('DEVI')
49855435ea7SShannon Nelson  * @version:         Current version of info
49955435ea7SShannon Nelson  * @asic_type:       Asic type
50055435ea7SShannon Nelson  * @asic_rev:        Asic revision
50155435ea7SShannon Nelson  * @fw_status:       Firmware status
50255435ea7SShannon Nelson  *			bit 0   - 1 = fw running
50355435ea7SShannon Nelson  *			bit 4-7 - 4 bit generation number, changes on fw restart
50455435ea7SShannon Nelson  * @fw_heartbeat:    Firmware heartbeat counter
50555435ea7SShannon Nelson  * @serial_num:      Serial number
50655435ea7SShannon Nelson  * @fw_version:      Firmware version
50755435ea7SShannon Nelson  * @oprom_regs:      oprom_regs to store oprom debug enable/disable and bmp
50855435ea7SShannon Nelson  * @rsvd_pad1024:    Struct padding
50955435ea7SShannon Nelson  * @hwstamp:         Hardware current timestamp registers
51055435ea7SShannon Nelson  * @rsvd_pad2048:    Struct padding
51155435ea7SShannon Nelson  */
51255435ea7SShannon Nelson struct pds_core_dev_info_regs {
51355435ea7SShannon Nelson #define PDS_CORE_DEVINFO_FWVERS_BUFLEN 32
51455435ea7SShannon Nelson #define PDS_CORE_DEVINFO_SERIAL_BUFLEN 32
51555435ea7SShannon Nelson 	u32    signature;
51655435ea7SShannon Nelson 	u8     version;
51755435ea7SShannon Nelson 	u8     asic_type;
51855435ea7SShannon Nelson 	u8     asic_rev;
51955435ea7SShannon Nelson #define PDS_CORE_FW_STS_F_STOPPED	0x00
52055435ea7SShannon Nelson #define PDS_CORE_FW_STS_F_RUNNING	0x01
52155435ea7SShannon Nelson #define PDS_CORE_FW_STS_F_GENERATION	0xF0
52255435ea7SShannon Nelson 	u8     fw_status;
52355435ea7SShannon Nelson 	__le32 fw_heartbeat;
52455435ea7SShannon Nelson 	char   fw_version[PDS_CORE_DEVINFO_FWVERS_BUFLEN];
52555435ea7SShannon Nelson 	char   serial_num[PDS_CORE_DEVINFO_SERIAL_BUFLEN];
52655435ea7SShannon Nelson 	u8     oprom_regs[32];     /* reserved */
52755435ea7SShannon Nelson 	u8     rsvd_pad1024[916];
52855435ea7SShannon Nelson 	struct pds_core_dev_hwstamp_regs hwstamp;   /* on 1k boundary */
52955435ea7SShannon Nelson 	u8     rsvd_pad2048[1016];
53055435ea7SShannon Nelson } __packed;
53155435ea7SShannon Nelson 
53255435ea7SShannon Nelson /**
53355435ea7SShannon Nelson  * struct pds_core_dev_cmd_regs - Device command register format (read-write)
53455435ea7SShannon Nelson  * @doorbell:	Device Cmd Doorbell, write-only
53555435ea7SShannon Nelson  *              Write a 1 to signal device to process cmd
53655435ea7SShannon Nelson  * @done:	Command completed indicator, poll for completion
53755435ea7SShannon Nelson  *              bit 0 == 1 when command is complete
53855435ea7SShannon Nelson  * @cmd:	Opcode-specific command bytes
53955435ea7SShannon Nelson  * @comp:	Opcode-specific response bytes
54055435ea7SShannon Nelson  * @rsvd:	Struct padding
54155435ea7SShannon Nelson  * @data:	Opcode-specific side-data
54255435ea7SShannon Nelson  */
54355435ea7SShannon Nelson struct pds_core_dev_cmd_regs {
54455435ea7SShannon Nelson 	u32                     doorbell;
54555435ea7SShannon Nelson 	u32                     done;
54655435ea7SShannon Nelson 	union pds_core_dev_cmd  cmd;
54755435ea7SShannon Nelson 	union pds_core_dev_comp comp;
54855435ea7SShannon Nelson 	u8                      rsvd[48];
54955435ea7SShannon Nelson 	u32                     data[478];
55055435ea7SShannon Nelson } __packed;
55155435ea7SShannon Nelson 
55255435ea7SShannon Nelson /**
55355435ea7SShannon Nelson  * struct pds_core_dev_regs - Device register format for bar 0 page 0
55455435ea7SShannon Nelson  * @info:            Device info registers
55555435ea7SShannon Nelson  * @devcmd:          Device command registers
55655435ea7SShannon Nelson  */
55755435ea7SShannon Nelson struct pds_core_dev_regs {
55855435ea7SShannon Nelson 	struct pds_core_dev_info_regs info;
55955435ea7SShannon Nelson 	struct pds_core_dev_cmd_regs  devcmd;
56055435ea7SShannon Nelson } __packed;
56155435ea7SShannon Nelson 
56255435ea7SShannon Nelson #ifndef __CHECKER__
56355435ea7SShannon Nelson static_assert(sizeof(struct pds_core_drv_identity) <= 1912);
56455435ea7SShannon Nelson static_assert(sizeof(struct pds_core_dev_identity) <= 1912);
56555435ea7SShannon Nelson static_assert(sizeof(union pds_core_dev_cmd) == 64);
56655435ea7SShannon Nelson static_assert(sizeof(union pds_core_dev_comp) == 16);
56755435ea7SShannon Nelson static_assert(sizeof(struct pds_core_dev_info_regs) == 2048);
56855435ea7SShannon Nelson static_assert(sizeof(struct pds_core_dev_cmd_regs) == 2048);
56955435ea7SShannon Nelson static_assert(sizeof(struct pds_core_dev_regs) == 4096);
57055435ea7SShannon Nelson #endif /* __CHECKER__ */
57155435ea7SShannon Nelson 
57255435ea7SShannon Nelson #endif /* _PDS_CORE_IF_H_ */
573