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