493 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright 2008 Cisco Systems, Inc. All rights reserved.4 * Copyright 2007 Nuova Systems, Inc. All rights reserved.5 */6#ifndef _VNIC_DEVCMD_H_7#define _VNIC_DEVCMD_H_8 9#define _CMD_NBITS 1410#define _CMD_VTYPEBITS 1011#define _CMD_FLAGSBITS 612#define _CMD_DIRBITS 213 14#define _CMD_NMASK ((1 << _CMD_NBITS)-1)15#define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1)16#define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1)17#define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1)18 19#define _CMD_NSHIFT 020#define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)21#define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)22#define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)23 24/*25 * Direction bits (from host perspective).26 */27#define _CMD_DIR_NONE 0U28#define _CMD_DIR_WRITE 1U29#define _CMD_DIR_READ 2U30#define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ)31 32/*33 * Flag bits.34 */35#define _CMD_FLAGS_NONE 0U36#define _CMD_FLAGS_NOWAIT 1U37 38/*39 * vNIC type bits.40 */41#define _CMD_VTYPE_NONE 0U42#define _CMD_VTYPE_ENET 1U43#define _CMD_VTYPE_FC 2U44#define _CMD_VTYPE_SCSI 4U45#define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)46 47/*48 * Used to create cmds..49*/50#define _CMDCF(dir, flags, vtype, nr) \51 (((dir) << _CMD_DIRSHIFT) | \52 ((flags) << _CMD_FLAGSSHIFT) | \53 ((vtype) << _CMD_VTYPESHIFT) | \54 ((nr) << _CMD_NSHIFT))55#define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr)56#define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)57 58/*59 * Used to decode cmds..60*/61#define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)62#define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)63#define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)64#define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)65 66enum vnic_devcmd_cmd {67 CMD_NONE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),68 69 /* mcpu fw info in mem: (u64)a0=paddr to struct vnic_devcmd_fw_info */70 CMD_MCPU_FW_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),71 72 /* dev-specific block member:73 * in: (u16)a0=offset,(u8)a1=size74 * out: a0=value */75 CMD_DEV_SPEC = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),76 77 /* stats clear */78 CMD_STATS_CLEAR = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),79 80 /* stats dump in mem: (u64)a0=paddr to stats area,81 * (u16)a1=sizeof stats area */82 CMD_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),83 84 /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */85 CMD_PACKET_FILTER = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7),86 87 /* hang detection notification */88 CMD_HANG_NOTIFY = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),89 90 /* MAC address in (u48)a0 */91 CMD_MAC_ADDR = _CMDC(_CMD_DIR_READ,92 _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),93 94 /* disable/enable promisc mode: (u8)a0=0/1 */95/***** XXX DEPRECATED *****/96 CMD_PROMISC_MODE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 10),97 98 /* disable/enable all-multi mode: (u8)a0=0/1 */99/***** XXX DEPRECATED *****/100 CMD_ALLMULTI_MODE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 11),101 102 /* add addr from (u48)a0 */103 CMD_ADDR_ADD = _CMDCNW(_CMD_DIR_WRITE,104 _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12),105 106 /* del addr from (u48)a0 */107 CMD_ADDR_DEL = _CMDCNW(_CMD_DIR_WRITE,108 _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13),109 110 /* add VLAN id in (u16)a0 */111 CMD_VLAN_ADD = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14),112 113 /* del VLAN id in (u16)a0 */114 CMD_VLAN_DEL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15),115 116 /* nic_cfg in (u32)a0 */117 CMD_NIC_CFG = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),118 119 /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */120 CMD_RSS_KEY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17),121 122 /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */123 CMD_RSS_CPU = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18),124 125 /* initiate softreset */126 CMD_SOFT_RESET = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19),127 128 /* softreset status:129 * out: a0=0 reset complete, a0=1 reset in progress */130 CMD_SOFT_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20),131 132 /* set struct vnic_devcmd_notify buffer in mem:133 * in:134 * (u64)a0=paddr to notify (set paddr=0 to unset)135 * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)136 * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)137 * out:138 * (u32)a1 = effective size139 */140 CMD_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),141 142 /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct,143 * (u8)a1=PXENV_UNDI_xxx */144 CMD_UNDI = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22),145 146 /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */147 CMD_OPEN = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),148 149 /* open status:150 * out: a0=0 open complete, a0=1 open in progress */151 CMD_OPEN_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),152 153 /* close vnic */154 CMD_CLOSE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),155 156 /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */157 CMD_INIT = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),158 159 /* variant of CMD_INIT, with provisioning info160 * (u64)a0=paddr of vnic_devcmd_provinfo161 * (u32)a1=sizeof provision info162 */163 CMD_INIT_PROV_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27),164 165 /* enable virtual link */166 CMD_ENABLE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),167 168 /* disable virtual link */169 CMD_DISABLE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),170 171 /* stats dump all vnics on uplink in mem: (u64)a0=paddr (u32)a1=uif */172 CMD_STATS_DUMP_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),173 174 /* init status:175 * out: a0=0 init complete, a0=1 init in progress176 * if a0=0, a1=errno */177 CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),178 179 /* INT13 API: (u64)a0=paddr to vnic_int13_params struct180 * (u8)a1=INT13_CMD_xxx */181 CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),182 183 /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */184 CMD_LOGICAL_UPLINK = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33),185 186 /* undo initialize of virtual link */187 CMD_DEINIT = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),188 189 /* check fw capability of a cmd:190 * in: (u32)a0=cmd191 * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */192 CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),193 194 /* persistent binding info195 * in: (u64)a0=paddr of arg196 * (u32)a1=CMD_PERBI_XXX */197 CMD_PERBI = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),198 199 /* Interrupt Assert Register functionality200 * in: (u16)a0=interrupt number to assert201 */202 CMD_IAR = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38),203 204 /* initiate hangreset, like softreset after hang detected */205 CMD_HANG_RESET = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39),206 207 /* hangreset status:208 * out: a0=0 reset complete, a0=1 reset in progress */209 CMD_HANG_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40),210 211 /*212 * Set hw ingress packet vlan rewrite mode:213 * in: (u32)a0=new vlan rewrite mode214 * out: (u32)a0=old vlan rewrite mode */215 CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41),216 217 /*218 * in: (u16)a0=bdf of target vnic219 * (u32)a1=cmd to proxy220 * a2-a15=args to cmd in a1221 * out: (u32)a0=status of proxied cmd222 * a1-a15=out args of proxied cmd */223 CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),224 225 /*226 * As for BY_BDF except a0 is index of hvnlink subordinate vnic227 * or SR-IOV virtual vnic228 */229 CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43),230 231 /*232 * For HPP toggle:233 * adapter-info-get234 * in: (u64)a0=phsical address of buffer passed in from caller.235 * (u16)a1=size of buffer specified in a0.236 * out: (u64)a0=phsical address of buffer passed in from caller.237 * (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or238 * 0 if no VIF-CONFIG-INFO TLV was ever received. */239 CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44),240 241 /*242 * INT13 API: (u64)a0=paddr to vnic_int13_params struct243 * (u32)a1=INT13_CMD_xxx244 */245 CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45),246 247 /*248 * Set default vlan:249 * in: (u16)a0=new default vlan250 * (u16)a1=zero for overriding vlan with param a0,251 * non-zero for resetting vlan to the default252 * out: (u16)a0=old default vlan253 */254 CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46),255 256 /* init_prov_info2:257 * Variant of CMD_INIT_PROV_INFO, where it will not try to enable258 * the vnic until CMD_ENABLE2 is issued.259 * (u64)a0=paddr of vnic_devcmd_provinfo260 * (u32)a1=sizeof provision info261 */262 CMD_INIT_PROV_INFO2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47),263 264 /* enable2:265 * (u32)a0=0 ==> standby266 * =CMD_ENABLE2_ACTIVE ==> active267 */268 CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48),269 270 /*271 * cmd_status:272 * Returns the status of the specified command273 * Input:274 * a0 = command for which status is being queried.275 * Possible values are:276 * CMD_SOFT_RESET277 * CMD_HANG_RESET278 * CMD_OPEN279 * CMD_INIT280 * CMD_INIT_PROV_INFO281 * CMD_DEINIT282 * CMD_INIT_PROV_INFO2283 * CMD_ENABLE2284 * Output:285 * if status == STAT_ERROR286 * a0 = ERR_ENOTSUPPORTED - status for command in a0 is287 * not supported288 * if status == STAT_NONE289 * a0 = status of the devcmd specified in a0 as follows.290 * ERR_SUCCESS - command in a0 completed successfully291 * ERR_EINPROGRESS - command in a0 is still in progress292 */293 CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49),294 295 /*296 * Returns interrupt coalescing timer conversion factors.297 * After calling this devcmd, ENIC driver can convert298 * interrupt coalescing timer in usec into CPU cycles as follows:299 *300 * intr_timer_cycles = intr_timer_usec * multiplier / divisor301 *302 * Interrupt coalescing timer in usecs can be be converted/obtained303 * from CPU cycles as follows:304 *305 * intr_timer_usec = intr_timer_cycles * divisor / multiplier306 *307 * in: none308 * out: (u32)a0 = multiplier309 * (u32)a1 = divisor310 * (u32)a2 = maximum timer value in usec311 */312 CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50),313 314 /*315 * ISCSI DUMP API:316 * in: (u64)a0=paddr of the param or param itself317 * (u32)a1=ISCSI_CMD_xxx318 */319 CMD_ISCSI_DUMP_REQ = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 51),320 321 /*322 * ISCSI DUMP STATUS API:323 * in: (u32)a0=cmd tag324 * in: (u32)a1=ISCSI_CMD_xxx325 * out: (u32)a0=cmd status326 */327 CMD_ISCSI_DUMP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 52),328 329 /*330 * Subvnic migration from MQ <--> VF.331 * Enable the LIF migration from MQ to VF and vice versa. MQ and VF332 * indexes are statically bound at the time of initialization.333 * Based on the334 * direction of migration, the resources of either MQ or the VF shall335 * be attached to the LIF.336 * in: (u32)a0=Direction of Migration337 * 0=> Migrate to VF338 * 1=> Migrate to MQ339 * (u32)a1=VF index (MQ index)340 */341 CMD_MIGRATE_SUBVNIC = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 53),342 343 /*344 * Register / Deregister the notification block for MQ subvnics345 * in:346 * (u64)a0=paddr to notify (set paddr=0 to unset)347 * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)348 * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)349 * out:350 * (u32)a1 = effective size351 */352 CMD_SUBVNIC_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 54),353 354 /*355 * Set the predefined mac address as default356 * in:357 * (u48)a0=mac addr358 */359 CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55),360 361 /* Update the provisioning info of the given VIF362 * (u64)a0=paddr of vnic_devcmd_provinfo363 * (u32)a1=sizeof provision info364 */365 CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56),366 367 /*368 * Initialization for the devcmd2 interface.369 * in: (u64) a0=host result buffer physical address370 * in: (u16) a1=number of entries in result buffer371 */372 CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57)373};374 375/* flags for CMD_OPEN */376#define CMD_OPENF_OPROM 0x1 /* open coming from option rom */377 378#define CMD_OPENF_RQ_ENABLE_THEN_POST 0x2379 380/* flags for CMD_INIT */381#define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */382 383/* flags for CMD_PACKET_FILTER */384#define CMD_PFILTER_DIRECTED 0x01385#define CMD_PFILTER_MULTICAST 0x02386#define CMD_PFILTER_BROADCAST 0x04387#define CMD_PFILTER_PROMISCUOUS 0x08388#define CMD_PFILTER_ALL_MULTICAST 0x10389 390enum vnic_devcmd_status {391 STAT_NONE = 0,392 STAT_BUSY = 1 << 0, /* cmd in progress */393 STAT_ERROR = 1 << 1, /* last cmd caused error (code in a0) */394};395 396enum vnic_devcmd_error {397 ERR_SUCCESS = 0,398 ERR_EINVAL = 1,399 ERR_EFAULT = 2,400 ERR_EPERM = 3,401 ERR_EBUSY = 4,402 ERR_ECMDUNKNOWN = 5,403 ERR_EBADSTATE = 6,404 ERR_ENOMEM = 7,405 ERR_ETIMEDOUT = 8,406 ERR_ELINKDOWN = 9,407};408 409struct vnic_devcmd_fw_info {410 char fw_version[32];411 char fw_build[32];412 char hw_version[32];413 char hw_serial_number[32];414};415 416struct vnic_devcmd_notify {417 u32 csum; /* checksum over following words */418 419 u32 link_state; /* link up == 1 */420 u32 port_speed; /* effective port speed (rate limit) */421 u32 mtu; /* MTU */422 u32 msglvl; /* requested driver msg lvl */423 u32 uif; /* uplink interface */424 u32 status; /* status bits (see VNIC_STF_*) */425 u32 error; /* error code (see ERR_*) for first ERR */426 u32 link_down_cnt; /* running count of link down transitions */427};428#define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */429 430struct vnic_devcmd_provinfo {431 u8 oui[3];432 u8 type;433 u8 data[];434};435 436/*437 * Writing cmd register causes STAT_BUSY to get set in status register.438 * When cmd completes, STAT_BUSY will be cleared.439 *440 * If cmd completed successfully STAT_ERROR will be clear441 * and args registers contain cmd-specific results.442 *443 * If cmd error, STAT_ERROR will be set and args[0] contains error code.444 *445 * status register is read-only. While STAT_BUSY is set,446 * all other register contents are read-only.447 */448 449/* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */450#define VNIC_DEVCMD_NARGS 15451struct vnic_devcmd {452 u32 status; /* RO */453 u32 cmd; /* RW */454 u64 args[VNIC_DEVCMD_NARGS]; /* RW cmd args (little-endian) */455};456 457/*458 * Version 2 of the interface.459 *460 * Some things are carried over, notably the vnic_devcmd_cmd enum.461 */462 463/*464 * Flags for vnic_devcmd2.flags465 */466 467#define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */468 469#define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS470 471struct vnic_devcmd2 {472 u16 pad;473 u16 flags;474 u32 cmd; /* same command #defines as original */475 u64 args[VNIC_DEVCMD2_NARGS];476};477 478#define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS479struct devcmd2_result {480 u64 results[VNIC_DEVCMD2_NRESULTS];481 u32 pad;482 u16 completed_index; /* into copy WQ */483 u8 error; /* same error codes as original */484 u8 color; /* 0 or 1 as with completion queues */485};486 487#define DEVCMD2_RING_SIZE 32488#define DEVCMD2_DESC_SIZE 128489 490#define DEVCMD2_RESULTS_SIZE_MAX ((1 << 16) - 1)491 492#endif /* _VNIC_DEVCMD_H_ */493