19c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
29c067b84SDoug Ambrisko * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved.
39c067b84SDoug Ambrisko * Copyright 2007 Nuova Systems, Inc. All rights reserved.
49c067b84SDoug Ambrisko */
59c067b84SDoug Ambrisko
69c067b84SDoug Ambrisko #ifndef _VNIC_DEVCMD_H_
79c067b84SDoug Ambrisko #define _VNIC_DEVCMD_H_
89c067b84SDoug Ambrisko
99c067b84SDoug Ambrisko #define _CMD_NBITS 14
109c067b84SDoug Ambrisko #define _CMD_VTYPEBITS 10
119c067b84SDoug Ambrisko #define _CMD_FLAGSBITS 6
129c067b84SDoug Ambrisko #define _CMD_DIRBITS 2
139c067b84SDoug Ambrisko
149c067b84SDoug Ambrisko #define _CMD_NMASK ((1 << _CMD_NBITS)-1)
159c067b84SDoug Ambrisko #define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1)
169c067b84SDoug Ambrisko #define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1)
179c067b84SDoug Ambrisko #define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1)
189c067b84SDoug Ambrisko
199c067b84SDoug Ambrisko #define _CMD_NSHIFT 0
209c067b84SDoug Ambrisko #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
219c067b84SDoug Ambrisko #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
229c067b84SDoug Ambrisko #define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
239c067b84SDoug Ambrisko
249c067b84SDoug Ambrisko /*
259c067b84SDoug Ambrisko * Direction bits (from host perspective).
269c067b84SDoug Ambrisko */
279c067b84SDoug Ambrisko #define _CMD_DIR_NONE 0U
289c067b84SDoug Ambrisko #define _CMD_DIR_WRITE 1U
299c067b84SDoug Ambrisko #define _CMD_DIR_READ 2U
309c067b84SDoug Ambrisko #define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ)
319c067b84SDoug Ambrisko
329c067b84SDoug Ambrisko /*
339c067b84SDoug Ambrisko * Flag bits.
349c067b84SDoug Ambrisko */
359c067b84SDoug Ambrisko #define _CMD_FLAGS_NONE 0U
369c067b84SDoug Ambrisko #define _CMD_FLAGS_NOWAIT 1U
379c067b84SDoug Ambrisko
389c067b84SDoug Ambrisko /*
399c067b84SDoug Ambrisko * vNIC type bits.
409c067b84SDoug Ambrisko */
419c067b84SDoug Ambrisko #define _CMD_VTYPE_NONE 0U
429c067b84SDoug Ambrisko #define _CMD_VTYPE_ENET 1U
439c067b84SDoug Ambrisko #define _CMD_VTYPE_FC 2U
449c067b84SDoug Ambrisko #define _CMD_VTYPE_SCSI 4U
459c067b84SDoug Ambrisko #define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
469c067b84SDoug Ambrisko
479c067b84SDoug Ambrisko /*
489c067b84SDoug Ambrisko * Used to create cmds..
499c067b84SDoug Ambrisko */
509c067b84SDoug Ambrisko #define _CMDCF(dir, flags, vtype, nr) \
519c067b84SDoug Ambrisko (((dir) << _CMD_DIRSHIFT) | \
529c067b84SDoug Ambrisko ((flags) << _CMD_FLAGSSHIFT) | \
539c067b84SDoug Ambrisko ((vtype) << _CMD_VTYPESHIFT) | \
549c067b84SDoug Ambrisko ((nr) << _CMD_NSHIFT))
559c067b84SDoug Ambrisko #define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr)
569c067b84SDoug Ambrisko #define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
579c067b84SDoug Ambrisko
589c067b84SDoug Ambrisko /*
599c067b84SDoug Ambrisko * Used to decode cmds..
609c067b84SDoug Ambrisko */
619c067b84SDoug Ambrisko #define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
629c067b84SDoug Ambrisko #define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
639c067b84SDoug Ambrisko #define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
649c067b84SDoug Ambrisko #define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
659c067b84SDoug Ambrisko
669c067b84SDoug Ambrisko #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
679c067b84SDoug Ambrisko
689c067b84SDoug Ambrisko enum vnic_devcmd_cmd {
699c067b84SDoug Ambrisko CMD_NONE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),
709c067b84SDoug Ambrisko
719c067b84SDoug Ambrisko /*
729c067b84SDoug Ambrisko * mcpu fw info in mem:
739c067b84SDoug Ambrisko * in:
749c067b84SDoug Ambrisko * (u64)a0=paddr to struct vnic_devcmd_fw_info
759c067b84SDoug Ambrisko * action:
769c067b84SDoug Ambrisko * Fills in struct vnic_devcmd_fw_info (128 bytes)
779c067b84SDoug Ambrisko * note:
789c067b84SDoug Ambrisko * An old definition of CMD_MCPU_FW_INFO
799c067b84SDoug Ambrisko */
809c067b84SDoug Ambrisko CMD_MCPU_FW_INFO_OLD = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),
819c067b84SDoug Ambrisko
829c067b84SDoug Ambrisko /*
839c067b84SDoug Ambrisko * mcpu fw info in mem:
849c067b84SDoug Ambrisko * in:
859c067b84SDoug Ambrisko * (u64)a0=paddr to struct vnic_devcmd_fw_info
869c067b84SDoug Ambrisko * (u16)a1=size of the structure
879c067b84SDoug Ambrisko * out:
889c067b84SDoug Ambrisko * (u16)a1=0 for in:a1 = 0,
899c067b84SDoug Ambrisko * data size actually written for other values.
909c067b84SDoug Ambrisko * action:
919c067b84SDoug Ambrisko * Fills in first 128 bytes of vnic_devcmd_fw_info for in:a1 = 0,
929c067b84SDoug Ambrisko * first in:a1 bytes for 0 < in:a1 <= 132,
939c067b84SDoug Ambrisko * 132 bytes for other values of in:a1.
949c067b84SDoug Ambrisko * note:
959c067b84SDoug Ambrisko * CMD_MCPU_FW_INFO and CMD_MCPU_FW_INFO_OLD have the same enum 1
969c067b84SDoug Ambrisko * for source compatibility.
979c067b84SDoug Ambrisko */
989c067b84SDoug Ambrisko CMD_MCPU_FW_INFO = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 1),
999c067b84SDoug Ambrisko
1009c067b84SDoug Ambrisko /* dev-specific block member:
1019c067b84SDoug Ambrisko * in: (u16)a0=offset,(u8)a1=size
1029c067b84SDoug Ambrisko * out: a0=value
1039c067b84SDoug Ambrisko */
1049c067b84SDoug Ambrisko CMD_DEV_SPEC = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),
1059c067b84SDoug Ambrisko
1069c067b84SDoug Ambrisko /* stats clear */
1079c067b84SDoug Ambrisko CMD_STATS_CLEAR = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),
1089c067b84SDoug Ambrisko
1099c067b84SDoug Ambrisko /* stats dump in mem: (u64)a0=paddr to stats area,
1109c067b84SDoug Ambrisko * (u16)a1=sizeof stats area */
1119c067b84SDoug Ambrisko CMD_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),
1129c067b84SDoug Ambrisko
1139c067b84SDoug Ambrisko /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */
1149c067b84SDoug Ambrisko CMD_PACKET_FILTER = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 7),
1159c067b84SDoug Ambrisko
1169c067b84SDoug Ambrisko /* set Rx packet filter for all: (u32)a0=filters (see CMD_PFILTER_*) */
1179c067b84SDoug Ambrisko CMD_PACKET_FILTER_ALL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7),
1189c067b84SDoug Ambrisko
1199c067b84SDoug Ambrisko /* hang detection notification */
1209c067b84SDoug Ambrisko CMD_HANG_NOTIFY = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),
1219c067b84SDoug Ambrisko
1229c067b84SDoug Ambrisko /* MAC address in (u48)a0 */
1239c067b84SDoug Ambrisko CMD_MAC_ADDR = _CMDC(_CMD_DIR_READ,
1249c067b84SDoug Ambrisko _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),
1259c067b84SDoug Ambrisko #define CMD_GET_MAC_ADDR CMD_MAC_ADDR /* some uses are aliased */
1269c067b84SDoug Ambrisko
1279c067b84SDoug Ambrisko /* add addr from (u48)a0 */
1289c067b84SDoug Ambrisko CMD_ADDR_ADD = _CMDCNW(_CMD_DIR_WRITE,
1299c067b84SDoug Ambrisko _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12),
1309c067b84SDoug Ambrisko
1319c067b84SDoug Ambrisko /* del addr from (u48)a0 */
1329c067b84SDoug Ambrisko CMD_ADDR_DEL = _CMDCNW(_CMD_DIR_WRITE,
1339c067b84SDoug Ambrisko _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13),
1349c067b84SDoug Ambrisko
1359c067b84SDoug Ambrisko /* add VLAN id in (u16)a0 */
1369c067b84SDoug Ambrisko CMD_VLAN_ADD = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14),
1379c067b84SDoug Ambrisko
1389c067b84SDoug Ambrisko /* del VLAN id in (u16)a0 */
1399c067b84SDoug Ambrisko CMD_VLAN_DEL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15),
1409c067b84SDoug Ambrisko
1419c067b84SDoug Ambrisko /*
1429c067b84SDoug Ambrisko * nic_cfg in (u32)a0
1439c067b84SDoug Ambrisko *
1449c067b84SDoug Ambrisko * Capability query:
1459c067b84SDoug Ambrisko * out: (u64) a0= 1 if a1 is valid
1469c067b84SDoug Ambrisko * (u64) a1= (NIC_CFG bits supported) | (flags << 32)
1479c067b84SDoug Ambrisko * (flags are CMD_NIC_CFG_CAPF_xxx)
1489c067b84SDoug Ambrisko */
1499c067b84SDoug Ambrisko CMD_NIC_CFG = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
1509c067b84SDoug Ambrisko
1519c067b84SDoug Ambrisko /*
1529c067b84SDoug Ambrisko * nic_cfg_chk (same as nic_cfg, but may return error)
1539c067b84SDoug Ambrisko * in (u32)a0
1549c067b84SDoug Ambrisko *
1559c067b84SDoug Ambrisko * Capability query:
1569c067b84SDoug Ambrisko * out: (u64) a0= 1 if a1 is valid
1579c067b84SDoug Ambrisko * (u64) a1= (NIC_CFG bits supported) | (flags << 32)
1589c067b84SDoug Ambrisko * (flags are CMD_NIC_CFG_CAPF_xxx)
1599c067b84SDoug Ambrisko */
1609c067b84SDoug Ambrisko CMD_NIC_CFG_CHK = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
1619c067b84SDoug Ambrisko
1629c067b84SDoug Ambrisko /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */
1639c067b84SDoug Ambrisko CMD_RSS_KEY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17),
1649c067b84SDoug Ambrisko
1659c067b84SDoug Ambrisko /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */
1669c067b84SDoug Ambrisko CMD_RSS_CPU = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18),
1679c067b84SDoug Ambrisko
1689c067b84SDoug Ambrisko /* initiate softreset */
1699c067b84SDoug Ambrisko CMD_SOFT_RESET = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19),
1709c067b84SDoug Ambrisko
1719c067b84SDoug Ambrisko /* softreset status:
1729c067b84SDoug Ambrisko * out: a0=0 reset complete, a0=1 reset in progress */
1739c067b84SDoug Ambrisko CMD_SOFT_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20),
1749c067b84SDoug Ambrisko
1759c067b84SDoug Ambrisko /* set struct vnic_devcmd_notify buffer in mem:
1769c067b84SDoug Ambrisko * in:
1779c067b84SDoug Ambrisko * (u64)a0=paddr to notify (set paddr=0 to unset)
1789c067b84SDoug Ambrisko * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
1799c067b84SDoug Ambrisko * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
1809c067b84SDoug Ambrisko * out:
1819c067b84SDoug Ambrisko * (u32)a1 = effective size
1829c067b84SDoug Ambrisko */
1839c067b84SDoug Ambrisko CMD_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),
1849c067b84SDoug Ambrisko
1859c067b84SDoug Ambrisko /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct,
1869c067b84SDoug Ambrisko * (u8)a1=PXENV_UNDI_xxx */
1879c067b84SDoug Ambrisko CMD_UNDI = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22),
1889c067b84SDoug Ambrisko
1899c067b84SDoug Ambrisko /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
1909c067b84SDoug Ambrisko CMD_OPEN = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),
1919c067b84SDoug Ambrisko
1929c067b84SDoug Ambrisko /* open status:
1939c067b84SDoug Ambrisko * out: a0=0 open complete, a0=1 open in progress */
1949c067b84SDoug Ambrisko CMD_OPEN_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),
1959c067b84SDoug Ambrisko
1969c067b84SDoug Ambrisko /* close vnic */
1979c067b84SDoug Ambrisko CMD_CLOSE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),
1989c067b84SDoug Ambrisko
1999c067b84SDoug Ambrisko /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
2009c067b84SDoug Ambrisko /***** Replaced by CMD_INIT *****/
2019c067b84SDoug Ambrisko CMD_INIT_v1 = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),
2029c067b84SDoug Ambrisko
2039c067b84SDoug Ambrisko /* variant of CMD_INIT, with provisioning info
2049c067b84SDoug Ambrisko * (u64)a0=paddr of vnic_devcmd_provinfo
2059c067b84SDoug Ambrisko * (u32)a1=sizeof provision info */
2069c067b84SDoug Ambrisko CMD_INIT_PROV_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27),
2079c067b84SDoug Ambrisko
2089c067b84SDoug Ambrisko /* enable virtual link */
2099c067b84SDoug Ambrisko CMD_ENABLE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
2109c067b84SDoug Ambrisko
2119c067b84SDoug Ambrisko /* enable virtual link, waiting variant. */
2129c067b84SDoug Ambrisko CMD_ENABLE_WAIT = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
2139c067b84SDoug Ambrisko
2149c067b84SDoug Ambrisko /* disable virtual link */
2159c067b84SDoug Ambrisko CMD_DISABLE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),
2169c067b84SDoug Ambrisko
2179c067b84SDoug Ambrisko /* stats dump sum of all vnic stats on same uplink in mem:
2189c067b84SDoug Ambrisko * (u64)a0=paddr
2199c067b84SDoug Ambrisko * (u16)a1=sizeof stats area */
2209c067b84SDoug Ambrisko CMD_STATS_DUMP_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),
2219c067b84SDoug Ambrisko
2229c067b84SDoug Ambrisko /* init status:
2239c067b84SDoug Ambrisko * out: a0=0 init complete, a0=1 init in progress
2249c067b84SDoug Ambrisko * if a0=0, a1=errno */
2259c067b84SDoug Ambrisko CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
2269c067b84SDoug Ambrisko
2279c067b84SDoug Ambrisko /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
2289c067b84SDoug Ambrisko * (u32)a1=INT13_CMD_xxx */
2299c067b84SDoug Ambrisko CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
2309c067b84SDoug Ambrisko
2319c067b84SDoug Ambrisko /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
2329c067b84SDoug Ambrisko CMD_LOGICAL_UPLINK = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33),
2339c067b84SDoug Ambrisko
2349c067b84SDoug Ambrisko /* undo initialize of virtual link */
2359c067b84SDoug Ambrisko CMD_DEINIT = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),
2369c067b84SDoug Ambrisko
2379c067b84SDoug Ambrisko /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
2389c067b84SDoug Ambrisko CMD_INIT = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 35),
2399c067b84SDoug Ambrisko
2409c067b84SDoug Ambrisko /* check fw capability of a cmd:
2419c067b84SDoug Ambrisko * in: (u32)a0=cmd
2429c067b84SDoug Ambrisko * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
2439c067b84SDoug Ambrisko CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
2449c067b84SDoug Ambrisko
2459c067b84SDoug Ambrisko /* persistent binding info
2469c067b84SDoug Ambrisko * in: (u64)a0=paddr of arg
2479c067b84SDoug Ambrisko * (u32)a1=CMD_PERBI_XXX */
2489c067b84SDoug Ambrisko CMD_PERBI = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),
2499c067b84SDoug Ambrisko
2509c067b84SDoug Ambrisko /* Interrupt Assert Register functionality
2519c067b84SDoug Ambrisko * in: (u16)a0=interrupt number to assert
2529c067b84SDoug Ambrisko */
2539c067b84SDoug Ambrisko CMD_IAR = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38),
2549c067b84SDoug Ambrisko
2559c067b84SDoug Ambrisko /* initiate hangreset, like softreset after hang detected */
2569c067b84SDoug Ambrisko CMD_HANG_RESET = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39),
2579c067b84SDoug Ambrisko
2589c067b84SDoug Ambrisko /* hangreset status:
2599c067b84SDoug Ambrisko * out: a0=0 reset complete, a0=1 reset in progress */
2609c067b84SDoug Ambrisko CMD_HANG_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40),
2619c067b84SDoug Ambrisko
2629c067b84SDoug Ambrisko /*
2639c067b84SDoug Ambrisko * Set hw ingress packet vlan rewrite mode:
2649c067b84SDoug Ambrisko * in: (u32)a0=new vlan rewrite mode
2659c067b84SDoug Ambrisko * out: (u32)a0=old vlan rewrite mode */
2669c067b84SDoug Ambrisko CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41),
2679c067b84SDoug Ambrisko
2689c067b84SDoug Ambrisko /*
2699c067b84SDoug Ambrisko * in: (u16)a0=bdf of target vnic
2709c067b84SDoug Ambrisko * (u32)a1=cmd to proxy
2719c067b84SDoug Ambrisko * a2-a15=args to cmd in a1
2729c067b84SDoug Ambrisko * out: (u32)a0=status of proxied cmd
2739c067b84SDoug Ambrisko * a1-a15=out args of proxied cmd */
2749c067b84SDoug Ambrisko CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),
2759c067b84SDoug Ambrisko
2769c067b84SDoug Ambrisko /*
2779c067b84SDoug Ambrisko * As for BY_BDF except a0 is index of hvnlink subordinate vnic
2789c067b84SDoug Ambrisko * or SR-IOV virtual vnic
2799c067b84SDoug Ambrisko */
2809c067b84SDoug Ambrisko CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43),
2819c067b84SDoug Ambrisko
2829c067b84SDoug Ambrisko /*
2839c067b84SDoug Ambrisko * For HPP toggle:
2849c067b84SDoug Ambrisko * adapter-info-get
2859c067b84SDoug Ambrisko * in: (u64)a0=phsical address of buffer passed in from caller.
2869c067b84SDoug Ambrisko * (u16)a1=size of buffer specified in a0.
2879c067b84SDoug Ambrisko * out: (u64)a0=phsical address of buffer passed in from caller.
2889c067b84SDoug Ambrisko * (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or
2899c067b84SDoug Ambrisko * 0 if no VIF-CONFIG-INFO TLV was ever received. */
2909c067b84SDoug Ambrisko CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44),
2919c067b84SDoug Ambrisko
2929c067b84SDoug Ambrisko /*
2939c067b84SDoug Ambrisko * INT13 API: (u64)a0=paddr to vnic_int13_params struct
2949c067b84SDoug Ambrisko * (u32)a1=INT13_CMD_xxx
2959c067b84SDoug Ambrisko */
2969c067b84SDoug Ambrisko CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45),
2979c067b84SDoug Ambrisko
2989c067b84SDoug Ambrisko /*
2999c067b84SDoug Ambrisko * Set default vlan:
3009c067b84SDoug Ambrisko * in: (u16)a0=new default vlan
3019c067b84SDoug Ambrisko * (u16)a1=zero for overriding vlan with param a0,
3029c067b84SDoug Ambrisko * non-zero for resetting vlan to the default
3039c067b84SDoug Ambrisko * out: (u16)a0=old default vlan
3049c067b84SDoug Ambrisko */
3059c067b84SDoug Ambrisko CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46),
3069c067b84SDoug Ambrisko
3079c067b84SDoug Ambrisko /* init_prov_info2:
3089c067b84SDoug Ambrisko * Variant of CMD_INIT_PROV_INFO, where it will not try to enable
3099c067b84SDoug Ambrisko * the vnic until CMD_ENABLE2 is issued.
3109c067b84SDoug Ambrisko * (u64)a0=paddr of vnic_devcmd_provinfo
3119c067b84SDoug Ambrisko * (u32)a1=sizeof provision info */
3129c067b84SDoug Ambrisko CMD_INIT_PROV_INFO2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47),
3139c067b84SDoug Ambrisko
3149c067b84SDoug Ambrisko /* enable2:
3159c067b84SDoug Ambrisko * (u32)a0=0 ==> standby
3169c067b84SDoug Ambrisko * =CMD_ENABLE2_ACTIVE ==> active
3179c067b84SDoug Ambrisko */
3189c067b84SDoug Ambrisko CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48),
3199c067b84SDoug Ambrisko
3209c067b84SDoug Ambrisko /*
3219c067b84SDoug Ambrisko * cmd_status:
3229c067b84SDoug Ambrisko * Returns the status of the specified command
3239c067b84SDoug Ambrisko * Input:
3249c067b84SDoug Ambrisko * a0 = command for which status is being queried.
3259c067b84SDoug Ambrisko * Possible values are:
3269c067b84SDoug Ambrisko * CMD_SOFT_RESET
3279c067b84SDoug Ambrisko * CMD_HANG_RESET
3289c067b84SDoug Ambrisko * CMD_OPEN
3299c067b84SDoug Ambrisko * CMD_INIT
3309c067b84SDoug Ambrisko * CMD_INIT_PROV_INFO
3319c067b84SDoug Ambrisko * CMD_DEINIT
3329c067b84SDoug Ambrisko * CMD_INIT_PROV_INFO2
3339c067b84SDoug Ambrisko * CMD_ENABLE2
3349c067b84SDoug Ambrisko * Output:
3359c067b84SDoug Ambrisko * if status == STAT_ERROR
3369c067b84SDoug Ambrisko * a0 = ERR_ENOTSUPPORTED - status for command in a0 is
3379c067b84SDoug Ambrisko * not supported
3389c067b84SDoug Ambrisko * if status == STAT_NONE
3399c067b84SDoug Ambrisko * a0 = status of the devcmd specified in a0 as follows.
3409c067b84SDoug Ambrisko * ERR_SUCCESS - command in a0 completed successfully
3419c067b84SDoug Ambrisko * ERR_EINPROGRESS - command in a0 is still in progress
3429c067b84SDoug Ambrisko */
3439c067b84SDoug Ambrisko CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49),
3449c067b84SDoug Ambrisko
3459c067b84SDoug Ambrisko /*
3469c067b84SDoug Ambrisko * Returns interrupt coalescing timer conversion factors.
3479c067b84SDoug Ambrisko * After calling this devcmd, ENIC driver can convert
3489c067b84SDoug Ambrisko * interrupt coalescing timer in usec into CPU cycles as follows:
3499c067b84SDoug Ambrisko *
3509c067b84SDoug Ambrisko * intr_timer_cycles = intr_timer_usec * multiplier / divisor
3519c067b84SDoug Ambrisko *
3529c067b84SDoug Ambrisko * Interrupt coalescing timer in usecs can be be converted/obtained
3539c067b84SDoug Ambrisko * from CPU cycles as follows:
3549c067b84SDoug Ambrisko *
3559c067b84SDoug Ambrisko * intr_timer_usec = intr_timer_cycles * divisor / multiplier
3569c067b84SDoug Ambrisko *
3579c067b84SDoug Ambrisko * in: none
3589c067b84SDoug Ambrisko * out: (u32)a0 = multiplier
3599c067b84SDoug Ambrisko * (u32)a1 = divisor
3609c067b84SDoug Ambrisko * (u32)a2 = maximum timer value in usec
3619c067b84SDoug Ambrisko */
3629c067b84SDoug Ambrisko CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50),
3639c067b84SDoug Ambrisko
3649c067b84SDoug Ambrisko /*
3659c067b84SDoug Ambrisko * ISCSI DUMP API:
3669c067b84SDoug Ambrisko * in: (u64)a0=paddr of the param or param itself
3679c067b84SDoug Ambrisko * (u32)a1=ISCSI_CMD_xxx
3689c067b84SDoug Ambrisko */
3699c067b84SDoug Ambrisko CMD_ISCSI_DUMP_REQ = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 51),
3709c067b84SDoug Ambrisko
3719c067b84SDoug Ambrisko /*
3729c067b84SDoug Ambrisko * ISCSI DUMP STATUS API:
3739c067b84SDoug Ambrisko * in: (u32)a0=cmd tag
3749c067b84SDoug Ambrisko * in: (u32)a1=ISCSI_CMD_xxx
3759c067b84SDoug Ambrisko * out: (u32)a0=cmd status
3769c067b84SDoug Ambrisko */
3779c067b84SDoug Ambrisko CMD_ISCSI_DUMP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 52),
3789c067b84SDoug Ambrisko
3799c067b84SDoug Ambrisko /*
3809c067b84SDoug Ambrisko * Subvnic migration from MQ <--> VF.
3819c067b84SDoug Ambrisko * Enable the LIF migration from MQ to VF and vice versa. MQ and VF
3829c067b84SDoug Ambrisko * indexes are statically bound at the time of initialization.
3839c067b84SDoug Ambrisko * Based on the direction of migration, the resources of either MQ or
3849c067b84SDoug Ambrisko * the VF shall be attached to the LIF.
3859c067b84SDoug Ambrisko * in: (u32)a0=Direction of Migration
3869c067b84SDoug Ambrisko * 0=> Migrate to VF
3879c067b84SDoug Ambrisko * 1=> Migrate to MQ
3889c067b84SDoug Ambrisko * (u32)a1=VF index (MQ index)
3899c067b84SDoug Ambrisko */
3909c067b84SDoug Ambrisko CMD_MIGRATE_SUBVNIC = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 53),
3919c067b84SDoug Ambrisko
3929c067b84SDoug Ambrisko /*
3939c067b84SDoug Ambrisko * Register / Deregister the notification block for MQ subvnics
3949c067b84SDoug Ambrisko * in:
3959c067b84SDoug Ambrisko * (u64)a0=paddr to notify (set paddr=0 to unset)
3969c067b84SDoug Ambrisko * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
3979c067b84SDoug Ambrisko * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
3989c067b84SDoug Ambrisko * out:
3999c067b84SDoug Ambrisko * (u32)a1 = effective size
4009c067b84SDoug Ambrisko */
4019c067b84SDoug Ambrisko CMD_SUBVNIC_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 54),
4029c067b84SDoug Ambrisko
4039c067b84SDoug Ambrisko /*
4049c067b84SDoug Ambrisko * Set the predefined mac address as default
4059c067b84SDoug Ambrisko * in:
4069c067b84SDoug Ambrisko * (u48)a0=mac addr
4079c067b84SDoug Ambrisko */
4089c067b84SDoug Ambrisko CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55),
4099c067b84SDoug Ambrisko
4109c067b84SDoug Ambrisko /* Update the provisioning info of the given VIF
4119c067b84SDoug Ambrisko * (u64)a0=paddr of vnic_devcmd_provinfo
4129c067b84SDoug Ambrisko * (u32)a1=sizeof provision info */
4139c067b84SDoug Ambrisko CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56),
4149c067b84SDoug Ambrisko
4159c067b84SDoug Ambrisko /*
4169c067b84SDoug Ambrisko * Initialization for the devcmd2 interface.
4179c067b84SDoug Ambrisko * in: (u64) a0=host result buffer physical address
4189c067b84SDoug Ambrisko * in: (u16) a1=number of entries in result buffer
4199c067b84SDoug Ambrisko */
4209c067b84SDoug Ambrisko CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57),
4219c067b84SDoug Ambrisko
4229c067b84SDoug Ambrisko /*
4239c067b84SDoug Ambrisko * Add a filter.
4249c067b84SDoug Ambrisko * in: (u64) a0= filter address
4259c067b84SDoug Ambrisko * (u32) a1= size of filter
4269c067b84SDoug Ambrisko * out: (u32) a0=filter identifier
4279c067b84SDoug Ambrisko *
4289c067b84SDoug Ambrisko * Capability query:
4299c067b84SDoug Ambrisko * out: (u64) a0= 1 if capability query supported
4309c067b84SDoug Ambrisko * (u64) a1= MAX filter type supported
4319c067b84SDoug Ambrisko */
4329c067b84SDoug Ambrisko CMD_ADD_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 58),
4339c067b84SDoug Ambrisko
4349c067b84SDoug Ambrisko /*
4359c067b84SDoug Ambrisko * Delete a filter.
4369c067b84SDoug Ambrisko * in: (u32) a0=filter identifier
4379c067b84SDoug Ambrisko */
4389c067b84SDoug Ambrisko CMD_DEL_FILTER = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 59),
4399c067b84SDoug Ambrisko
4409c067b84SDoug Ambrisko /*
4419c067b84SDoug Ambrisko * Enable a Queue Pair in User space NIC
4429c067b84SDoug Ambrisko * in: (u32) a0=Queue Pair number
4439c067b84SDoug Ambrisko * (u32) a1= command
4449c067b84SDoug Ambrisko */
4459c067b84SDoug Ambrisko CMD_QP_ENABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 60),
4469c067b84SDoug Ambrisko
4479c067b84SDoug Ambrisko /*
4489c067b84SDoug Ambrisko * Disable a Queue Pair in User space NIC
4499c067b84SDoug Ambrisko * in: (u32) a0=Queue Pair number
4509c067b84SDoug Ambrisko * (u32) a1= command
4519c067b84SDoug Ambrisko */
4529c067b84SDoug Ambrisko CMD_QP_DISABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 61),
4539c067b84SDoug Ambrisko
4549c067b84SDoug Ambrisko /*
4559c067b84SDoug Ambrisko * Stats dump Queue Pair in User space NIC
4569c067b84SDoug Ambrisko * in: (u32) a0=Queue Pair number
4579c067b84SDoug Ambrisko * (u64) a1=host buffer addr for status dump
4589c067b84SDoug Ambrisko * (u32) a2=length of the buffer
4599c067b84SDoug Ambrisko */
4609c067b84SDoug Ambrisko CMD_QP_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 62),
4619c067b84SDoug Ambrisko
4629c067b84SDoug Ambrisko /*
4639c067b84SDoug Ambrisko * Clear stats for Queue Pair in User space NIC
4649c067b84SDoug Ambrisko * in: (u32) a0=Queue Pair number
4659c067b84SDoug Ambrisko */
4669c067b84SDoug Ambrisko CMD_QP_STATS_CLEAR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 63),
4679c067b84SDoug Ambrisko
4689c067b84SDoug Ambrisko /*
4699c067b84SDoug Ambrisko * UEFI BOOT API: (u64)a0= UEFI FLS_CMD_xxx
4709c067b84SDoug Ambrisko * (ui64)a1= paddr for the info buffer
4719c067b84SDoug Ambrisko */
4729c067b84SDoug Ambrisko CMD_FC_REQ = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 64),
4739c067b84SDoug Ambrisko
4749c067b84SDoug Ambrisko /*
4759c067b84SDoug Ambrisko * Return the iSCSI config details required by the EFI Option ROM
4769c067b84SDoug Ambrisko * in: (u32) a0=0 Get Boot Info for PXE eNIC as per pxe_boot_config_t
4779c067b84SDoug Ambrisko * a0=1 Get Boot info for iSCSI enic as per
4789c067b84SDoug Ambrisko * iscsi_boot_efi_cfg_t
4799c067b84SDoug Ambrisko * in: (u64) a1=Host address where iSCSI config info is returned
4809c067b84SDoug Ambrisko */
4819c067b84SDoug Ambrisko CMD_VNIC_BOOT_CONFIG_INFO = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 65),
4829c067b84SDoug Ambrisko
4839c067b84SDoug Ambrisko /*
4849c067b84SDoug Ambrisko * Create a Queue Pair (RoCE)
4859c067b84SDoug Ambrisko * in: (u32) a0 = Queue Pair number
4869c067b84SDoug Ambrisko * (u32) a1 = Remote QP
4879c067b84SDoug Ambrisko * (u32) a2 = RDMA-RQ
4889c067b84SDoug Ambrisko * (u16) a3 = RQ Res Group
4899c067b84SDoug Ambrisko * (u16) a4 = SQ Res Group
4909c067b84SDoug Ambrisko * (u32) a5 = Protection Domain
4919c067b84SDoug Ambrisko * (u64) a6 = Remote MAC
4929c067b84SDoug Ambrisko * (u32) a7 = start PSN
4939c067b84SDoug Ambrisko * (u16) a8 = MSS
4949c067b84SDoug Ambrisko * (u32) a9 = protocol version
4959c067b84SDoug Ambrisko */
4969c067b84SDoug Ambrisko CMD_RDMA_QP_CREATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 66),
4979c067b84SDoug Ambrisko
4989c067b84SDoug Ambrisko /*
4999c067b84SDoug Ambrisko * Delete a Queue Pair (RoCE)
5009c067b84SDoug Ambrisko * in: (u32) a0 = Queue Pair number
5019c067b84SDoug Ambrisko */
5029c067b84SDoug Ambrisko CMD_RDMA_QP_DELETE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 67),
5039c067b84SDoug Ambrisko
5049c067b84SDoug Ambrisko /*
5059c067b84SDoug Ambrisko * Retrieve a Queue Pair's status information (RoCE)
5069c067b84SDoug Ambrisko * in: (u32) a0 = Queue Pair number
5079c067b84SDoug Ambrisko * (u64) a1 = host buffer addr for QP status struct
5089c067b84SDoug Ambrisko * (u32) a2 = length of the buffer
5099c067b84SDoug Ambrisko */
5109c067b84SDoug Ambrisko CMD_RDMA_QP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 68),
5119c067b84SDoug Ambrisko
5129c067b84SDoug Ambrisko /*
5139c067b84SDoug Ambrisko * Use this devcmd for agreeing on the highest common version supported
5149c067b84SDoug Ambrisko * by both driver and fw for by features who need such a facility.
5159c067b84SDoug Ambrisko * in: (u64) a0 = feature (driver requests for the supported versions
5169c067b84SDoug Ambrisko * on this feature)
5179c067b84SDoug Ambrisko * out: (u64) a0 = bitmap of all supported versions for that feature
5189c067b84SDoug Ambrisko */
5199c067b84SDoug Ambrisko CMD_GET_SUPP_FEATURE_VER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 69),
5209c067b84SDoug Ambrisko
5219c067b84SDoug Ambrisko /*
5229c067b84SDoug Ambrisko * Initialize the RDMA notification work queue
5239c067b84SDoug Ambrisko * in: (u64) a0 = host buffer address
5249c067b84SDoug Ambrisko * in: (u16) a1 = number of entries in buffer
5259c067b84SDoug Ambrisko * in: (u16) a2 = resource group number
5269c067b84SDoug Ambrisko * in: (u16) a3 = CQ number to post completion
5279c067b84SDoug Ambrisko */
5289c067b84SDoug Ambrisko CMD_RDMA_INIT_INFO_BUF = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 70),
5299c067b84SDoug Ambrisko
5309c067b84SDoug Ambrisko /*
5319c067b84SDoug Ambrisko * De-init the RDMA notification work queue
5329c067b84SDoug Ambrisko * in: (u64) a0=resource group number
5339c067b84SDoug Ambrisko */
5349c067b84SDoug Ambrisko CMD_RDMA_DEINIT_INFO_BUF = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 71),
5359c067b84SDoug Ambrisko
5369c067b84SDoug Ambrisko /*
5379c067b84SDoug Ambrisko * Control (Enable/Disable) overlay offloads on the given vnic
5389c067b84SDoug Ambrisko * in: (u8) a0 = OVERLAY_FEATURE_NVGRE : NVGRE
5399c067b84SDoug Ambrisko * a0 = OVERLAY_FEATURE_VXLAN : VxLAN
5409c067b84SDoug Ambrisko * in: (u8) a1 = OVERLAY_OFFLOAD_ENABLE : Enable or
5419c067b84SDoug Ambrisko * a1 = OVERLAY_OFFLOAD_DISABLE : Disable or
5429c067b84SDoug Ambrisko * a1 = OVERLAY_OFFLOAD_ENABLE_V2 : Enable with version 2
5439c067b84SDoug Ambrisko */
5449c067b84SDoug Ambrisko CMD_OVERLAY_OFFLOAD_CTRL =
5459c067b84SDoug Ambrisko _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 72),
5469c067b84SDoug Ambrisko
5479c067b84SDoug Ambrisko /*
5489c067b84SDoug Ambrisko * Configuration of overlay offloads feature on a given vNIC
5499c067b84SDoug Ambrisko * in: (u8) a0 = OVERLAY_CFG_VXLAN_PORT_UPDATE : VxLAN
5509c067b84SDoug Ambrisko * in: (u16) a1 = unsigned short int port information
5519c067b84SDoug Ambrisko */
5529c067b84SDoug Ambrisko CMD_OVERLAY_OFFLOAD_CFG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 73),
5539c067b84SDoug Ambrisko
5549c067b84SDoug Ambrisko /*
5559c067b84SDoug Ambrisko * Return the configured name for the device
5569c067b84SDoug Ambrisko * in: (u64) a0=Host address where the name is copied
5579c067b84SDoug Ambrisko * (u32) a1=Size of the buffer
5589c067b84SDoug Ambrisko */
5599c067b84SDoug Ambrisko CMD_GET_CONFIG_NAME = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 74),
5609c067b84SDoug Ambrisko
5619c067b84SDoug Ambrisko /*
5629c067b84SDoug Ambrisko * Enable group interrupt for the VF
5639c067b84SDoug Ambrisko * in: (u32) a0 = GRPINTR_ENABLE : enable
5649c067b84SDoug Ambrisko * a0 = GRPINTR_DISABLE : disable
5659c067b84SDoug Ambrisko * a0 = GRPINTR_UPD_VECT: update group vector addr
5669c067b84SDoug Ambrisko * in: (u32) a1 = interrupt group count
5679c067b84SDoug Ambrisko * in: (u64) a2 = Start of host buffer address for DMAing group
5689c067b84SDoug Ambrisko * vector bitmap
5699c067b84SDoug Ambrisko * in: (u64) a3 = Stride between group vectors
5709c067b84SDoug Ambrisko */
5719c067b84SDoug Ambrisko CMD_CONFIG_GRPINTR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 75),
5729c067b84SDoug Ambrisko
5739c067b84SDoug Ambrisko /*
5749c067b84SDoug Ambrisko * Set cq arrary base and size in a list of consective wqs and
5759c067b84SDoug Ambrisko * rqs for a device
5769c067b84SDoug Ambrisko * in: (u16) a0 = the wq relative index in the device.
5779c067b84SDoug Ambrisko * -1 indicates skipping wq configuration
5789c067b84SDoug Ambrisko * in: (u16) a1 = the wcq relative index in the device
5799c067b84SDoug Ambrisko * in: (u16) a2 = the rq relative index in the device
5809c067b84SDoug Ambrisko * -1 indicates skipping rq configuration
5819c067b84SDoug Ambrisko * in: (u16) a3 = the rcq relative index in the device
5829c067b84SDoug Ambrisko */
5839c067b84SDoug Ambrisko CMD_CONFIG_CQ_ARRAY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 76),
5849c067b84SDoug Ambrisko
5859c067b84SDoug Ambrisko /*
5869c067b84SDoug Ambrisko * Add an advanced filter.
5879c067b84SDoug Ambrisko * in: (u64) a0= filter address
5889c067b84SDoug Ambrisko * (u32) a1= size of filter
5899c067b84SDoug Ambrisko * out: (u32) a0=filter identifier
5909c067b84SDoug Ambrisko *
5919c067b84SDoug Ambrisko * Capability query:
5929c067b84SDoug Ambrisko * in: (u64) a1= supported filter capability exchange modes
5939c067b84SDoug Ambrisko * out: (u64) a0= 1 if capability query supported
5949c067b84SDoug Ambrisko * if (u64) a1 = 0: a1 = MAX filter type supported
5959c067b84SDoug Ambrisko * if (u64) a1 & FILTER_CAP_MODE_V1_FLAG:
5969c067b84SDoug Ambrisko * a1 = bitmask of supported filters
5979c067b84SDoug Ambrisko * a2 = FILTER_CAP_MODE_V1
5989c067b84SDoug Ambrisko * a3 = bitmask of supported actions
5999c067b84SDoug Ambrisko */
6009c067b84SDoug Ambrisko CMD_ADD_ADV_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 77),
6019c067b84SDoug Ambrisko
6029c067b84SDoug Ambrisko /*
6039c067b84SDoug Ambrisko * Allocate a counter for use with CMD_ADD_FILTER
6049c067b84SDoug Ambrisko * out:(u32) a0 = counter index
6059c067b84SDoug Ambrisko */
6069c067b84SDoug Ambrisko CMD_COUNTER_ALLOC = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ENET, 85),
6079c067b84SDoug Ambrisko
6089c067b84SDoug Ambrisko /*
6099c067b84SDoug Ambrisko * Free a counter
6109c067b84SDoug Ambrisko * in: (u32) a0 = counter_id
6119c067b84SDoug Ambrisko */
6129c067b84SDoug Ambrisko CMD_COUNTER_FREE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 86),
6139c067b84SDoug Ambrisko
6149c067b84SDoug Ambrisko /*
6159c067b84SDoug Ambrisko * Read a counter
6169c067b84SDoug Ambrisko * in: (u32) a0 = counter_id
6179c067b84SDoug Ambrisko * (u32) a1 = clear counter if non-zero
6189c067b84SDoug Ambrisko * out:(u64) a0 = packet count
6199c067b84SDoug Ambrisko * (u64) a1 = byte count
6209c067b84SDoug Ambrisko */
6219c067b84SDoug Ambrisko CMD_COUNTER_QUERY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 87),
6229c067b84SDoug Ambrisko
6239c067b84SDoug Ambrisko /*
6249c067b84SDoug Ambrisko * Configure periodic counter DMA. This will trigger an immediate
6259c067b84SDoug Ambrisko * DMA of the counters (unless period == 0), and then schedule a DMA
6269c067b84SDoug Ambrisko * of the counters every <period> seconds until disdabled.
6279c067b84SDoug Ambrisko * Each new COUNTER_DMA_CONFIG will override all previous commands on
6289c067b84SDoug Ambrisko * this vnic.
6299c067b84SDoug Ambrisko * Setting a2 (period) = 0 will disable periodic DMAs
6309c067b84SDoug Ambrisko * If a0 (num_counters) != 0, an immediate DMA will always be done,
6319c067b84SDoug Ambrisko * irrespective of the value in a2.
6329c067b84SDoug Ambrisko * in: (u32) a0 = number of counters to DMA
6339c067b84SDoug Ambrisko * (u64) a1 = host target DMA address
6349c067b84SDoug Ambrisko * (u32) a2 = DMA period in milliseconds (0 to disable)
6359c067b84SDoug Ambrisko */
6369c067b84SDoug Ambrisko CMD_COUNTER_DMA_CONFIG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 88),
6379c067b84SDoug Ambrisko #define VNIC_COUNTER_DMA_MIN_PERIOD 500
6389c067b84SDoug Ambrisko
6399c067b84SDoug Ambrisko /*
6409c067b84SDoug Ambrisko * Clear all counters on a vnic
6419c067b84SDoug Ambrisko */
6429c067b84SDoug Ambrisko CMD_COUNTER_CLEAR_ALL = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ENET, 89),
6439c067b84SDoug Ambrisko };
6449c067b84SDoug Ambrisko
6459c067b84SDoug Ambrisko /* Modes for exchanging advanced filter capabilities. The modes supported by
6469c067b84SDoug Ambrisko * the driver are passed in the CMD_ADD_ADV_FILTER capability command and the
6479c067b84SDoug Ambrisko * mode selected is returned.
6489c067b84SDoug Ambrisko * V0: the maximum filter type supported is returned
6499c067b84SDoug Ambrisko * V1: bitmasks of supported filters and actions are returned
6509c067b84SDoug Ambrisko */
6519c067b84SDoug Ambrisko enum filter_cap_mode {
6529c067b84SDoug Ambrisko FILTER_CAP_MODE_V0 = 0, /* Must always be 0 for legacy drivers */
6539c067b84SDoug Ambrisko FILTER_CAP_MODE_V1 = 1,
6549c067b84SDoug Ambrisko };
6559c067b84SDoug Ambrisko #define FILTER_CAP_MODE_V1_FLAG (1 << FILTER_CAP_MODE_V1)
6569c067b84SDoug Ambrisko
6579c067b84SDoug Ambrisko /* CMD_ENABLE2 flags */
6589c067b84SDoug Ambrisko #define CMD_ENABLE2_STANDBY 0x0
6599c067b84SDoug Ambrisko #define CMD_ENABLE2_ACTIVE 0x1
6609c067b84SDoug Ambrisko
6619c067b84SDoug Ambrisko /* flags for CMD_OPEN */
6629c067b84SDoug Ambrisko #define CMD_OPENF_OPROM 0x1 /* open coming from option rom */
6639c067b84SDoug Ambrisko #define CMD_OPENF_IG_DESCCACHE 0x2 /* Do not flush IG DESC cache */
6649c067b84SDoug Ambrisko
6659c067b84SDoug Ambrisko /* flags for CMD_INIT */
6669c067b84SDoug Ambrisko #define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */
6679c067b84SDoug Ambrisko
6689c067b84SDoug Ambrisko /* flags for CMD_NIC_CFG */
6699c067b84SDoug Ambrisko #define CMD_NIC_CFG_CAPF_UDP_WEAK (1ULL << 0) /* Bodega-style UDP RSS */
6709c067b84SDoug Ambrisko
6719c067b84SDoug Ambrisko /* flags for CMD_PACKET_FILTER */
6729c067b84SDoug Ambrisko #define CMD_PFILTER_DIRECTED 0x01
6739c067b84SDoug Ambrisko #define CMD_PFILTER_MULTICAST 0x02
6749c067b84SDoug Ambrisko #define CMD_PFILTER_BROADCAST 0x04
6759c067b84SDoug Ambrisko #define CMD_PFILTER_PROMISCUOUS 0x08
6769c067b84SDoug Ambrisko #define CMD_PFILTER_ALL_MULTICAST 0x10
6779c067b84SDoug Ambrisko
6789c067b84SDoug Ambrisko /* Commands for CMD_QP_ENABLE/CM_QP_DISABLE */
6799c067b84SDoug Ambrisko #define CMD_QP_RQWQ 0x0
6809c067b84SDoug Ambrisko
6819c067b84SDoug Ambrisko /* rewrite modes for CMD_IG_VLAN_REWRITE_MODE */
6829c067b84SDoug Ambrisko #define IG_VLAN_REWRITE_MODE_DEFAULT_TRUNK 0
6839c067b84SDoug Ambrisko #define IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN 1
6849c067b84SDoug Ambrisko #define IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN 2
6859c067b84SDoug Ambrisko #define IG_VLAN_REWRITE_MODE_PASS_THRU 3
6869c067b84SDoug Ambrisko
6879c067b84SDoug Ambrisko enum vnic_devcmd_status {
6889c067b84SDoug Ambrisko STAT_NONE = 0,
6899c067b84SDoug Ambrisko STAT_BUSY = 1 << 0, /* cmd in progress */
6909c067b84SDoug Ambrisko STAT_ERROR = 1 << 1, /* last cmd caused error (code in a0) */
6919c067b84SDoug Ambrisko STAT_FAILOVER = 1 << 2, /* always set on vnics in pci standby state
6929c067b84SDoug Ambrisko * if seen a failover to the standby happened
6939c067b84SDoug Ambrisko */
6949c067b84SDoug Ambrisko };
6959c067b84SDoug Ambrisko
6969c067b84SDoug Ambrisko enum vnic_devcmd_error {
6979c067b84SDoug Ambrisko ERR_SUCCESS = 0,
6989c067b84SDoug Ambrisko ERR_EINVAL = 1,
6999c067b84SDoug Ambrisko ERR_EFAULT = 2,
7009c067b84SDoug Ambrisko ERR_EPERM = 3,
7019c067b84SDoug Ambrisko ERR_EBUSY = 4,
7029c067b84SDoug Ambrisko ERR_ECMDUNKNOWN = 5,
7039c067b84SDoug Ambrisko ERR_EBADSTATE = 6,
7049c067b84SDoug Ambrisko ERR_ENOMEM = 7,
7059c067b84SDoug Ambrisko ERR_ETIMEDOUT = 8,
7069c067b84SDoug Ambrisko ERR_ELINKDOWN = 9,
7079c067b84SDoug Ambrisko ERR_EMAXRES = 10,
7089c067b84SDoug Ambrisko ERR_ENOTSUPPORTED = 11,
7099c067b84SDoug Ambrisko ERR_EINPROGRESS = 12,
7109c067b84SDoug Ambrisko ERR_MAX
7119c067b84SDoug Ambrisko };
7129c067b84SDoug Ambrisko
7139c067b84SDoug Ambrisko /*
7149c067b84SDoug Ambrisko * note: hw_version and asic_rev refer to the same thing,
7159c067b84SDoug Ambrisko * but have different formats. hw_version is
7169c067b84SDoug Ambrisko * a 32-byte string (e.g. "A2") and asic_rev is
7179c067b84SDoug Ambrisko * a 16-bit integer (e.g. 0xA2).
7189c067b84SDoug Ambrisko */
7199c067b84SDoug Ambrisko struct vnic_devcmd_fw_info {
7209c067b84SDoug Ambrisko char fw_version[32];
7219c067b84SDoug Ambrisko char fw_build[32];
7229c067b84SDoug Ambrisko char hw_version[32];
7239c067b84SDoug Ambrisko char hw_serial_number[32];
7249c067b84SDoug Ambrisko u16 asic_type;
7259c067b84SDoug Ambrisko u16 asic_rev;
7269c067b84SDoug Ambrisko };
7279c067b84SDoug Ambrisko
7289c067b84SDoug Ambrisko enum fwinfo_asic_type {
7299c067b84SDoug Ambrisko FWINFO_ASIC_TYPE_UNKNOWN,
7309c067b84SDoug Ambrisko FWINFO_ASIC_TYPE_PALO,
7319c067b84SDoug Ambrisko FWINFO_ASIC_TYPE_SERENO,
7329c067b84SDoug Ambrisko FWINFO_ASIC_TYPE_CRUZ,
7339c067b84SDoug Ambrisko };
7349c067b84SDoug Ambrisko
7359c067b84SDoug Ambrisko struct vnic_devcmd_notify {
7369c067b84SDoug Ambrisko u32 csum; /* checksum over following words */
7379c067b84SDoug Ambrisko
7389c067b84SDoug Ambrisko u32 link_state; /* link up == 1 */
7399c067b84SDoug Ambrisko u32 port_speed; /* effective port speed (rate limit) */
7409c067b84SDoug Ambrisko u32 mtu; /* MTU */
7419c067b84SDoug Ambrisko u32 msglvl; /* requested driver msg lvl */
7429c067b84SDoug Ambrisko u32 uif; /* uplink interface */
7439c067b84SDoug Ambrisko u32 status; /* status bits (see VNIC_STF_*) */
7449c067b84SDoug Ambrisko u32 error; /* error code (see ERR_*) for first ERR */
7459c067b84SDoug Ambrisko u32 link_down_cnt; /* running count of link down transitions */
7469c067b84SDoug Ambrisko u32 perbi_rebuild_cnt; /* running count of perbi rebuilds */
7479c067b84SDoug Ambrisko };
7489c067b84SDoug Ambrisko #define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */
7499c067b84SDoug Ambrisko #define VNIC_STF_STD_PAUSE 0x0002 /* standard link-level pause on */
7509c067b84SDoug Ambrisko #define VNIC_STF_PFC_PAUSE 0x0004 /* priority flow control pause on */
7519c067b84SDoug Ambrisko /* all supported status flags */
7529c067b84SDoug Ambrisko #define VNIC_STF_ALL (VNIC_STF_FATAL_ERR |\
7539c067b84SDoug Ambrisko VNIC_STF_STD_PAUSE |\
7549c067b84SDoug Ambrisko VNIC_STF_PFC_PAUSE |\
7559c067b84SDoug Ambrisko 0)
7569c067b84SDoug Ambrisko
7579c067b84SDoug Ambrisko struct vnic_devcmd_provinfo {
7589c067b84SDoug Ambrisko u8 oui[3];
7599c067b84SDoug Ambrisko u8 type;
7609c067b84SDoug Ambrisko u8 data[0];
7619c067b84SDoug Ambrisko };
7629c067b84SDoug Ambrisko
7639c067b84SDoug Ambrisko /*
7649c067b84SDoug Ambrisko * These are used in flags field of different filters to denote
7659c067b84SDoug Ambrisko * valid fields used.
7669c067b84SDoug Ambrisko */
7679c067b84SDoug Ambrisko #define FILTER_FIELD_VALID(fld) (1 << (fld - 1))
7689c067b84SDoug Ambrisko
7699c067b84SDoug Ambrisko #define FILTER_FIELD_USNIC_VLAN FILTER_FIELD_VALID(1)
7709c067b84SDoug Ambrisko #define FILTER_FIELD_USNIC_ETHTYPE FILTER_FIELD_VALID(2)
7719c067b84SDoug Ambrisko #define FILTER_FIELD_USNIC_PROTO FILTER_FIELD_VALID(3)
7729c067b84SDoug Ambrisko #define FILTER_FIELD_USNIC_ID FILTER_FIELD_VALID(4)
7739c067b84SDoug Ambrisko
7749c067b84SDoug Ambrisko #define FILTER_FIELDS_USNIC (FILTER_FIELD_USNIC_VLAN | \
7759c067b84SDoug Ambrisko FILTER_FIELD_USNIC_ETHTYPE | \
7769c067b84SDoug Ambrisko FILTER_FIELD_USNIC_PROTO | \
7779c067b84SDoug Ambrisko FILTER_FIELD_USNIC_ID)
7789c067b84SDoug Ambrisko
7799c067b84SDoug Ambrisko struct filter_usnic_id {
7809c067b84SDoug Ambrisko u32 flags;
7819c067b84SDoug Ambrisko u16 vlan;
7829c067b84SDoug Ambrisko u16 ethtype;
7839c067b84SDoug Ambrisko u8 proto_version;
7849c067b84SDoug Ambrisko u32 usnic_id;
7859c067b84SDoug Ambrisko } __attribute__((packed));
7869c067b84SDoug Ambrisko
7879c067b84SDoug Ambrisko #define FILTER_FIELD_5TUP_PROTO FILTER_FIELD_VALID(1)
7889c067b84SDoug Ambrisko #define FILTER_FIELD_5TUP_SRC_AD FILTER_FIELD_VALID(2)
7899c067b84SDoug Ambrisko #define FILTER_FIELD_5TUP_DST_AD FILTER_FIELD_VALID(3)
7909c067b84SDoug Ambrisko #define FILTER_FIELD_5TUP_SRC_PT FILTER_FIELD_VALID(4)
7919c067b84SDoug Ambrisko #define FILTER_FIELD_5TUP_DST_PT FILTER_FIELD_VALID(5)
7929c067b84SDoug Ambrisko
7939c067b84SDoug Ambrisko #define FILTER_FIELDS_IPV4_5TUPLE (FILTER_FIELD_5TUP_PROTO | \
7949c067b84SDoug Ambrisko FILTER_FIELD_5TUP_SRC_AD | \
7959c067b84SDoug Ambrisko FILTER_FIELD_5TUP_DST_AD | \
7969c067b84SDoug Ambrisko FILTER_FIELD_5TUP_SRC_PT | \
7979c067b84SDoug Ambrisko FILTER_FIELD_5TUP_DST_PT)
7989c067b84SDoug Ambrisko
7999c067b84SDoug Ambrisko /* Enums for the protocol field. */
8009c067b84SDoug Ambrisko enum protocol_e {
8019c067b84SDoug Ambrisko PROTO_UDP = 0,
8029c067b84SDoug Ambrisko PROTO_TCP = 1,
8039c067b84SDoug Ambrisko PROTO_IPV4 = 2,
8049c067b84SDoug Ambrisko PROTO_IPV6 = 3
8059c067b84SDoug Ambrisko };
8069c067b84SDoug Ambrisko
8079c067b84SDoug Ambrisko struct filter_ipv4_5tuple {
8089c067b84SDoug Ambrisko u32 flags;
8099c067b84SDoug Ambrisko u32 protocol;
8109c067b84SDoug Ambrisko u32 src_addr;
8119c067b84SDoug Ambrisko u32 dst_addr;
8129c067b84SDoug Ambrisko u16 src_port;
8139c067b84SDoug Ambrisko u16 dst_port;
8149c067b84SDoug Ambrisko } __attribute__((packed));
8159c067b84SDoug Ambrisko
8169c067b84SDoug Ambrisko #define FILTER_FIELD_VMQ_VLAN FILTER_FIELD_VALID(1)
8179c067b84SDoug Ambrisko #define FILTER_FIELD_VMQ_MAC FILTER_FIELD_VALID(2)
8189c067b84SDoug Ambrisko
8199c067b84SDoug Ambrisko #define FILTER_FIELDS_MAC_VLAN (FILTER_FIELD_VMQ_VLAN | \
8209c067b84SDoug Ambrisko FILTER_FIELD_VMQ_MAC)
8219c067b84SDoug Ambrisko
8229c067b84SDoug Ambrisko #define FILTER_FIELDS_NVGRE FILTER_FIELD_VMQ_MAC
8239c067b84SDoug Ambrisko
8249c067b84SDoug Ambrisko struct filter_mac_vlan {
8259c067b84SDoug Ambrisko u32 flags;
8269c067b84SDoug Ambrisko u16 vlan;
8279c067b84SDoug Ambrisko u8 mac_addr[6];
8289c067b84SDoug Ambrisko } __attribute__((packed));
8299c067b84SDoug Ambrisko
8309c067b84SDoug Ambrisko #define FILTER_FIELD_VLAN_IP_3TUP_VLAN FILTER_FIELD_VALID(1)
8319c067b84SDoug Ambrisko #define FILTER_FIELD_VLAN_IP_3TUP_L3_PROTO FILTER_FIELD_VALID(2)
8329c067b84SDoug Ambrisko #define FILTER_FIELD_VLAN_IP_3TUP_DST_AD FILTER_FIELD_VALID(3)
8339c067b84SDoug Ambrisko #define FILTER_FIELD_VLAN_IP_3TUP_L4_PROTO FILTER_FIELD_VALID(4)
8349c067b84SDoug Ambrisko #define FILTER_FIELD_VLAN_IP_3TUP_DST_PT FILTER_FIELD_VALID(5)
8359c067b84SDoug Ambrisko
8369c067b84SDoug Ambrisko #define FILTER_FIELDS_VLAN_IP_3TUP (FILTER_FIELD_VLAN_IP_3TUP_VLAN | \
8379c067b84SDoug Ambrisko FILTER_FIELD_VLAN_IP_3TUP_L3_PROTO | \
8389c067b84SDoug Ambrisko FILTER_FIELD_VLAN_IP_3TUP_DST_AD | \
8399c067b84SDoug Ambrisko FILTER_FIELD_VLAN_IP_3TUP_L4_PROTO | \
8409c067b84SDoug Ambrisko FILTER_FIELD_VLAN_IP_3TUP_DST_PT)
8419c067b84SDoug Ambrisko
8429c067b84SDoug Ambrisko struct filter_vlan_ip_3tuple {
8439c067b84SDoug Ambrisko u32 flags;
8449c067b84SDoug Ambrisko u16 vlan;
8459c067b84SDoug Ambrisko u16 l3_protocol;
8469c067b84SDoug Ambrisko union {
8479c067b84SDoug Ambrisko u32 dst_addr_v4;
8489c067b84SDoug Ambrisko u8 dst_addr_v6[16];
8499c067b84SDoug Ambrisko } u;
8509c067b84SDoug Ambrisko u32 l4_protocol;
8519c067b84SDoug Ambrisko u16 dst_port;
8529c067b84SDoug Ambrisko } __attribute__((packed));
8539c067b84SDoug Ambrisko
8549c067b84SDoug Ambrisko #define FILTER_GENERIC_1_BYTES 64
8559c067b84SDoug Ambrisko
8569c067b84SDoug Ambrisko enum filter_generic_1_layer {
8579c067b84SDoug Ambrisko FILTER_GENERIC_1_L2,
8589c067b84SDoug Ambrisko FILTER_GENERIC_1_L3,
8599c067b84SDoug Ambrisko FILTER_GENERIC_1_L4,
8609c067b84SDoug Ambrisko FILTER_GENERIC_1_L5,
8619c067b84SDoug Ambrisko FILTER_GENERIC_1_NUM_LAYERS
8629c067b84SDoug Ambrisko };
8639c067b84SDoug Ambrisko
8649c067b84SDoug Ambrisko #define FILTER_GENERIC_1_IPV4 (1 << 0)
8659c067b84SDoug Ambrisko #define FILTER_GENERIC_1_IPV6 (1 << 1)
8669c067b84SDoug Ambrisko #define FILTER_GENERIC_1_UDP (1 << 2)
8679c067b84SDoug Ambrisko #define FILTER_GENERIC_1_TCP (1 << 3)
8689c067b84SDoug Ambrisko #define FILTER_GENERIC_1_TCP_OR_UDP (1 << 4)
8699c067b84SDoug Ambrisko #define FILTER_GENERIC_1_IP4SUM_OK (1 << 5)
8709c067b84SDoug Ambrisko #define FILTER_GENERIC_1_L4SUM_OK (1 << 6)
8719c067b84SDoug Ambrisko #define FILTER_GENERIC_1_IPFRAG (1 << 7)
8729c067b84SDoug Ambrisko
8739c067b84SDoug Ambrisko #define FILTER_GENERIC_1_KEY_LEN 64
8749c067b84SDoug Ambrisko
8759c067b84SDoug Ambrisko /*
8769c067b84SDoug Ambrisko * Version 1 of generic filter specification
8779c067b84SDoug Ambrisko * position is only 16 bits, reserving positions > 64k to be used by firmware
8789c067b84SDoug Ambrisko */
8799c067b84SDoug Ambrisko struct filter_generic_1 {
8809c067b84SDoug Ambrisko u16 position; /* lower position comes first */
8819c067b84SDoug Ambrisko u32 mask_flags;
8829c067b84SDoug Ambrisko u32 val_flags;
8839c067b84SDoug Ambrisko u16 mask_vlan;
8849c067b84SDoug Ambrisko u16 val_vlan;
8859c067b84SDoug Ambrisko struct {
8869c067b84SDoug Ambrisko u8 mask[FILTER_GENERIC_1_KEY_LEN]; /* 0 bit means "don't care"*/
8879c067b84SDoug Ambrisko u8 val[FILTER_GENERIC_1_KEY_LEN];
8889c067b84SDoug Ambrisko } __attribute__((packed)) layer[FILTER_GENERIC_1_NUM_LAYERS];
8899c067b84SDoug Ambrisko } __attribute__((packed));
8909c067b84SDoug Ambrisko
8919c067b84SDoug Ambrisko /* Specifies the filter_action type. */
8929c067b84SDoug Ambrisko enum {
8939c067b84SDoug Ambrisko FILTER_ACTION_RQ_STEERING = 0,
8949c067b84SDoug Ambrisko FILTER_ACTION_V2 = 1,
8959c067b84SDoug Ambrisko FILTER_ACTION_MAX
8969c067b84SDoug Ambrisko };
8979c067b84SDoug Ambrisko
8989c067b84SDoug Ambrisko struct filter_action {
8999c067b84SDoug Ambrisko u32 type;
9009c067b84SDoug Ambrisko union {
9019c067b84SDoug Ambrisko u32 rq_idx;
9029c067b84SDoug Ambrisko } u;
9039c067b84SDoug Ambrisko } __attribute__((packed));
9049c067b84SDoug Ambrisko
9059c067b84SDoug Ambrisko #define FILTER_ACTION_RQ_STEERING_FLAG (1 << 0)
9069c067b84SDoug Ambrisko #define FILTER_ACTION_FILTER_ID_FLAG (1 << 1)
9079c067b84SDoug Ambrisko #define FILTER_ACTION_DROP_FLAG (1 << 2)
9089c067b84SDoug Ambrisko #define FILTER_ACTION_COUNTER_FLAG (1 << 3)
9099c067b84SDoug Ambrisko #define FILTER_ACTION_V2_ALL (FILTER_ACTION_RQ_STEERING_FLAG \
9109c067b84SDoug Ambrisko | FILTER_ACTION_FILTER_ID_FLAG \
9119c067b84SDoug Ambrisko | FILTER_ACTION_DROP_FLAG \
9129c067b84SDoug Ambrisko | FILTER_ACTION_COUNTER_FLAG)
9139c067b84SDoug Ambrisko
9149c067b84SDoug Ambrisko /* Version 2 of filter action must be a strict extension of struct filter_action
9159c067b84SDoug Ambrisko * where the first fields exactly match in size and meaning.
9169c067b84SDoug Ambrisko */
9179c067b84SDoug Ambrisko struct filter_action_v2 {
9189c067b84SDoug Ambrisko u32 type;
9199c067b84SDoug Ambrisko u32 rq_idx;
9209c067b84SDoug Ambrisko u32 flags; /* use FILTER_ACTION_XXX_FLAG defines */
9219c067b84SDoug Ambrisko u16 filter_id;
9229c067b84SDoug Ambrisko u32 counter_index;
9239c067b84SDoug Ambrisko uint8_t reserved[28]; /* for future expansion */
9249c067b84SDoug Ambrisko } __attribute__((packed));
9259c067b84SDoug Ambrisko
9269c067b84SDoug Ambrisko /* Specifies the filter type. */
9279c067b84SDoug Ambrisko enum filter_type {
9289c067b84SDoug Ambrisko FILTER_USNIC_ID = 0,
9299c067b84SDoug Ambrisko FILTER_IPV4_5TUPLE = 1,
9309c067b84SDoug Ambrisko FILTER_MAC_VLAN = 2,
9319c067b84SDoug Ambrisko FILTER_VLAN_IP_3TUPLE = 3,
9329c067b84SDoug Ambrisko FILTER_NVGRE_VMQ = 4,
9339c067b84SDoug Ambrisko FILTER_USNIC_IP = 5,
9349c067b84SDoug Ambrisko FILTER_DPDK_1 = 6,
9359c067b84SDoug Ambrisko FILTER_MAX
9369c067b84SDoug Ambrisko };
9379c067b84SDoug Ambrisko
9389c067b84SDoug Ambrisko #define FILTER_USNIC_ID_FLAG (1 << FILTER_USNIC_ID)
9399c067b84SDoug Ambrisko #define FILTER_IPV4_5TUPLE_FLAG (1 << FILTER_IPV4_5TUPLE)
9409c067b84SDoug Ambrisko #define FILTER_MAC_VLAN_FLAG (1 << FILTER_MAC_VLAN)
9419c067b84SDoug Ambrisko #define FILTER_VLAN_IP_3TUPLE_FLAG (1 << FILTER_VLAN_IP_3TUPLE)
9429c067b84SDoug Ambrisko #define FILTER_NVGRE_VMQ_FLAG (1 << FILTER_NVGRE_VMQ)
9439c067b84SDoug Ambrisko #define FILTER_USNIC_IP_FLAG (1 << FILTER_USNIC_IP)
9449c067b84SDoug Ambrisko #define FILTER_DPDK_1_FLAG (1 << FILTER_DPDK_1)
9459c067b84SDoug Ambrisko #define FILTER_V1_ALL (FILTER_USNIC_ID_FLAG | \
9469c067b84SDoug Ambrisko FILTER_IPV4_5TUPLE_FLAG | \
9479c067b84SDoug Ambrisko FILTER_MAC_VLAN_FLAG | \
9489c067b84SDoug Ambrisko FILTER_VLAN_IP_3TUPLE_FLAG | \
9499c067b84SDoug Ambrisko FILTER_NVGRE_VMQ_FLAG | \
9509c067b84SDoug Ambrisko FILTER_USNIC_IP_FLAG | \
9519c067b84SDoug Ambrisko FILTER_DPDK_1_FLAG)
9529c067b84SDoug Ambrisko
9539c067b84SDoug Ambrisko struct filter {
9549c067b84SDoug Ambrisko u32 type;
9559c067b84SDoug Ambrisko union {
9569c067b84SDoug Ambrisko struct filter_usnic_id usnic;
9579c067b84SDoug Ambrisko struct filter_ipv4_5tuple ipv4;
9589c067b84SDoug Ambrisko struct filter_mac_vlan mac_vlan;
9599c067b84SDoug Ambrisko struct filter_vlan_ip_3tuple vlan_3tuple;
9609c067b84SDoug Ambrisko } u;
9619c067b84SDoug Ambrisko } __attribute__((packed));
9629c067b84SDoug Ambrisko
9639c067b84SDoug Ambrisko /*
9649c067b84SDoug Ambrisko * This is a strict superset of "struct filter" and exists only
9659c067b84SDoug Ambrisko * because many drivers use "sizeof (struct filter)" in deciding TLV size.
9669c067b84SDoug Ambrisko * This new, larger struct filter would cause any code that uses that method
9679c067b84SDoug Ambrisko * to not work with older firmware, so we add filter_v2 to hold the
9689c067b84SDoug Ambrisko * new filter types. Drivers should use vnic_filter_size() to determine
9699c067b84SDoug Ambrisko * the TLV size instead of sizeof (struct fiter_v2) to guard against future
9709c067b84SDoug Ambrisko * growth.
9719c067b84SDoug Ambrisko */
9729c067b84SDoug Ambrisko struct filter_v2 {
9739c067b84SDoug Ambrisko u32 type;
9749c067b84SDoug Ambrisko union {
9759c067b84SDoug Ambrisko struct filter_usnic_id usnic;
9769c067b84SDoug Ambrisko struct filter_ipv4_5tuple ipv4;
9779c067b84SDoug Ambrisko struct filter_mac_vlan mac_vlan;
9789c067b84SDoug Ambrisko struct filter_vlan_ip_3tuple vlan_3tuple;
9799c067b84SDoug Ambrisko struct filter_generic_1 generic_1;
9809c067b84SDoug Ambrisko } u;
9819c067b84SDoug Ambrisko } __attribute__((packed));
9829c067b84SDoug Ambrisko
9839c067b84SDoug Ambrisko enum {
9849c067b84SDoug Ambrisko CLSF_TLV_FILTER = 0,
9859c067b84SDoug Ambrisko CLSF_TLV_ACTION = 1,
9869c067b84SDoug Ambrisko };
9879c067b84SDoug Ambrisko
9889c067b84SDoug Ambrisko struct filter_tlv {
9899c067b84SDoug Ambrisko uint32_t type;
9909c067b84SDoug Ambrisko uint32_t length;
9919c067b84SDoug Ambrisko uint32_t val[0];
9929c067b84SDoug Ambrisko };
9939c067b84SDoug Ambrisko
9949c067b84SDoug Ambrisko /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */
9959c067b84SDoug Ambrisko #define FILTER_MAX_BUF_SIZE 100
9969c067b84SDoug Ambrisko #define FILTER_V2_MAX_BUF_SIZE (sizeof(struct filter_v2) + \
9979c067b84SDoug Ambrisko sizeof(struct filter_action_v2) + \
9989c067b84SDoug Ambrisko (2 * sizeof(struct filter_tlv)))
9999c067b84SDoug Ambrisko
10009c067b84SDoug Ambrisko /*
10019c067b84SDoug Ambrisko * Compute actual structure size given filter type. To be "future-proof,"
10029c067b84SDoug Ambrisko * drivers should use this instead of "sizeof (struct filter_v2)" when
10039c067b84SDoug Ambrisko * computing length for TLV.
10049c067b84SDoug Ambrisko */
10059c067b84SDoug Ambrisko static inline uint32_t
vnic_filter_size(struct filter_v2 * fp)10069c067b84SDoug Ambrisko vnic_filter_size(struct filter_v2 *fp)
10079c067b84SDoug Ambrisko {
10089c067b84SDoug Ambrisko uint32_t size;
10099c067b84SDoug Ambrisko
10109c067b84SDoug Ambrisko switch (fp->type) {
10119c067b84SDoug Ambrisko case FILTER_USNIC_ID:
10129c067b84SDoug Ambrisko size = sizeof(fp->u.usnic);
10139c067b84SDoug Ambrisko break;
10149c067b84SDoug Ambrisko case FILTER_IPV4_5TUPLE:
10159c067b84SDoug Ambrisko size = sizeof(fp->u.ipv4);
10169c067b84SDoug Ambrisko break;
10179c067b84SDoug Ambrisko case FILTER_MAC_VLAN:
10189c067b84SDoug Ambrisko case FILTER_NVGRE_VMQ:
10199c067b84SDoug Ambrisko size = sizeof(fp->u.mac_vlan);
10209c067b84SDoug Ambrisko break;
10219c067b84SDoug Ambrisko case FILTER_VLAN_IP_3TUPLE:
10229c067b84SDoug Ambrisko size = sizeof(fp->u.vlan_3tuple);
10239c067b84SDoug Ambrisko break;
10249c067b84SDoug Ambrisko case FILTER_USNIC_IP:
10259c067b84SDoug Ambrisko case FILTER_DPDK_1:
10269c067b84SDoug Ambrisko size = sizeof(fp->u.generic_1);
10279c067b84SDoug Ambrisko break;
10289c067b84SDoug Ambrisko default:
10299c067b84SDoug Ambrisko size = sizeof(fp->u);
10309c067b84SDoug Ambrisko break;
10319c067b84SDoug Ambrisko }
10329c067b84SDoug Ambrisko size += sizeof(fp->type);
10339c067b84SDoug Ambrisko return size;
10349c067b84SDoug Ambrisko }
10359c067b84SDoug Ambrisko
10369c067b84SDoug Ambrisko enum {
10379c067b84SDoug Ambrisko CLSF_ADD = 0,
10389c067b84SDoug Ambrisko CLSF_DEL = 1,
10399c067b84SDoug Ambrisko };
10409c067b84SDoug Ambrisko
10419c067b84SDoug Ambrisko /*
10429c067b84SDoug Ambrisko * Get the action structure size given action type. To be "future-proof,"
10439c067b84SDoug Ambrisko * drivers should use this instead of "sizeof (struct filter_action_v2)"
10449c067b84SDoug Ambrisko * when computing length for TLV.
10459c067b84SDoug Ambrisko */
10469c067b84SDoug Ambrisko static inline uint32_t
vnic_action_size(struct filter_action_v2 * fap)10479c067b84SDoug Ambrisko vnic_action_size(struct filter_action_v2 *fap)
10489c067b84SDoug Ambrisko {
10499c067b84SDoug Ambrisko uint32_t size;
10509c067b84SDoug Ambrisko
10519c067b84SDoug Ambrisko switch (fap->type) {
10529c067b84SDoug Ambrisko case FILTER_ACTION_RQ_STEERING:
10539c067b84SDoug Ambrisko size = sizeof(struct filter_action);
10549c067b84SDoug Ambrisko break;
10559c067b84SDoug Ambrisko case FILTER_ACTION_V2:
10569c067b84SDoug Ambrisko size = sizeof(struct filter_action_v2);
10579c067b84SDoug Ambrisko break;
10589c067b84SDoug Ambrisko default:
10599c067b84SDoug Ambrisko size = sizeof(struct filter_action);
10609c067b84SDoug Ambrisko break;
10619c067b84SDoug Ambrisko }
10629c067b84SDoug Ambrisko return size;
10639c067b84SDoug Ambrisko }
10649c067b84SDoug Ambrisko
10659c067b84SDoug Ambrisko /*
10669c067b84SDoug Ambrisko * Writing cmd register causes STAT_BUSY to get set in status register.
10679c067b84SDoug Ambrisko * When cmd completes, STAT_BUSY will be cleared.
10689c067b84SDoug Ambrisko *
10699c067b84SDoug Ambrisko * If cmd completed successfully STAT_ERROR will be clear
10709c067b84SDoug Ambrisko * and args registers contain cmd-specific results.
10719c067b84SDoug Ambrisko *
10729c067b84SDoug Ambrisko * If cmd error, STAT_ERROR will be set and args[0] contains error code.
10739c067b84SDoug Ambrisko *
10749c067b84SDoug Ambrisko * status register is read-only. While STAT_BUSY is set,
10759c067b84SDoug Ambrisko * all other register contents are read-only.
10769c067b84SDoug Ambrisko */
10779c067b84SDoug Ambrisko
10789c067b84SDoug Ambrisko /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
10799c067b84SDoug Ambrisko #define VNIC_DEVCMD_NARGS 15
10809c067b84SDoug Ambrisko struct vnic_devcmd {
10819c067b84SDoug Ambrisko u32 status; /* RO */
10829c067b84SDoug Ambrisko u32 cmd; /* RW */
10839c067b84SDoug Ambrisko u64 args[VNIC_DEVCMD_NARGS]; /* RW cmd args (little-endian) */
10849c067b84SDoug Ambrisko };
10859c067b84SDoug Ambrisko
10869c067b84SDoug Ambrisko #define DEVCMD_STATUS 0
10879c067b84SDoug Ambrisko #define DEVCMD_CMD 4
10889c067b84SDoug Ambrisko #define DEVCMD_ARGS(x) (8 + (VNIC_DEVCMD_NARGS * x))
10899c067b84SDoug Ambrisko
10909c067b84SDoug Ambrisko /*
10919c067b84SDoug Ambrisko * Version 2 of the interface.
10929c067b84SDoug Ambrisko *
10939c067b84SDoug Ambrisko * Some things are carried over, notably the vnic_devcmd_cmd enum.
10949c067b84SDoug Ambrisko */
10959c067b84SDoug Ambrisko
10969c067b84SDoug Ambrisko /*
10979c067b84SDoug Ambrisko * Flags for vnic_devcmd2.flags
10989c067b84SDoug Ambrisko */
10999c067b84SDoug Ambrisko
11009c067b84SDoug Ambrisko #define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */
11019c067b84SDoug Ambrisko
11029c067b84SDoug Ambrisko #define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS
11039c067b84SDoug Ambrisko struct vnic_devcmd2 {
11049c067b84SDoug Ambrisko u16 pad;
11059c067b84SDoug Ambrisko u16 flags;
11069c067b84SDoug Ambrisko u32 cmd; /* same command #defines as original */
11079c067b84SDoug Ambrisko u64 args[VNIC_DEVCMD2_NARGS];
11089c067b84SDoug Ambrisko };
11099c067b84SDoug Ambrisko
11109c067b84SDoug Ambrisko #define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS
11119c067b84SDoug Ambrisko struct devcmd2_result {
11129c067b84SDoug Ambrisko u64 results[VNIC_DEVCMD2_NRESULTS];
11139c067b84SDoug Ambrisko u32 pad;
11149c067b84SDoug Ambrisko u16 completed_index; /* into copy WQ */
11159c067b84SDoug Ambrisko u8 error; /* same error codes as original */
11169c067b84SDoug Ambrisko u8 color; /* 0 or 1 as with completion queues */
11179c067b84SDoug Ambrisko };
11189c067b84SDoug Ambrisko
11199c067b84SDoug Ambrisko #define DEVCMD2_RING_SIZE 32
11209c067b84SDoug Ambrisko #define DEVCMD2_DESC_SIZE 128
11219c067b84SDoug Ambrisko
11229c067b84SDoug Ambrisko #define DEVCMD2_RESULTS_SIZE_MAX ((1 << 16) - 1)
11239c067b84SDoug Ambrisko
11249c067b84SDoug Ambrisko /* Overlay related definitions */
11259c067b84SDoug Ambrisko
11269c067b84SDoug Ambrisko /*
11279c067b84SDoug Ambrisko * This enum lists the flag associated with each of the overlay features
11289c067b84SDoug Ambrisko */
11299c067b84SDoug Ambrisko typedef enum {
11309c067b84SDoug Ambrisko OVERLAY_FEATURE_NVGRE = 1,
11319c067b84SDoug Ambrisko OVERLAY_FEATURE_VXLAN,
11329c067b84SDoug Ambrisko OVERLAY_FEATURE_MAX,
11339c067b84SDoug Ambrisko } overlay_feature_t;
11349c067b84SDoug Ambrisko
11359c067b84SDoug Ambrisko #define OVERLAY_OFFLOAD_ENABLE 0
11369c067b84SDoug Ambrisko #define OVERLAY_OFFLOAD_DISABLE 1
11379c067b84SDoug Ambrisko #define OVERLAY_OFFLOAD_ENABLE_V2 2
11389c067b84SDoug Ambrisko
11399c067b84SDoug Ambrisko #define OVERLAY_CFG_VXLAN_PORT_UPDATE 0
11409c067b84SDoug Ambrisko
11419c067b84SDoug Ambrisko /*
11429c067b84SDoug Ambrisko * Use this enum to get the supported versions for each of these features
11439c067b84SDoug Ambrisko * If you need to use the devcmd_get_supported_feature_version(), add
11449c067b84SDoug Ambrisko * the new feature into this enum and install function handler in devcmd.c
11459c067b84SDoug Ambrisko */
11469c067b84SDoug Ambrisko typedef enum {
11479c067b84SDoug Ambrisko VIC_FEATURE_VXLAN,
11489c067b84SDoug Ambrisko VIC_FEATURE_RDMA,
11499c067b84SDoug Ambrisko VIC_FEATURE_MAX,
11509c067b84SDoug Ambrisko } vic_feature_t;
11519c067b84SDoug Ambrisko
11529c067b84SDoug Ambrisko /*
11539c067b84SDoug Ambrisko * These flags are used in args[1] of devcmd CMD_GET_SUPP_FEATURE_VER
11549c067b84SDoug Ambrisko * to indicate the host driver about the VxLAN and Multi WQ features
11559c067b84SDoug Ambrisko * supported
11569c067b84SDoug Ambrisko */
11579c067b84SDoug Ambrisko #define FEATURE_VXLAN_IPV6_INNER (1 << 0)
11589c067b84SDoug Ambrisko #define FEATURE_VXLAN_IPV6_OUTER (1 << 1)
11599c067b84SDoug Ambrisko #define FEATURE_VXLAN_MULTI_WQ (1 << 2)
11609c067b84SDoug Ambrisko
11619c067b84SDoug Ambrisko #define FEATURE_VXLAN_IPV6 (FEATURE_VXLAN_IPV6_INNER | \
11629c067b84SDoug Ambrisko FEATURE_VXLAN_IPV6_OUTER)
11639c067b84SDoug Ambrisko
11649c067b84SDoug Ambrisko /*
11659c067b84SDoug Ambrisko * CMD_CONFIG_GRPINTR subcommands
11669c067b84SDoug Ambrisko */
11679c067b84SDoug Ambrisko typedef enum {
11689c067b84SDoug Ambrisko GRPINTR_ENABLE = 1,
11699c067b84SDoug Ambrisko GRPINTR_DISABLE,
11709c067b84SDoug Ambrisko GRPINTR_UPD_VECT,
11719c067b84SDoug Ambrisko } grpintr_subcmd_t;
11729c067b84SDoug Ambrisko
11739c067b84SDoug Ambrisko /*
11749c067b84SDoug Ambrisko * Structure for counter DMA
11759c067b84SDoug Ambrisko * (DMAed by CMD_COUNTER_DMA_CONFIG)
11769c067b84SDoug Ambrisko */
11779c067b84SDoug Ambrisko struct vnic_counter_counts {
11789c067b84SDoug Ambrisko u64 vcc_packets;
11799c067b84SDoug Ambrisko u64 vcc_bytes;
11809c067b84SDoug Ambrisko };
11819c067b84SDoug Ambrisko
11829c067b84SDoug Ambrisko #endif /* _VNIC_DEVCMD_H_ */
1183