Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
0003 
0004 #ifndef _VNIC_DEVCMD_H_
0005 #define _VNIC_DEVCMD_H_
0006 
0007 #define _CMD_NBITS      14
0008 #define _CMD_VTYPEBITS  10
0009 #define _CMD_FLAGSBITS  6
0010 #define _CMD_DIRBITS    2
0011 
0012 #define _CMD_NMASK      ((1 << _CMD_NBITS)-1)
0013 #define _CMD_VTYPEMASK  ((1 << _CMD_VTYPEBITS)-1)
0014 #define _CMD_FLAGSMASK  ((1 << _CMD_FLAGSBITS)-1)
0015 #define _CMD_DIRMASK    ((1 << _CMD_DIRBITS)-1)
0016 
0017 #define _CMD_NSHIFT     0
0018 #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
0019 #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
0020 #define _CMD_DIRSHIFT   (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
0021 
0022 /*
0023  * Direction bits (from host perspective).
0024  */
0025 #define _CMD_DIR_NONE   0U
0026 #define _CMD_DIR_WRITE  1U
0027 #define _CMD_DIR_READ   2U
0028 #define _CMD_DIR_RW     (_CMD_DIR_WRITE | _CMD_DIR_READ)
0029 
0030 /*
0031  * Flag bits.
0032  */
0033 #define _CMD_FLAGS_NONE 0U
0034 #define _CMD_FLAGS_NOWAIT 1U
0035 
0036 /*
0037  * vNIC type bits.
0038  */
0039 #define _CMD_VTYPE_NONE  0U
0040 #define _CMD_VTYPE_ENET  1U
0041 #define _CMD_VTYPE_FC    2U
0042 #define _CMD_VTYPE_SCSI  4U
0043 #define _CMD_VTYPE_ALL   (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
0044 
0045 /*
0046  * Used to create cmds..
0047 */
0048 #define _CMDCF(dir, flags, vtype, nr)  \
0049     (((dir)   << _CMD_DIRSHIFT) | \
0050     ((flags) << _CMD_FLAGSSHIFT) | \
0051     ((vtype) << _CMD_VTYPESHIFT) | \
0052     ((nr)    << _CMD_NSHIFT))
0053 #define _CMDC(dir, vtype, nr)    _CMDCF(dir, 0, vtype, nr)
0054 #define _CMDCNW(dir, vtype, nr)  _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
0055 
0056 /*
0057  * Used to decode cmds..
0058 */
0059 #define _CMD_DIR(cmd)            (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
0060 #define _CMD_FLAGS(cmd)          (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
0061 #define _CMD_VTYPE(cmd)          (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
0062 #define _CMD_N(cmd)              (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
0063 
0064 enum vnic_devcmd_cmd {
0065     CMD_NONE                = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),
0066 
0067     /* mcpu fw info in mem: (u64)a0=paddr to struct vnic_devcmd_fw_info */
0068     CMD_MCPU_FW_INFO        = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),
0069 
0070     /* dev-specific block member:
0071      *    in: (u16)a0=offset,(u8)a1=size
0072      *    out: a0=value */
0073     CMD_DEV_SPEC            = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),
0074 
0075     /* stats clear */
0076     CMD_STATS_CLEAR         = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),
0077 
0078     /* stats dump in mem: (u64)a0=paddr to stats area,
0079      *                    (u16)a1=sizeof stats area */
0080     CMD_STATS_DUMP          = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),
0081 
0082     /* nic_cfg in (u32)a0 */
0083     CMD_NIC_CFG             = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
0084 
0085     /* set struct vnic_devcmd_notify buffer in mem:
0086      * in:
0087      *   (u64)a0=paddr to notify (set paddr=0 to unset)
0088      *   (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
0089      *   (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
0090      * out:
0091      *   (u32)a1 = effective size
0092      */
0093     CMD_NOTIFY              = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),
0094 
0095     /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
0096     CMD_OPEN        = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),
0097 
0098     /* open status:
0099      *    out: a0=0 open complete, a0=1 open in progress */
0100     CMD_OPEN_STATUS     = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),
0101 
0102     /* close vnic */
0103     CMD_CLOSE       = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),
0104 
0105     /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
0106     CMD_INIT        = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),
0107 
0108     /* enable virtual link */
0109     CMD_ENABLE      = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
0110 
0111     /* enable virtual link, waiting variant. */
0112     CMD_ENABLE_WAIT     = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
0113 
0114     /* disable virtual link */
0115     CMD_DISABLE     = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),
0116 
0117     /* stats dump all vnics on uplink in mem: (u64)a0=paddr (u32)a1=uif */
0118     CMD_STATS_DUMP_ALL  = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),
0119 
0120     /* init status:
0121      *    out: a0=0 init complete, a0=1 init in progress
0122      *         if a0=0, a1=errno */
0123     CMD_INIT_STATUS     = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
0124 
0125     /* undo initialize of virtual link */
0126     CMD_DEINIT      = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),
0127 
0128     /* check fw capability of a cmd:
0129      * in:  (u32)a0=cmd
0130      * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
0131     CMD_CAPABILITY      = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
0132 
0133     /*
0134      * Initialization for the devcmd2 interface.
0135      * in: (u64) a0=host result buffer physical address
0136      * in: (u16) a1=number of entries in result buffer
0137      */
0138     CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57)
0139 };
0140 
0141 /* flags for CMD_OPEN */
0142 #define CMD_OPENF_OPROM     0x1 /* open coming from option rom */
0143 
0144 /* flags for CMD_INIT */
0145 #define CMD_INITF_DEFAULT_MAC   0x1 /* init with default mac addr */
0146 
0147 /* flags for CMD_PACKET_FILTER */
0148 #define CMD_PFILTER_DIRECTED        0x01
0149 #define CMD_PFILTER_MULTICAST       0x02
0150 #define CMD_PFILTER_BROADCAST       0x04
0151 #define CMD_PFILTER_PROMISCUOUS     0x08
0152 #define CMD_PFILTER_ALL_MULTICAST   0x10
0153 
0154 enum vnic_devcmd_status {
0155     STAT_NONE = 0,
0156     STAT_BUSY = 1 << 0, /* cmd in progress */
0157     STAT_ERROR = 1 << 1,    /* last cmd caused error (code in a0) */
0158 };
0159 
0160 enum vnic_devcmd_error {
0161     ERR_SUCCESS = 0,
0162     ERR_EINVAL = 1,
0163     ERR_EFAULT = 2,
0164     ERR_EPERM = 3,
0165     ERR_EBUSY = 4,
0166     ERR_ECMDUNKNOWN = 5,
0167     ERR_EBADSTATE = 6,
0168     ERR_ENOMEM = 7,
0169     ERR_ETIMEDOUT = 8,
0170     ERR_ELINKDOWN = 9,
0171 };
0172 
0173 struct vnic_devcmd_fw_info {
0174     char fw_version[32];
0175     char fw_build[32];
0176     char hw_version[32];
0177     char hw_serial_number[32];
0178 };
0179 
0180 struct vnic_devcmd_notify {
0181     u32 csum;       /* checksum over following words */
0182 
0183     u32 link_state;     /* link up == 1 */
0184     u32 port_speed;     /* effective port speed (rate limit) */
0185     u32 mtu;        /* MTU */
0186     u32 msglvl;     /* requested driver msg lvl */
0187     u32 uif;        /* uplink interface */
0188     u32 status;     /* status bits (see VNIC_STF_*) */
0189     u32 error;      /* error code (see ERR_*) for first ERR */
0190     u32 link_down_cnt;  /* running count of link down transitions */
0191 };
0192 #define VNIC_STF_FATAL_ERR  0x0001  /* fatal fw error */
0193 
0194 struct vnic_devcmd_provinfo {
0195     u8 oui[3];
0196     u8 type;
0197     u8 data[];
0198 };
0199 
0200 /*
0201  * Writing cmd register causes STAT_BUSY to get set in status register.
0202  * When cmd completes, STAT_BUSY will be cleared.
0203  *
0204  * If cmd completed successfully STAT_ERROR will be clear
0205  * and args registers contain cmd-specific results.
0206  *
0207  * If cmd error, STAT_ERROR will be set and args[0] contains error code.
0208  *
0209  * status register is read-only.  While STAT_BUSY is set,
0210  * all other register contents are read-only.
0211  */
0212 
0213 /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
0214 #define VNIC_DEVCMD_NARGS 15
0215 struct vnic_devcmd {
0216     u32 status;         /* RO */
0217     u32 cmd;            /* RW */
0218     u64 args[VNIC_DEVCMD_NARGS];    /* RW cmd args (little-endian) */
0219 };
0220 
0221 
0222 /*
0223  * Version 2 of the interface.
0224  *
0225  * Some things are carried over, notably the vnic_devcmd_cmd enum.
0226  */
0227 
0228 /*
0229  * Flags for vnic_devcmd2.flags
0230  */
0231 
0232 #define DEVCMD2_FNORESULT       0x1     /* Don't copy result to host */
0233 
0234 #define VNIC_DEVCMD2_NARGS      VNIC_DEVCMD_NARGS
0235 struct vnic_devcmd2 {
0236     u16 pad;
0237     u16 flags;
0238     u32 cmd;                /* same command #defines as original */
0239     u64 args[VNIC_DEVCMD2_NARGS];
0240 };
0241 
0242 #define VNIC_DEVCMD2_NRESULTS   VNIC_DEVCMD_NARGS
0243 struct devcmd2_result {
0244     u64 results[VNIC_DEVCMD2_NRESULTS];
0245     u32 pad;
0246     u16 completed_index;    /* into copy WQ */
0247     u8  error;              /* same error codes as original */
0248     u8  color;              /* 0 or 1 as with completion queues */
0249 };
0250 
0251 #define DEVCMD2_RING_SIZE   32
0252 #define DEVCMD2_DESC_SIZE   128
0253 
0254 #define DEVCMD2_RESULTS_SIZE_MAX   ((1 << 16) - 1)
0255 
0256 #endif /* _VNIC_DEVCMD_H_ */