Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
0004  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
0005  */
0006 
0007 #ifndef _VNIC_DEVCMD_H_
0008 #define _VNIC_DEVCMD_H_
0009 
0010 #define _CMD_NBITS      14
0011 #define _CMD_VTYPEBITS  10
0012 #define _CMD_FLAGSBITS  6
0013 #define _CMD_DIRBITS    2
0014 
0015 #define _CMD_NMASK      ((1 << _CMD_NBITS)-1)
0016 #define _CMD_VTYPEMASK  ((1 << _CMD_VTYPEBITS)-1)
0017 #define _CMD_FLAGSMASK  ((1 << _CMD_FLAGSBITS)-1)
0018 #define _CMD_DIRMASK    ((1 << _CMD_DIRBITS)-1)
0019 
0020 #define _CMD_NSHIFT     0
0021 #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
0022 #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
0023 #define _CMD_DIRSHIFT   (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
0024 
0025 /*
0026  * Direction bits (from host perspective).
0027  */
0028 #define _CMD_DIR_NONE   0U
0029 #define _CMD_DIR_WRITE  1U
0030 #define _CMD_DIR_READ   2U
0031 #define _CMD_DIR_RW     (_CMD_DIR_WRITE | _CMD_DIR_READ)
0032 
0033 /*
0034  * Flag bits.
0035  */
0036 #define _CMD_FLAGS_NONE 0U
0037 #define _CMD_FLAGS_NOWAIT 1U
0038 
0039 /*
0040  * vNIC type bits.
0041  */
0042 #define _CMD_VTYPE_NONE  0U
0043 #define _CMD_VTYPE_ENET  1U
0044 #define _CMD_VTYPE_FC    2U
0045 #define _CMD_VTYPE_SCSI  4U
0046 #define _CMD_VTYPE_ALL   (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
0047 
0048 /*
0049  * Used to create cmds..
0050 */
0051 #define _CMDCF(dir, flags, vtype, nr)  \
0052     (((dir)   << _CMD_DIRSHIFT) | \
0053     ((flags) << _CMD_FLAGSSHIFT) | \
0054     ((vtype) << _CMD_VTYPESHIFT) | \
0055     ((nr)    << _CMD_NSHIFT))
0056 #define _CMDC(dir, vtype, nr)    _CMDCF(dir, 0, vtype, nr)
0057 #define _CMDCNW(dir, vtype, nr)  _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
0058 
0059 /*
0060  * Used to decode cmds..
0061 */
0062 #define _CMD_DIR(cmd)            (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
0063 #define _CMD_FLAGS(cmd)          (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
0064 #define _CMD_VTYPE(cmd)          (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
0065 #define _CMD_N(cmd)              (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
0066 
0067 enum vnic_devcmd_cmd {
0068     CMD_NONE                = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),
0069 
0070     /*
0071      * mcpu fw info in mem:
0072      * in:
0073      *   (u64)a0=paddr to struct vnic_devcmd_fw_info
0074      * action:
0075      *   Fills in struct vnic_devcmd_fw_info (128 bytes)
0076      * note:
0077      *   An old definition of CMD_MCPU_FW_INFO
0078      */
0079     CMD_MCPU_FW_INFO_OLD    = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),
0080 
0081     /*
0082      * mcpu fw info in mem:
0083      * in:
0084      *   (u64)a0=paddr to struct vnic_devcmd_fw_info
0085      *   (u16)a1=size of the structure
0086      * out:
0087      *   (u16)a1=0                          for in:a1 = 0,
0088      *           data size actually written for other values.
0089      * action:
0090      *   Fills in first 128 bytes of vnic_devcmd_fw_info for in:a1 = 0,
0091      *            first in:a1 bytes               for 0 < in:a1 <= 132,
0092      *            132 bytes                       for other values of in:a1.
0093      * note:
0094      *   CMD_MCPU_FW_INFO and CMD_MCPU_FW_INFO_OLD have the same enum 1
0095      *   for source compatibility.
0096      */
0097     CMD_MCPU_FW_INFO        = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 1),
0098 
0099     /* dev-specific block member:
0100      *    in: (u16)a0=offset,(u8)a1=size
0101      *    out: a0=value */
0102     CMD_DEV_SPEC            = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),
0103 
0104     /* stats clear */
0105     CMD_STATS_CLEAR         = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),
0106 
0107     /* stats dump in mem: (u64)a0=paddr to stats area,
0108      *                    (u16)a1=sizeof stats area */
0109     CMD_STATS_DUMP          = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),
0110 
0111     /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */
0112     CMD_PACKET_FILTER   = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 7),
0113 
0114     /* set Rx packet filter for all: (u32)a0=filters (see CMD_PFILTER_*) */
0115     CMD_PACKET_FILTER_ALL   = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7),
0116 
0117     /* hang detection notification */
0118     CMD_HANG_NOTIFY         = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),
0119 
0120     /* MAC address in (u48)a0 */
0121     CMD_GET_MAC_ADDR        = _CMDC(_CMD_DIR_READ,
0122                     _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),
0123 
0124     /* add addr from (u48)a0 */
0125     CMD_ADDR_ADD            = _CMDCNW(_CMD_DIR_WRITE,
0126                     _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12),
0127 
0128     /* del addr from (u48)a0 */
0129     CMD_ADDR_DEL            = _CMDCNW(_CMD_DIR_WRITE,
0130                     _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13),
0131 
0132     /* add VLAN id in (u16)a0 */
0133     CMD_VLAN_ADD            = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14),
0134 
0135     /* del VLAN id in (u16)a0 */
0136     CMD_VLAN_DEL            = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15),
0137 
0138     /* nic_cfg (no wait, always succeeds)
0139      * in: (u32)a0
0140      *
0141      * Capability query:
0142      * out: (u64) a0 = 1 if a1 is valid
0143      *  (u64) a1 = (NIC_CFG bits supported) | (flags << 32)
0144      *
0145      * flags are CMD_NIC_CFG_CAPF_xxx
0146      */
0147     CMD_NIC_CFG             = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
0148     /* nic_cfg_chk (will return error if flags are invalid)
0149      * in: (u32)a0
0150      *
0151      * Capability query:
0152      * out: (u64) a0 = 1 if a1 is valid
0153      *  (u64) a1 = (NIC_CFG bits supported) | (flags << 32)
0154      *
0155      * flags are CMD_NIC_CFG_CAPF_xxx
0156      */
0157     CMD_NIC_CFG_CHK     = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
0158 
0159     /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */
0160     CMD_RSS_KEY             = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17),
0161 
0162     /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */
0163     CMD_RSS_CPU             = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18),
0164 
0165     /* initiate softreset */
0166     CMD_SOFT_RESET          = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19),
0167 
0168     /* softreset status:
0169      *    out: a0=0 reset complete, a0=1 reset in progress */
0170     CMD_SOFT_RESET_STATUS   = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20),
0171 
0172     /* set struct vnic_devcmd_notify buffer in mem:
0173      * in:
0174      *   (u64)a0=paddr to notify (set paddr=0 to unset)
0175      *   (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
0176      *   (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
0177      * out:
0178      *   (u32)a1 = effective size
0179      */
0180     CMD_NOTIFY              = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),
0181 
0182     /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct,
0183      *           (u8)a1=PXENV_UNDI_xxx */
0184     CMD_UNDI                = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22),
0185 
0186     /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
0187     CMD_OPEN        = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),
0188 
0189     /* open status:
0190      *    out: a0=0 open complete, a0=1 open in progress */
0191     CMD_OPEN_STATUS     = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),
0192 
0193     /* close vnic */
0194     CMD_CLOSE       = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),
0195 
0196     /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
0197 /***** Replaced by CMD_INIT *****/
0198     CMD_INIT_v1     = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),
0199 
0200     /* variant of CMD_INIT, with provisioning info
0201      *     (u64)a0=paddr of vnic_devcmd_provinfo
0202      *     (u32)a1=sizeof provision info */
0203     CMD_INIT_PROV_INFO  = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27),
0204 
0205     /* enable virtual link */
0206     CMD_ENABLE      = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
0207 
0208     /* enable virtual link, waiting variant. */
0209     CMD_ENABLE_WAIT     = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
0210 
0211     /* disable virtual link */
0212     CMD_DISABLE     = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),
0213 
0214     /* stats dump sum of all vnic stats on same uplink in mem:
0215      *     (u64)a0=paddr
0216      *     (u16)a1=sizeof stats area */
0217     CMD_STATS_DUMP_ALL  = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),
0218 
0219     /* init status:
0220      *    out: a0=0 init complete, a0=1 init in progress
0221      *         if a0=0, a1=errno */
0222     CMD_INIT_STATUS     = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
0223 
0224     /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
0225      *            (u32)a1=INT13_CMD_xxx */
0226     CMD_INT13               = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
0227 
0228     /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
0229     CMD_LOGICAL_UPLINK      = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33),
0230 
0231     /* undo initialize of virtual link */
0232     CMD_DEINIT      = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),
0233 
0234     /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
0235     CMD_INIT        = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 35),
0236 
0237     /* check fw capability of a cmd:
0238      * in:  (u32)a0=cmd
0239      * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
0240     CMD_CAPABILITY      = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
0241 
0242     /* persistent binding info
0243      * in:  (u64)a0=paddr of arg
0244      *      (u32)a1=CMD_PERBI_XXX */
0245     CMD_PERBI       = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),
0246 
0247     /* Interrupt Assert Register functionality
0248      * in: (u16)a0=interrupt number to assert
0249      */
0250     CMD_IAR         = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38),
0251 
0252     /* initiate hangreset, like softreset after hang detected */
0253     CMD_HANG_RESET      = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39),
0254 
0255     /* hangreset status:
0256      *    out: a0=0 reset complete, a0=1 reset in progress */
0257     CMD_HANG_RESET_STATUS   = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40),
0258 
0259     /*
0260      * Set hw ingress packet vlan rewrite mode:
0261      * in:  (u32)a0=new vlan rewrite mode
0262      * out: (u32)a0=old vlan rewrite mode */
0263     CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41),
0264 
0265     /*
0266      * in:  (u16)a0=bdf of target vnic
0267      *      (u32)a1=cmd to proxy
0268      *      a2-a15=args to cmd in a1
0269      * out: (u32)a0=status of proxied cmd
0270      *      a1-a15=out args of proxied cmd */
0271     CMD_PROXY_BY_BDF =  _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),
0272 
0273     /*
0274      * As for BY_BDF except a0 is index of hvnlink subordinate vnic
0275      * or SR-IOV virtual vnic
0276      */
0277     CMD_PROXY_BY_INDEX =    _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43),
0278 
0279     /*
0280      * For HPP toggle:
0281      * adapter-info-get
0282      * in:  (u64)a0=phsical address of buffer passed in from caller.
0283      *      (u16)a1=size of buffer specified in a0.
0284      * out: (u64)a0=phsical address of buffer passed in from caller.
0285      *      (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or
0286      *              0 if no VIF-CONFIG-INFO TLV was ever received. */
0287     CMD_CONFIG_INFO_GET     = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44),
0288 
0289     /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
0290      *            (u32)a1=INT13_CMD_xxx
0291      */
0292     CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45),
0293 
0294     /* Set default vlan:
0295      * in: (u16)a0=new default vlan
0296      *     (u16)a1=zero for overriding vlan with param a0,
0297      *             non-zero for resetting vlan to the default
0298      * out: (u16)a0=old default vlan
0299      */
0300     CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46),
0301 
0302     /* init_prov_info2:
0303      * Variant of CMD_INIT_PROV_INFO, where it will not try to enable
0304      * the vnic until CMD_ENABLE2 is issued.
0305      *     (u64)a0=paddr of vnic_devcmd_provinfo
0306      *     (u32)a1=sizeof provision info
0307      */
0308     CMD_INIT_PROV_INFO2  = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47),
0309 
0310     /* enable2:
0311      *      (u32)a0=0                  ==> standby
0312      *             =CMD_ENABLE2_ACTIVE ==> active
0313      */
0314     CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48),
0315 
0316     /*
0317      * cmd_status:
0318      *     Returns the status of the specified command
0319      * Input:
0320      *     a0 = command for which status is being queried.
0321      *          Possible values are:
0322      *              CMD_SOFT_RESET
0323      *              CMD_HANG_RESET
0324      *              CMD_OPEN
0325      *              CMD_INIT
0326      *              CMD_INIT_PROV_INFO
0327      *              CMD_DEINIT
0328      *              CMD_INIT_PROV_INFO2
0329      *              CMD_ENABLE2
0330      * Output:
0331      *     if status == STAT_ERROR
0332      *        a0 = ERR_ENOTSUPPORTED - status for command in a0 is
0333      *                                 not supported
0334      *     if status == STAT_NONE
0335      *        a0 = status of the devcmd specified in a0 as follows.
0336      *             ERR_SUCCESS   - command in a0 completed successfully
0337      *             ERR_EINPROGRESS - command in a0 is still in progress
0338      */
0339     CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49),
0340 
0341     /*
0342      * Returns interrupt coalescing timer conversion factors.
0343      * After calling this devcmd, ENIC driver can convert
0344      * interrupt coalescing timer in usec into CPU cycles as follows:
0345      *
0346      *   intr_timer_cycles = intr_timer_usec * multiplier / divisor
0347      *
0348      * Interrupt coalescing timer in usecs can be obtained from
0349      * CPU cycles as follows:
0350      *
0351      *   intr_timer_usec = intr_timer_cycles * divisor / multiplier
0352      *
0353      * in: none
0354      * out: (u32)a0 = multiplier
0355      *      (u32)a1 = divisor
0356      *      (u32)a2 = maximum timer value in usec
0357      */
0358     CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50),
0359 
0360     /*
0361      * Set the predefined mac address as default
0362      * in:
0363      *   (u48)a0 = mac addr
0364      */
0365     CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55),
0366 
0367     /* Update the provisioning info of the given VIF
0368      *     (u64)a0=paddr of vnic_devcmd_provinfo
0369      *     (u32)a1=sizeof provision info
0370      */
0371     CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56),
0372 
0373     /* Initialization for the devcmd2 interface.
0374      * in: (u64) a0 = host result buffer physical address
0375      * in: (u16) a1 = number of entries in result buffer
0376      */
0377     CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57),
0378 
0379     /* Add a filter.
0380      * in: (u64) a0= filter address
0381      *     (u32) a1= size of filter
0382      * out: (u32) a0=filter identifier
0383      */
0384     CMD_ADD_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 58),
0385 
0386     /* Delete a filter.
0387      * in: (u32) a0=filter identifier
0388      */
0389     CMD_DEL_FILTER = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 59),
0390 
0391     /* Enable a Queue Pair in User space NIC
0392      * in: (u32) a0=Queue Pair number
0393      *     (u32) a1= command
0394      */
0395     CMD_QP_ENABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 60),
0396 
0397     /* Disable a Queue Pair in User space NIC
0398      * in: (u32) a0=Queue Pair number
0399      *     (u32) a1= command
0400      */
0401     CMD_QP_DISABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 61),
0402 
0403     /* Stats dump Queue Pair in User space NIC
0404      * in: (u32) a0=Queue Pair number
0405      *     (u64) a1=host buffer addr for status dump
0406      *     (u32) a2=length of the buffer
0407      */
0408     CMD_QP_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 62),
0409 
0410     /* Clear stats for Queue Pair in User space NIC
0411      * in: (u32) a0=Queue Pair number
0412      */
0413     CMD_QP_STATS_CLEAR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 63),
0414 
0415     /* Use this devcmd for agreeing on the highest common version supported
0416      * by both driver and fw for features who need such a facility.
0417      * in:  (u64) a0 = feature (driver requests for the supported versions
0418      *  on this feature)
0419      * out: (u64) a0 = bitmap of all supported versions for that feature
0420      */
0421     CMD_GET_SUPP_FEATURE_VER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 69),
0422 
0423     /* Control (Enable/Disable) overlay offloads on the given vnic
0424      * in: (u8) a0 = OVERLAY_FEATURE_NVGRE : NVGRE
0425      *      a0 = OVERLAY_FEATURE_VXLAN : VxLAN
0426      * in: (u8) a1 = OVERLAY_OFFLOAD_ENABLE : Enable or
0427      *      a1 = OVERLAY_OFFLOAD_DISABLE : Disable or
0428      *      a1 = OVERLAY_OFFLOAD_ENABLE_V2 : Enable with version 2
0429      */
0430     CMD_OVERLAY_OFFLOAD_CTRL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 72),
0431 
0432     /* Configuration of overlay offloads feature on a given vNIC
0433      * in: (u8) a0 = DEVCMD_OVERLAY_NVGRE : NVGRE
0434      *      a0 = DEVCMD_OVERLAY_VXLAN : VxLAN
0435      * in: (u8) a1 = VXLAN_PORT_UPDATE : VxLAN
0436      * in: (u16) a2 = unsigned short int port information
0437      */
0438     CMD_OVERLAY_OFFLOAD_CFG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 73),
0439 };
0440 
0441 /* CMD_ENABLE2 flags */
0442 #define CMD_ENABLE2_STANDBY 0x0
0443 #define CMD_ENABLE2_ACTIVE  0x1
0444 
0445 /* flags for CMD_OPEN */
0446 #define CMD_OPENF_OPROM     0x1 /* open coming from option rom */
0447 #define CMD_OPENF_IG_DESCCACHE  0x2 /* Do not flush IG DESC cache */
0448 
0449 /* flags for CMD_INIT */
0450 #define CMD_INITF_DEFAULT_MAC   0x1 /* init with default mac addr */
0451 
0452 /* flags for CMD_PACKET_FILTER */
0453 #define CMD_PFILTER_DIRECTED        0x01
0454 #define CMD_PFILTER_MULTICAST       0x02
0455 #define CMD_PFILTER_BROADCAST       0x04
0456 #define CMD_PFILTER_PROMISCUOUS     0x08
0457 #define CMD_PFILTER_ALL_MULTICAST   0x10
0458 
0459 /* Commands for CMD_QP_ENABLE/CM_QP_DISABLE */
0460 #define CMD_QP_RQWQ                     0x0
0461 
0462 /* rewrite modes for CMD_IG_VLAN_REWRITE_MODE */
0463 #define IG_VLAN_REWRITE_MODE_DEFAULT_TRUNK              0
0464 #define IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN         1
0465 #define IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN  2
0466 #define IG_VLAN_REWRITE_MODE_PASS_THRU                  3
0467 
0468 enum vnic_devcmd_status {
0469     STAT_NONE = 0,
0470     STAT_BUSY = 1 << 0, /* cmd in progress */
0471     STAT_ERROR = 1 << 1,    /* last cmd caused error (code in a0) */
0472 };
0473 
0474 enum vnic_devcmd_error {
0475     ERR_SUCCESS = 0,
0476     ERR_EINVAL = 1,
0477     ERR_EFAULT = 2,
0478     ERR_EPERM = 3,
0479     ERR_EBUSY = 4,
0480     ERR_ECMDUNKNOWN = 5,
0481     ERR_EBADSTATE = 6,
0482     ERR_ENOMEM = 7,
0483     ERR_ETIMEDOUT = 8,
0484     ERR_ELINKDOWN = 9,
0485     ERR_EMAXRES = 10,
0486     ERR_ENOTSUPPORTED = 11,
0487     ERR_EINPROGRESS = 12,
0488     ERR_MAX
0489 };
0490 
0491 /*
0492  * note: hw_version and asic_rev refer to the same thing,
0493  *       but have different formats. hw_version is
0494  *       a 32-byte string (e.g. "A2") and asic_rev is
0495  *       a 16-bit integer (e.g. 0xA2).
0496  */
0497 struct vnic_devcmd_fw_info {
0498     char fw_version[32];
0499     char fw_build[32];
0500     char hw_version[32];
0501     char hw_serial_number[32];
0502     u16 asic_type;
0503     u16 asic_rev;
0504 };
0505 
0506 struct vnic_devcmd_notify {
0507     u32 csum;       /* checksum over following words */
0508 
0509     u32 link_state;     /* link up == 1 */
0510     u32 port_speed;     /* effective port speed (rate limit) */
0511     u32 mtu;        /* MTU */
0512     u32 msglvl;     /* requested driver msg lvl */
0513     u32 uif;        /* uplink interface */
0514     u32 status;     /* status bits (see VNIC_STF_*) */
0515     u32 error;      /* error code (see ERR_*) for first ERR */
0516     u32 link_down_cnt;  /* running count of link down transitions */
0517     u32 perbi_rebuild_cnt;  /* running count of perbi rebuilds */
0518 };
0519 #define VNIC_STF_FATAL_ERR  0x0001  /* fatal fw error */
0520 #define VNIC_STF_STD_PAUSE  0x0002  /* standard link-level pause on */
0521 #define VNIC_STF_PFC_PAUSE  0x0004  /* priority flow control pause on */
0522 /* all supported status flags */
0523 #define VNIC_STF_ALL        (VNIC_STF_FATAL_ERR |\
0524                  VNIC_STF_STD_PAUSE |\
0525                  VNIC_STF_PFC_PAUSE |\
0526                  0)
0527 
0528 struct vnic_devcmd_provinfo {
0529     u8 oui[3];
0530     u8 type;
0531     u8 data[];
0532 };
0533 
0534 /* These are used in flags field of different filters to denote
0535  * valid fields used.
0536  */
0537 #define FILTER_FIELD_VALID(fld) (1 << (fld - 1))
0538 
0539 #define FILTER_FIELDS_USNIC ( \
0540             FILTER_FIELD_VALID(1) | \
0541             FILTER_FIELD_VALID(2) | \
0542             FILTER_FIELD_VALID(3) | \
0543             FILTER_FIELD_VALID(4))
0544 
0545 #define FILTER_FIELDS_IPV4_5TUPLE ( \
0546             FILTER_FIELD_VALID(1) | \
0547             FILTER_FIELD_VALID(2) | \
0548             FILTER_FIELD_VALID(3) | \
0549             FILTER_FIELD_VALID(4) | \
0550             FILTER_FIELD_VALID(5))
0551 
0552 #define FILTER_FIELDS_MAC_VLAN ( \
0553             FILTER_FIELD_VALID(1) | \
0554             FILTER_FIELD_VALID(2))
0555 
0556 #define FILTER_FIELD_USNIC_VLAN    FILTER_FIELD_VALID(1)
0557 #define FILTER_FIELD_USNIC_ETHTYPE FILTER_FIELD_VALID(2)
0558 #define FILTER_FIELD_USNIC_PROTO   FILTER_FIELD_VALID(3)
0559 #define FILTER_FIELD_USNIC_ID      FILTER_FIELD_VALID(4)
0560 
0561 struct filter_usnic_id {
0562     u32 flags;
0563     u16 vlan;
0564     u16 ethtype;
0565     u8 proto_version;
0566     u32 usnic_id;
0567 } __packed;
0568 
0569 #define FILTER_FIELD_5TUP_PROTO  FILTER_FIELD_VALID(1)
0570 #define FILTER_FIELD_5TUP_SRC_AD FILTER_FIELD_VALID(2)
0571 #define FILTER_FIELD_5TUP_DST_AD FILTER_FIELD_VALID(3)
0572 #define FILTER_FIELD_5TUP_SRC_PT FILTER_FIELD_VALID(4)
0573 #define FILTER_FIELD_5TUP_DST_PT FILTER_FIELD_VALID(5)
0574 
0575 /* Enums for the protocol field. */
0576 enum protocol_e {
0577     PROTO_UDP = 0,
0578     PROTO_TCP = 1,
0579 };
0580 
0581 struct filter_ipv4_5tuple {
0582     u32 flags;
0583     u32 protocol;
0584     u32 src_addr;
0585     u32 dst_addr;
0586     u16 src_port;
0587     u16 dst_port;
0588 } __packed;
0589 
0590 #define FILTER_FIELD_VMQ_VLAN   FILTER_FIELD_VALID(1)
0591 #define FILTER_FIELD_VMQ_MAC    FILTER_FIELD_VALID(2)
0592 
0593 struct filter_mac_vlan {
0594     u32 flags;
0595     u16 vlan;
0596     u8 mac_addr[6];
0597 } __packed;
0598 
0599 /* Specifies the filter_action type. */
0600 enum {
0601     FILTER_ACTION_RQ_STEERING = 0,
0602     FILTER_ACTION_MAX
0603 };
0604 
0605 struct filter_action {
0606     u32 type;
0607     union {
0608         u32 rq_idx;
0609     } u;
0610 } __packed;
0611 
0612 /* Specifies the filter type. */
0613 enum filter_type {
0614     FILTER_USNIC_ID = 0,
0615     FILTER_IPV4_5TUPLE = 1,
0616     FILTER_MAC_VLAN = 2,
0617     FILTER_MAX
0618 };
0619 
0620 struct filter {
0621     u32 type;
0622     union {
0623         struct filter_usnic_id usnic;
0624         struct filter_ipv4_5tuple ipv4;
0625         struct filter_mac_vlan mac_vlan;
0626     } u;
0627 } __packed;
0628 
0629 enum {
0630     CLSF_TLV_FILTER = 0,
0631     CLSF_TLV_ACTION = 1,
0632 };
0633 
0634 /* Maximum size of buffer to CMD_ADD_FILTER */
0635 #define FILTER_MAX_BUF_SIZE 100
0636 
0637 struct filter_tlv {
0638     u32 type;
0639     u32 length;
0640     u32 val[];
0641 };
0642 
0643 enum {
0644     CLSF_ADD = 0,
0645     CLSF_DEL = 1,
0646 };
0647 
0648 /*
0649  * Writing cmd register causes STAT_BUSY to get set in status register.
0650  * When cmd completes, STAT_BUSY will be cleared.
0651  *
0652  * If cmd completed successfully STAT_ERROR will be clear
0653  * and args registers contain cmd-specific results.
0654  *
0655  * If cmd error, STAT_ERROR will be set and args[0] contains error code.
0656  *
0657  * status register is read-only.  While STAT_BUSY is set,
0658  * all other register contents are read-only.
0659  */
0660 
0661 /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
0662 #define VNIC_DEVCMD_NARGS 15
0663 struct vnic_devcmd {
0664     u32 status;         /* RO */
0665     u32 cmd;            /* RW */
0666     u64 args[VNIC_DEVCMD_NARGS];    /* RW cmd args (little-endian) */
0667 };
0668 
0669 #define DEVCMD2_FNORESULT   0x1 /* Don't copy result to host */
0670 
0671 #define VNIC_DEVCMD2_NARGS  VNIC_DEVCMD_NARGS
0672 struct vnic_devcmd2 {
0673     u16 pad;
0674     u16 flags;
0675     u32 cmd;
0676     u64 args[VNIC_DEVCMD2_NARGS];
0677 };
0678 
0679 #define VNIC_DEVCMD2_NRESULTS   VNIC_DEVCMD_NARGS
0680 struct devcmd2_result {
0681     u64 results[VNIC_DEVCMD2_NRESULTS];
0682     u32 pad;
0683     u16 completed_index;
0684     u8  error;
0685     u8  color;
0686 };
0687 
0688 #define DEVCMD2_RING_SIZE   32
0689 #define DEVCMD2_DESC_SIZE   128
0690 
0691 enum overlay_feature_t {
0692     OVERLAY_FEATURE_NVGRE = 1,
0693     OVERLAY_FEATURE_VXLAN,
0694     OVERLAY_FEATURE_MAX,
0695 };
0696 
0697 enum overlay_ofld_cmd {
0698     OVERLAY_OFFLOAD_ENABLE,
0699     OVERLAY_OFFLOAD_DISABLE,
0700     OVERLAY_OFFLOAD_ENABLE_P2,
0701     OVERLAY_OFFLOAD_MAX,
0702 };
0703 
0704 #define OVERLAY_CFG_VXLAN_PORT_UPDATE   0
0705 
0706 #define ENIC_VXLAN_INNER_IPV6       BIT(0)
0707 #define ENIC_VXLAN_OUTER_IPV6       BIT(1)
0708 #define ENIC_VXLAN_MULTI_WQ     BIT(2)
0709 
0710 /* Use this enum to get the supported versions for each of these features
0711  * If you need to use the devcmd_get_supported_feature_version(), add
0712  * the new feature into this enum and install function handler in devcmd.c
0713  */
0714 enum vic_feature_t {
0715     VIC_FEATURE_VXLAN,
0716     VIC_FEATURE_RDMA,
0717     VIC_FEATURE_VXLAN_PATCH,
0718     VIC_FEATURE_MAX,
0719 };
0720 
0721 #endif /* _VNIC_DEVCMD_H_ */