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