DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family
@ 2020-09-22  8:48 Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
                   ` (62 more replies)
  0 siblings, 63 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Riverhead is a new NIC family, the first one with EF100 architecture.
Control interface is an MCDI similar to EF10. Datapath interface is
completely new.

The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
enabled.

EF10-based NICs are tested with the patch series applied with and
without EFSYS_OPT_RIVERHEAD enabled.

net/sfc patches will follow.

Andrew Rybchenko (41):
  common/sfc_efx/base: add EF100 registers definitions
  common/sfc_efx/base: update MCDI headers
  common/sfc_efx/base: add event queue operation to do polling
  common/sfc_efx/base: add efsys option for Riverhead
  common/sfc_efx/base: add Riverhead NIC family
  common/sfc_efx/base: update registers check for Riverhead
  common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  common/sfc_efx/base: use EF10 PHY methods for Riverhead
  common/sfc_efx/base: move 14b prefix check out of caps get
  common/sfc_efx/base: remove PF count get from caps get
  common/sfc_efx/base: factor out helper to get board config
  common/sfc_efx/base: set NIC features in generic place
  common/sfc_efx/base: factor out MCDI entity reset helper
  common/sfc_efx/base: add Riverhead support to NIC module
  common/sfc_efx/base: use dummy tunnel ops for Riverhead
  common/sfc_efx/base: use EF10 filter methods for Riverhead
  common/sfc_efx/base: use EF10 MAC methods for Riverhead
  common/sfc_efx/base: add interrupts module for Riverhead
  common/sfc_efx/base: move EvQ init/fini wrappers to generic
  common/sfc_efx/base: move EvQ create generic checks
  common/sfc_efx/base: prepare to merge EvQ init functions
  common/sfc_efx/base: merge versions of init EvQ wrappers
  common/sfc_efx/base: add event queue module for Riverhead
  common/sfc_efx/base: handle MCDI events on Riverhead
  common/sfc_efx/base: move RxQ init/fini wrappers to generic
  common/sfc_efx/base: move TxQ init/fini wrappers to generic
  common/sfc_efx/base: switch TxQ init to extended version
  common/sfc_efx/base: maintain RxQ counter in generic code
  common/sfc_efx/base: free Rx queue structure in generic code
  common/sfc_efx/base: move Rx index check to generic code
  common/sfc_efx/base: implement Rx control path for Riverhead
  common/sfc_efx/base: implement Tx control path for Riverhead
  common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  common/sfc_efx/base: handle Rx events for Riverhead
  common/sfc_efx/base: handle Tx complete on Riverhead
  common/sfc_efx: do not include libefx headers from efsys.h
  common/sfc_efx/base: add API to get Rx prefix information
  common/sfc_efx/base: group RxQ parameters into a structure
  common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  common/sfc_efx/base: use EF10 EVB methods for Riverhead
  common/sfc_efx/base: allocate vAdaptor on Riverhead

Andy Moreton (7):
  common/sfc_efx/base: add option for extended width events
  common/sfc_efx/base: add 256bit type
  common/sfc_efx/base: support creation of extended width EvQ
  common/sfc_efx/base: poll extended width event queues
  common/sfc_efx/base: handle normal events in extended width
  common/sfc_efx/base: add option for descriptor proxy queues
  common/sfc_efx/base: handle descriptor proxy queue events

Igor Romanov (9):
  common/sfc_efx/base: add function control window concept
  common/sfc_efx/base: add function control window lookup API
  common/sfc_efx/base: add efsys API to find a memory BAR
  common/sfc_efx/base: add Xilinx capabilities table lookup
  common/sfc_efx/base: add NIC magic check on BAR lookup
  common/sfc_efx/base: introduce UDP tunnel destruct operation
  common/sfc_efx/base: introduce states for UDP tunnel entries
  common/sfc_efx/base: support UDP tunnel operations for EF100
  common/sfc_efx/base: replace PCI efsys macros with functions

Ivan Malov (3):
  common/sfc_efx/base: complete EvQ creation on Riverhead
  common/sfc_efx/base: indicate support for TSO version 3
  common/sfc_efx/base: report restrictions for TSO version 3

 drivers/common/sfc_efx/base/ef10_ev.c         |  391 +-
 drivers/common/sfc_efx/base/ef10_evb.c        |    8 +-
 drivers/common/sfc_efx/base/ef10_filter.c     |   24 +-
 drivers/common/sfc_efx/base/ef10_impl.h       |   38 +
 drivers/common/sfc_efx/base/ef10_mac.c        |    6 +-
 drivers/common/sfc_efx/base/ef10_mcdi.c       |   55 +-
 drivers/common/sfc_efx/base/ef10_nic.c        |  413 +-
 drivers/common/sfc_efx/base/ef10_phy.c        |    4 +-
 drivers/common/sfc_efx/base/ef10_rx.c         |  384 +-
 drivers/common/sfc_efx/base/ef10_tx.c         |  137 +-
 drivers/common/sfc_efx/base/efx.h             |  226 +-
 drivers/common/sfc_efx/base/efx_check.h       |   71 +-
 drivers/common/sfc_efx/base/efx_ev.c          |  456 +-
 drivers/common/sfc_efx/base/efx_evb.c         |   24 +
 drivers/common/sfc_efx/base/efx_filter.c      |   18 +
 drivers/common/sfc_efx/base/efx_impl.h        |  252 +-
 drivers/common/sfc_efx/base/efx_intr.c        |   20 +
 drivers/common/sfc_efx/base/efx_mac.c         |   32 +
 drivers/common/sfc_efx/base/efx_mcdi.c        |  588 +-
 drivers/common/sfc_efx/base/efx_mcdi.h        |   11 +
 drivers/common/sfc_efx/base/efx_nic.c         |  102 +
 drivers/common/sfc_efx/base/efx_pci.c         |  367 ++
 drivers/common/sfc_efx/base/efx_phy.c         |   26 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h  |  934 +++
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5241 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 drivers/common/sfc_efx/base/efx_rx.c          |  112 +-
 drivers/common/sfc_efx/base/efx_tunnel.c      |  342 +-
 drivers/common/sfc_efx/base/efx_tx.c          |   35 +-
 drivers/common/sfc_efx/base/efx_types.h       |  581 +-
 drivers/common/sfc_efx/base/hunt_nic.c        |    6 +
 drivers/common/sfc_efx/base/medford2_nic.c    |    6 +
 drivers/common/sfc_efx/base/medford_nic.c     |    6 +
 drivers/common/sfc_efx/base/meson.build       |   10 +-
 drivers/common/sfc_efx/base/rhead_ev.c        |  687 +++
 drivers/common/sfc_efx/base/rhead_impl.h      |  484 ++
 drivers/common/sfc_efx/base/rhead_intr.c      |  104 +
 drivers/common/sfc_efx/base/rhead_nic.c       |  633 ++
 drivers/common/sfc_efx/base/rhead_pci.c       |  146 +
 drivers/common/sfc_efx/base/rhead_rx.c        |  677 +++
 drivers/common/sfc_efx/base/rhead_tunnel.c    |  343 ++
 drivers/common/sfc_efx/base/rhead_tx.c        |  192 +
 drivers/common/sfc_efx/base/siena_nic.c       |   10 +-
 drivers/common/sfc_efx/efsys.h                |    9 +-
 .../sfc_efx/rte_common_sfc_efx_version.map    |    3 +
 drivers/net/sfc/sfc.c                         |    3 +-
 drivers/net/sfc/sfc_ev.c                      |   18 +-
 48 files changed, 12951 insertions(+), 1487 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 01/60] common/sfc_efx/base: add EF100 registers definitions
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
@ 2020-09-22  8:48 ` Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
                   ` (61 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_impl.h       |   1 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h | 934 +++++++++++++++++++
 2 files changed, 935 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d6a31d298..87c7d5df52 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -10,6 +10,7 @@
 #include "efx.h"
 #include "efx_regs.h"
 #include "efx_regs_ef10.h"
+#include "efx_regs_ef100.h"
 #if EFSYS_OPT_MCDI
 #include "efx_mcdi.h"
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_regs_ef100.h b/drivers/common/sfc_efx/base/efx_regs_ef100.h
new file mode 100644
index 0000000000..1842150737
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_regs_ef100.h
@@ -0,0 +1,934 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_EFX_EF100_REGS_H
+#define	_SYS_EFX_EF100_REGS_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/**************************************************************************
+ * NOTE: the line below marks the start of the autogenerated section
+ * EF100 registers and descriptors
+ *
+ **************************************************************************
+ */
+
+/*
+ * HW_REV_ID_REG(32bit):
+ * Hardware revision info register
+ */
+
+#define	ER_GZ_HW_REV_ID_REG_OFST 0x00000000
+/* rhead=rhead_host_regs */
+#define	ER_GZ_HW_REV_ID_REG_RESET 0x0
+
+
+
+
+/*
+ * NIC_REV_ID(32bit):
+ * SoftNIC revision info register
+ */
+
+#define	ER_GZ_NIC_REV_ID_OFST 0x00000004
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_REV_ID_RESET 0x0
+
+
+
+
+/*
+ * NIC_MAGIC(32bit):
+ * Signature register that should contain a well-known value
+ */
+
+#define	ER_GZ_NIC_MAGIC_OFST 0x00000008
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_MAGIC_RESET 0x0
+
+
+#define	ERF_GZ_NIC_MAGIC_LBN 0
+#define	ERF_GZ_NIC_MAGIC_WIDTH 32
+#define	EFE_GZ_NIC_MAGIC_EXPECTED 0xEF100FCB
+
+
+/*
+ * MC_SFT_STATUS(32bit):
+ * MC soft status
+ */
+
+#define	ER_GZ_MC_SFT_STATUS_OFST 0x00000010
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_SFT_STATUS_STEP 4
+#define	ER_GZ_MC_SFT_STATUS_ROWS 2
+#define	ER_GZ_MC_SFT_STATUS_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_LWRD_REG(32bit):
+ * MC doorbell register, low word
+ */
+
+#define	ER_GZ_MC_DB_LWRD_REG_OFST 0x00000020
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_LWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_HWRD_REG(32bit):
+ * MC doorbell register, high word
+ */
+
+#define	ER_GZ_MC_DB_HWRD_REG_OFST 0x00000024
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_HWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * EVQ_INT_PRIME(32bit):
+ * Prime EVQ
+ */
+
+#define	ER_GZ_EVQ_INT_PRIME_OFST 0x00000040
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_INT_PRIME_RESET 0x0
+
+
+#define	ERF_GZ_IDX_LBN 16
+#define	ERF_GZ_IDX_WIDTH 16
+#define	ERF_GZ_EVQ_ID_LBN 0
+#define	ERF_GZ_EVQ_ID_WIDTH 16
+
+
+/*
+ * INT_AGG_RING_PRIME(32bit):
+ * Prime interrupt aggregation ring.
+ */
+
+#define	ER_GZ_INT_AGG_RING_PRIME_OFST 0x00000048
+/* rhead=rhead_host_regs */
+#define	ER_GZ_INT_AGG_RING_PRIME_RESET 0x0
+
+
+/* defined as ERF_GZ_IDX_LBN 16; */
+/* defined as ERF_GZ_IDX_WIDTH 16 */
+#define	ERF_GZ_RING_ID_LBN 0
+#define	ERF_GZ_RING_ID_WIDTH 16
+
+
+/*
+ * EVQ_TMR(32bit):
+ * EVQ timer control
+ */
+
+#define	ER_GZ_EVQ_TMR_OFST 0x00000104
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_TMR_STEP 65536
+#define	ER_GZ_EVQ_TMR_ROWS 1024
+#define	ER_GZ_EVQ_TMR_RESET 0x0
+
+
+
+
+/*
+ * EVQ_UNSOL_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for unsolicited events.
+ */
+
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_OFST 0x00000108
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * EVQ_DESC_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for descriptor proxy events.
+ */
+
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_OFST 0x00000110
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * RX_RING_DOORBELL(32bit):
+ * Ring Rx doorbell.
+ */
+
+#define	ER_GZ_RX_RING_DOORBELL_OFST 0x00000180
+/* rhead=rhead_host_regs */
+#define	ER_GZ_RX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_RX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_RX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_RX_RING_PIDX_LBN 16
+#define	ERF_GZ_RX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_RING_DOORBELL(32bit):
+ * Ring Tx doorbell.
+ */
+
+#define	ER_GZ_TX_RING_DOORBELL_OFST 0x00000200
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_TX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_TX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_TX_RING_PIDX_LBN 16
+#define	ERF_GZ_TX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_DESC_PUSH(128bit):
+ * Tx ring descriptor push. Reserved for future use.
+ */
+
+#define	ER_GZ_TX_DESC_PUSH_OFST 0x00000210
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_DESC_PUSH_STEP 65536
+#define	ER_GZ_TX_DESC_PUSH_ROWS 1024
+#define	ER_GZ_TX_DESC_PUSH_RESET 0x0
+
+
+
+
+/*
+ * THE_TIME(64bit):
+ * NIC hardware time
+ */
+
+#define	ER_GZ_THE_TIME_OFST 0x00000280
+/* rhead=rhead_host_regs */
+#define	ER_GZ_THE_TIME_STEP 65536
+#define	ER_GZ_THE_TIME_ROWS 1024
+#define	ER_GZ_THE_TIME_RESET 0x0
+
+
+#define	ERF_GZ_THE_TIME_SECS_LBN 32
+#define	ERF_GZ_THE_TIME_SECS_WIDTH 32
+#define	ERF_GZ_THE_TIME_NANOS_LBN 2
+#define	ERF_GZ_THE_TIME_NANOS_WIDTH 30
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_LBN 1
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_WIDTH 1
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_LBN 0
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_WIDTH 1
+
+
+/*
+ * PARAMS_TLV_LEN(32bit):
+ * Size of design parameters area in bytes
+ */
+
+#define	ER_GZ_PARAMS_TLV_LEN_OFST 0x00000c00
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_LEN_STEP 65536
+#define	ER_GZ_PARAMS_TLV_LEN_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_LEN_RESET 0x0
+
+
+
+
+/*
+ * PARAMS_TLV(8160bit):
+ * Design parameters
+ */
+
+#define	ER_GZ_PARAMS_TLV_OFST 0x00000c04
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_STEP 65536
+#define	ER_GZ_PARAMS_TLV_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_RESET 0x0
+
+
+
+
+/* ES_EW_EMBEDDED_EVENT */
+#define	ESF_GZ_EV_256_EVENT_DW0_LBN 0
+#define	ESF_GZ_EV_256_EVENT_DW0_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_DW1_LBN 32
+#define	ESF_GZ_EV_256_EVENT_DW1_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_LBN 0
+#define	ESF_GZ_EV_256_EVENT_WIDTH 64
+#define	ESE_GZ_EW_EMBEDDED_EVENT_STRUCT_SIZE 64
+
+
+/* ES_NMMU_PAGESZ_2M_ADDR */
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_LBN 59
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_WIDTH 5
+#define	ESE_GZ_NMMU_PAGE_SIZE_2M 9
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_WIDTH 32
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_LBN 53
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_WIDTH 6
+#define	ESF_GZ_NMMU_2M_PAGE_ID_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_WIDTH 38
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_LBN 0
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_WIDTH 21
+#define	ESE_GZ_NMMU_PAGESZ_2M_ADDR_STRUCT_SIZE 64
+
+
+/* ES_PARAM_TLV */
+#define	ESF_GZ_TLV_VALUE_LBN 16
+#define	ESF_GZ_TLV_VALUE_WIDTH 8
+#define	ESE_GZ_TLV_VALUE_LENMIN 8
+#define	ESE_GZ_TLV_VALUE_LENMAX 2040
+#define	ESF_GZ_TLV_LEN_LBN 8
+#define	ESF_GZ_TLV_LEN_WIDTH 8
+#define	ESF_GZ_TLV_TYPE_LBN 0
+#define	ESF_GZ_TLV_TYPE_WIDTH 8
+#define	ESE_GZ_DP_NMMU_GROUP_SIZE 5
+#define	ESE_GZ_DP_EVQ_UNSOL_CREDIT_SEQ_BITS 4
+#define	ESE_GZ_DP_TX_EV_NUM_DESCS_BITS 3
+#define	ESE_GZ_DP_RX_EV_NUM_PACKETS_BITS 2
+#define	ESE_GZ_DP_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_GZ_DP_PAD 0
+#define	ESE_GZ_PARAM_TLV_STRUCT_SIZE 24
+
+
+/* ES_PCI_EXPRESS_XCAP_HDR */
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_LBN 20
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_WIDTH 12
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_LBN 16
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_WIDTH 4
+#define	ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC 1
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_LBN 0
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_WIDTH 16
+#define	ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR 0xb
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_STRUCT_SIZE 32
+
+
+/* ES_RHEAD_BASE_EVENT */
+#define	ESF_GZ_E_TYPE_LBN 60
+#define	ESF_GZ_E_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EV_DRIVER 5
+#define	ESE_GZ_EF100_EV_MCDI 4
+#define	ESE_GZ_EF100_EV_CONTROL 3
+#define	ESE_GZ_EF100_EV_TX_TIMESTAMP 2
+#define	ESE_GZ_EF100_EV_TX_COMPLETION 1
+#define	ESE_GZ_EF100_EV_RX_PKTS 0
+#define	ESF_GZ_EV_EVQ_PHASE_LBN 59
+#define	ESF_GZ_EV_EVQ_PHASE_WIDTH 1
+#define	ESE_GZ_RHEAD_BASE_EVENT_STRUCT_SIZE 64
+
+
+/* ES_RHEAD_EW_EVENT */
+#define	ESF_GZ_EV_256_EV32_PHASE_LBN 255
+#define	ESF_GZ_EV_256_EV32_PHASE_WIDTH 1
+#define	ESF_GZ_EV_256_EV32_TYPE_LBN 251
+#define	ESF_GZ_EV_256_EV32_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EVEW_VIRTQ_DESC 2
+#define	ESE_GZ_EF100_EVEW_TXQ_DESC 1
+#define	ESE_GZ_EF100_EVEW_64BIT 0
+#define	ESE_GZ_RHEAD_EW_EVENT_STRUCT_SIZE 256
+
+
+/* ES_RX_DESC */
+#define	ESF_GZ_RX_BUF_ADDR_DW0_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_LBN 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_WIDTH 64
+#define	ESE_GZ_RX_DESC_STRUCT_SIZE 64
+
+
+/* ES_TXQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_WIDTH 128
+#define	ESE_GZ_TXQ_DESC_PROXY_EVENT_STRUCT_SIZE 144
+
+
+/* ES_TX_DESC_TYPE */
+#define	ESF_GZ_TX_DESC_TYPE_LBN 124
+#define	ESF_GZ_TX_DESC_TYPE_WIDTH 4
+#define	ESE_GZ_TX_DESC_TYPE_DESC2CMPT 7
+#define	ESE_GZ_TX_DESC_TYPE_MEM2MEM 4
+#define	ESE_GZ_TX_DESC_TYPE_SEG 3
+#define	ESE_GZ_TX_DESC_TYPE_TSO 2
+#define	ESE_GZ_TX_DESC_TYPE_PREFIX 1
+#define	ESE_GZ_TX_DESC_TYPE_SEND 0
+#define	ESE_GZ_TX_DESC_TYPE_STRUCT_SIZE 128
+
+
+/* ES_VIRTQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_LBN 144
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_VQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_WIDTH 128
+#define	ESE_GZ_VIRTQ_DESC_PROXY_EVENT_STRUCT_SIZE 160
+
+
+/* ES_XIL_CFGBAR_TBL_ENTRY */
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_LBN 96
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_LBN 100
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_WIDTH 60
+#define	ESE_GZ_CONT_CAP_OFFSET_BYTES_SHIFT 4
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_LBN 67
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_WIDTH 29
+#define	ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT 4
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_LBN 67
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_WIDTH 1
+#define	ESF_GZ_CFGBAR_EF100_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_EF100_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_LBN 32
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_WIDTH 32
+#define	ESE_GZ_CFGBAR_ENTRY_SIZE_EF100 12
+#define	ESE_GZ_CFGBAR_ENTRY_HEADER_SIZE 8
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_LBN 28
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_WIDTH 1
+#define	ESF_GZ_CFGBAR_ENTRY_REV_LBN 20
+#define	ESF_GZ_CFGBAR_ENTRY_REV_WIDTH 8
+#define	ESE_GZ_CFGBAR_ENTRY_REV_EF100 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_LBN 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_WIDTH 20
+#define	ESE_GZ_CFGBAR_ENTRY_LAST 0xfffff
+#define	ESE_GZ_CFGBAR_ENTRY_CONT_CAP_ADDR 0xffffe
+#define	ESE_GZ_CFGBAR_ENTRY_EF100 0xef100
+#define	ESE_GZ_XIL_CFGBAR_TBL_ENTRY_STRUCT_SIZE 128
+
+
+/* ES_XIL_CFGBAR_VSEC */
+#define	ESF_GZ_VSEC_TBL_OFF_HI_LBN 64
+#define	ESF_GZ_VSEC_TBL_OFF_HI_WIDTH 32
+#define	ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT 32
+#define	ESF_GZ_VSEC_TBL_OFF_LO_LBN 36
+#define	ESF_GZ_VSEC_TBL_OFF_LO_WIDTH 28
+#define	ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT 4
+#define	ESF_GZ_VSEC_TBL_BAR_LBN 32
+#define	ESF_GZ_VSEC_TBL_BAR_WIDTH 4
+#define	ESE_GZ_VSEC_BAR_NUM_INVALID 7
+#define	ESE_GZ_VSEC_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_VSEC_LEN_LBN 20
+#define	ESF_GZ_VSEC_LEN_WIDTH 12
+#define	ESE_GZ_VSEC_LEN_HIGH_OFFT 16
+#define	ESE_GZ_VSEC_LEN_MIN 12
+#define	ESF_GZ_VSEC_VER_LBN 16
+#define	ESF_GZ_VSEC_VER_WIDTH 4
+#define	ESE_GZ_VSEC_VER_XIL_CFGBAR 0
+#define	ESF_GZ_VSEC_ID_LBN 0
+#define	ESF_GZ_VSEC_ID_WIDTH 16
+#define	ESE_GZ_XILINX_VSEC_ID 0x20
+#define	ESE_GZ_XIL_CFGBAR_VSEC_STRUCT_SIZE 96
+
+
+/* ES_rh_egres_hclass */
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_LBN 15
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_LBN 13
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_LBN 12
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_LBN 10
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_LBN 8
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_LBN 5
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_WIDTH 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_LBN 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_LBN 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_LBN 0
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_WIDTH 2
+#define	ESE_GZ_RH_EGRES_HCLASS_STRUCT_SIZE 16
+
+
+/* ES_sf_driver */
+#define	ESF_GZ_DRIVER_E_TYPE_LBN 60
+#define	ESF_GZ_DRIVER_E_TYPE_WIDTH 4
+#define	ESF_GZ_DRIVER_PHASE_LBN 59
+#define	ESF_GZ_DRIVER_PHASE_WIDTH 1
+#define	ESF_GZ_DRIVER_DATA_DW0_LBN 0
+#define	ESF_GZ_DRIVER_DATA_DW0_WIDTH 32
+#define	ESF_GZ_DRIVER_DATA_DW1_LBN 32
+#define	ESF_GZ_DRIVER_DATA_DW1_WIDTH 27
+#define	ESF_GZ_DRIVER_DATA_LBN 0
+#define	ESF_GZ_DRIVER_DATA_WIDTH 59
+#define	ESE_GZ_SF_DRIVER_STRUCT_SIZE 64
+
+
+/* ES_sf_ev_rsvd */
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_LBN 34
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_WIDTH 3
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_LBN 30
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_WIDTH 4
+#define	ESF_GZ_EV_RSVD_SRC_QID_LBN 18
+#define	ESF_GZ_EV_RSVD_SRC_QID_WIDTH 12
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_LBN 2
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_WIDTH 16
+#define	ESF_GZ_EV_RSVD_TBD_LBN 0
+#define	ESF_GZ_EV_RSVD_TBD_WIDTH 2
+#define	ESE_GZ_SF_EV_RSVD_STRUCT_SIZE 37
+
+
+/* ES_sf_flush_evnt */
+#define	ESF_GZ_EV_FLSH_E_TYPE_LBN 60
+#define	ESF_GZ_EV_FLSH_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_FLSH_PHASE_LBN 59
+#define	ESF_GZ_EV_FLSH_PHASE_WIDTH 1
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_LBN 53
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_WIDTH 6
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_LBN 42
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_WIDTH 11
+#define	ESF_GZ_EV_FLSH_RSVD_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_WIDTH 43
+#define	ESF_GZ_EV_FLSH_LABEL_LBN 4
+#define	ESF_GZ_EV_FLSH_LABEL_WIDTH 6
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_LBN 0
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_WIDTH 4
+#define	ESE_GZ_SF_FLUSH_EVNT_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_pkts */
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_RXPKTS_PHASE_LBN 59
+#define	ESF_GZ_EV_RXPKTS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RXPKTS_RSVD_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_WIDTH 37
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_LBN 0
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_WIDTH 16
+#define	ESE_GZ_SF_RX_PKTS_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_prefix */
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_LBN 160
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_LBN 144
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_LBN 128
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_MARK_LBN 96
+#define	ESF_GZ_RX_PREFIX_USER_MARK_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_LBN 64
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_LBN 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_CLASS_LBN 16
+#define	ESF_GZ_RX_PREFIX_CLASS_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_LBN 15
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_LBN 14
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_LENGTH_LBN 0
+#define	ESF_GZ_RX_PREFIX_LENGTH_WIDTH 14
+#define	ESE_GZ_SF_RX_PREFIX_STRUCT_SIZE 176
+
+
+/* ES_sf_rxtx_generic */
+#define	ESF_GZ_EV_BARRIER_LBN 167
+#define	ESF_GZ_EV_BARRIER_WIDTH 1
+#define	ESF_GZ_EV_RSVD_DW0_LBN 130
+#define	ESF_GZ_EV_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RSVD_DW1_LBN 162
+#define	ESF_GZ_EV_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RSVD_LBN 130
+#define	ESF_GZ_EV_RSVD_WIDTH 37
+#define	ESF_GZ_EV_DPRXY_LBN 129
+#define	ESF_GZ_EV_DPRXY_WIDTH 1
+#define	ESF_GZ_EV_VIRTIO_LBN 128
+#define	ESF_GZ_EV_VIRTIO_WIDTH 1
+#define	ESF_GZ_EV_COUNT_DW0_LBN 0
+#define	ESF_GZ_EV_COUNT_DW0_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW1_LBN 32
+#define	ESF_GZ_EV_COUNT_DW1_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW2_LBN 64
+#define	ESF_GZ_EV_COUNT_DW2_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW3_LBN 96
+#define	ESF_GZ_EV_COUNT_DW3_WIDTH 32
+#define	ESF_GZ_EV_COUNT_LBN 0
+#define	ESF_GZ_EV_COUNT_WIDTH 128
+#define	ESE_GZ_SF_RXTX_GENERIC_STRUCT_SIZE 168
+
+
+/* ES_sf_ts_stamp */
+#define	ESF_GZ_EV_TS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TS_PHASE_LBN 59
+#define	ESF_GZ_EV_TS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TS_RSVD_LBN 56
+#define	ESF_GZ_EV_TS_RSVD_WIDTH 3
+#define	ESF_GZ_EV_TS_STATUS_LBN 54
+#define	ESF_GZ_EV_TS_STATUS_WIDTH 2
+#define	ESF_GZ_EV_TS_Q_LABEL_LBN 48
+#define	ESF_GZ_EV_TS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TS_DESC_ID_LBN 32
+#define	ESF_GZ_EV_TS_DESC_ID_WIDTH 16
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_LBN 0
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_WIDTH 32
+#define	ESE_GZ_SF_TS_STAMP_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_cmplt */
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TXCMPL_PHASE_LBN 59
+#define	ESF_GZ_EV_TXCMPL_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_TXCMPL_RSVD_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_WIDTH 37
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_LBN 0
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_WIDTH 16
+#define	ESE_GZ_SF_TX_CMPLT_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_desc2cmpt_dsc_fmt */
+#define	ESF_GZ_D2C_TGT_VI_ID_LBN 108
+#define	ESF_GZ_D2C_TGT_VI_ID_WIDTH 16
+#define	ESF_GZ_D2C_CMPT2_LBN 107
+#define	ESF_GZ_D2C_CMPT2_WIDTH 1
+#define	ESF_GZ_D2C_ABS_VI_ID_LBN 106
+#define	ESF_GZ_D2C_ABS_VI_ID_WIDTH 1
+#define	ESF_GZ_D2C_ORDERED_LBN 105
+#define	ESF_GZ_D2C_ORDERED_WIDTH 1
+#define	ESF_GZ_D2C_SKIP_N_LBN 97
+#define	ESF_GZ_D2C_SKIP_N_WIDTH 8
+#define	ESF_GZ_D2C_RSVD_DW0_LBN 64
+#define	ESF_GZ_D2C_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_D2C_RSVD_DW1_LBN 96
+#define	ESF_GZ_D2C_RSVD_DW1_WIDTH 1
+#define	ESF_GZ_D2C_RSVD_LBN 64
+#define	ESF_GZ_D2C_RSVD_WIDTH 33
+#define	ESF_GZ_D2C_COMPLETION_DW0_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_DW0_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_LBN 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_WIDTH 64
+#define	ESE_GZ_SF_TX_DESC2CMPT_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_mem2mem_dsc_fmt */
+#define	ESF_GZ_M2M_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_M2M_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_M2M_RSVD_LBN 120
+#define	ESF_GZ_M2M_RSVD_WIDTH 2
+#define	ESF_GZ_M2M_ADDR_SPC_LBN 108
+#define	ESF_GZ_M2M_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_M2M_LEN_MINUS_1_LBN 64
+#define	ESF_GZ_M2M_LEN_MINUS_1_WIDTH 20
+#define	ESF_GZ_M2M_ADDR_DW0_LBN 0
+#define	ESF_GZ_M2M_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_DW1_LBN 32
+#define	ESF_GZ_M2M_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_LBN 0
+#define	ESF_GZ_M2M_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_MEM2MEM_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_ovr_dsc_fmt */
+#define	ESF_GZ_TX_PREFIX_MARK_EN_LBN 123
+#define	ESF_GZ_TX_PREFIX_MARK_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_LBN 122
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_LBN 121
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_LBN 120
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_WIDTH 32
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_LBN 96
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_WIDTH 24
+#define	ESF_GZ_TX_PREFIX_RSRVD_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_WIDTH 56
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_LBN 48
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_LBN 32
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_MARK_LBN 0
+#define	ESF_GZ_TX_PREFIX_MARK_WIDTH 32
+#define	ESE_GZ_SF_TX_OVR_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_seg_dsc_fmt */
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_TX_SEG_RSVD2_LBN 120
+#define	ESF_GZ_TX_SEG_RSVD2_WIDTH 2
+#define	ESF_GZ_TX_SEG_ADDR_SPC_LBN 108
+#define	ESF_GZ_TX_SEG_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_TX_SEG_RSVD_LBN 80
+#define	ESF_GZ_TX_SEG_RSVD_WIDTH 4
+#define	ESF_GZ_TX_SEG_LEN_LBN 64
+#define	ESF_GZ_TX_SEG_LEN_WIDTH 16
+#define	ESF_GZ_TX_SEG_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_SEG_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_std_dsc_fmt */
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_SEND_RSVD_LBN 99
+#define	ESF_GZ_TX_SEND_RSVD_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_LBN 97
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_LBN 92
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_WIDTH 5
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_LBN 83
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_WIDTH 9
+#define	ESF_GZ_TX_SEND_NUM_SEGS_LBN 78
+#define	ESF_GZ_TX_SEND_NUM_SEGS_WIDTH 5
+#define	ESF_GZ_TX_SEND_LEN_LBN 64
+#define	ESF_GZ_TX_SEND_LEN_WIDTH 14
+#define	ESF_GZ_TX_SEND_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_STD_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_tso_dsc_fmt */
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_TSO_RSVD_LBN 94
+#define	ESF_GZ_TX_TSO_RSVD_WIDTH 7
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_LBN 93
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_LBN 85
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_LBN 77
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_LBN 69
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_LBN 64
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_WIDTH 5
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_LBN 42
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_WIDTH 22
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_LBN 34
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_LBN 33
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_LBN 32
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_LBN 31
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_LBN 29
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_LBN 27
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_LBN 17
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_WIDTH 10
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_LBN 14
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_WIDTH 3
+#define	ESF_GZ_TX_TSO_MSS_LBN 0
+#define	ESF_GZ_TX_TSO_MSS_WIDTH 14
+#define	ESE_GZ_SF_TX_TSO_DSC_FMT_STRUCT_SIZE 124
+
+
+
+/* Enum DESIGN_PARAMS */
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT 17
+#define	ESE_EF100_DP_GZ_VI_STRIDES 16
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES 15
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS 14
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN 13
+#define	ESE_EF100_DP_GZ_COMPAT 12
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES 11
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS 10
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN 9
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY 8
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS 6
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN 5
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS 4
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE 3
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS 2
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_EF100_DP_GZ_PAD 0
+
+/* Enum DESIGN_PARAM_DEFAULTS */
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT 0x3fffff
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS_DEFAULT 0x1106
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT 0x3ff
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT_DEFAULT 640
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS_DEFAULT 512
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES_DEFAULT 512
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT 192
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE_DEFAULT 32
+#define	ESE_EF100_DP_GZ_VI_STRIDES_DEFAULT 16
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS_DEFAULT 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT 4
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS_DEFAULT 2
+#define	ESE_EF100_DP_GZ_COMPAT_DEFAULT 0
+
+/* Enum HOST_IF_CONSTANTS */
+#define	ESE_GZ_FCW_LEN 0x4C
+#define	ESE_GZ_RX_PKT_PREFIX_LEN 22
+
+/* Enum PCI_CONSTANTS */
+#define	ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE 256
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE 4
+
+/* Enum RH_HCLASS_L2_CLASS */
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_E2_0123VLAN 1
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_OTHER 0
+
+/* Enum RH_HCLASS_L2_STATUS */
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_RESERVED 3
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_FCS_ERR 2
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_LEN_ERR 1
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_OK 0
+
+/* Enum RH_HCLASS_L3_CLASS */
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP6 2
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4BAD 1
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4GOOD 0
+
+/* Enum RH_HCLASS_L4_CLASS */
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_FRAG 2
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_UDP 1
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_TCP 0
+
+/* Enum RH_HCLASS_L4_CSUM */
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_GOOD 1
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_BAD_OR_UNKNOWN 0
+
+/* Enum RH_HCLASS_TUNNEL_CLASS */
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_7 7
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_6 6
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_5 5
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_4 4
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_GENEVE 3
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NVGRE 2
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_VXLAN 1
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NONE 0
+
+/* Enum TX_DESC_CSO_PARTIAL_EN */
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_TCP 2
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_UDP 1
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_OFF 0
+
+/* Enum TX_DESC_CS_INNER_L3 */
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_GENEVE 3
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_NVGRE 2
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_VXLAN 1
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_OFF 0
+
+/* Enum TX_DESC_IP4_ID */
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD16 2
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD15 1
+#define	ESE_GZ_TX_DESC_IP4_ID_NO_OP 0
+/*************************************************************************
+ * NOTE: the comment line above marks the end of the autogenerated section
+ */
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _SYS_EFX_EF100_REGS_H */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 02/60] common/sfc_efx/base: update MCDI headers
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
@ 2020-09-22  8:48 ` Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
                   ` (60 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5241 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 3 files changed, 5173 insertions(+), 271 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi.h b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
index ffb9a9b02a..34a473aa46 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_H
@@ -405,7 +405,22 @@
  */
 #define	MC_CMD_ERR_PIOBUFS_PRESENT 0x101b
 
-/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10
+/* MC_CMD_RESOURCE_SPECIFIER enum */
+/* enum: Any */
+#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
+#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe /* enum */
+
+/* MAE_MCDI_ENCAP_TYPE enum: Encapsulation type. Defines how the payload will
+ * be parsed to an inner frame. Other values are reserved. Unknown values
+ * should be treated same as NONE.
+ */
+#define	MAE_MCDI_ENCAP_TYPE_NONE 0x0 /* enum */
+/* enum: Don't assume enum aligns with support bitmask... */
+#define	MAE_MCDI_ENCAP_TYPE_VXLAN 0x1
+#define	MAE_MCDI_ENCAP_TYPE_NVGRE 0x2 /* enum */
+#define	MAE_MCDI_ENCAP_TYPE_GENEVE 0x3 /* enum */
+
+/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10/EF100
  * platforms
  */
 #define	MCDI_EVENT_LEN 8
@@ -423,14 +438,19 @@
 #define	MCDI_EVENT_LEVEL_FATAL 0x3
 #define	MCDI_EVENT_DATA_OFST 0
 #define	MCDI_EVENT_DATA_LEN 4
+#define	MCDI_EVENT_CMDDONE_SEQ_OFST 0
 #define	MCDI_EVENT_CMDDONE_SEQ_LBN 0
 #define	MCDI_EVENT_CMDDONE_SEQ_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_DATALEN_OFST 0
 #define	MCDI_EVENT_CMDDONE_DATALEN_LBN 8
 #define	MCDI_EVENT_CMDDONE_DATALEN_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_ERRNO_OFST 0
 #define	MCDI_EVENT_CMDDONE_ERRNO_LBN 16
 #define	MCDI_EVENT_CMDDONE_ERRNO_WIDTH 8
+#define	MCDI_EVENT_LINKCHANGE_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_WIDTH 16
+#define	MCDI_EVENT_LINKCHANGE_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_SPEED_LBN 16
 #define	MCDI_EVENT_LINKCHANGE_SPEED_WIDTH 4
 /* enum: Link is down or link speed could not be determined */
@@ -449,26 +469,36 @@
 #define	MCDI_EVENT_LINKCHANGE_SPEED_50G 0x6
 /* enum: 100Gbs */
 #define	MCDI_EVENT_LINKCHANGE_SPEED_100G 0x7
+#define	MCDI_EVENT_LINKCHANGE_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_LBN 20
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_WIDTH 4
+#define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_MONITOR_OFST 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_STATE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_STATE_LBN 8
 #define	MCDI_EVENT_SENSOREVT_STATE_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_VALUE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_VALUE_LBN 16
 #define	MCDI_EVENT_SENSOREVT_VALUE_WIDTH 16
+#define	MCDI_EVENT_FWALERT_DATA_OFST 0
 #define	MCDI_EVENT_FWALERT_DATA_LBN 8
 #define	MCDI_EVENT_FWALERT_DATA_WIDTH 24
+#define	MCDI_EVENT_FWALERT_REASON_OFST 0
 #define	MCDI_EVENT_FWALERT_REASON_LBN 0
 #define	MCDI_EVENT_FWALERT_REASON_WIDTH 8
 /* enum: SRAM Access. */
 #define	MCDI_EVENT_FWALERT_REASON_SRAM_ACCESS 0x1
+#define	MCDI_EVENT_FLR_VF_OFST 0
 #define	MCDI_EVENT_FLR_VF_LBN 0
 #define	MCDI_EVENT_FLR_VF_WIDTH 8
+#define	MCDI_EVENT_TX_ERR_TXQ_OFST 0
 #define	MCDI_EVENT_TX_ERR_TXQ_LBN 0
 #define	MCDI_EVENT_TX_ERR_TXQ_WIDTH 12
+#define	MCDI_EVENT_TX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_TX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_TX_ERR_TYPE_WIDTH 4
 /* enum: Descriptor loader reported failure */
@@ -483,12 +513,16 @@
 #define	MCDI_EVENT_TX_OPT_IN_PKT 0x8
 /* enum: DMA or PIO data access error */
 #define	MCDI_EVENT_TX_ERR_BAD_DMA_OR_PIO 0x9
+#define	MCDI_EVENT_TX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_TX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_TX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_TX_FLUSH_TXQ_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_LBN 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_WIDTH 12
+#define	MCDI_EVENT_PTP_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_WIDTH 8
 /* enum: PLL lost lock */
@@ -499,6 +533,7 @@
 #define	MCDI_EVENT_PTP_ERR_FIFO 0x3
 /* enum: Merge queue overflow */
 #define	MCDI_EVENT_PTP_ERR_QUEUE 0x4
+#define	MCDI_EVENT_AOE_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_WIDTH 8
 /* enum: AOE failed to load - no valid image? */
@@ -545,8 +580,10 @@
 #define	MCDI_EVENT_AOE_FPGA_CLOCKS_PROGRAM_FAILED 0x13
 /* enum: Notify that FPGA Controller is alive to serve MCDI requests */
 #define	MCDI_EVENT_AOE_FC_RUNNING 0x14
+#define	MCDI_EVENT_AOE_ERR_DATA_OFST 0
 #define	MCDI_EVENT_AOE_ERR_DATA_LBN 8
 #define	MCDI_EVENT_AOE_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_WIDTH 8
 /* enum: FC Assert happened, but the register information is not available */
@@ -554,6 +591,7 @@
 /* enum: The register information for FC Assert is ready for readinng by driver
  */
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_DATA_READY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_WIDTH 8
 /* enum: Reading from NV failed */
@@ -574,28 +612,38 @@
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_SIZE 0x7
 /* enum: Unsupported DDR rank */
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_RANK 0x8
+#define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_WIDTH 8
 /* enum: Primary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_PRIMARY 0x0
 /* enum: Secondary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_SECONDARY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_WIDTH 8
+#define	MCDI_EVENT_RX_ERR_RXQ_OFST 0
 #define	MCDI_EVENT_RX_ERR_RXQ_LBN 0
 #define	MCDI_EVENT_RX_ERR_RXQ_WIDTH 12
+#define	MCDI_EVENT_RX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_RX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_RX_ERR_TYPE_WIDTH 4
+#define	MCDI_EVENT_RX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_RX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_RX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_RX_FLUSH_RXQ_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_LBN 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_WIDTH 12
+#define	MCDI_EVENT_MC_REBOOT_COUNT_OFST 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_LBN 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_WIDTH 16
+#define	MCDI_EVENT_MUM_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_WIDTH 8
 /* enum: MUM failed to load - no valid image? */
@@ -604,10 +652,13 @@
 #define	MCDI_EVENT_MUM_ASSERT 0x2
 /* enum: MUM not kicking watchdog */
 #define	MCDI_EVENT_MUM_WATCHDOG 0x3
+#define	MCDI_EVENT_MUM_ERR_DATA_OFST 0
 #define	MCDI_EVENT_MUM_ERR_DATA_LBN 8
 #define	MCDI_EVENT_MUM_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_DBRET_SEQ_OFST 0
 #define	MCDI_EVENT_DBRET_SEQ_LBN 0
 #define	MCDI_EVENT_DBRET_SEQ_WIDTH 8
+#define	MCDI_EVENT_SUC_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_WIDTH 8
 /* enum: Corrupted or bad SUC application. */
@@ -618,30 +669,48 @@
 #define	MCDI_EVENT_SUC_EXCEPTION 0x3
 /* enum: SUC watchdog timer expired. */
 #define	MCDI_EVENT_SUC_WATCHDOG 0x4
+#define	MCDI_EVENT_SUC_ERR_ADDRESS_OFST 0
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_LBN 8
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_WIDTH 24
+#define	MCDI_EVENT_SUC_ERR_DATA_OFST 0
 #define	MCDI_EVENT_SUC_ERR_DATA_LBN 8
 #define	MCDI_EVENT_SUC_ERR_DATA_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MCDI_EVENT/LINKCHANGE_SPEED */
+#define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_LBN 28
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_WIDTH 1
+#define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_LBN 29
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
+#define	MCDI_EVENT_MODULECHANGE_LD_CAP_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_LBN 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_WIDTH 30
+#define	MCDI_EVENT_MODULECHANGE_SEQ_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_SEQ_LBN 30
 #define	MCDI_EVENT_MODULECHANGE_SEQ_WIDTH 2
 #define	MCDI_EVENT_DATA_LBN 0
 #define	MCDI_EVENT_DATA_WIDTH 32
+/* Alias for PTP_DATA. */
 #define	MCDI_EVENT_SRC_LBN 36
 #define	MCDI_EVENT_SRC_WIDTH 8
+/* Data associated with PTP events which doesn't fit into the main DATA field
+ */
+#define	MCDI_EVENT_PTP_DATA_LBN 36
+#define	MCDI_EVENT_PTP_DATA_WIDTH 8
+/* EF100 specific. Defined by QDMA. The phase bit, changes each time round the
+ * event ring
+ */
+#define	MCDI_EVENT_EV_EVQ_PHASE_LBN 59
+#define	MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
 #define	MCDI_EVENT_EV_CODE_LBN 60
 #define	MCDI_EVENT_EV_CODE_WIDTH 4
 #define	MCDI_EVENT_CODE_LBN 44
@@ -737,6 +806,27 @@
  * contains the value.
  */
 #define	MCDI_EVENT_CODE_DYNAMIC_SENSORS_STATE_CHANGE 0x23
+/* enum: Notification that a descriptor proxy function configuration has been
+ * pushed to "live" status (visible to host). SRC field contains the handle of
+ * the affected descriptor proxy function. DATA field contains the generation
+ * count of configuration set applied. See MC_CMD_DESC_PROXY_FUNC_CONFIG_SET /
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_COMMIT and SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_CONFIG_COMMITTED 0x24
+/* enum: Notification that a descriptor proxy function has been reset. SRC
+ * field contains the handle of the affected descriptor proxy function. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_RESET 0x25
+/* enum: Notification that a driver attached to a descriptor proxy function.
+ * SRC field contains the handle of the affected descriptor proxy function. For
+ * Virtio proxy functions this message consists of two MCDI events, where the
+ * first event's (CONT=1) DATA field carries negotiated virtio feature bits 0
+ * to 31 and the second (CONT=0) carries bits 32 to 63. For EF100 proxy
+ * functions event length and meaning of DATA field is not yet defined. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_DRIVER_ATTACH 0x26
 /* enum: Artificial event generated by host and posted via MC for test
  * purposes.
  */
@@ -888,6 +978,22 @@
 /* The current state of a sensor. */
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_LBN 36
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_WIDTH 8
+#define	MCDI_EVENT_DESC_PROXY_DATA_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_DATA_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_WIDTH 32
+/* Generation count of applied configuration set */
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_WIDTH 32
+/* Virtio features negotiated with the host driver. First event (CONT=1)
+ * carries bits 0 to 31. Second event (CONT=0) carries bits 32 to 63.
+ */
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_WIDTH 32
 
 /* FCDI_EVENT structuredef */
 #define	FCDI_EVENT_LEN 8
@@ -905,6 +1011,7 @@
 #define	FCDI_EVENT_LEVEL_FATAL 0x3
 #define	FCDI_EVENT_DATA_OFST 0
 #define	FCDI_EVENT_DATA_LEN 4
+#define	FCDI_EVENT_LINK_STATE_STATUS_OFST 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_LBN 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_WIDTH 1
 #define	FCDI_EVENT_LINK_DOWN 0x0 /* enum */
@@ -1040,24 +1147,33 @@
 #define	MUM_EVENT_LEVEL_FATAL 0x3
 #define	MUM_EVENT_DATA_OFST 0
 #define	MUM_EVENT_DATA_LEN 4
+#define	MUM_EVENT_SENSOR_ID_OFST 0
 #define	MUM_EVENT_SENSOR_ID_LBN 0
 #define	MUM_EVENT_SENSOR_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_SENSOR_INFO/MC_CMD_SENSOR_INFO_OUT/MASK */
+#define	MUM_EVENT_SENSOR_STATE_OFST 0
 #define	MUM_EVENT_SENSOR_STATE_LBN 8
 #define	MUM_EVENT_SENSOR_STATE_WIDTH 8
+#define	MUM_EVENT_PORT_PHY_READY_OFST 0
 #define	MUM_EVENT_PORT_PHY_READY_LBN 0
 #define	MUM_EVENT_PORT_PHY_READY_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_LINK_UP_OFST 0
 #define	MUM_EVENT_PORT_PHY_LINK_UP_LBN 1
 #define	MUM_EVENT_PORT_PHY_LINK_UP_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOL_LBN 2
 #define	MUM_EVENT_PORT_PHY_TX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOL_LBN 3
 #define	MUM_EVENT_PORT_PHY_RX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOS_LBN 4
 #define	MUM_EVENT_PORT_PHY_TX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOS_LBN 5
 #define	MUM_EVENT_PORT_PHY_RX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_FAULT_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_LBN 6
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_WIDTH 1
 #define	MUM_EVENT_DATA_LBN 0
@@ -1205,16 +1321,22 @@
  * below)
  */
 #define	MC_CMD_COPYCODE_HUNT_IGNORE_CONFIG_MAGIC_ADDR 0x1badc
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_LBN 17
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_LBN 2
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_LBN 3
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_LBN 4
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_LBN 5
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_LBN 6
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_WIDTH 1
 /* Destination address */
@@ -1272,10 +1394,13 @@
 #define	MC_CMD_GET_BOOT_STATUS_OUT_BOOT_OFFSET_NULL 0xdeadbeef
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_LBN 0
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_LBN 1
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_LBN 2
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_WIDTH 1
 
@@ -1547,14 +1672,19 @@
 /* Flags indicating which extended fields are valid */
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_LBN 0
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_LBN 1
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_LBN 2
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_LBN 3
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_LBN 4
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_WIDTH 1
 /* MC firmware unique build ID (as binary SHA-1 value) */
@@ -2088,8 +2218,10 @@
 /* Original field containing queue ID. Now extended to include flags. */
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_LEN 4
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_LBN 0
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_WIDTH 16
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_LBN 31
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_WIDTH 1
 
@@ -2395,12 +2527,16 @@
 /* Various PTP capabilities */
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_LEN 4
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_LBN 0
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_LBN 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_LBN 2
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_LBN 3
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_WIDTH 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RESERVED0_OFST 12
@@ -2728,10 +2864,13 @@
 #define	MC_CMD_DBIWROP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIWROP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LBN 32
@@ -2980,10 +3119,13 @@
 #define	MC_CMD_DBIRDOP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIRDOP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LBN 32
@@ -3051,22 +3193,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_LEN 4
+#define	MC_CMD_DRV_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_PREBOOT_OFST 0
 #define	MC_CMD_DRV_PREBOOT_LBN 1
 #define	MC_CMD_DRV_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3113,22 +3264,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_LEN 4
+/*             MC_CMD_DRV_ATTACH_OFST 0 */
 /*             MC_CMD_DRV_ATTACH_LBN 0 */
 /*             MC_CMD_DRV_ATTACH_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_WIDTH 1
+/*             MC_CMD_DRV_PREBOOT_OFST 0 */
 /*             MC_CMD_DRV_PREBOOT_LBN 1 */
 /*             MC_CMD_DRV_PREBOOT_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3263,6 +3423,7 @@
  */
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_LEN 4
+#define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_LBN 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_WIDTH 1
 
@@ -3381,8 +3542,10 @@
 #define	MC_CMD_PUTS_IN_STRING_NUM(len) (((len)-12)/1)
 #define	MC_CMD_PUTS_IN_DEST_OFST 0
 #define	MC_CMD_PUTS_IN_DEST_LEN 4
+#define	MC_CMD_PUTS_IN_UART_OFST 0
 #define	MC_CMD_PUTS_IN_UART_LBN 0
 #define	MC_CMD_PUTS_IN_UART_WIDTH 1
+#define	MC_CMD_PUTS_IN_PORT_OFST 0
 #define	MC_CMD_PUTS_IN_PORT_LBN 1
 #define	MC_CMD_PUTS_IN_PORT_WIDTH 1
 #define	MC_CMD_PUTS_IN_DHOST_OFST 4
@@ -3415,18 +3578,25 @@
 /* flags */
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_LBN 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN 1
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN 2
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_LBN 3
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_LBN 4
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_LBN 5
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_LBN 6
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_WIDTH 1
 /* ?? */
@@ -3435,46 +3605,67 @@
 /* Bitmask of supported capabilities */
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_OFST 8
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_LEN 4
+#define	MC_CMD_PHY_CAP_10HDX_OFST 8
 #define	MC_CMD_PHY_CAP_10HDX_LBN 1
 #define	MC_CMD_PHY_CAP_10HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10FDX_LBN 2
 #define	MC_CMD_PHY_CAP_10FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100HDX_OFST 8
 #define	MC_CMD_PHY_CAP_100HDX_LBN 3
 #define	MC_CMD_PHY_CAP_100HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100FDX_LBN 4
 #define	MC_CMD_PHY_CAP_100FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000HDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000HDX_LBN 5
 #define	MC_CMD_PHY_CAP_1000HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000FDX_LBN 6
 #define	MC_CMD_PHY_CAP_1000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10000FDX_LBN 7
 #define	MC_CMD_PHY_CAP_10000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_PAUSE_OFST 8
 #define	MC_CMD_PHY_CAP_PAUSE_LBN 8
 #define	MC_CMD_PHY_CAP_PAUSE_WIDTH 1
+#define	MC_CMD_PHY_CAP_ASYM_OFST 8
 #define	MC_CMD_PHY_CAP_ASYM_LBN 9
 #define	MC_CMD_PHY_CAP_ASYM_WIDTH 1
+#define	MC_CMD_PHY_CAP_AN_OFST 8
 #define	MC_CMD_PHY_CAP_AN_LBN 10
 #define	MC_CMD_PHY_CAP_AN_WIDTH 1
+#define	MC_CMD_PHY_CAP_40000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_40000FDX_LBN 11
 #define	MC_CMD_PHY_CAP_40000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_DDM_OFST 8
 #define	MC_CMD_PHY_CAP_DDM_LBN 12
 #define	MC_CMD_PHY_CAP_DDM_WIDTH 1
+#define	MC_CMD_PHY_CAP_100000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100000FDX_LBN 13
 #define	MC_CMD_PHY_CAP_100000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_25000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_25000FDX_LBN 14
 #define	MC_CMD_PHY_CAP_25000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_50000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_50000FDX_LBN 15
 #define	MC_CMD_PHY_CAP_50000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_LBN 16
 #define	MC_CMD_PHY_CAP_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_LBN 17
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_LBN 18
 #define	MC_CMD_PHY_CAP_RS_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_LBN 19
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_LBN 20
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_LBN 21
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_WIDTH 1
 /* ?? */
@@ -4089,20 +4280,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4112,12 +4311,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_LEN 4
+#define	MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1
+#define	MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1
 
@@ -4145,20 +4348,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4168,12 +4379,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_LEN 4
+/*             MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1 */
 /* True local device capabilities (taking into account currently used PMD/MDI,
@@ -4197,24 +4412,36 @@
 /*               FEC_TYPE/TYPE */
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_LBN 4
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_LBN 5
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_HI_BER_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_OFST 40
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_LBN 9
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_WIDTH 1
 
 
 /***********************************/
@@ -4237,12 +4464,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_LEN 4
@@ -4267,12 +4500,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_LEN 4
@@ -4285,8 +4524,10 @@
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_SPEED_LEN 4
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_LEN 1
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_WIDTH 7
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_LBN 7
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_WIDTH 1
 
@@ -4340,8 +4581,10 @@
 #define	MC_CMD_SET_MAC_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_IN_FCNTL_OFST 20
@@ -4360,6 +4603,7 @@
 #define	MC_CMD_FCNTL_GENERATE 0x5
 #define	MC_CMD_SET_MAC_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_WIDTH 1
 
@@ -4378,8 +4622,10 @@
 #define	MC_CMD_SET_MAC_EXT_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_EXT_IN_FCNTL_OFST 20
@@ -4398,6 +4644,7 @@
 /*               MC_CMD_FCNTL_GENERATE 0x5 */
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_WIDTH 1
 /* Select which parameters to configure. A parameter will only be modified if
@@ -4407,14 +4654,19 @@
  */
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_LBN 2
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_LBN 3
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_LBN 4
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_WIDTH 1
 
@@ -4536,18 +4788,25 @@
 #define	MC_CMD_MAC_STATS_IN_DMA_ADDR_HI_OFST 4
 #define	MC_CMD_MAC_STATS_IN_CMD_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CMD_LEN 4
+#define	MC_CMD_MAC_STATS_IN_DMA_OFST 8
 #define	MC_CMD_MAC_STATS_IN_DMA_LBN 0
 #define	MC_CMD_MAC_STATS_IN_DMA_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CLEAR_LBN 1
 #define	MC_CMD_MAC_STATS_IN_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIOD_MS_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_LBN 16
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_WIDTH 16
 /* DMA length. Should be set to MAC_STATS_NUM_STATS * sizeof(uint64_t), as
@@ -5053,8 +5312,10 @@
 /*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_LEN 4 */
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_LEN 4
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_LBN 0
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_WIDTH 1
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_LBN 1
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_WIDTH 1
 
@@ -5211,18 +5472,25 @@
 #define	MC_CMD_NVRAM_INFO_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CRC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_LBN 3
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CMAC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_LBN 6
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_OUT_PHYSDEV_OFST 16
@@ -5242,14 +5510,19 @@
 #define	MC_CMD_NVRAM_INFO_V2_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PHYSDEV_OFST 16
@@ -5298,6 +5571,7 @@
 /*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
 
@@ -5477,10 +5751,13 @@
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_REBOOT_LEN 4
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_LBN 1
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_LBN 2
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_WIDTH 1
 
@@ -5676,6 +5953,7 @@
 #define	MC_CMD_REBOOT_MODE_SNAPPER 0x3
 /* enum: snapper fake POR */
 #define	MC_CMD_REBOOT_MODE_SNAPPER_POR 0x4
+#define	MC_CMD_REBOOT_MODE_IN_FAKE_OFST 0
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_LBN 7
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_WIDTH 1
 
@@ -5748,6 +6026,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -5970,6 +6249,7 @@
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_MASK_LEN 4
 /*            Enum values, see field(s): */
 /*               MC_CMD_SENSOR_INFO_OUT */
+#define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_OFST 0
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_LBN 31
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_WIDTH 1
 /* MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF */
@@ -6025,7 +6305,11 @@
 
 /* MC_CMD_READ_SENSORS_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_IN_LEN 8
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LO_OFST 0
@@ -6033,7 +6317,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_LEN 12
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LO_OFST 0
@@ -6044,7 +6332,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN_V2 msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_LEN 16
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LO_OFST 0
@@ -6055,6 +6347,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -6336,6 +6629,7 @@
 #define	MC_CMD_WORKAROUND_EXT_OUT_LEN 4
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_LEN 4
+#define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_WIDTH 1
 
@@ -6558,10 +6852,13 @@
 #define	MC_CMD_NVRAM_METADATA_OUT_TYPE_LEN 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_LBN 0
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_LBN 1
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_LBN 2
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_WIDTH 1
 /* Subtype ID code for content of this partition */
@@ -6686,6 +6983,7 @@
 #define	MC_CMD_CLP_IN_SET_MAC_V2_RESERVED_LEN 2
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_LBN 0
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_WIDTH 1
 
@@ -6700,6 +6998,7 @@
 /*            MC_CMD_CLP_IN_OP_LEN 4 */
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_LBN 0
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_WIDTH 1
 
@@ -6751,6 +7050,7 @@
 #define	MC_CMD_MUM_IN_LEN 4
 #define	MC_CMD_MUM_IN_OP_HDR_OFST 0
 #define	MC_CMD_MUM_IN_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_OP_OFST 0
 #define	MC_CMD_MUM_IN_OP_LBN 0
 #define	MC_CMD_MUM_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to MUM */
@@ -6892,6 +7192,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_IN_READ 0x0 /* enum */
@@ -6954,12 +7255,14 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_LBN 8
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_READ 0x0 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE 0x1 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG 0x2 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE 0x3 /* enum */
+#define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_LBN 16
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_WIDTH 8
 
@@ -6976,6 +7279,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_WIDTH 8
 
@@ -6985,6 +7289,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_WIDTH 8
 
@@ -6994,6 +7299,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_WIDTH 8
 
@@ -7004,8 +7310,10 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_LEN 4
+#define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_LBN 0
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_WIDTH 8
+#define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_LBN 8
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_WIDTH 8
 
@@ -7023,10 +7331,13 @@
 /* Control flags for clock programming */
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_LEN 4
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_LBN 0
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_LBN 1
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_LBN 2
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_WIDTH 1
 
@@ -7052,6 +7363,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_QSFP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_QSFP_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_WIDTH 4
 #define	MC_CMD_MUM_IN_QSFP_INIT 0x0 /* enum */
@@ -7238,10 +7550,13 @@
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MINNUM 1
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM 63
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM_MCDI2 255
+#define	MC_CMD_MUM_OUT_READ_SENSORS_READING_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_LBN 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_LBN 16
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_WIDTH 8
 
@@ -7267,8 +7582,10 @@
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LP_CAP_LEN 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_LEN 4
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_LBN 0
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_WIDTH 1
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_LBN 1
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_WIDTH 1
 
@@ -7313,8 +7630,10 @@
 /* Discrete (soldered) DDR resistor strap info */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_LEN 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_WIDTH 16
 /* Number of SODIMM info records */
@@ -7328,6 +7647,7 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MINNUM 2
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM 30
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM_MCDI2 126
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_WIDTH 8
 /* enum: SODIMM bank 1 (Top SODIMM for Sorrento) */
@@ -7336,10 +7656,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK2 0x1
 /* enum: Total number of SODIMM banks */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NUM_BANKS 0x2
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_LBN 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_WIDTH 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_LBN 20
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_WIDTH 4
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_POWERED 0x0 /* enum */
@@ -7348,10 +7671,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V5 0x3 /* enum */
 /* enum: Values 5-15 are reserved for future usage */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V8 0x4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_LBN 32
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_LBN 48
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_WIDTH 4
 /* enum: No module present */
@@ -7369,6 +7695,7 @@
 /* enum: Modules may or may not be present, but cannot establish contact by I2C
  */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_REACHABLE 0x6
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_LBN 52
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_WIDTH 12
 
@@ -7677,12 +8004,6 @@
 /* MC_CMD_EVENT_CTRL_OUT msgrequest */
 #define	MC_CMD_EVENT_CTRL_OUT_LEN 0
 
-/* MC_CMD_RESOURCE_SPECIFIER enum */
-/* enum: Any */
-#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
-/* enum: None */
-#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe
-
 /* EVB_PORT_ID structuredef */
 #define	EVB_PORT_ID_LEN 4
 #define	EVB_PORT_ID_PORT_ID_OFST 0
@@ -7902,24 +8223,34 @@
 #define	LICENSED_FEATURES_MASK_LEN 8
 #define	LICENSED_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_FEATURES_PIO_OFST 0
 #define	LICENSED_FEATURES_PIO_LBN 1
 #define	LICENSED_FEATURES_PIO_WIDTH 1
+#define	LICENSED_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_FEATURES_CLOCK_OFST 0
 #define	LICENSED_FEATURES_CLOCK_LBN 3
 #define	LICENSED_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_FEATURES_MASK_LBN 0
@@ -7932,36 +8263,52 @@
 #define	LICENSED_V3_APPS_MASK_LEN 8
 #define	LICENSED_V3_APPS_MASK_LO_OFST 0
 #define	LICENSED_V3_APPS_MASK_HI_OFST 4
+#define	LICENSED_V3_APPS_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_ONLOAD_LBN 0
 #define	LICENSED_V3_APPS_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_PTP_OFST 0
 #define	LICENSED_V3_APPS_PTP_LBN 1
 #define	LICENSED_V3_APPS_PTP_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_LBN 2
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARSECURE_OFST 0
 #define	LICENSED_V3_APPS_SOLARSECURE_LBN 3
 #define	LICENSED_V3_APPS_SOLARSECURE_WIDTH 1
+#define	LICENSED_V3_APPS_PERF_MONITOR_OFST 0
 #define	LICENSED_V3_APPS_PERF_MONITOR_LBN 4
 #define	LICENSED_V3_APPS_PERF_MONITOR_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_LBN 5
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_LBN 6
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_WIDTH 1
+#define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_OFST 0
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_LBN 7
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_WIDTH 1
+#define	LICENSED_V3_APPS_TCP_DIRECT_OFST 0
 #define	LICENSED_V3_APPS_TCP_DIRECT_LBN 8
 #define	LICENSED_V3_APPS_TCP_DIRECT_WIDTH 1
+#define	LICENSED_V3_APPS_LOW_LATENCY_OFST 0
 #define	LICENSED_V3_APPS_LOW_LATENCY_LBN 9
 #define	LICENSED_V3_APPS_LOW_LATENCY_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_LBN 10
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_LBN 11
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_LBN 12
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_WIDTH 1
+#define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_LBN 13
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_DSHBRD_OFST 0
 #define	LICENSED_V3_APPS_DSHBRD_LBN 14
 #define	LICENSED_V3_APPS_DSHBRD_WIDTH 1
+#define	LICENSED_V3_APPS_SCATRD_OFST 0
 #define	LICENSED_V3_APPS_SCATRD_LBN 15
 #define	LICENSED_V3_APPS_SCATRD_WIDTH 1
 #define	LICENSED_V3_APPS_MASK_LBN 0
@@ -7974,24 +8321,34 @@
 #define	LICENSED_V3_FEATURES_MASK_LEN 8
 #define	LICENSED_V3_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_V3_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_V3_FEATURES_PIO_OFST 0
 #define	LICENSED_V3_FEATURES_PIO_LBN 1
 #define	LICENSED_V3_FEATURES_PIO_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_V3_FEATURES_CLOCK_OFST 0
 #define	LICENSED_V3_FEATURES_CLOCK_LBN 3
 #define	LICENSED_V3_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_V3_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_V3_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_V3_FEATURES_MASK_LBN 0
@@ -8044,12 +8401,16 @@
  */
 #define	RSS_MODE_HASH_SELECTOR_OFST 0
 #define	RSS_MODE_HASH_SELECTOR_LEN 1
+#define	RSS_MODE_HASH_SRC_ADDR_OFST 0
 #define	RSS_MODE_HASH_SRC_ADDR_LBN 0
 #define	RSS_MODE_HASH_SRC_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_DST_ADDR_OFST 0
 #define	RSS_MODE_HASH_DST_ADDR_LBN 1
 #define	RSS_MODE_HASH_DST_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_SRC_PORT_OFST 0
 #define	RSS_MODE_HASH_SRC_PORT_LBN 2
 #define	RSS_MODE_HASH_SRC_PORT_WIDTH 1
+#define	RSS_MODE_HASH_DST_PORT_OFST 0
 #define	RSS_MODE_HASH_DST_PORT_LBN 3
 #define	RSS_MODE_HASH_DST_PORT_WIDTH 1
 #define	RSS_MODE_HASH_SELECTOR_LBN 0
@@ -8164,18 +8525,25 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_WIDTH 1
 #define	MC_CMD_INIT_EVQ_IN_TMR_MODE_OFST 20
@@ -8250,20 +8618,28 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LBN 7
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_WIDTH 4
 /* enum: All initialisation flags specified by host. */
@@ -8285,6 +8661,9 @@
  * MC_CMD_INIT_EVQ_V2/MC_CMD_INIT_EVQ_V2_OUT/FLAGS for list of affected flags.
  */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO 0x3
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_OFST 16
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_LBN 11
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_WIDTH 1
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_OFST 20
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_LEN 4
 /* enum: Disabled */
@@ -8335,12 +8714,16 @@
 /* Actual configuration applied on the card */
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_WIDTH 1
 
@@ -8401,20 +8784,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_UNUSED_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_LBN 10
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8458,20 +8849,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8487,8 +8886,10 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8496,10 +8897,13 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8542,20 +8946,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8571,8 +8983,10 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8580,10 +8994,13 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8655,20 +9072,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8684,8 +9109,10 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8693,10 +9120,13 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8781,20 +9211,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8810,8 +9248,10 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8819,10 +9259,13 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8939,22 +9382,31 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8995,30 +9447,51 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_LBN 12
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_LBN 13
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_LBN 14
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_LBN 15
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_LBN 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_LBN 17
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_LEN 4
@@ -9036,8 +9509,10 @@
 /* Flags related to Qbb flow control mode. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_WIDTH 3
 
@@ -9148,8 +9623,10 @@
 /* The handle of the target function. */
 #define	MC_CMD_PROXY_CMD_IN_TARGET_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_LEN 4
+#define	MC_CMD_PROXY_CMD_IN_TARGET_PF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_LBN 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_WIDTH 16
+#define	MC_CMD_PROXY_CMD_IN_TARGET_VF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_LBN 16
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_WIDTH 16
 #define	MC_CMD_PROXY_CMD_IN_VF_NULL 0xffff /* enum */
@@ -9213,6 +9690,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_IN_LEN 108
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9257,6 +9735,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_LEN 112
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9466,32 +9945,46 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_LBN 11
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9539,8 +10032,10 @@
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9606,60 +10101,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9707,8 +10230,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9744,8 +10269,10 @@
  */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9754,8 +10281,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -9827,9 +10356,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_IFRM_DST_IP_LEN 16
 
 /* MC_CMD_FILTER_OP_V3_IN msgrequest: FILTER_OP extension to support additional
- * filter actions for Intel's DPDK (Data Plane Development Kit, dpdk.org) via
- * its rte_flow API. This extension is only useful with the sfc_efx driver
- * included as part of DPDK, used in conjunction with the dpdk datapath
+ * filter actions for EF100. Some of these actions are also supported on EF10,
+ * for Intel's DPDK (Data Plane Development Kit, dpdk.org) via its rte_flow
+ * API. In the latter case, this extension is only useful with the sfc_efx
+ * driver included as part of DPDK, used in conjunction with the dpdk datapath
  * firmware variant.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_LEN 180
@@ -9850,60 +10380,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9951,8 +10509,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9988,8 +10548,10 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9998,8 +10560,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -10069,11 +10633,39 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_OFST 156
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_LEN 16
-/* Set an action for all packets matching this filter. The DPDK driver and dpdk
- * f/w variant use their own specific delivery structures, which are documented
- * in the DPDK Firmware Driver Interface (SF-119419-TC). Requesting anything
- * other than MATCH_ACTION_NONE when the NIC is running another f/w variant
- * will cause the filter insertion to fail with ENOTSUP.
+/* Flags controlling mutations of the user_mark and user_flag fields of
+ * matching packets, with logic as follows: if (req.MATCH_BITOR_FLAG == 1)
+ * user_flag = req.MATCH_SET_FLAG bit_or user_flag; else user_flag =
+ * req.MATCH_SET_FLAG; if (req.MATCH_SET_MARK == 0) user_mark = 0; else if
+ * (req.MATCH_BITOR_MARK == 1) user_mark = req.MATCH_SET_MARK bit_or user_mark;
+ * else user_mark = req.MATCH_SET_MARK; N.B. These flags overlap with the
+ * MATCH_ACTION field, which is deprecated in favour of this field. For the
+ * cases where these flags induce a valid encoding of the MATCH_ACTION field,
+ * the semantics agree.
+ */
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_LBN 0
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_LBN 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_LBN 2
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_LBN 3
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_WIDTH 1
+/* Deprecated: the overlapping MATCH_ACTION_FLAGS field exposes all of the
+ * functionality of this field in an ABI-backwards-compatible manner, and
+ * should be used instead. Any future extensions should be made to the
+ * MATCH_ACTION_FLAGS field, and not to this field. Set an action for all
+ * packets matching this filter. The DPDK driver and (on EF10) dpdk f/w variant
+ * use their own specific delivery structures, which are documented in the DPDK
+ * Firmware Driver Interface (SF-119419-TC). Requesting anything other than
+ * MATCH_ACTION_NONE on an EF10 NIC running another f/w variant will cause the
+ * filter insertion to fail with ENOTSUP.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_OFST 172
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_LEN 4
@@ -10164,6 +10756,10 @@
  * frames (Medford only)
  */
 #define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_ENCAP_RX_MATCHES 0x4
+/* enum: read the list of supported matches for the encapsulation detection
+ * rules inserted by MC_CMD_VNIC_ENCAP_RULE_ADD. (ef100 and later)
+ */
+#define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES 0x5
 
 /* MC_CMD_GET_PARSER_DISP_INFO_OUT msgresponse */
 #define	MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMIN 8
@@ -10198,6 +10794,7 @@
 /* bitfield of filter insertion restrictions */
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_LBN 0
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_WIDTH 1
 
@@ -10243,6 +10840,34 @@
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_OFST 32
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_LEN 4
 
+/* MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT msgresponse: This response is
+ * returned if a MC_CMD_GET_PARSER_DISP_INFO_IN request is sent with OP value
+ * OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES. It contains information about the
+ * supported match types that can be used in the encapsulation detection rules
+ * inserted by MC_CMD_VNIC_ENCAP_RULE_ADD.
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMIN 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX 252
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LEN(num) (8+4*(num))
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_NUM(len) (((len)-8)/4)
+/* The op code OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES is returned. */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_OFST 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_PARSER_DISP_INFO_IN/OP */
+/* number of supported match types */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_OFST 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_LEN 4
+/* array of supported match types (valid MATCH_FLAGS values for
+ * MC_CMD_VNIC_ENCAP_RULE_ADD) sorted in decreasing priority order
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_OFST 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MINNUM 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM 61
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM_MCDI2 253
+
 
 /***********************************/
 /* MC_CMD_PARSER_DISP_RW
@@ -10388,9 +11013,15 @@
 
 /* MC_CMD_GET_PORT_ASSIGNMENT_OUT msgresponse */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN 4
-/* Identifies the port assignment for this function. */
+/* Identifies the port assignment for this function. On EF100, it is possible
+ * for the function to have no network port assigned (either because it is not
+ * yet configured, or assigning a port to a given function personality makes no
+ * sense - e.g. virtio-blk), in which case the return value is NULL_PORT.
+ */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_OFST 0
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_LEN 4
+/* enum: Special value to indicate no port is assigned to a function. */
+#define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_NULL_PORT 0xffffffff
 
 
 /***********************************/
@@ -10497,6 +11128,7 @@
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_MAX_LEN 4
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_LBN 0
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF. */
@@ -10526,6 +11158,7 @@
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_MAX_LEN 4
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_LBN 0
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF, or 0 for no change, or
@@ -10619,10 +11252,13 @@
 /* Combined metadata field. */
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_LEN 4
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_WIDTH 8
 /* TXDPCPU raw table data for queue. */
@@ -10645,14 +11281,19 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LO_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_HI_OFST 60
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_LBN 40
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_WIDTH 24
 /* RXDPCPU raw table data for queue. */
@@ -10675,12 +11316,16 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LO_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_HI_OFST 92
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_WIDTH 8
 
@@ -10832,38 +11477,55 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_WIDTH 31
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_WIDTH 28
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_WIDTH 29
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_LBN 9
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_WIDTH 23
 
@@ -10886,32 +11548,46 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_LBN 10
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_WIDTH 22
 
@@ -11063,62 +11739,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11179,8 +11884,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11228,8 +11935,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11283,62 +11992,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11399,8 +12137,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11448,8 +12188,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11497,70 +12239,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11624,62 +12402,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11740,8 +12547,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11789,8 +12598,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11838,70 +12649,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11990,62 +12837,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12106,8 +12982,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12155,8 +13033,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12204,70 +13084,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12364,62 +13280,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12480,8 +13425,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12529,8 +13476,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12578,70 +13527,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12743,62 +13728,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12859,8 +13873,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12908,8 +13924,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12957,70 +13975,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -13128,190 +14182,2248 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
 
-
-/***********************************/
-/* MC_CMD_V2_EXTN
- * Encapsulation for a v2 extended command
+/* MC_CMD_GET_CAPABILITIES_V7_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LEN 152
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_V2_EXTN 0x7f
-
-/* MC_CMD_V2_EXTN_IN msgrequest */
-#define	MC_CMD_V2_EXTN_IN_LEN 4
-/* the extended command number */
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
-/* the actual length of the encapsulated command (which is not in the v1
- * header)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
-/* Type of command/response */
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
-/* enum: MCDI command directed to or response originating from the MC. */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
-/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
- * are not defined.
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_ALLOC
- * Allocate a pacer bucket (for qau rp or a snapper test)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
-#undef	MC_CMD_0xb2_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
-
-/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_FREE
- * Free a pacer bucket
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_FREE 0xb3
-#undef	MC_CMD_0xb3_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
-
-/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_INIT
- * Initialise pacer bucket with a given rate
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
  */
-#define	MC_CMD_TCM_BUCKET_INIT 0xb4
-#undef	MC_CMD_0xb4_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
-/* the desired maximum fill level */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_TXQ_INIT
- * Initialise txq in pacer with given options or set options
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT 0xb5
-#undef	MC_CMD_0xb5_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
-
-/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
-
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+
+/* MC_CMD_GET_CAPABILITIES_V8_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LEN 160
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_HI_OFST 156
+
+/* MC_CMD_GET_CAPABILITIES_V9_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LEN 184
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+
+/* MC_CMD_GET_CAPABILITIES_V10_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LEN 192
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+/* A bitmap of the queue sizes the device can provide, where bit N being set
+ * indicates that 2**N is a valid size. The device may be limited in the number
+ * of different queue sizes that can exist simultaneously, so a bit being set
+ * here does not guarantee that an attempt to create a queue of that size will
+ * succeed.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_OFST 184
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_LEN 4
+/* A bitmap of queue sizes that are always available, in the same format as
+ * SUPPORTED_QUEUE_SIZES. Attempting to create a queue with one of these sizes
+ * will never fail due to unavailability of the requested size.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
+
+
+/***********************************/
+/* MC_CMD_V2_EXTN
+ * Encapsulation for a v2 extended command
+ */
+#define	MC_CMD_V2_EXTN 0x7f
+
+/* MC_CMD_V2_EXTN_IN msgrequest */
+#define	MC_CMD_V2_EXTN_IN_LEN 4
+/* the extended command number */
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
+/* the actual length of the encapsulated command (which is not in the v1
+ * header)
+ */
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
+/* Type of command/response */
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
+/* enum: MCDI command directed to or response originating from the MC. */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
+/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
+ * are not defined.
+ */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_ALLOC
+ * Allocate a pacer bucket (for qau rp or a snapper test)
+ */
+#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
+#undef	MC_CMD_0xb2_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
+
+/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_FREE
+ * Free a pacer bucket
+ */
+#define	MC_CMD_TCM_BUCKET_FREE 0xb3
+#undef	MC_CMD_0xb3_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
+
+/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_INIT
+ * Initialise pacer bucket with a given rate
+ */
+#define	MC_CMD_TCM_BUCKET_INIT 0xb4
+#undef	MC_CMD_0xb4_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
+/* the desired maximum fill level */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_TXQ_INIT
+ * Initialise txq in pacer with given options or set options
+ */
+#define	MC_CMD_TCM_TXQ_INIT 0xb5
+#undef	MC_CMD_0xb5_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
+
+/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
+
 /* MC_CMD_TCM_TXQ_INIT_OUT msgresponse */
 #define	MC_CMD_TCM_TXQ_INIT_OUT_LEN 0
 
@@ -13387,6 +16499,7 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
 /* The number of VLAN tags to allow for attached v-ports. For VLAN aggregators,
@@ -13481,8 +16594,10 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_LBN 1
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -13494,8 +16609,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 
@@ -13542,8 +16659,10 @@
 /* Flags controlling v-adaptor creation */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_WIDTH 1
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 1
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
 /* The number of VLAN tags to strip on receive */
@@ -13555,8 +16674,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 /* The MAC address to assign to this v-adaptor */
@@ -13677,8 +16798,10 @@
 /* The target function to modify. */
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_LEN 4
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_LBN 0
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_WIDTH 16
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_LBN 16
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_WIDTH 16
 
@@ -13792,12 +16915,68 @@
  * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_SHARED 0x1
-/* Number of queues spanned by this context, in the range 1-64; valid offsets
- * in the indirection table will be in the range 0 to NUM_QUEUES-1.
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_OFST 8
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_LEN 4
 
+/* MC_CMD_RSS_CONTEXT_ALLOC_V2_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_LEN 16
+/* The handle of the owning upstream port */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_LEN 4
+/* The type of context to allocate */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_OFST 4
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_LEN 4
+/* enum: Allocate a context for exclusive use. The key and indirection table
+ * must be explicitly configured.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EXCLUSIVE 0x0
+/* enum: Allocate a context for shared use; this will spread across a range of
+ * queues, but the key and indirection table are pre-configured and may not be
+ * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_SHARED 0x1
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_OFST 8
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_LEN 4
+/* Size of indirection table to be allocated to this context from the pool.
+ * Must be a power of 2. The minimum and maximum table size can be queried
+ * using MC_CMD_GET_CAPABILITIES_V9. If there is not enough space remaining in
+ * the common pool to allocate the requested table size, due to allocating
+ * table space to other RSS contexts, then the command will fail with
+ * MC_CMD_ERR_ENOSPC.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_OFST 12
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_LEN 4
+
 /* MC_CMD_RSS_CONTEXT_ALLOC_OUT msgresponse */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN 4
 /* The handle of the new RSS context. This should be considered opaque to the
@@ -13875,7 +17054,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_TABLE
- * Set the indirection table for an RSS context.
+ * Set the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_SET_TABLE 0xa2
 #undef	MC_CMD_0xa2_PRIVILEGE_CTG
@@ -13897,7 +17078,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_GET_TABLE
- * Get the indirection table for an RSS context.
+ * Get the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE 0xa3
 #undef	MC_CMD_0xa3_PRIVILEGE_CTG
@@ -13917,6 +17100,93 @@
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE_OUT_INDIRECTION_TABLE_LEN 128
 
 
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE
+ * Write a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_SET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE 0x13e
+#undef	MC_CMD_0x13e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMIN 8
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LEN(num) (4+4*(num))
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_NUM(len) (((len)-4)/4)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array of index-value pairs to be written to the table. Structure is
+ * MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_LEN 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM 62
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM_MCDI2 254
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT_LEN 0
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY structuredef */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_LEN 4
+/* The index of the table entry to be written. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LBN 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_WIDTH 16
+/* The value to write into the table entry. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_OFST 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LBN 16
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_WIDTH 16
+
+
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_READ_TABLE
+ * Read a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_GET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE 0x13f
+#undef	MC_CMD_0x13f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13f_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMIN 6
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LEN(num) (4+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_NUM(len) (((len)-4)/2)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array containing the indices of the entries to be read. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM 124
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM_MCDI2 508
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMIN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LEN(num) (0+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_NUM(len) (((len)-0)/2)
+/* A buffer containing the requested entries read from the table. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM 126
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM_MCDI2 510
+
+
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_FLAGS
  * Set various control flags for an RSS context.
@@ -13945,26 +17215,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14004,26 +17285,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14275,8 +17567,10 @@
 /* Flags requesting what should be changed. */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_WIDTH 1
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_LBN 1
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -14288,8 +17582,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_WIDTH 16
 /* The number of MAC addresses to add */
@@ -14304,6 +17600,7 @@
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_LEN 4
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_WIDTH 1
 
@@ -14383,8 +17680,10 @@
 #define	MC_CMD_SET_RXDP_CONFIG_IN_LEN 4
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_LEN 4
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_WIDTH 2
 /* enum: pad to 64 bytes */
@@ -14414,8 +17713,10 @@
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_LEN 4
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_LEN 4
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_WIDTH 2
 /*             Enum values, see field(s): */
@@ -14564,6 +17865,7 @@
  */
 #define	MC_CMD_DPCPU_RPC_IN_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_LBN 8
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_WIDTH 8
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_TXDPCPU_READ 0x6 /* enum */
@@ -14575,14 +17877,19 @@
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SELF_TEST 0x4a /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_CSR_ACCESS 0x4c /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SET_MC_REPLAY_CNTXT 0x4d /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_WIDTH 240
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_STOP_RETURN_RESULT 0x0 /* enum */
@@ -14590,17 +17897,22 @@
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE_READ 0x3 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_PIPELINED_READ 0x4 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_LBN 80
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_CUT_THROUGH 0x1 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD_FIRST 0x3 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_WDATA_OFST 12
@@ -14619,8 +17931,10 @@
 /* DATA */
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_LBN 32
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_OUT_RDATA_OFST 12
@@ -15122,6 +18436,7 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15, Huntington) */
@@ -15248,6 +18563,7 @@
 /* enum: DFE Tap5 - retimer hostside (Medford2 with DS250x retimer (-15 - 15))
  */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_DFE_TAP5_RT_HS 0x2d
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15255,12 +18571,16 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15282,20 +18602,26 @@
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15323,6 +18649,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TX Amplitude (Huntington, Medford, Medford2) */
@@ -15363,6 +18690,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_ADV_RT_HS 0x11
 /* enum: Post-cursor Tap (Retimer Hostside) */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_DLY_RT_HS 0x12
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15370,10 +18698,13 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_WIDTH 8
 
@@ -15395,18 +18726,23 @@
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15447,8 +18783,10 @@
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_WIDTH 1
 /* Scan duration / cycle count */
@@ -15489,8 +18827,10 @@
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_WIDTH 1
 
@@ -15644,6 +18984,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15) */
@@ -15668,6 +19009,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQC 0x9
 /* enum: CTLE EQ Resistor (DC Gain) */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQRES 0xa
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 5
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15687,10 +19029,13 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_14 0xe /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_15 0xf /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_ALL 0x10 /* enum */
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 10
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15712,20 +19057,26 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 5
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 2
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15753,6 +19104,7 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TxMargin (PIPE) */
@@ -15765,12 +19117,15 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_C0 0x3
 /* enum: De-emphasis coefficient C(+1) (PIPE) */
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_CP1 0x4
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 12
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -16335,8 +19690,10 @@
 /* configuration flags */
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_LBN 1
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16379,8 +19736,10 @@
 /* configuration flags */
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_LBN 1
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16501,6 +19860,7 @@
 /* configuration flags */
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16543,6 +19903,7 @@
 /* configuration flags */
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16576,6 +19937,7 @@
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RX_QUEUE_LEN 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_LEN 4
+#define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_LBN 0
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_WIDTH 1
 
@@ -16699,6 +20061,7 @@
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_LEN 8
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_LEN 4
+#define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_LBN 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_WIDTH 1
 /* New mode (TLV_PORT_MODE_*) to set, if override enabled */
@@ -16792,8 +20155,10 @@
  */
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_WIDTH 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_VF_NULL 0xffff /* enum */
@@ -16866,8 +20231,10 @@
  */
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_LEN 4
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_WIDTH 16
 /* New link state mode to be set */
@@ -16986,8 +20353,10 @@
 /* For VFS_OF_PF specify the PF, for ONE specify the target function */
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_WIDTH 16
 /* Privileges to be added to the target functions. For privilege definitions
@@ -17342,34 +20711,49 @@
 /* fields to include in match criteria */
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_LBN 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_LBN 1
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_LBN 2
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_LBN 3
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_LBN 4
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_LBN 5
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_LBN 10
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_LBN 11
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_LBN 12
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_LBN 13
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_LBN 14
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_WIDTH 1
 /* remote MAC address to match (as bytes in network order) */
@@ -17792,6 +21176,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_WIDTH 1
 /* The number of entries in the ENTRIES array */
@@ -17811,6 +21196,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_WIDTH 1
 
@@ -18871,10 +22257,13 @@
 /* Flags specifying what type of security features are being set */
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_LBN 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_LBN 1
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_LBN 31
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_WIDTH 1
 
@@ -18909,6 +22298,7 @@
 #define	MC_CMD_TSA_INFO_IN_LEN 4
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_OP_WIDTH 16
 /* enum: Information about recently discovered local IP address of the adapter
@@ -18946,10 +22336,13 @@
  */
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_LBN 8
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_LBN 16
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_WIDTH 8
 /* enum: ARP reply sent out of the physical port */
@@ -18960,8 +22353,10 @@
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_GRATUITOUS_ARP 0x2
 /* enum: DHCP ACK packet received on the physical port */
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_DHCP_ACK 0x3
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_LBN 24
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_LBN 25
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_WIDTH 7
 /* IPV4 address retrieved from the sampled packets. This field is relevant only
@@ -19001,18 +22396,25 @@
 /* Additional metadata describing the sampled packet */
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_LBN 8
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_LBN 9
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_WIDTH 7
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_WIDTH 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_LBN 17
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_LBN 18
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_WIDTH 1
 /* 128-byte raw prefix of the sampled packet which includes the ethernet
@@ -19034,6 +22436,7 @@
 #define	MC_CMD_TSA_INFO_IN_UNBIND_LEN 12
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_UNBIND_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_WIDTH 16
 /* Type of the unbind attempt. */
@@ -19072,6 +22475,7 @@
 /* sub-operation code info */
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_HOST_INFO_IN_OP_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_LBN 0
 #define	MC_CMD_HOST_INFO_IN_OP_WIDTH 16
 /* enum: Read a 16-byte unique host identifier from the adapter. This UUID
@@ -19138,6 +22542,7 @@
 /* sub-operation code info */
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSAN_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSAN_INFO_IN_OP_WIDTH 16
 /* enum: Read configuration parameters and IDs that uniquely identify an
@@ -19157,10 +22562,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19181,10 +22589,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19270,8 +22681,10 @@
 /* Parameters describing the statistics operation */
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_LEN 4
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_LBN 0
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_WIDTH 1
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_LBN 1
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_WIDTH 1
 /* Counter ID list specification type */
@@ -19458,6 +22871,7 @@
  */
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_OFST 0
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LEN 4
+#define	MC_TSA_IPV4_ITEM_PORT_IDX_OFST 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_LBN 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_WIDTH 8
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LBN 0
@@ -19488,6 +22902,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_WIDTH 16
 /* enum: Request that the adapter verifies that the IPv4 addresses supplied are
@@ -19516,6 +22931,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to validate. */
@@ -19545,6 +22961,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to remove. */
@@ -19579,6 +22996,7 @@
 /* sub-operation code info */
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_SECURE_NIC_INFO_IN_OP_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_LBN 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_WIDTH 16
 /* enum: Get the status of various security settings, all signed along with a
@@ -19811,6 +23229,12 @@
  * FRU_INFORMATION partition. Attempts to write to read-only FRUs are rejected.
  */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE 0x7
+/* enum: Read UDID Vendor Specific ID from SUC persistent storage. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ 0x8
+/* enum: Write UDID Vendor Specific ID to SUC persistent storage for use in
+ * SMBus ARP.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE 0x9
 
 /* MC_CMD_SUC_MANFTEST_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_OUT_LEN 0
@@ -19867,12 +23291,16 @@
 /* The combined status of the calibration operation. */
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_LBN 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_LBN 1
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_LBN 2
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_WIDTH 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_LBN 6
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_WIDTH 2
 
@@ -19936,6 +23364,34 @@
 /* MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT_LEN 0
 
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_LEN 4
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_READ.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_LEN 8
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_OFST 4
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT_LEN 0
+
 
 /***********************************/
 /* MC_CMD_GET_CERTIFICATE
@@ -20112,10 +23568,13 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_NUM(len) (((len)-8)/8)
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_LEN 4
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_LBN 1
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_LBN 31
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_WIDTH 1
 /* The number of rows present in this response. */
@@ -20128,12 +23587,16 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MINNUM 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM 30
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM_MCDI2 126
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_WIDTH 6
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_LBN 6
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_LBN 7
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_LBN 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_WIDTH 24
 /* The time of the LTSSM transition. Times are reported as fractional
@@ -20184,14 +23647,19 @@
  */
 #define	TELEMETRY_CONFIG_FLAGS_OFST 0
 #define	TELEMETRY_CONFIG_FLAGS_LEN 4
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_LBN 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_LBN 1
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_LBN 2
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_LBN 3
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_RESERVED1_OFST 0
 #define	TELEMETRY_CONFIG_RESERVED1_LBN 4
 #define	TELEMETRY_CONFIG_RESERVED1_WIDTH 28
 #define	TELEMETRY_CONFIG_FLAGS_LBN 0
@@ -20320,24 +23788,34 @@
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LEN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LO_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_HI_OFST 4
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_LBN 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_LBN 1
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_LBN 2
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_LBN 3
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_LBN 4
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_LBN 5
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_LBN 6
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_LBN 7
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_LBN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_LBN 9
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_WIDTH 1
 
@@ -20534,36 +24012,24 @@
 
 /* MC_CMD_GET_VPD_IN msgresponse */
 #define	MC_CMD_GET_VPD_IN_LEN 4
-/* To request only VPD tags from a certain origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_OFST 0
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LEN 2
-/* enum: Return all VPD regardless of origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_ALL 0x0
-/* enum: Return only VPD tags generated by MCFW (not stored in NVRAM) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LIVE 0x1
-/* enum: Return only VPD tags stored in NVRAM (not generated by MCFW) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_NVRAM 0x2
 /* VPD address to start from. In case VPD is longer than MCDI buffer
  * (unlikely), user can make multiple calls with different starting addresses.
  */
-#define	MC_CMD_GET_VPD_IN_ADDR_OFST 2
-#define	MC_CMD_GET_VPD_IN_ADDR_LEN 2
+#define	MC_CMD_GET_VPD_IN_ADDR_OFST 0
+#define	MC_CMD_GET_VPD_IN_ADDR_LEN 4
 
 /* MC_CMD_GET_VPD_OUT msgresponse */
-#define	MC_CMD_GET_VPD_OUT_LENMIN 5
+#define	MC_CMD_GET_VPD_OUT_LENMIN 0
 #define	MC_CMD_GET_VPD_OUT_LENMAX 252
 #define	MC_CMD_GET_VPD_OUT_LENMAX_MCDI2 1020
-#define	MC_CMD_GET_VPD_OUT_LEN(num) (4+1*(num))
-#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-4)/1)
-/* Length of VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATALEN_OFST 0
-#define	MC_CMD_GET_VPD_OUT_DATALEN_LEN 4
+#define	MC_CMD_GET_VPD_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-0)/1)
 /* VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATA_OFST 4
+#define	MC_CMD_GET_VPD_OUT_DATA_OFST 0
 #define	MC_CMD_GET_VPD_OUT_DATA_LEN 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 248
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1016
+#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 0
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 252
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1020
 
 
 /***********************************/
@@ -20599,12 +24065,16 @@
 /* General status */
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_LEN 4
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_LBN 0
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_WIDTH 2
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_LBN 2
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_LBN 3
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_LBN 4
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_WIDTH 1
 
@@ -20632,59 +24102,55 @@
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_OFST 24
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_LEN 4
 
-/* EF100_MCDI_EVENT structuredef: The structure of an MCDI_EVENT on EF100
- * platforms
+
+/***********************************/
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN
+ * System lockdown, when enabled firmware updates are blocked.
  */
-#define	EF100_MCDI_EVENT_LEN 8
-/* Defined by QMDA. Will be 1 for all SFC events */
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_LBN 0
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_WIDTH 1
-/* Defined by QMDA. The phase bit, changes each time round the event ring */
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_LBN 1
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
-/* Defined by QDMA. Meaning unclear. */
-#define	EF100_MCDI_EVENT_EV_ERROR_LBN 2
-#define	EF100_MCDI_EVENT_EV_ERROR_WIDTH 1
-/* Defined by QMDA. Indicates a descriptor was consumed. */
-#define	EF100_MCDI_EVENT_EV_DESC_USED_LBN 3
-#define	EF100_MCDI_EVENT_EV_DESC_USED_WIDTH 1
-/* Indicates the top-level type of the event. Event types are as documented in
- * SF-119689-TC and defined in events.yml. For MCDI events it's always
- * EF100_EV_MCDI. HW can generate other event type for its events.
- */
-#define	EF100_MCDI_EVENT_EV_TYPE_LBN 4
-#define	EF100_MCDI_EVENT_EV_TYPE_WIDTH 4
-#define	EF100_MCDI_EVENT_CODE_OFST 1
-#define	EF100_MCDI_EVENT_CODE_LEN 1
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/CODE */
-#define	EF100_MCDI_EVENT_CODE_LBN 8
-#define	EF100_MCDI_EVENT_CODE_WIDTH 8
-/* Data associated with PTP events which doesn't fit into the main DATA field
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN 0x16f
+#undef	MC_CMD_0x16f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16f_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_IN msgrequest: This MCDI command is to enable
+ * only because lockdown can only be disabled by a PMCI command or a cold reset
+ * of the system.
  */
-#define	EF100_MCDI_EVENT_PTP_DATA_OFST 2
-#define	EF100_MCDI_EVENT_PTP_DATA_LEN 1
-#define	EF100_MCDI_EVENT_PTP_DATA_LBN 16
-#define	EF100_MCDI_EVENT_PTP_DATA_WIDTH 8
-/* Alias for PTP_DATA. Nobody uses SRC to mean the source of anything, but
- * there's code that uses it to refer to ptp data
- */
-#define	EF100_MCDI_EVENT_SRC_OFST 2
-#define	EF100_MCDI_EVENT_SRC_LEN 1
-#define	EF100_MCDI_EVENT_SRC_LBN 16
-#define	EF100_MCDI_EVENT_SRC_WIDTH 8
-/* Set if this message continues into another event */
-#define	EF100_MCDI_EVENT_CONT_LBN 24
-#define	EF100_MCDI_EVENT_CONT_WIDTH 1
-#define	EF100_MCDI_EVENT_LEVEL_LBN 25
-#define	EF100_MCDI_EVENT_LEVEL_WIDTH 3
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/LEVEL */
-/* Data associated with this event. Format depends on the event code. */
-#define	EF100_MCDI_EVENT_DATA_OFST 4
-#define	EF100_MCDI_EVENT_DATA_LEN 4
-#define	EF100_MCDI_EVENT_DATA_LBN 32
-#define	EF100_MCDI_EVENT_DATA_WIDTH 32
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_IN_LEN 0
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT msgresponse */
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_TEST_FEATURES
+ * This command returns device details knowledge of which may be required by
+ * test infrastructure. Although safe, it is not intended to be used by
+ * production drivers, and the structure returned intentionally has no public
+ * documentation.
+ */
+#define	MC_CMD_GET_TEST_FEATURES 0x1ac
+#undef	MC_CMD_0x1ac_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ac_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_TEST_FEATURES_IN msgrequest: Request test features. */
+#define	MC_CMD_GET_TEST_FEATURES_IN_LEN 0
+
+/* MC_CMD_GET_TEST_FEATURE_OUT msgresponse */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMIN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX 252
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LEN(num) (0+4*(num))
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_NUM(len) (((len)-0)/4)
+/* Test-specific NIC information. Production drivers must treat this as opaque.
+ * The layout is defined in the private TEST_FEATURES_LAYOUT structure.
+ */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_OFST 0
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_LEN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MINNUM 1
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM 63
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM_MCDI2 255
 
 /* CLOCK_INFO structuredef: Information about a single hardware clock */
 #define	CLOCK_INFO_LEN 28
@@ -20710,6 +24176,7 @@
 /* Assorted flags */
 #define	CLOCK_INFO_FLAGS_OFST 2
 #define	CLOCK_INFO_FLAGS_LEN 2
+#define	CLOCK_INFO_SETTABLE_OFST 2
 #define	CLOCK_INFO_SETTABLE_LBN 0
 #define	CLOCK_INFO_SETTABLE_WIDTH 1
 #define	CLOCK_INFO_FLAGS_LBN 16
@@ -20754,4 +24221,1240 @@
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM 9
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM_MCDI2 36
 
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_ADD
+ * Add a rule for detecting encapsulations in the VNIC stage. Currently this only affects checksum validation in VNIC RX - on TX the send descriptor explicitly specifies encapsulation. These rules are per-VNIC, i.e. only apply to the current driver. If a rule matches, then the packet is considered to have the corresponding encapsulation type, and the inner packet is parsed. It is up to the driver to ensure that overlapping rules are not inserted. (If a packet would match multiple rules, a random one of them will be used.) A rule with the exact same match criteria may not be inserted twice (EALREADY). Only a limited number MATCH_FLAGS values are supported, use MC_CMD_GET_PARSER_DISP_INFO with OP OP_GET_SUPPORTED_VNIC_ENCAP_RULE_MATCHES to get a list of supported combinations. Each driver may only have a limited set of active rules - returns ENOSPC if the caller's table is full.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD 0x16d
+#undef	MC_CMD_0x16d_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16d_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN 36
+/* Set to MAE_MPORT_SELECTOR_ASSIGNED. In the future this may be relaxed. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_LEN 4
+/* Any non-zero bits other than the ones named below or an unsupported
+ * combination will cause the NIC to return EOPNOTSUPP. In the future more
+ * flags may be added.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_LEN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN 3
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_WIDTH 1
+/* Only if MATCH_ETHER_TYPE is set. Ethertype value as bytes in network order.
+ * Currently only IPv4 (0x0800) and IPv6 (0x86DD) ethertypes may be used.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_OFST 8
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_LEN 2
+/* Only if MATCH_OUTER_VLAN is set. VID value as bytes in network order.
+ * (Deprecated)
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_LBN 80
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WIDTH 12
+/* Only if MATCH_OUTER_VLAN is set. Aligned wrapper for OUTER_VLAN_VID. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_LEN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_WIDTH 12
+/* Only if MATCH_DST_IP is set. IP address as bytes in network order. In the
+ * case of IPv4, the IP should be in the first 4 bytes and all other bytes
+ * should be zero.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_OFST 12
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN 16
+/* Only if MATCH_IP_PROTO is set. Currently only UDP proto (17) may be used. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_OFST 28
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_LEN 1
+/* Actions that should be applied to packets match the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_LEN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_WIDTH 1
+/* Only if MATCH_DST_PORT is set. Port number as bytes in network order. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_OFST 30
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_LEN 2
+/* Resulting encapsulation type, as per MAE_MCDI_ENCAP_TYPE enumeration. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_OFST 32
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN 4
+/* Handle to inserted rule. Used for removing the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE
+ * Remove a VNIC encapsulation rule. Packets which would have previously matched the rule will then be considered as unencapsulated. Returns EALREADY if the input HANDLE doesn't correspond to an existing rule.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE 0x16e
+#undef	MC_CMD_0x16e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN 4
+/* Handle which was returned by MC_CMD_VNIC_ENCAP_RULE_ADD. */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN 0
+
+/* UUID structuredef: An RFC4122 standard UUID. The values here are stored in
+ * the endianness specified by the RFC; users should ignore the broken-out
+ * fields and instead do straight memory copies to ensure correct ordering.
+ */
+#define	UUID_LEN 16
+#define	UUID_TIME_LOW_OFST 0
+#define	UUID_TIME_LOW_LEN 4
+#define	UUID_TIME_LOW_LBN 0
+#define	UUID_TIME_LOW_WIDTH 32
+#define	UUID_TIME_MID_OFST 4
+#define	UUID_TIME_MID_LEN 2
+#define	UUID_TIME_MID_LBN 32
+#define	UUID_TIME_MID_WIDTH 16
+#define	UUID_TIME_HI_LBN 52
+#define	UUID_TIME_HI_WIDTH 12
+#define	UUID_VERSION_LBN 48
+#define	UUID_VERSION_WIDTH 4
+#define	UUID_RESERVED_LBN 64
+#define	UUID_RESERVED_WIDTH 2
+#define	UUID_CLK_SEQ_LBN 66
+#define	UUID_CLK_SEQ_WIDTH 14
+#define	UUID_NODE_OFST 10
+#define	UUID_NODE_LEN 6
+#define	UUID_NODE_LBN 80
+#define	UUID_NODE_WIDTH 48
+
+/* MC_CMD_DEVEL_DUMP_VI_ENTRY structuredef */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_LEN 16
+/* Type of entry */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_C2H 0x0 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_H2C 0x1 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_C2H 0x2 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_H2C 0x3 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_C2H 0x4 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_H2C 0x5 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_WRB 0x6 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_PFTCH 0x7 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_QTBL 0x100 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_C2H_QTBL 0x101 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_VIO 0x10a /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_WIDTH 32
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LBN 32
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_WIDTH 32
+/* Size of entry data */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_OFST 8
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LBN 64
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_WIDTH 32
+/* Offset of entry data from start of MCDI message response payload */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_OFST 12
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LBN 96
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DEVEL_DUMP_VI
+ * Dump various parts of the hardware's state for a VI.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI 0x1b5
+#undef	MC_CMD_0x1b5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1b5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_DEVEL_DUMP_VI_IN msgrequest */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_LEN 4
+/* Absolute queue id of queue to dump state for */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_LEN 4
+
+/* MC_CMD_DEVEL_DUMP_VI_OUT msgresponse */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMIN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX_MCDI2 1012
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_NUM(len) (((len)-0)/1)
+/* Number of dump entries returned */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_WIDTH 8
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM_MCDI2 1020
+/* Array of MC_CMD_DEVEL_DUMP_VI_ENTRY structures of length NUM_ENTRIES */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_LEN 16
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM 15
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM_MCDI2 63
+
+/* FUNCTION_PERSONALITY structuredef: The meanings of the personalities are
+ * defined in SF-120734-TC with more information in SF-122717-TC.
+ */
+#define	FUNCTION_PERSONALITY_LEN 4
+#define	FUNCTION_PERSONALITY_ID_OFST 0
+#define	FUNCTION_PERSONALITY_ID_LEN 4
+/* enum: Function has no assigned personality */
+#define	FUNCTION_PERSONALITY_NULL 0x0
+/* enum: Function has an EF100-style function control window and VI windows
+ * with both EF100 and vDPA doorbells.
+ */
+#define	FUNCTION_PERSONALITY_EF100 0x1
+/* enum: Function has virtio net device configuration registers and doorbells
+ * for virtio queue pairs.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_NET 0x2
+/* enum: Function has virtio block device configuration registers and a
+ * doorbell for a single virtqueue.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_BLK 0x3
+/* enum: Function is a Xilinx acceleration device - management function */
+#define	FUNCTION_PERSONALITY_ACCEL_MGMT 0x4
+/* enum: Function is a Xilinx acceleration device - user function */
+#define	FUNCTION_PERSONALITY_ACCEL_USR 0x5
+#define	FUNCTION_PERSONALITY_ID_LBN 0
+#define	FUNCTION_PERSONALITY_ID_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_FEATURES
+ * Get a list of the virtio features supported by the device.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES 0x168
+#undef	MC_CMD_0x168_PRIVILEGE_CTG
+
+#define	MC_CMD_0x168_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_LEN 4
+/* Type of device to get features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_LEN 4
+/* enum: Reserved. Do not use. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_RESERVED 0x0
+/* enum: Net device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_NET 0x1
+/* enum: Block device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_BLOCK 0x2
+
+/* MC_CMD_VIRTIO_GET_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_LEN 8
+/* Features supported by the device. The result is a bitfield in the format of
+ * the feature bits of the specified device type as defined in the virtIO 1.1
+ * specification ( https://docs.oasis-
+ * open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.pdf )
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LO_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_HI_OFST 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_TEST_FEATURES
+ * Query whether a given set of features is supported. Fails with ENOSUP if the
+ * driver requests a feature the device doesn't support. Fails with EINVAL if
+ * the driver fails to request a feature which the device requires.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES 0x169
+#undef	MC_CMD_0x169_PRIVILEGE_CTG
+
+#define	MC_CMD_0x169_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_LEN 16
+/* Type of device to test features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_OFST 4
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_LEN 4
+/* Features requested. Same format as the returned value from
+ * MC_CMD_VIRTIO_GET_FEATURES.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LO_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_HI_OFST 12
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_INIT_QUEUE
+ * Create a virtio virtqueue. Fails with EALREADY if the queue already exists.
+ * Fails with ENOSUP if a feature is requested that isn't supported. Fails with
+ * EINVAL if a required feature isn't requested, or any other parameter is
+ * invalid.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE 0x16a
+#undef	MC_CMD_0x16a_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16a_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_LEN 68
+/* Type of virtqueue to create. A network rxq and a txq can exist at the same
+ * time on a single VI.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/* enum: A network device receive queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_RXQ 0x0
+/* enum: A network device transmit queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_TXQ 0x1
+/* enum: A block device request queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_BLOCK 0x2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, create the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, create queue on the PF. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_VF_NULL 0xffff
+/* Desired instance. This is the function-local index of the associated VI, not
+ * the virtqueue number as counted by the virtqueue spec.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_LEN 4
+/* Queue size, in entries. Must be a power of two. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_OFST 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_LEN 4
+/* Flags */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_LEN 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_LBN 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_WIDTH 1
+/* Address of the descriptor table in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LO_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_HI_OFST 20
+/* Address of the available ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LO_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_HI_OFST 28
+/* Address of the used ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LO_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_HI_OFST 36
+/* PASID to use on PCIe transactions involving this queue. Ignored if the
+ * USE_PASID flag is not set.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_OFST 40
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_LEN 4
+/* Which MSIX vector to use for this virtqueue, or NO_VECTOR if MSIX should not
+ * be used.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_OFST 44
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_LEN 2
+/* enum: Do not enable interrupts for this virtqueue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NO_VECTOR 0xffff
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_OFST 46
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_LEN 2
+/* Virtio features to apply to this queue. Same format as the in the virtio
+ * spec and in the return from MC_CMD_VIRTIO_GET_FEATURES. Must be a subset of
+ * the features returned from MC_CMD_VIRTIO_GET_FEATURES. Features are per-
+ * queue because with vDPA multiple queues on the same function can be passed
+ * through to different virtual hosts as independent devices.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LO_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_HI_OFST 52
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_OUT/FEATURES */
+/* The inital producer index for this queue's used ring. If this queue is being
+ * created to be migrated into, this should be the FINAL_PIDX value returned by
+ * MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from. Otherwise, it
+ * should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_OFST 56
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_LEN 4
+/* The inital consumer index for this queue's available ring. If this queue is
+ * being created to be migrated into, this should be the FINAL_CIDX value
+ * returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
+ * Otherwise, it should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_OFST 60
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_LEN 4
+/* A MAE_MPORT_SELECTOR defining which mport this queue should be associated
+ * with. Use MAE_MPORT_SELECTOR_ASSIGNED to request the default mport for the
+ * function this queue is being created on.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_OFST 64
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_LEN 4
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_RESP_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_FINI_QUEUE
+ * Destroy a virtio virtqueue
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE 0x16b
+#undef	MC_CMD_0x16b_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16b_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_LEN 8
+/* Type of virtqueue to destroy. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_INIT_QUEUE/MC_CMD_VIRTIO_INIT_QUEUE_REQ/QUEUE_TYPE */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, destroy the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, destroy the queue on the PF. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_VF_NULL 0xffff
+/* Instance to destroy */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_LEN 8
+/* The producer index of the used ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_LEN 4
+/* The consumer index of the available ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET
+ * Get the offset in the BAR of the doorbells for a VI. Doesn't require the
+ * queue(s) to be allocated.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET 0x16c
+#undef	MC_CMD_0x16c_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16c_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ msgrequest */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_LEN 8
+/* Type of device to get information for. Matches the device id as defined by
+ * the virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, query the VI
+ * on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_LEN 2
+/* enum: No VF, query the PF. */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_VF_NULL 0xffff
+/* VI instance to query */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_LEN 8
+/* Offset of RX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_LEN 4
+/* Offset of TX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_OFST 4
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_LEN 4
+
+/* MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_LEN 4
+/* Offset of request doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_LEN 4
+
+/* PCIE_FUNCTION structuredef: Structure representing a PCIe function ID
+ * (interface/PF/VF tuple)
+ */
+#define	PCIE_FUNCTION_LEN 8
+/* PCIe PF function number */
+#define	PCIE_FUNCTION_PF_OFST 0
+#define	PCIE_FUNCTION_PF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_PF_ANY 0xfffe
+/* enum: Value representing invalid (null) function */
+#define	PCIE_FUNCTION_PF_NULL 0xffff
+#define	PCIE_FUNCTION_PF_LBN 0
+#define	PCIE_FUNCTION_PF_WIDTH 16
+/* PCIe VF Function number (PF relative) */
+#define	PCIE_FUNCTION_VF_OFST 2
+#define	PCIE_FUNCTION_VF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_VF_ANY 0xfffe
+/* enum: Function is a PF (when PF != PF_NULL) or invalid function (when PF ==
+ * PF_NULL)
+ */
+#define	PCIE_FUNCTION_VF_NULL 0xffff
+#define	PCIE_FUNCTION_VF_LBN 16
+#define	PCIE_FUNCTION_VF_WIDTH 16
+/* PCIe interface of the function */
+#define	PCIE_FUNCTION_INTF_OFST 4
+#define	PCIE_FUNCTION_INTF_LEN 4
+/* enum: Host PCIe interface */
+#define	PCIE_FUNCTION_INTF_HOST 0x0
+/* enum: Application Processor interface */
+#define	PCIE_FUNCTION_INTF_AP 0x1
+#define	PCIE_FUNCTION_INTF_LBN 32
+#define	PCIE_FUNCTION_INTF_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CREATE
+ * Descriptor proxy functions are abstract devices that forward all request
+ * submitted to the host PCIe function (descriptors submitted to Virtio or
+ * EF100 queues) to be handled on another function (most commonly on the
+ * embedded Application Processor), via EF100 descriptor proxy, memory-to-
+ * memory and descriptor-to-completion mechanisms. Primary user is Virtio-blk
+ * subsystem, see SF-122927-TC. This function allocates a new descriptor proxy
+ * function on the host and assigns a user-defined label. The actual function
+ * configuration is not persisted until the caller configures it with
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN and commits with
+ * MC_CMD_DESC_PROXY_FUNC_COMMIT_IN.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE 0x172
+#undef	MC_CMD_0x172_PRIVILEGE_CTG
+
+#define	MC_CMD_0x172_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LEN 52
+/* PCIe Function ID to allocate (as struct PCIE_FUNCTION). Set to
+ * {PF_ANY,VF_ANY,interface} for "any available function" Set to
+ * {PF_ANY,VF_NULL,interface} for "any available PF"
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LO_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_HI_OFST 4
+/* The personality to set. The meanings of the personalities are defined in
+ * SF-120734-TC with more information in SF-122717-TC. At present, we only
+ * support proxying for VIRTIO_BLK
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_OFST 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_LEN 12
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_LEN 4
+/* Allocated function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_HI_OFST 8
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY
+ * Remove an existing descriptor proxy function. Underlying function
+ * personality and configuration reverts back to factory default. Function
+ * configuration is committed immediately to specified store and any function
+ * ownership is released.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY 0x173
+#undef	MC_CMD_0x173_PRIVILEGE_CTG
+
+#define	MC_CMD_0x173_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LEN 44
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_LEN 40
+/* Store from which to remove function configuration */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_DESC_PROXY_FUNC_COMMIT/MC_CMD_DESC_PROXY_FUNC_COMMIT_IN/STORE */
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT_LEN 0
+
+/* VIRTIO_BLK_CONFIG structuredef: Virtio block device configuration. See
+ * Virtio specification v1.1, Sections 5.2.3 and 6 for definition of feature
+ * bits. See Virtio specification v1.1, Section 5.2.4 (struct
+ * virtio_blk_config) for definition of remaining configuration fields
+ */
+#define	VIRTIO_BLK_CONFIG_LEN 68
+/* Virtio block device features to advertise, per Virtio 1.1, 5.2.3 and 6 */
+#define	VIRTIO_BLK_CONFIG_FEATURES_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_LEN 8
+#define	VIRTIO_BLK_CONFIG_FEATURES_LO_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_HI_OFST 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_LBN 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_LBN 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_LBN 2
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_LBN 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_LBN 5
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_LBN 6
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_LBN 7
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_LBN 9
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_LBN 10
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_LBN 11
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_LBN 12
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_LBN 13
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_LBN 14
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_LBN 28
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_LBN 29
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_LBN 32
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_LBN 33
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_LBN 34
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_LBN 35
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_LBN 36
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_LBN 37
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_LBN 38
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_FEATURES_LBN 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_WIDTH 64
+/* The capacity of the device (expressed in 512-byte sectors) */
+#define	VIRTIO_BLK_CONFIG_CAPACITY_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LEN 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LO_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_HI_OFST 12
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LBN 64
+#define	VIRTIO_BLK_CONFIG_CAPACITY_WIDTH 64
+/* Maximum size of any single segment. Only valid when VIRTIO_BLK_F_SIZE_MAX is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_OFST 16
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LBN 128
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_WIDTH 32
+/* Maximum number of segments in a request. Only valid when
+ * VIRTIO_BLK_F_SEG_MAX is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_OFST 20
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LBN 160
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_WIDTH 32
+/* Disk-style geometry - cylinders. Only valid when VIRTIO_BLK_F_GEOMETRY is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_OFST 24
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LEN 2
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LBN 192
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_WIDTH 16
+/* Disk-style geometry - heads. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_HEADS_OFST 26
+#define	VIRTIO_BLK_CONFIG_HEADS_LEN 1
+#define	VIRTIO_BLK_CONFIG_HEADS_LBN 208
+#define	VIRTIO_BLK_CONFIG_HEADS_WIDTH 8
+/* Disk-style geometry - sectors. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SECTORS_OFST 27
+#define	VIRTIO_BLK_CONFIG_SECTORS_LEN 1
+#define	VIRTIO_BLK_CONFIG_SECTORS_LBN 216
+#define	VIRTIO_BLK_CONFIG_SECTORS_WIDTH 8
+/* Block size of disk. Only valid when VIRTIO_BLK_F_BLK_SIZE is set. */
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_OFST 28
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LBN 224
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_WIDTH 32
+/* Block topology - number of logical blocks per physical block (log2). Only
+ * valid when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_OFST 32
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LEN 1
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LBN 256
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_WIDTH 8
+/* Block topology - offset of first aligned logical block. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_OFST 33
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LEN 1
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LBN 264
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_WIDTH 8
+/* Block topology - suggested minimum I/O size in blocks. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_OFST 34
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LEN 2
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LBN 272
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_WIDTH 16
+/* Block topology - optimal (suggested maximum) I/O size in blocks. Only valid
+ * when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_OFST 36
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LBN 288
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_WIDTH 32
+/* Unused, set to zero. Note that virtio_blk_config.writeback is volatile and
+ * not carried in config data.
+ */
+#define	VIRTIO_BLK_CONFIG_UNUSED0_OFST 40
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LEN 2
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LBN 320
+#define	VIRTIO_BLK_CONFIG_UNUSED0_WIDTH 16
+/* Number of queues. Only valid if the VIRTIO_BLK_F_MQ feature is negotiated.
+ */
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_OFST 42
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LEN 2
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LBN 336
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_WIDTH 16
+/* Maximum discard sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_OFST 44
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LBN 352
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_WIDTH 32
+/* Maximum discard segment number. Only valid if VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_OFST 48
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LBN 384
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_WIDTH 32
+/* Discard sector alignment, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_OFST 52
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LEN 4
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LBN 416
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_WIDTH 32
+/* Maximum write zeroes sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_OFST 56
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LBN 448
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_WIDTH 32
+/* Maximum write zeroes segment number. Only valid if VIRTIO_BLK_F_WRITE_ZEROES
+ * is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_OFST 60
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LBN 480
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_WIDTH 32
+/* Write zeroes request can result in deallocating one or more sectors. Only
+ * valid if VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_OFST 64
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LEN 1
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LBN 512
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_WIDTH 8
+/* Unused, set to zero. */
+#define	VIRTIO_BLK_CONFIG_UNUSED1_OFST 65
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LEN 3
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LBN 520
+#define	VIRTIO_BLK_CONFIG_UNUSED1_WIDTH 24
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET
+ * Set configuration for an existing descriptor proxy function. Configuration
+ * data must match function personality. The actual function configuration is
+ * not persisted until the caller commits with MC_CMD_DESC_PROXY_FUNC_COMMIT_IN
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET 0x174
+#undef	MC_CMD_0x174_PRIVILEGE_CTG
+
+#define	MC_CMD_0x174_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMIN 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LEN(num) (20+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_NUM(len) (((len)-20)/1)
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_LEN 16
+/* Configuration data. Format of configuration data is determined implicitly
+ * from function personality referred to by HANDLE. Currently, only supported
+ * format is VIRTIO_BLK_CONFIG.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM 232
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM_MCDI2 1000
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT
+ * Commit function configuration to non-volatile or volatile store. Once
+ * configuration is applied to hardware (which may happen immediately or on
+ * next function/device reset) a DESC_PROXY_FUNC_CONFIG_SET MCDI event will be
+ * delivered to callers MCDI event queue.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT 0x175
+#undef	MC_CMD_0x175_PRIVILEGE_CTG
+
+#define	MC_CMD_0x175_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_LEN 4
+/* enum: Store into non-volatile (dynamic) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_NON_VOLATILE 0x0
+/* enum: Store into volatile (ephemeral) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_VOLATILE 0x1
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_LEN 4
+/* Generation count to be delivered in an event once configuration becomes live
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_OPEN
+ * Retrieve a handle for an existing descriptor proxy function. Returns an
+ * integer handle, valid until function is deallocated, MC rebooted or power-
+ * cycle. Returns ENODEV if no function with given label exists.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN 0x176
+#undef	MC_CMD_0x176_PRIVILEGE_CTG
+
+#define	MC_CMD_0x176_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LEN 40
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMIN 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LEN(num) (40+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_NUM(len) (((len)-40)/1)
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_LEN 4
+/* PCIe Function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_HI_OFST 8
+/* Function personality */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* Function configuration state */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_OFST 16
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_LEN 4
+/* enum: Function configuration is visible to the host (live) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LIVE 0x0
+/* enum: Function configuration is pending reset */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PENDING 0x1
+/* enum: Function configuration is missing (created, but no configuration
+ * committed)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_UNCONFIGURED 0x2
+/* Generation count to be delivered in an event once the configuration becomes
+ * live (if status is "pending")
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_OFST 24
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_LEN 16
+/* Configuration data corresponding to function personality. Currently, only
+ * supported format is VIRTIO_BLK_CONFIG. Not valid if status is UNCONFIGURED.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM 212
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM_MCDI2 980
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE
+ * Releases a handle for an open descriptor proxy function. If proxying was
+ * enabled on the device, the caller is expected to gracefully stop it using
+ * MC_CMD_DESC_PROXY_FUNC_DISABLE prior to calling this function. Closing an
+ * active device without disabling proxying will result in forced close, which
+ * will put the device into a failed state and signal the host driver of the
+ * error (for virtio, DEVICE_NEEDS_RESET flag would be set on the host side)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE 0x1a1
+#undef	MC_CMD_0x1a1_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a1_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_LEN 4
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT_LEN 0
+
+/* DESC_PROXY_FUNC_MAP structuredef */
+#define	DESC_PROXY_FUNC_MAP_LEN 52
+/* PCIe function ID (as struct PCIE_FUNCTION) */
+#define	DESC_PROXY_FUNC_MAP_FUNC_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_LEN 8
+#define	DESC_PROXY_FUNC_MAP_FUNC_LO_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_HI_OFST 4
+#define	DESC_PROXY_FUNC_MAP_FUNC_LBN 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_WIDTH 64
+/* Function personality */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_OFST 8
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LBN 64
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_WIDTH 32
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	DESC_PROXY_FUNC_MAP_LABEL_OFST 12
+#define	DESC_PROXY_FUNC_MAP_LABEL_LEN 40
+#define	DESC_PROXY_FUNC_MAP_LABEL_LBN 96
+#define	DESC_PROXY_FUNC_MAP_LABEL_WIDTH 320
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENUM
+ * Enumerate existing descriptor proxy functions
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM 0x177
+#undef	MC_CMD_0x177_PRIVILEGE_CTG
+
+#define	MC_CMD_0x177_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_LEN 4
+/* Starting index, set to 0 on first request. See
+ * MC_CMD_DESC_PROXY_FUNC_ENUM_OUT/FLAGS.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMIN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX 212
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX_MCDI2 992
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LEN(num) (4+52*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_NUM(len) (((len)-4)/52)
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_LBN 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_WIDTH 1
+/* Function map, as array of DESC_PROXY_FUNC_MAP */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_LEN 52
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM_MCDI2 19
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE
+ * Enable descriptor proxying for function into target event queue. Returns VI
+ * allocation info for the proxy source function, so that the caller can map
+ * absolute VI IDs from descriptor proxy events back to the originating
+ * function.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE 0x178
+#undef	MC_CMD_0x178_PRIVILEGE_CTG
+
+#define	MC_CMD_0x178_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_LEN 4
+/* Descriptor proxy sink queue (caller function relative). Must be extended
+ * width event queue
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_LEN 8
+/* The number of VIs allocated on the function */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_LEN 4
+/* The base absolute VI number allocated to the function. */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE
+ * Disable descriptor proxying for function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE 0x179
+#undef	MC_CMD_0x179_PRIVILEGE_CTG
+
+#define	MC_CMD_0x179_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_LEN 4
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_ADDR_SPC_ID
+ * Get Address space identifier for use in mem2mem descriptors for a given
+ * target. See SF-120734-TC for details on ADDR_SPC_IDs and mem2mem
+ * descriptors.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID 0x1a0
+#undef	MC_CMD_0x1a0_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a0_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_GET_ADDR_SPC_ID_IN msgrequest */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_LEN 16
+/* Resource type to get ADDR_SPC_ID for */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_LEN 4
+/* enum: Address space ID for host/AP memory DMA over the same interface this
+ * MCDI was called on
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_SELF 0x0
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC 0x1
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value specified by PASID
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC_PASID 0x2
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value of relative VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_REL_VI 0x3
+/* enum: Address space ID for host/AP memory DMA via PCI interface, function
+ * and PASID value of absolute VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_ABS_VI 0x4
+/* enum: Address space ID for host memory DMA via PCI interface and function of
+ * descriptor proxy function specified by HANDLE
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_DESC_PROXY_HANDLE 0x5
+/* enum: Address space ID for DMA to/from MC memory */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_MC_MEM 0x6
+/* enum: Address space ID for DMA to/from other SmartNIC memory (on-chip, DDR)
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_NIC_MEM 0x7
+/* PCIe Function ID (as struct PCIE_FUNCTION). Only valid if TYPE is PCI_FUNC,
+ * PCI_FUNC_PASID or REL_VI.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LO_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_HI_OFST 8
+/* PASID value. Only valid if TYPE is PCI_FUNC_PASID. */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_LEN 4
+/* Relative or absolute VI number. Only valid if TYPE is REL_VI or ABS_VI */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_LEN 4
+/* Descriptor proxy function handle. Only valid if TYPE is DESC_PROXY_HANDLE.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_LEN 4
+
+/* MC_CMD_GET_ADDR_SPC_ID_OUT msgresponse */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_LEN 8
+/* Address Space ID for the requested target. Only the lower 36 bits are valid
+ * in the current SmartNIC implementation.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LO_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_HI_OFST 4
+
+/* MAE_MPORT_SELECTOR structuredef: MPORTS are identified by an opaque unsigned
+ * integer value (mport_id) that is guaranteed to be representable within
+ * 32-bits or within any NIC interface field that needs store the value
+ * (whichever is narrowers). This selector structure provides a stable way to
+ * refer to m-ports.
+ */
+#define	MAE_MPORT_SELECTOR_LEN 4
+/* Used to force the tools to output bitfield-style defines for this structure.
+ */
+#define	MAE_MPORT_SELECTOR_FLAT_OFST 0
+#define	MAE_MPORT_SELECTOR_FLAT_LEN 4
+/* enum: An m-port selector value that is guaranteed never to represent a real
+ * mport
+ */
+#define	MAE_MPORT_SELECTOR_NULL 0x0
+/* enum: The m-port assigned to the calling client. */
+#define	MAE_MPORT_SELECTOR_ASSIGNED 0x1000000
+#define	MAE_MPORT_SELECTOR_TYPE_OFST 0
+#define	MAE_MPORT_SELECTOR_TYPE_LBN 24
+#define	MAE_MPORT_SELECTOR_TYPE_WIDTH 8
+/* enum: The MPORT connected to a given physical port */
+#define	MAE_MPORT_SELECTOR_TYPE_PPORT 0x2
+/* enum: The MPORT assigned to a given PCIe function */
+#define	MAE_MPORT_SELECTOR_TYPE_FUNC 0x3
+/* enum: An mport_id */
+#define	MAE_MPORT_SELECTOR_TYPE_MPORT_ID 0x4
+#define	MAE_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_WIDTH 24
+#define	MAE_MPORT_SELECTOR_PPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_LBN 16
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_WIDTH 8
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_WIDTH 16
+/* enum: Used for VF_ID to indicate a physical function. */
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_NULL 0xffff
+/* enum: Used for PF_ID to indicate the physical function of the calling
+ * client. - When used by a PF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the calling function. (For clarity, it is recommended that
+ * clients use ASSIGNED to achieve this behaviour). - When used by a PF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a VF child of the calling
+ * function. - When used by a VF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the PF owning the calling function. - When used by a VF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a sibling VF of the
+ * calling function. - Not meaningful used by a client that is not a PCIe
+ * function.
+ */
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_CALLER 0xff
+#define	MAE_MPORT_SELECTOR_FLAT_LBN 0
+#define	MAE_MPORT_SELECTOR_FLAT_WIDTH 32
+
 #endif /* _SIENA_MC_DRIVER_PCOL_H */
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
index f15c7b2064..aa03e8015a 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_AOE_H
@@ -25,6 +25,7 @@
 #define	MC_CMD_FC_IN_LEN 4
 #define	MC_CMD_FC_IN_OP_HDR_OFST 0
 #define	MC_CMD_FC_IN_OP_HDR_LEN 4
+#define	MC_CMD_FC_IN_OP_OFST 0
 #define	MC_CMD_FC_IN_OP_LBN 0
 #define	MC_CMD_FC_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to FC. */
@@ -152,6 +153,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_MAC_HEADER_OFST 4
 #define	MC_CMD_FC_IN_MAC_HEADER_LEN 4
+#define	MC_CMD_FC_IN_MAC_OP_OFST 4
 #define	MC_CMD_FC_IN_MAC_OP_LBN 0
 #define	MC_CMD_FC_IN_MAC_OP_WIDTH 8
 /* enum: MAC reconfigure handler */
@@ -166,14 +168,17 @@
 #define	MC_CMD_FC_OP_MAC_OP_GET_TX_STATS 0x7
 /* enum: MAC Read status */
 #define	MC_CMD_FC_OP_MAC_OP_READ_STATUS 0x8
+#define	MC_CMD_FC_IN_MAC_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_WIDTH 8
 /* enum: External FPGA port. */
 #define	MC_CMD_FC_PORT_EXT 0x0
 /* enum: Internal Siena-facing FPGA ports. */
 #define	MC_CMD_FC_PORT_INT 0x1
+#define	MC_CMD_FC_IN_MAC_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_MAC_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -210,8 +215,10 @@
 #define	MC_CMD_FC_IN_MAC_SET_LINK_ADDR_HI_OFST 20
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_LEN 4
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_LBN 0
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_LBN 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_WIDTH 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_FCNTL_OFST 28
@@ -249,10 +256,13 @@
 #define	MC_CMD_FC_IN_MAC_GET_STATS_STATS_INDEX_LEN 4
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_LBN 0
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_LBN 1
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_LBN 2
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_WIDTH 1
 /* Number of statistics to read */
@@ -370,6 +380,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_OP_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_OP_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_OP_WIDTH 8
 /* enum: DRAM Test Start */
@@ -385,12 +396,16 @@
 /*            MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_START_T0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_T1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_LBN 1
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_LBN 2
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_LBN 3
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_WIDTH 1
 
@@ -433,6 +448,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_LEN 4
+#define	MC_CMD_FC_IN_READ_MAP_OP_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_OP_LBN 0
 #define	MC_CMD_FC_IN_READ_MAP_OP_WIDTH 8
 /* enum: Get the number of map regions */
@@ -467,16 +483,22 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_LBN 0
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_LBN 1
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_LBN 2
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_LBN 3
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_LBN 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_LBN 5
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_WIDTH 1
 
@@ -486,6 +508,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_IO_REL_HEADER_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_HEADER_LEN 4
+#define	MC_CMD_FC_IN_IO_REL_OP_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_OP_LBN 0
 #define	MC_CMD_FC_IN_IO_REL_OP_WIDTH 8
 /* enum: Get the base address that the FC applies to relative commands */
@@ -494,6 +517,7 @@
 #define	MC_CMD_FC_IN_IO_REL_READ32 0x2
 /* enum: Write data */
 #define	MC_CMD_FC_IN_IO_REL_WRITE32 0x3
+#define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_LBN 8
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_WIDTH 8
 /* enum: Application address space */
@@ -547,6 +571,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_UHLINK_HEADER_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_HEADER_LEN 4
+#define	MC_CMD_FC_IN_UHLINK_OP_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_OP_LBN 0
 #define	MC_CMD_FC_IN_UHLINK_OP_WIDTH 8
 /* enum: Get PHY configuration info */
@@ -565,10 +590,13 @@
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_SET 0x7
 /* enum: Get loopback mode config state on fpga port */
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_GET 0x8
+#define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -668,10 +696,13 @@
 #define	MC_CMD_FC_IN_SET_LINK_SPEED_LEN 4
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_LBN 0
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_POWEROFF_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_LBN 1
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_TXDIS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_LBN 2
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_WIDTH 1
 
@@ -773,12 +804,16 @@
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DATA_LEN 4
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_LBN 0
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_LBN 1
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_LBN 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_LBN 3
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_WIDTH 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_NONE 0x0 /* enum */
@@ -1396,6 +1431,7 @@
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_LEN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_WIDTH 8
 /* enum: Test not yet initiated */
@@ -1406,31 +1442,43 @@
 #define	MC_CMD_FC_OP_DDR_TEST_SUCCESS 0x2
 /* enum: Test did not complete in specified time */
 #define	MC_CMD_FC_OP_DDR_TEST_TIMER_EXPIRED 0x3
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_LBN 11
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_LBN 9
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_LBN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_WIDTH 1
 /* Test result from FPGA */
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_LBN 31
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_LBN 30
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_LBN 29
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_LBN 28
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_LBN 15
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_LBN 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_WIDTH 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_TEST_COMPLETE 0x0 /* enum */
@@ -1447,6 +1495,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_GET_ASSERT_STATE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_LBN 8
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -1455,6 +1504,7 @@
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1
 /* enum: Crash data has been sent */
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2
+#define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -1484,16 +1534,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1501,58 +1557,80 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_WIDTH 8
 #define	MC_CMD_FC_FPGA_TYPE_A7 0xa7 /* enum */
 #define	MC_CMD_FC_FPGA_TYPE_A5 0xa5 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_WIDTH 10
+#define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_WIDTH 2
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 /* enum */
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_WIDTH 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED4_OFST 16
@@ -1563,6 +1641,7 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_WIDTH 16
 
@@ -1570,16 +1649,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1587,66 +1672,94 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_LBN 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_LBN 14
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_LBN 13
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_LBN 11
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_LBN 10
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_LBN 9
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_LBN 7
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_LBN 6
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_LBN 5
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_WIDTH 4
 #define	MC_CMD_FC_FPGA_V2_TYPE_A3 0x0 /* enum */
@@ -1659,28 +1772,35 @@
 #define	MC_CMD_FC_FPGA_V2_TYPE_D7 0xb /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_WIDTH 16
 
@@ -1688,16 +1808,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1705,40 +1831,53 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_WIDTH 16
 
@@ -1746,16 +1885,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1763,14 +1908,18 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
@@ -1779,6 +1928,7 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_WIDTH 16
 
@@ -1787,10 +1937,13 @@
 /* Qsys system ID */
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_LEN 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_WIDTH 4
 
@@ -1888,29 +2041,37 @@
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LEN 48
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_WIDTH 16
 /* Transceiver Transmit settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_WIDTH 16
 /* Transceiver Receive settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_WIDTH 16
 /* Rx eye opening */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_WIDTH 16
 /* PCS status word */
@@ -1919,8 +2080,10 @@
 /* Link status word */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_WIDTH 1
 /* Current SFp parameters applied */
@@ -1944,10 +2107,13 @@
 /* PHY config flags */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_LBN 2
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_WIDTH 1
 
@@ -2024,6 +2190,7 @@
 /* Capabilities of the FPGA/FC */
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_LEN 4
+#define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_LBN 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_WIDTH 1
 
@@ -2117,8 +2284,10 @@
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_LEN 4
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_LBN 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_LBN 1
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_WIDTH 1
 
@@ -2185,14 +2354,19 @@
 /* DDR soak test status word; bits [4:0] are relevant. */
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_LBN 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_LBN 1
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_LBN 2
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_LBN 3
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_LBN 4
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_WIDTH 1
 /* DDR soak test error count */
@@ -2222,6 +2396,7 @@
 #define	MC_CMD_AOE_IN_LEN 4
 #define	MC_CMD_AOE_IN_OP_HDR_OFST 0
 #define	MC_CMD_AOE_IN_OP_HDR_LEN 4
+#define	MC_CMD_AOE_IN_OP_OFST 0
 #define	MC_CMD_AOE_IN_OP_LBN 0
 #define	MC_CMD_AOE_IN_OP_WIDTH 8
 /* enum: FPGA and CPLD information */
@@ -2408,18 +2583,25 @@
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_ADDR_HI_OFST 12
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_LEN 4
+#define	MC_CMD_AOE_IN_MAC_STATS_DMA_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_LBN 0
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_LBN 1
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_LBN 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_WIDTH 16
 /* Length of DMA data (optional) */
@@ -2485,6 +2667,7 @@
 /*            MC_CMD_AOE_IN_CMD_LEN 4 */
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_LEN 4
+#define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_LBN 0
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_WIDTH 8
 /* enum: AOE and associated external port */
@@ -2495,6 +2678,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_DIAGNOSTIC 0x2
 /* enum: Configure link state mode on given AOE port */
 #define	MC_CMD_AOE_IN_LINK_STATE_CUSTOM 0x3
+#define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_LBN 8
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_WIDTH 8
 /* enum: No-op */
@@ -2503,6 +2687,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_OR 0x1
 /* enum: logical AND of all SFP ports link status */
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_AND 0x2
+#define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_LBN 16
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_WIDTH 16
 
@@ -2605,6 +2790,7 @@
 /* FC boot control flags */
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_LEN 4
+#define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_LBN 0
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_WIDTH 1
 
@@ -2624,6 +2810,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_LBN 8
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -2632,6 +2819,7 @@
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1 */
 /* enum: Crash data has been sent */
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2 */
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_LBN 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -2884,12 +3072,16 @@
 /* Information on the module. */
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_PRESENT_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_POWERED_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_POWERED_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_POWERED_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_LBN 3
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_WIDTH 1
 /* Memory size, in MB. */
@@ -2934,21 +3126,28 @@
 /* Flags describing status info on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_WIDTH 1
 /* DDR ECC status on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_LBN 8
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_LBN 16
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_LBN 24
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_WIDTH 8
 
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
index 5209b43ace..8276cfcdb6 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  *
  * The version of this file has MCDI strings really used in the libefx.
  */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 03/60] common/sfc_efx/base: add event queue operation to do polling
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
@ 2020-09-22  8:48 ` Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
                   ` (59 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Event queue host interface differ on Riverhead and implementation
will be different.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c   | 325 ++++++++++++++-----------
 drivers/common/sfc_efx/base/efx_impl.h |   2 +
 2 files changed, 182 insertions(+), 145 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index e6a8d4ca1a..21fddfb64d 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -66,6 +66,17 @@ siena_ev_qstats_update(
 
 #endif /* EFSYS_OPT_SIENA */
 
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
+
 #if EFSYS_OPT_SIENA
 static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_init,				/* eevo_init */
@@ -74,6 +85,7 @@ static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_qdestroy,			/* eevo_qdestroy */
 	siena_ev_qprime,			/* eevo_qprime */
 	siena_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	siena_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	siena_ev_qstats_update,			/* eevo_qstats_update */
@@ -89,6 +101,7 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 	ef10_ev_qdestroy,			/* eevo_qdestroy */
 	ef10_ev_qprime,				/* eevo_qprime */
 	ef10_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	ef10_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	ef10_ev_qstats_update,			/* eevo_qstats_update */
@@ -374,8 +387,6 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
-#define	EFX_EV_BATCH	8
-
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
@@ -383,153 +394,15 @@ efx_ev_qpoll(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg)
 {
-	efx_qword_t ev[EFX_EV_BATCH];
-	unsigned int batch;
-	unsigned int total;
-	unsigned int count;
-	unsigned int index;
-	size_t offset;
-
-	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
-
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
-	    FSE_AZ_EV_CODE_DRV_GEN_EV);
-#if EFSYS_OPT_MCDI
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
-	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
-#endif
+	efx_nic_t *enp = eep->ee_enp;
+	const efx_ev_ops_t *eevop = enp->en_eevop;
 
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
-	EFSYS_ASSERT(countp != NULL);
-	EFSYS_ASSERT(eecp != NULL);
-
-	count = *countp;
-	do {
-		/* Read up until the end of the batch period */
-		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (total = 0; total < batch; ++total) {
-			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
-
-			if (!EFX_EV_PRESENT(ev[total]))
-				break;
-
-			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
-
-			offset += sizeof (efx_qword_t);
-		}
-
-#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
-		/*
-		 * Prefetch the next batch when we get within PREFETCH_PERIOD
-		 * of a completed batch. If the batch is smaller, then prefetch
-		 * immediately.
-		 */
-		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
-			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-		/* Process the batch of events */
-		for (index = 0; index < total; ++index) {
-			boolean_t should_abort;
-			uint32_t code;
-
-#if EFSYS_OPT_EV_PREFETCH
-			/* Prefetch if we've now reached the batch period */
-			if (total == batch &&
-			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
-				offset = (count + batch) & eep->ee_mask;
-				offset *= sizeof (efx_qword_t);
-
-				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-			}
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
-			switch (code) {
-			case FSE_AZ_EV_CODE_RX_EV:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_TX_EV:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRIVER_EV:
-				should_abort = eep->ee_driver(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRV_GEN_EV:
-				should_abort = eep->ee_drv_gen(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#if EFSYS_OPT_MCDI
-			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#endif
-			case FSE_AZ_EV_CODE_GLOBAL_EV:
-				if (eep->ee_global) {
-					should_abort = eep->ee_global(eep,
-					    &(ev[index]), eecp, arg);
-					break;
-				}
-				/* else fallthrough */
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
-			if (should_abort) {
-				/* Ignore subsequent events */
-				total = index + 1;
-
-				/*
-				 * Poison batch to ensure the outer
-				 * loop is broken out of.
-				 */
-				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
-				batch += (EFX_EV_BATCH << 1);
-				EFSYS_ASSERT(total != batch);
-				break;
-			}
-		}
-
-		/*
-		 * Now that the hardware has most likely moved onto dma'ing
-		 * into the next cache line, clear the processed events. Take
-		 * care to only clear out events that we've processed
-		 */
-		EFX_SET_QWORD(ev[0]);
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (index = 0; index < total; ++index) {
-			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
-			offset += sizeof (efx_qword_t);
-		}
-
-		count += total;
-
-	} while (total == batch);
+	EFSYS_ASSERT(eevop != NULL &&
+	    eevop->eevo_qpoll != NULL);
 
-	*countp = count;
+	eevop->eevo_qpoll(eep, countp, eecp, arg);
 }
 
 			void
@@ -1484,3 +1357,165 @@ siena_ev_fini(
 }
 
 #endif /* EFSYS_OPT_SIENA */
+
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+#define	EFX_EV_BATCH	8
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EFX_EV_BATCH];
+	unsigned int batch;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
+
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
+	    FSE_AZ_EV_CODE_DRV_GEN_EV);
+#if EFSYS_OPT_MCDI
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
+	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
+#endif
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EFX_EV_PRESENT(ev[total]))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
+		/*
+		 * Prefetch the next batch when we get within PREFETCH_PERIOD
+		 * of a completed batch. If the batch is smaller, then prefetch
+		 * immediately.
+		 */
+		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
+			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+#if EFSYS_OPT_EV_PREFETCH
+			/* Prefetch if we've now reached the batch period */
+			if (total == batch &&
+			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
+				offset = (count + batch) & eep->ee_mask;
+				offset *= sizeof (efx_qword_t);
+
+				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+			}
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
+			switch (code) {
+			case FSE_AZ_EV_CODE_RX_EV:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_TX_EV:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRIVER_EV:
+				should_abort = eep->ee_driver(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRV_GEN_EV:
+				should_abort = eep->ee_drv_gen(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#if EFSYS_OPT_MCDI
+			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#endif
+			case FSE_AZ_EV_CODE_GLOBAL_EV:
+				if (eep->ee_global) {
+					should_abort = eep->ee_global(eep,
+					    &(ev[index]), eecp, arg);
+					break;
+				}
+				/* else fallthrough */
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
+				batch += (EFX_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * Now that the hardware has most likely moved onto dma'ing
+		 * into the next cache line, clear the processed events. Take
+		 * care to only clear out events that we've processed
+		 */
+		EFX_SET_QWORD(ev[0]);
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (index = 0; index < total; ++index) {
+			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
+			offset += sizeof (efx_qword_t);
+		}
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 87c7d5df52..1ef68e2d3a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -85,6 +85,8 @@ typedef struct efx_ev_ops_s {
 	void		(*eevo_qdestroy)(efx_evq_t *);
 	efx_rc_t	(*eevo_qprime)(efx_evq_t *, unsigned int);
 	void		(*eevo_qpost)(efx_evq_t *, uint16_t);
+	void		(*eevo_qpoll)(efx_evq_t *, unsigned int *,
+					const efx_ev_callbacks_t *, void *);
 	efx_rc_t	(*eevo_qmoderate)(efx_evq_t *, unsigned int);
 #if EFSYS_OPT_QSTATS
 	void		(*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 04/60] common/sfc_efx/base: add efsys option for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (2 preceding siblings ...)
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
@ 2020-09-22  8:48 ` Andrew Rybchenko
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
                   ` (58 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 44 ++++++++++++-------------
 drivers/common/sfc_efx/efsys.h          |  3 ++
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 5a04a69e5f..978321cf67 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -47,8 +47,8 @@
 
 #if EFSYS_OPT_CHECK_REG
 /* Verify chip implements accessed registers */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "CHECK_REG requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "CHECK_REG requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_CHECK_REG */
 
@@ -79,21 +79,21 @@
 
 #if EFSYS_OPT_FILTER
 /* Support hardware packet filters */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "FILTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "FILTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_FILTER */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 # if !EFSYS_OPT_FILTER
-#  error "EF10 arch requires FILTER"
+#  error "RIVERHEAD or EF10 arch requires FILTER"
 # endif
 #endif /* EFX_OPTS_EF10() */
 
 #if EFSYS_OPT_LOOPBACK
 /* Support hardware loopback modes */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "LOOPBACK requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "LOOPBACK requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_LOOPBACK */
 
@@ -107,21 +107,21 @@
 
 #if EFSYS_OPT_MAC_STATS
 /* Support MAC statistics */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MAC_STATS requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MAC_STATS requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MAC_STATS */
 
 #if EFSYS_OPT_MCDI
 /* Support management controller messages */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MCDI requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MCDI requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MCDI */
 
-#if (EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#if (EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
 # if !EFSYS_OPT_MCDI
-#  error "EF10 arch or SIENA requires MCDI"
+#  error "RIVERHEAD or EF10 arch or SIENA requires MCDI"
 # endif
 #endif
 
@@ -288,15 +288,15 @@
 
 #if EFSYS_OPT_RX_SCALE
 /* Support receive scaling (RSS) */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCALE requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCALE requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCALE */
 
 #if EFSYS_OPT_RX_SCATTER
 /* Support receive scatter DMA */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCATTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCATTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCATTER */
 
@@ -338,8 +338,8 @@
 
 #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
 /* Support adapters with missing static config (for factory use only) */
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "ALLOW_UNCONFIGURED_NIC requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_ALLOW_UNCONFIGURED_NIC */
 
@@ -359,8 +359,8 @@
 
 /* Support hardware assistance for tunnels */
 #if EFSYS_OPT_TUNNEL
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "TUNNEL requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "TUNNEL requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 46b08f9789..1567d91588 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -105,6 +105,9 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_MEDFORD 1
 /* Enable SFN2xxx support */
 #define EFSYS_OPT_MEDFORD2 1
+/* Disable Riverhead support */
+#define EFSYS_OPT_RIVERHEAD 0
+
 #ifdef RTE_LIBRTE_SFC_EFX_DEBUG
 #define EFSYS_OPT_CHECK_REG 1
 #else
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 05/60] common/sfc_efx/base: add Riverhead NIC family
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (3 preceding siblings ...)
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
@ 2020-09-22  8:48 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
                   ` (57 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:48 UTC (permalink / raw)
  To: dev

Riverhead is the first NIC family of the EF100 architecture.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 +++++++
 drivers/common/sfc_efx/base/efx_impl.h |  3 +++
 drivers/common/sfc_efx/base/efx_nic.c  | 14 ++++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c1b4876314..2082efe023 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -55,6 +55,7 @@ typedef enum efx_family_e {
 	EFX_FAMILY_HUNTINGTON,
 	EFX_FAMILY_MEDFORD,
 	EFX_FAMILY_MEDFORD2,
+	EFX_FAMILY_RIVERHEAD,
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
@@ -68,6 +69,7 @@ efx_family(
 
 
 #define	EFX_PCI_VENID_SFC			0x1924
+#define	EFX_PCI_VENID_XILINX			0x10EE
 
 #define	EFX_PCI_DEVID_FALCON			0x0710	/* SFC4000 */
 
@@ -90,6 +92,8 @@ efx_family(
 #define	EFX_PCI_DEVID_MEDFORD2			0x0B03	/* SFC9250 PF */
 #define	EFX_PCI_DEVID_MEDFORD2_VF		0x1B03	/* SFC9250 VF */
 
+#define	EFX_PCI_DEVID_RIVERHEAD			0x0100
+#define	EFX_PCI_DEVID_RIVERHEAD_VF		0x1100
 
 #define	EFX_MEM_BAR_SIENA			2
 
@@ -101,6 +105,9 @@ efx_family(
 
 #define	EFX_MEM_BAR_MEDFORD2			0
 
+/* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
+#define	EFX_MEM_BAR_RIVERHEAD			2
+
 
 /* Error codes */
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ef68e2d3a..898770c1cb 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -871,6 +871,9 @@ struct efx_nic_s {
 	 (_enp)->en_family == EFX_FAMILY_MEDFORD || \
 	 (_enp)->en_family == EFX_FAMILY_HUNTINGTON)
 
+#define	EFX_FAMILY_IS_EF100(_enp) \
+	((_enp)->en_family == EFX_FAMILY_RIVERHEAD)
+
 
 #define	EFX_NIC_MAGIC	0x02121996
 
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 267d010524..b5e36661c9 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -85,6 +85,20 @@ efx_family(
 		}
 	}
 
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			*efp = EFX_FAMILY_RIVERHEAD;
+			*membarp = EFX_MEM_BAR_RIVERHEAD;
+			return (0);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
 	*efp = EFX_FAMILY_INVALID;
 	return (ENOTSUP);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 06/60] common/sfc_efx/base: update registers check for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (4 preceding siblings ...)
  2020-09-22  8:48 ` [dpdk-dev] [PATCH 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
                   ` (56 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Riverhead family got letter 'G' for registers definition.
Registers used for Riverhead should have the letter in the
specification range.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 898770c1cb..f891172086 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1008,6 +1008,10 @@ struct efx_txq_s {
 			rev = 'F';					\
 			break;						\
 									\
+		case EFX_FAMILY_RIVERHEAD:				\
+			rev = 'G';					\
+			break;						\
+									\
 		default:						\
 			rev = '?';					\
 			break;						\
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 07/60] common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (5 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
                   ` (55 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

MCDI on Riverhead is very close to the EF10 and there is no
point to duplicate the code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 46 ++++++++++++++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  8 ++---
 drivers/common/sfc_efx/base/efx_impl.h  |  4 +--
 drivers/common/sfc_efx/base/efx_mcdi.c  | 21 +++++++++++
 4 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 9e8a0c1f69..727f14826e 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_MCDI
 
@@ -27,7 +27,7 @@ ef10_mcdi_init(
 	efx_dword_t dword;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 	EFSYS_ASSERT(enp->en_features & EFX_FEATURE_MCDI_DMA);
 
 	/*
@@ -53,7 +53,16 @@ ef10_mcdi_init(
 		goto fail2;
 	}
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0, 1);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	/* Save initial MC reboot status */
 	(void) ef10_mcdi_poll_reboot(enp);
@@ -133,7 +142,7 @@ ef10_mcdi_send_request(
 	efx_dword_t dword;
 	unsigned int pos;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/* Write the header */
 	for (pos = 0; pos < hdr_len; pos += sizeof (efx_dword_t)) {
@@ -154,11 +163,29 @@ ef10_mcdi_send_request(
 	/* Ring the doorbell to post the command DMA address to the MC */
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) >> 32);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) & 0xffffffff);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 }
 
 	__checkReturn	boolean_t
@@ -210,6 +237,9 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
+	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
+	    ER_GZ_MC_SFT_STATUS_OFST);
+
 	/* Update MC reboot status word */
 	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
 	new_status = dword.ed_u32[0];
@@ -255,7 +285,7 @@ ef10_mcdi_feature_supported(
 	uint32_t privilege_mask = encp->enc_privilege_mask;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/*
 	 * Use privilege mask state at MCDI attach.
@@ -316,4 +346,4 @@ ef10_mcdi_feature_supported(
 
 #endif	/* EFSYS_OPT_MCDI */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2082efe023..c7fe814ca0 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -243,8 +243,8 @@ efx_nic_check_pcie_link_speed(
 
 #if EFSYS_OPT_MCDI
 
-#if EFX_OPTS_EF10()
-/* EF10 architecture NICs require MCDIv2 commands */
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+/* EF10 architecture and Riverhead NICs require MCDIv2 commands */
 #define	WITH_MCDI_V2 1
 #endif
 
@@ -1438,11 +1438,11 @@ typedef struct efx_nic_cfg_s {
 #if EFSYS_OPT_BIST
 	uint32_t		enc_bist_mask;
 #endif	/* EFSYS_OPT_BIST */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	uint32_t		enc_pf;
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f891172086..c7edeaa000 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -37,9 +37,9 @@
 #include "medford2_impl.h"
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 #include "ef10_impl.h"
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #ifdef	__cplusplus
 extern "C" {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8cd651f529..dec3a170a7 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -60,6 +60,21 @@ static const efx_mcdi_ops_t	__efx_mcdi_ef10_ops = {
 
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_mcdi_ops_t	__efx_mcdi_rhead_ops = {
+	ef10_mcdi_init,			/* emco_init */
+	ef10_mcdi_send_request,		/* emco_send_request */
+	ef10_mcdi_poll_reboot,		/* emco_poll_reboot */
+	ef10_mcdi_poll_response,	/* emco_poll_response */
+	ef10_mcdi_read_response,	/* emco_read_response */
+	ef10_mcdi_fini,			/* emco_fini */
+	ef10_mcdi_feature_supported,	/* emco_feature_supported */
+	ef10_mcdi_get_timeout,		/* emco_get_timeout */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 
 	__checkReturn	efx_rc_t
@@ -98,6 +113,12 @@ efx_mcdi_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emcop = &__efx_mcdi_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 08/60] common/sfc_efx/base: use EF10 PHY methods for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (6 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
                   ` (54 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

There is no difference yet in PHY support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_phy.c |  4 ++--
 drivers/common/sfc_efx/base/efx_phy.c  | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 622374f7b6..b9822e4d42 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 static			void
 mcdi_phy_decode_cap(
@@ -755,4 +755,4 @@ ef10_bist_stop(
 
 #endif	/* EFSYS_OPT_BIST */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 841d148852..8df868d80c 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -48,6 +48,26 @@ static const efx_phy_ops_t	__efx_phy_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_phy_ops_t	__efx_phy_rhead_ops = {
+	ef10_phy_power,			/* epo_power */
+	NULL,				/* epo_reset */
+	ef10_phy_reconfigure,		/* epo_reconfigure */
+	ef10_phy_verify,		/* epo_verify */
+	ef10_phy_oui_get,		/* epo_oui_get */
+	ef10_phy_link_state_get,	/* epo_link_state_get */
+#if EFSYS_OPT_PHY_STATS
+	ef10_phy_stats_update,		/* epo_stats_update */
+#endif	/* EFSYS_OPT_PHY_STATS */
+#if EFSYS_OPT_BIST
+	ef10_bist_enable_offline,	/* epo_bist_enable_offline */
+	ef10_bist_start,		/* epo_bist_start */
+	ef10_bist_poll,			/* epo_bist_poll */
+	ef10_bist_stop,			/* epo_bist_stop */
+#endif	/* EFSYS_OPT_BIST */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_phy_probe(
 	__in		efx_nic_t *enp)
@@ -88,6 +108,12 @@ efx_phy_probe(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		epop = &__efx_phy_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD2 */
+
 	default:
 		rc = ENOTSUP;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 09/60] common/sfc_efx/base: move 14b prefix check out of caps get
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (7 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
                   ` (53 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

The function which gets capabilties from MC should simply fill in
NIC configuration. Caller should decide if the configuration is
supported or not.

The change is required to prepare the function to be reused on
Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 33 ++++++++++++++------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 34fa45e8c1..bb5fd50eab 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1062,15 +1062,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
-	/*
-	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
-	 * We only support the 14 byte prefix here.
-	 */
-	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14) == 0) {
-		rc = ENOTSUP;
-		goto fail4;
-	}
-	encp->enc_rx_prefix_size = 14;
+	/* Check if RXDP firmware inserts 14 byte prefix */
+	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
+		encp->enc_rx_prefix_size = 14;
+	else
+		encp->enc_rx_prefix_size = 0;
 
 #if EFSYS_OPT_RX_SCALE
 	/* Check if the firmware supports additional RSS modes */
@@ -1348,7 +1344,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1397,11 +1393,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail5:
-	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
@@ -1932,6 +1926,15 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail8;
 
+	/*
+	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
+	 * We only support the 14 byte prefix here.
+	 */
+	if (encp->enc_rx_prefix_size != 14) {
+		rc = ENOTSUP;
+		goto fail9;
+	}
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1960,7 +1963,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail9;
+			goto fail10;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1976,7 +1979,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail10;
+		goto fail11;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 10/60] common/sfc_efx/base: remove PF count get from caps get
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (8 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
                   ` (52 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

ef10_get_datapath_caps() should simply fill in NIC configuration
based MC_CMD_GET_CAPABILITIES output.

Number of PFs is a part of board configuration should be obtained
in corresponding function.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 37 +++++++++++++-------------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index bb5fd50eab..f7c4601819 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1031,10 +1031,6 @@ ef10_get_datapath_caps(
 		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
 	efx_rc_t rc;
 
-	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
-		goto fail1;
-
-
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
@@ -1045,12 +1041,12 @@ ef10_get_datapath_caps(
 
 	if (req.emr_rc != 0) {
 		rc = req.emr_rc;
-		goto fail2;
+		goto fail1;
 	}
 
 	if (req.emr_out_length_used < MC_CMD_GET_CAPABILITIES_OUT_LEN) {
 		rc = EMSGSIZE;
-		goto fail3;
+		goto fail2;
 	}
 
 #define	CAP_FLAGS1(_req, _flag)						\
@@ -1344,7 +1340,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail4;
+			goto fail3;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1393,11 +1389,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail4:
-	EFSYS_PROBE(fail4);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1856,6 +1850,9 @@ ef10_nic_board_cfg(
 	encp->enc_pf = pf;
 	encp->enc_vf = vf;
 
+	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
+		goto fail4;
+
 	/* MAC address for this function */
 	if (EFX_PCI_FUNCTION_IS_PF(encp)) {
 		rc = efx_mcdi_get_mac_address_pf(enp, mac_addr);
@@ -1880,7 +1877,7 @@ ef10_nic_board_cfg(
 		rc = efx_mcdi_get_mac_address_vf(enp, mac_addr);
 	}
 	if (rc != 0)
-		goto fail4;
+		goto fail5;
 
 	EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
 
@@ -1891,7 +1888,7 @@ ef10_nic_board_cfg(
 		if (rc == EACCES)
 			board_type = 0;
 		else
-			goto fail5;
+			goto fail6;
 	}
 
 	encp->enc_board_type = board_type;
@@ -1899,7 +1896,7 @@ ef10_nic_board_cfg(
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
-		goto fail6;
+		goto fail7;
 
 	/*
 	 * Firmware with support for *_FEC capability bits does not
@@ -1918,13 +1915,13 @@ ef10_nic_board_cfg(
 
 	/* Obtain the default PHY advertised capabilities */
 	if ((rc = ef10_phy_get_link(enp, &els)) != 0)
-		goto fail7;
+		goto fail8;
 	epp->ep_default_adv_cap_mask = els.epls.epls_adv_cap_mask;
 	epp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;
 
 	/* Check capabilities of running datapath firmware */
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
-		goto fail8;
+		goto fail9;
 
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
@@ -1932,7 +1929,7 @@ ef10_nic_board_cfg(
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail9;
+		goto fail10;
 	}
 
 	/* Alignment for WPTR updates */
@@ -1963,7 +1960,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail10;
+			goto fail11;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1979,7 +1976,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail11;
+		goto fail12;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
@@ -1988,10 +1985,12 @@ ef10_nic_board_cfg(
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail12;
+			goto fail13;
 
 	return (0);
 
+fail13:
+	EFSYS_PROBE(fail13);
 fail12:
 	EFSYS_PROBE(fail12);
 fail11:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 11/60] common/sfc_efx/base: factor out helper to get board config
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (9 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
                   ` (51 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

The helper will be used on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 213 ++++++++++++++-----------
 1 file changed, 117 insertions(+), 96 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index f7c4601819..47329ff8dc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1758,60 +1758,9 @@ ef10_external_port_mapping(
 }
 
 static	__checkReturn	efx_rc_t
-ef10_set_workaround_bug26807(
-	__in		efx_nic_t *enp)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	uint32_t flags;
-	efx_rc_t rc;
-
-	/*
-	 * If the bug26807 workaround is enabled, then firmware has enabled
-	 * support for chained multicast filters. Firmware will reset (FLR)
-	 * functions which have filters in the hardware filter table when the
-	 * workaround is enabled/disabled.
-	 *
-	 * We must recheck if the workaround is enabled after inserting the
-	 * first hardware filter, in case it has been changed since this check.
-	 */
-	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
-	    B_TRUE, &flags);
-	if (rc == 0) {
-		encp->enc_bug26807_workaround = B_TRUE;
-		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
-			/*
-			 * Other functions had installed filters before the
-			 * workaround was enabled, and they have been reset
-			 * by firmware.
-			 */
-			EFSYS_PROBE(bug26807_workaround_flr_done);
-			/* FIXME: bump MC warm boot count ? */
-		}
-	} else if (rc == EACCES) {
-		/*
-		 * Unprivileged functions cannot enable the workaround in older
-		 * firmware.
-		 */
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else {
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-ef10_nic_board_cfg(
+efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
-	const efx_nic_ops_t *enop = enp->en_enop;
 	efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	ef10_link_state_t els;
@@ -1892,7 +1841,6 @@ ef10_nic_board_cfg(
 	}
 
 	encp->enc_board_type = board_type;
-	encp->enc_clk_mult = 1; /* not used for EF10 */
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
@@ -1923,15 +1871,128 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail9;
 
+	/* Get interrupt vector limits */
+	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
+		if (EFX_PCI_FUNCTION_IS_PF(encp))
+			goto fail10;
+
+		/* Ignore error (cannot query vector limits from a VF). */
+		base = 0;
+		nvec = 1024;
+	}
+	encp->enc_intr_vec_base = base;
+	encp->enc_intr_limit = nvec;
+
+	/*
+	 * Get the current privilege mask. Note that this may be modified
+	 * dynamically, so this value is informational only. DO NOT use
+	 * the privilege mask to check for sufficient privileges, as that
+	 * can result in time-of-check/time-of-use bugs.
+	 */
+	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
+		goto fail11;
+	encp->enc_privilege_mask = mask;
+
+	return (0);
+
+fail11:
+	EFSYS_PROBE(fail11);
+fail10:
+	EFSYS_PROBE(fail10);
+fail9:
+	EFSYS_PROBE(fail9);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_set_workaround_bug26807(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t flags;
+	efx_rc_t rc;
+
+	/*
+	 * If the bug26807 workaround is enabled, then firmware has enabled
+	 * support for chained multicast filters. Firmware will reset (FLR)
+	 * functions which have filters in the hardware filter table when the
+	 * workaround is enabled/disabled.
+	 *
+	 * We must recheck if the workaround is enabled after inserting the
+	 * first hardware filter, in case it has been changed since this check.
+	 */
+	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
+	    B_TRUE, &flags);
+	if (rc == 0) {
+		encp->enc_bug26807_workaround = B_TRUE;
+		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
+			/*
+			 * Other functions had installed filters before the
+			 * workaround was enabled, and they have been reset
+			 * by firmware.
+			 */
+			EFSYS_PROBE(bug26807_workaround_flr_done);
+			/* FIXME: bump MC warm boot count ? */
+		}
+	} else if (rc == EACCES) {
+		/*
+		 * Unprivileged functions cannot enable the workaround in older
+		 * firmware.
+		 */
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else {
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_nic_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
 	 * We only support the 14 byte prefix here.
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail10;
+		goto fail2;
 	}
 
+	encp->enc_clk_mult = 1; /* not used for EF10 */
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1957,56 +2018,16 @@ ef10_nic_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
-	/* Get interrupt vector limits */
-	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
-		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail11;
-
-		/* Ignore error (cannot query vector limits from a VF). */
-		base = 0;
-		nvec = 1024;
-	}
-	encp->enc_intr_vec_base = base;
-	encp->enc_intr_limit = nvec;
-
-	/*
-	 * Get the current privilege mask. Note that this may be modified
-	 * dynamically, so this value is informational only. DO NOT use
-	 * the privilege mask to check for sufficient privileges, as that
-	 * can result in time-of-check/time-of-use bugs.
-	 */
-	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail12;
-	encp->enc_privilege_mask = mask;
-
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-		goto fail11;
+		goto fail3;
 
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail13;
+			goto fail4;
 
 	return (0);
 
-fail13:
-	EFSYS_PROBE(fail13);
-fail12:
-	EFSYS_PROBE(fail12);
-fail11:
-	EFSYS_PROBE(fail11);
-fail10:
-	EFSYS_PROBE(fail10);
-fail9:
-	EFSYS_PROBE(fail9);
-fail8:
-	EFSYS_PROBE(fail8);
-fail7:
-	EFSYS_PROBE(fail7);
-fail6:
-	EFSYS_PROBE(fail6);
-fail5:
-	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 12/60] common/sfc_efx/base: set NIC features in generic place
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (10 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
                   ` (50 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

There is no point to duplicate it NIC family specific probe handlers.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 2 --
 drivers/common/sfc_efx/base/efx_nic.c   | 3 +++
 drivers/common/sfc_efx/base/siena_nic.c | 3 ---
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 47329ff8dc..4796dd6b59 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2098,8 +2098,6 @@ ef10_nic_probe(
 	}
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index b5e36661c9..9d6961e2ff 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -318,6 +318,7 @@ efx_nic_probe(
 	__in		efx_nic_t *enp,
 	__in		efx_fw_variant_t efv)
 {
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	const efx_nic_ops_t *enop;
 	efx_rc_t rc;
 
@@ -351,6 +352,8 @@ efx_nic_probe(
 	if ((rc = enop->eno_probe(enp)) != 0)
 		goto fail1;
 
+	encp->enc_features = enp->en_features;
+
 	if ((rc = efx_phy_probe(enp)) != 0)
 		goto fail2;
 
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index bd5e8ceb8a..b9b6d1951c 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -301,7 +301,6 @@ siena_nic_probe(
 	__in		efx_nic_t *enp)
 {
 	efx_port_t *epp = &(enp->en_port);
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	siena_link_state_t sls;
 	unsigned int mask;
 	efx_oword_t oword;
@@ -369,8 +368,6 @@ siena_nic_probe(
 		goto fail12;
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 13/60] common/sfc_efx/base: factor out MCDI entity reset helper
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (11 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
                   ` (49 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

The helper will be reused on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 51 +++++++++++++++++---------
 1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 4796dd6b59..c5990f16cc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1921,6 +1921,39 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
+		MC_CMD_ENTITY_RESET_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_ENTITY_RESET;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
+
+	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
+	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
@@ -2203,9 +2236,6 @@ ef10_nic_set_drv_limits(
 ef10_nic_reset(
 	__in		efx_nic_t *enp)
 {
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
-		MC_CMD_ENTITY_RESET_OUT_LEN);
 	efx_rc_t rc;
 
 	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
@@ -2214,21 +2244,8 @@ ef10_nic_reset(
 	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
 		goto fail2;
 
-	req.emr_cmd = MC_CMD_ENTITY_RESET;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
-
-	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
-	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
 		goto fail3;
-	}
 
 	/* Clear RX/TX DMA queue errors */
 	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 14/60] common/sfc_efx/base: add Riverhead support to NIC module
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (12 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
                   ` (48 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Define basic NIC features and limitations.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h  |  25 ++
 drivers/common/sfc_efx/base/ef10_nic.c   |  52 ++-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   4 +-
 drivers/common/sfc_efx/base/efx_nic.c    |  34 ++
 drivers/common/sfc_efx/base/meson.build  |   3 +-
 drivers/common/sfc_efx/base/rhead_impl.h | 105 +++++
 drivers/common/sfc_efx/base/rhead_nic.c  | 500 +++++++++++++++++++++++
 8 files changed, 716 insertions(+), 15 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index da0ec7fab5..e933d88135 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -1422,12 +1422,37 @@ efx_mcdi_get_vector_cfg(
 	__out_opt	uint32_t *pf_nvecp,
 	__out_opt	uint32_t *vf_nvecp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_alloc_vis(
+	__in		efx_nic_t *enp,
+	__in		uint32_t min_vi_count,
+	__in		uint32_t max_vi_count,
+	__out		uint32_t *vi_basep,
+	__out		uint32_t *vi_countp,
+	__out		uint32_t *vi_shiftp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_free_vis(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn		efx_rc_t
 ef10_get_privilege_mask(
 	__in			efx_nic_t *enp,
 	__out			uint32_t *maskp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_nic_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp);
+
 #if EFSYS_OPT_FW_SUBVARIANT_AWARE
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index c5990f16cc..80dc99aed5 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -10,7 +10,7 @@
 #include "mcdi_mon.h"
 #endif
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #include "ef10_tlv_layout.h"
 
@@ -24,7 +24,7 @@ efx_mcdi_get_port_assignment(
 		MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_ASSIGNMENT;
 	req.emr_in_buf = payload;
@@ -68,7 +68,7 @@ efx_mcdi_get_port_modes(
 		MC_CMD_GET_PORT_MODES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_MODES;
 	req.emr_in_buf = payload;
@@ -223,6 +223,10 @@ ef10_nic_get_port_mode_bandwidth(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn		efx_rc_t
 efx_mcdi_vadaptor_alloc(
 	__in			efx_nic_t *enp,
@@ -292,6 +296,10 @@ efx_mcdi_vadaptor_free(
 	return (rc);
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_get_mac_address_pf(
 	__in			efx_nic_t *enp,
@@ -302,7 +310,7 @@ efx_mcdi_get_mac_address_pf(
 		MC_CMD_GET_MAC_ADDRESSES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -358,7 +366,7 @@ efx_mcdi_get_mac_address_vf(
 		MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_VPORT_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -420,7 +428,7 @@ efx_mcdi_get_clock(
 		MC_CMD_GET_CLOCK_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_CLOCK;
 	req.emr_in_buf = payload;
@@ -569,7 +577,7 @@ efx_mcdi_get_vector_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_alloc_vis(
 	__in		efx_nic_t *enp,
 	__in		uint32_t min_vi_count,
@@ -631,7 +639,7 @@ efx_mcdi_alloc_vis(
 }
 
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_free_vis(
 	__in		efx_nic_t *enp)
 {
@@ -663,6 +671,9 @@ efx_mcdi_free_vis(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_alloc_piobuf(
@@ -978,6 +989,10 @@ ef10_nic_pio_unlink(
 	return (efx_mcdi_unlink_piobuf(enp, vi_index));
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_mcdi_get_pf_count(
 	__in		efx_nic_t *enp,
@@ -1667,6 +1682,19 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_NA_2x2),			/* mode 14 */
 		{ EFX_EXT_PORT_NA, 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Riverhead allocate each port number to a separate
+	 * cage.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 2
+	 */
+	{
+		EFX_FAMILY_RIVERHEAD,
+		(1U << TLV_PORT_MODE_1x1_NA) |			/* mode 0 */
+		(1U << TLV_PORT_MODE_1x4_NA) |			/* mode 1 */
+		(1U << TLV_PORT_MODE_1x1_1x1),			/* mode 2 */
+		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
 };
 
 static	__checkReturn	efx_rc_t
@@ -1757,7 +1785,7 @@ ef10_external_port_mapping(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
@@ -1921,7 +1949,7 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_entity_reset(
 	__in		efx_nic_t *enp)
 {
@@ -1954,6 +1982,10 @@ efx_mcdi_entity_reset(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c7edeaa000..b41b0e5dea 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -41,6 +41,10 @@
 #include "ef10_impl.h"
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+#include "rhead_impl.h"
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -835,7 +839,7 @@ struct efx_nic_s {
 #endif	/* EFSYS_OPT_SIENA */
 		int	enu_unused;
 	} en_u;
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	union en_arch {
 		struct {
 			int			ena_vi_base;
@@ -856,7 +860,7 @@ struct efx_nic_s {
 			size_t			ena_wc_mem_map_size;
 		} ef10;
 	} en_arch;
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #if EFSYS_OPT_EVB
 	const efx_evb_ops_t	*en_eeop;
 	struct efx_vswitch_s    *en_vswitchp;
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index dec3a170a7..ade7f7fed4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2032,7 +2032,7 @@ efx_mcdi_mac_stats_periodic(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 /*
  * This function returns the pf and vf number of a function.  If it is a pf the
@@ -2129,7 +2129,7 @@ efx_mcdi_privilege_mask(
 	return (rc);
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 	__checkReturn		efx_rc_t
 efx_mcdi_set_workaround(
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 9d6961e2ff..465e2c7a36 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -188,6 +188,27 @@ static const efx_nic_ops_t	__efx_nic_medford2_ops = {
 
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_nic_ops_t	__efx_nic_riverhead_ops = {
+	rhead_nic_probe,		/* eno_probe */
+	rhead_board_cfg,		/* eno_board_cfg */
+	rhead_nic_set_drv_limits,	/* eno_set_drv_limits */
+	rhead_nic_reset,		/* eno_reset */
+	rhead_nic_init,			/* eno_init */
+	rhead_nic_get_vi_pool,		/* eno_get_vi_pool */
+	rhead_nic_get_bar_region,	/* eno_get_bar_region */
+	rhead_nic_hw_unavailable,	/* eno_hw_unavailable */
+	rhead_nic_set_hw_unavailable,	/* eno_set_hw_unavailable */
+#if EFSYS_OPT_DIAG
+	rhead_nic_register_test,	/* eno_register_test */
+#endif	/* EFSYS_OPT_DIAG */
+	rhead_nic_fini,			/* eno_fini */
+	rhead_nic_unprobe,		/* eno_unprobe */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_nic_create(
@@ -285,6 +306,19 @@ efx_nic_create(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		enp->en_enop = &__efx_nic_riverhead_ops;
+		enp->en_features =
+		    EFX_FEATURE_IPV6 |
+		    EFX_FEATURE_LINK_EVENTS |
+		    EFX_FEATURE_PERIODIC_MAC_STATS |
+		    EFX_FEATURE_MCDI |
+		    EFX_FEATURE_MAC_HEADER_FILTERS |
+		    EFX_FEATURE_MCDI_DMA;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = ENOTSUP;
 		goto fail2;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8909525c34..6ca5b57023 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -51,7 +51,8 @@ sources = [
 	'ef10_vpd.c',
 	'hunt_nic.c',
 	'medford_nic.c',
-	'medford2_nic.c'
+	'medford2_nic.c',
+	'rhead_nic.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
new file mode 100644
index 0000000000..e25a871cb3
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_RHEAD_IMPL_H
+#define	_SYS_RHEAD_IMPL_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+#define	RHEAD_EVQ_MAXNEVS	16384
+#define	RHEAD_EVQ_MINNEVS	256
+
+#define	RHEAD_RXQ_MAXNDESCS	16384
+#define	RHEAD_RXQ_MINNDESCS	256
+
+#define	RHEAD_TXQ_MAXNDESCS	16384
+#define	RHEAD_TXQ_MINNDESCS	256
+
+#define	RHEAD_EVQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
+
+
+/* NIC */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_DIAG
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp);
+
+#endif	/* EFSYS_OPT_DIAG */
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp);
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_RHEAD_IMPL_H */
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
new file mode 100644
index 0000000000..c83d18e6ab
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -0,0 +1,500 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t end_padding;
+	uint32_t bandwidth;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
+	encp->enc_clk_mult = 1; /* not used for Riverhead */
+
+	/*
+	 * FIXME There are TxSend and TxSeg descriptors on Riverhead.
+	 * TxSeg is bigger than TxSend.
+	 */
+	encp->enc_tx_dma_desc_size_max = EFX_MASK32(ESF_GZ_TX_SEND_LEN);
+	/* No boundary crossing limits */
+	encp->enc_tx_dma_desc_boundary = 0;
+
+	/*
+	 * Maximum number of bytes into the frame the TCP header can start for
+	 * firmware assisted TSO to work.
+	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+
+	/*
+	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
+	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
+	 * resources (allocated to this PCIe function), which is zero until
+	 * after we have allocated VIs.
+	 */
+	encp->enc_evq_limit = 1024;
+	encp->enc_rxq_limit = EFX_RXQ_LIMIT_TARGET;
+	encp->enc_txq_limit = EFX_TXQ_LIMIT_TARGET;
+
+	encp->enc_buftbl_limit = UINT32_MAX;
+
+	/*
+	 * Enable firmware workarounds for hardware errata.
+	 * Expected responses are:
+	 *  - 0 (zero):
+	 *	Success: workaround enabled or disabled as requested.
+	 *  - MC_CMD_ERR_ENOSYS (reported as ENOTSUP):
+	 *	Firmware does not support the MC_CMD_WORKAROUND request.
+	 *	(assume that the workaround is not supported).
+	 *  - MC_CMD_ERR_ENOENT (reported as ENOENT):
+	 *	Firmware does not support the requested workaround.
+	 *  - MC_CMD_ERR_EPERM  (reported as EACCES):
+	 *	Unprivileged function cannot enable/disable workarounds.
+	 *
+	 * See efx_mcdi_request_errcode() for MCDI error translations.
+	 */
+
+	/*
+	 * Replay engine on Riverhead should suppress duplicate packets
+	 * (e.g. because of exact multicast and all-multicast filters
+	 * match) to the same RxQ.
+	 */
+	encp->enc_bug26807_workaround = B_FALSE;
+
+	/*
+	 * Checksums for TSO sends should always be correct on Riverhead.
+	 * FIXME: revisit when TSO support is implemented.
+	 */
+	encp->enc_bug61297_workaround = B_FALSE;
+
+	encp->enc_evq_max_nevs = RHEAD_EVQ_MAXNEVS;
+	encp->enc_evq_min_nevs = RHEAD_EVQ_MINNEVS;
+	encp->enc_rxq_max_ndescs = RHEAD_RXQ_MAXNDESCS;
+	encp->enc_rxq_min_ndescs = RHEAD_RXQ_MINNDESCS;
+	encp->enc_txq_max_ndescs = RHEAD_TXQ_MAXNDESCS;
+	encp->enc_txq_min_ndescs = RHEAD_TXQ_MINNDESCS;
+
+	/* Riverhead FW does not support event queue timers yet. */
+	encp->enc_evq_timer_quantum_ns = 0;
+	encp->enc_evq_timer_max_us = 0;
+
+	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
+	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
+	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
+
+	/* No required alignment for WPTR updates */
+	encp->enc_rx_push_align = 1;
+
+	/* Riverhead supports a single Rx prefix size. */
+	encp->enc_rx_prefix_size = ESE_GZ_RX_PKT_PREFIX_LEN;
+
+	/* Alignment for receive packet DMA buffers. */
+	encp->enc_rx_buf_align_start = 1;
+
+	/* Get the RX DMA end padding alignment configuration. */
+	if ((rc = efx_mcdi_get_rxdp_config(enp, &end_padding)) != 0) {
+		if (rc != EACCES)
+			goto fail2;
+
+		/* Assume largest tail padding size supported by hardware. */
+		end_padding = 128;
+	}
+	encp->enc_rx_buf_align_end = end_padding;
+
+	/*
+	 * Riverhead stores a single global copy of VPD, not per-PF as on
+	 * Huntington.
+	 */
+	encp->enc_vpd_is_global = B_TRUE;
+
+	rc = ef10_nic_get_port_mode_bandwidth(enp, &bandwidth);
+	if (rc != 0)
+		goto fail3;
+	encp->enc_required_pcie_bandwidth_mbps = bandwidth;
+	encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN3;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/* Read and clear any assertion state */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+
+	/* Exit the assertion handler */
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		if (rc != EACCES)
+			goto fail2;
+
+	if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
+		goto fail3;
+
+	/* Get remaining controller-specific board config */
+	if ((rc = enop->eno_board_cfg(enp)) != 0)
+		goto fail4;
+
+	/*
+	 * Set default driver config limits (based on board config).
+	 *
+	 * FIXME: For now allocate a fixed number of VIs which is likely to be
+	 * sufficient and small enough to allow multiple functions on the same
+	 * port.
+	 */
+	edcp->edc_min_vi_count = edcp->edc_max_vi_count =
+	    MIN(128, MAX(encp->enc_rxq_limit, encp->enc_txq_limit));
+
+	/*
+	 * The client driver must configure and enable PIO buffer support,
+	 * but there is no PIO support on Riverhead anyway.
+	 */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+#if EFSYS_OPT_MAC_STATS
+	/* Wipe the MAC statistics */
+	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
+		goto fail5;
+#endif
+
+#if EFSYS_OPT_LOOPBACK
+	if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
+		goto fail6;
+#endif
+
+	return (0);
+
+#if EFSYS_OPT_LOOPBACK
+fail6:
+	EFSYS_PROBE(fail6);
+#endif
+#if EFSYS_OPT_MAC_STATS
+fail5:
+	EFSYS_PROBE(fail5);
+#endif
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_evq_count, max_evq_count;
+	uint32_t min_rxq_count, max_rxq_count;
+	uint32_t min_txq_count, max_txq_count;
+	efx_rc_t rc;
+
+	if (edlp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	/* Get minimum required and maximum usable VI limits */
+	min_evq_count = MIN(edlp->edl_min_evq_count, encp->enc_evq_limit);
+	min_rxq_count = MIN(edlp->edl_min_rxq_count, encp->enc_rxq_limit);
+	min_txq_count = MIN(edlp->edl_min_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_min_vi_count =
+	    MAX(min_evq_count, MAX(min_rxq_count, min_txq_count));
+
+	max_evq_count = MIN(edlp->edl_max_evq_count, encp->enc_evq_limit);
+	max_rxq_count = MIN(edlp->edl_max_rxq_count, encp->enc_rxq_limit);
+	max_txq_count = MIN(edlp->edl_max_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_max_vi_count =
+	    MAX(max_evq_count, MAX(max_rxq_count, max_txq_count));
+
+	/* There is no PIO support on Riverhead */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		goto fail2;
+
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
+		goto fail3;
+
+	/* Clear RX/TX DMA queue errors */
+	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp)
+{
+	const efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_vi_count, max_vi_count;
+	uint32_t vi_count, vi_base, vi_shift;
+	uint32_t vi_window_size;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
+
+	/* Enable reporting of some events (e.g. link change) */
+	if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
+		goto fail1;
+
+	min_vi_count = edcp->edc_min_vi_count;
+	max_vi_count = edcp->edc_max_vi_count;
+
+	/* Ensure that the previously attached driver's VIs are freed */
+	if ((rc = efx_mcdi_free_vis(enp)) != 0)
+		goto fail2;
+
+	/*
+	 * Reserve VI resources (EVQ+RXQ+TXQ) for this PCIe function. If this
+	 * fails then retrying the request for fewer VI resources may succeed.
+	 */
+	vi_count = 0;
+	if ((rc = efx_mcdi_alloc_vis(enp, min_vi_count, max_vi_count,
+		    &vi_base, &vi_count, &vi_shift)) != 0)
+		goto fail3;
+
+	EFSYS_PROBE2(vi_alloc, uint32_t, vi_base, uint32_t, vi_count);
+
+	if (vi_count < min_vi_count) {
+		rc = ENOMEM;
+		goto fail4;
+	}
+
+	enp->en_arch.ef10.ena_vi_base = vi_base;
+	enp->en_arch.ef10.ena_vi_count = vi_count;
+	enp->en_arch.ef10.ena_vi_shift = vi_shift;
+
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, !=,
+	    EFX_VI_WINDOW_SHIFT_INVALID);
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, <=,
+	    EFX_VI_WINDOW_SHIFT_64K);
+	vi_window_size = 1U << enp->en_nic_cfg.enc_vi_window_shift;
+
+	/* Save UC memory mapping details */
+	enp->en_arch.ef10.ena_uc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_uc_mem_map_size =
+	    vi_window_size * enp->en_arch.ef10.ena_vi_count;
+
+	/* No WC memory mapping since PIO is not supported */
+	enp->en_arch.ef10.ena_pio_write_vi_base = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
+
+	enp->en_vport_id = EVB_PORT_ID_NULL;
+
+	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
+
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+
+	(void) efx_mcdi_free_vis(enp);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp)
+{
+	/*
+	 * Report VIs that the client driver can use.
+	 * Do not include VIs used for PIO buffer writes.
+	 */
+	*vi_countp = enp->en_arch.ef10.ena_vi_count;
+
+	return (0);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep)
+{
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/*
+	 * TODO: Specify host memory mapping alignment and granularity
+	 * in efx_drv_limits_t so that they can be taken into account
+	 * when allocating extra VIs for PIO writes.
+	 */
+	switch (region) {
+	case EFX_REGION_VI:
+		/* UC mapped memory BAR region for VI registers */
+		*offsetp = enp->en_arch.ef10.ena_uc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_uc_mem_map_size;
+		break;
+
+	case EFX_REGION_PIO_WRITE_VI:
+		/* WC mapped memory BAR region for piobuf writes */
+		*offsetp = enp->en_arch.ef10.ena_wc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_wc_mem_map_size;
+		break;
+
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	efx_dword_t dword;
+
+	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
+		return (B_TRUE);
+
+	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
+		goto unavail;
+
+	return (B_FALSE);
+
+unavail:
+	rhead_nic_set_hw_unavailable(enp);
+
+	return (B_TRUE);
+}
+
+			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	EFSYS_PROBE(hw_unavail);
+	enp->en_reset_flags |= EFX_RESET_HW_UNAVAIL;
+}
+
+			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_free_vis(enp);
+	enp->en_arch.ef10.ena_vi_count = 0;
+}
+
+			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_drv_attach(enp, B_FALSE);
+}
+
+#if EFSYS_OPT_DIAG
+
+	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* FIXME */
+	_NOTE(ARGUNUSED(enp))
+	_NOTE(CONSTANTCONDITION)
+	if (B_FALSE) {
+		rc = ENOTSUP;
+		goto fail1;
+	}
+	/* FIXME */
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFSYS_OPT_DIAG */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (13 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
                   ` (47 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Riverhead does not support tunnels yet.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_tunnel.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 1cc072f0d9..b1d1407bd2 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -10,12 +10,12 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
 	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
 };
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
@@ -171,6 +171,12 @@ efx_tunnel_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etop = &__efx_tunnel_dummy_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 16/60] common/sfc_efx/base: use EF10 filter methods for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (14 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
                   ` (46 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Filtering MCDI on Riverhead are the same as on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c | 14 +++++++-------
 drivers/common/sfc_efx/base/efx_filter.c  | 18 ++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h    |  4 ++--
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 12c84a5640..51e6f1a210 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_FILTER
 
@@ -94,7 +94,7 @@ ef10_filter_init(
 	efx_rc_t rc;
 	ef10_filter_table_t *eftp;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 #define	MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match))
 	EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_HOST ==
@@ -152,7 +152,7 @@ ef10_filter_init(
 ef10_filter_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if (enp->en_filter.ef_ef10_filter_table != NULL) {
 		EFSYS_KMEM_FREE(enp->en_esip, sizeof (ef10_filter_table_t),
@@ -540,7 +540,7 @@ ef10_filter_restore(
 	efsys_lock_state_t state;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	for (tbl_id = 0; tbl_id < EFX_EF10_FILTER_TBL_ROWS; tbl_id++) {
 
@@ -839,7 +839,7 @@ ef10_filter_add_internal(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	EFSYS_ASSERT(spec->efs_overridden_spec == NULL);
 
@@ -1149,7 +1149,7 @@ ef10_filter_delete(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	hash = ef10_filter_hash(spec);
 
@@ -2138,4 +2138,4 @@ ef10_filter_default_rxq_clear(
 
 #endif /* EFSYS_OPT_FILTER */
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_filter.c b/drivers/common/sfc_efx/base/efx_filter.c
index 3310b738e2..9b4cd08bb8 100644
--- a/drivers/common/sfc_efx/base/efx_filter.c
+++ b/drivers/common/sfc_efx/base/efx_filter.c
@@ -68,6 +68,18 @@ static const efx_filter_ops_t	__efx_filter_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_filter_ops_t	__efx_filter_rhead_ops = {
+	ef10_filter_init,		/* efo_init */
+	ef10_filter_fini,		/* efo_fini */
+	ef10_filter_restore,		/* efo_restore */
+	ef10_filter_add,		/* efo_add */
+	ef10_filter_delete,		/* efo_delete */
+	ef10_filter_supported_filters,	/* efo_supported_filters */
+	ef10_filter_reconfigure,	/* efo_reconfigure */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_filter_insert(
 	__in		efx_nic_t *enp,
@@ -180,6 +192,12 @@ efx_filter_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		efop = &__efx_filter_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b41b0e5dea..cc34a05f95 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -465,9 +465,9 @@ typedef struct efx_filter_s {
 #if EFSYS_OPT_SIENA
 	siena_filter_t		*ef_siena_filter;
 #endif /* EFSYS_OPT_SIENA */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	ef10_filter_table_t	*ef_ef10_filter_table;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 } efx_filter_t;
 
 #if EFSYS_OPT_SIENA
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 17/60] common/sfc_efx/base: use EF10 MAC methods for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (15 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
                   ` (45 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

There is no difference yet in MAC support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mac.c |  6 ++---
 drivers/common/sfc_efx/base/efx_impl.h |  1 +
 drivers/common/sfc_efx/base/efx_mac.c  | 32 ++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mac.c b/drivers/common/sfc_efx/base/ef10_mac.c
index 7e89f34a69..6fe44f13e2 100644
--- a/drivers/common/sfc_efx/base/ef10_mac.c
+++ b/drivers/common/sfc_efx/base/ef10_mac.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_mac_poll(
@@ -351,7 +351,7 @@ ef10_mac_multicast_list_set(
 	const efx_mac_ops_t *emop = epp->ep_emop;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if ((rc = emop->emo_reconfigure(enp)) != 0)
 		goto fail1;
@@ -1039,4 +1039,4 @@ ef10_mac_stats_update(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index cc34a05f95..f2ea08bbf6 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -77,6 +77,7 @@ typedef enum efx_mac_type_e {
 	EFX_MAC_HUNTINGTON,
 	EFX_MAC_MEDFORD,
 	EFX_MAC_MEDFORD2,
+	EFX_MAC_RIVERHEAD,
 	EFX_MAC_NTYPES
 } efx_mac_type_t;
 
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index ae23aad4b2..36aca6787c 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -64,6 +64,31 @@ static const efx_mac_ops_t	__efx_mac_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_mac_ops_t	__efx_mac_rhead_ops = {
+	ef10_mac_poll,				/* emo_poll */
+	ef10_mac_up,				/* emo_up */
+	ef10_mac_addr_set,			/* emo_addr_set */
+	ef10_mac_pdu_set,			/* emo_pdu_set */
+	ef10_mac_pdu_get,			/* emo_pdu_get */
+	ef10_mac_reconfigure,			/* emo_reconfigure */
+	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
+	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
+	ef10_mac_filter_default_rxq_clear,
+					/* emo_filter_default_rxq_clear */
+#if EFSYS_OPT_LOOPBACK
+	ef10_mac_loopback_set,			/* emo_loopback_set */
+#endif	/* EFSYS_OPT_LOOPBACK */
+#if EFSYS_OPT_MAC_STATS
+	ef10_mac_stats_get_mask,		/* emo_stats_get_mask */
+	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
+	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
+	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
+	ef10_mac_stats_update			/* emo_stats_update */
+#endif	/* EFSYS_OPT_MAC_STATS */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn			efx_rc_t
 efx_mac_pdu_set(
 	__in				efx_nic_t *enp,
@@ -873,6 +898,13 @@ efx_mac_select(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emop = &__efx_mac_rhead_ops;
+		type = EFX_MAC_RIVERHEAD;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = EINVAL;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 18/60] common/sfc_efx/base: add interrupts module for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (16 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
                   ` (44 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Riverhead supports interrupt aggregation rings. Right now there
are no plans to support it in libefx, but it is better to have
own set of callbacks to easier handle EF10 and Riverhead
differences in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_intr.c   |  20 +++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  55 ++++++++++++
 drivers/common/sfc_efx/base/rhead_intr.c | 104 +++++++++++++++++++++++
 4 files changed, 180 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c

diff --git a/drivers/common/sfc_efx/base/efx_intr.c b/drivers/common/sfc_efx/base/efx_intr.c
index 7e3cc3c6a0..1dfa19df2e 100644
--- a/drivers/common/sfc_efx/base/efx_intr.c
+++ b/drivers/common/sfc_efx/base/efx_intr.c
@@ -89,6 +89,20 @@ static const efx_intr_ops_t	__efx_intr_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_intr_ops_t	__efx_intr_rhead_ops = {
+	rhead_intr_init,		/* eio_init */
+	rhead_intr_enable,		/* eio_enable */
+	rhead_intr_disable,		/* eio_disable */
+	rhead_intr_disable_unlocked,	/* eio_disable_unlocked */
+	rhead_intr_trigger,		/* eio_trigger */
+	rhead_intr_status_line,		/* eio_status_line */
+	rhead_intr_status_message,	/* eio_status_message */
+	rhead_intr_fatal,		/* eio_fatal */
+	rhead_intr_fini,		/* eio_fini */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_intr_init(
 	__in		efx_nic_t *enp,
@@ -138,6 +152,12 @@ efx_intr_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eiop = &__efx_intr_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(B_FALSE);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 6ca5b57023..ea2517ba26 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_intr.c',
 	'rhead_nic.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index e25a871cb3..b95302a13f 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -98,6 +98,61 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* INTR */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_intr.c b/drivers/common/sfc_efx/base/rhead_intr.c
new file mode 100644
index 0000000000..08c770529f
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_intr.c
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp)
+{
+	_NOTE(ARGUNUSED(enp, type, esmp))
+
+	return (0);
+}
+
+
+			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level)
+{
+	_NOTE(ARGUNUSED(enp, level))
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp)
+{
+	_NOTE(ARGUNUSED(enp, qmaskp))
+
+	/*
+	 * Riverhead does not support line interrupts,
+	 * so this function should never be called.
+	 */
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp)
+{
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	_NOTE(ARGUNUSED(enp, message))
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp)
+{
+	/* Fatal errors are reported via events */
+	_NOTE(ARGUNUSED(enp))
+}
+
+			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (17 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
                   ` (43 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

EvQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement EvQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  | 304 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  33 +++
 drivers/common/sfc_efx/base/efx_mcdi.c | 306 +++++++++++++++++++++++++
 3 files changed, 339 insertions(+), 304 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index f0a135ed57..08729cf71e 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -100,310 +100,6 @@ efx_mcdi_set_evq_tmr(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags,
-	__in		boolean_t low_latency)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	boolean_t interrupting;
-	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
-	unsigned int evq_type;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_evq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
-		MC_CMD_FINI_EVQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the EVQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
 
 	__checkReturn	efx_rc_t
 ef10_ev_init(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f2ea08bbf6..bf1cfc49ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,6 +1408,39 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index ade7f7fed4..5b733bb88c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,4 +2443,310 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	boolean_t interrupting;
+	int ev_cut_through;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	/*
+	 * On Huntington RX and TX event batching can only be requested together
+	 * (even if the datapath firmware doesn't actually support RX
+	 * batching). If event cut through is enabled no RX batching will occur.
+	 *
+	 * So always enable RX and TX event batching, and enable event cut
+	 * through if we want low latency operation.
+	 */
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		ev_cut_through = low_latency ? 1 : 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		ev_cut_through = 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		ev_cut_through = 1;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
+	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
+	boolean_t interrupting;
+	unsigned int evq_type;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
+		MC_CMD_FINI_EVQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the EVQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 20/60] common/sfc_efx/base: move EvQ create generic checks
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (18 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
                   ` (42 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

There is no point to duplicate these generic checks in NIC family
specific handlers.

As the side effect it fixes bug with incorrect interrupt moderation
settings silently ignored on event queue create on Siena.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c | 20 ++-----------
 drivers/common/sfc_efx/base/efx_ev.c  | 42 ++++++++++++++++-----------
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 08729cf71e..18f19e816d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -133,16 +133,6 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	if (us > encp->enc_evq_timer_max_us) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
@@ -156,7 +146,7 @@ ef10_ev_qcreate(
 	if (flags & EFX_EVQ_FLAGS_NO_CONT_EV) {
 		if (enp->en_nic_cfg.enc_no_cont_ev_mode_supported == B_FALSE) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail1;
 		}
 	}
 
@@ -197,7 +187,7 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
 		    flags);
 		if (rc != 0)
-			goto fail4;
+			goto fail2;
 	} else {
 		/*
 		 * On Huntington we need to specify the settings to use.
@@ -214,15 +204,11 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 		    low_latency);
 		if (rc != 0)
-			goto fail5;
+			goto fail3;
 	}
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 21fddfb64d..4d11c531ce 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -236,18 +236,28 @@ efx_ev_qcreate(
 	EFSYS_ASSERT3U(enp->en_ev_qcount + 1, <,
 	    enp->en_nic_cfg.enc_evq_limit);
 
+	if (index >= encp->enc_evq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (us > encp->enc_evq_timer_max_us) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
 	switch (flags & EFX_EVQ_FLAGS_NOTIFY_MASK) {
 	case EFX_EVQ_FLAGS_NOTIFY_INTERRUPT:
 		break;
 	case EFX_EVQ_FLAGS_NOTIFY_DISABLED:
 		if (us != 0) {
 			rc = EINVAL;
-			goto fail1;
+			goto fail3;
 		}
 		break;
 	default:
 		rc = EINVAL;
-		goto fail2;
+		goto fail4;
 	}
 
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
@@ -257,14 +267,14 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail5;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail4;
+		goto fail6;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -287,16 +297,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail5;
+		goto fail7;
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
+fail7:
+	EFSYS_PROBE(fail7);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
@@ -1189,15 +1203,11 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 #endif
 	for (size = 0;
@@ -1207,7 +1217,7 @@ siena_ev_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	/* Set up the handler table */
@@ -1239,13 +1249,11 @@ siena_ev_qcreate(
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
-#if EFSYS_OPT_RX_SCALE
 fail2:
 	EFSYS_PROBE(fail2);
-#endif
+#if EFSYS_OPT_RX_SCALE
 fail1:
+#endif
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
 	return (rc);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 21/60] common/sfc_efx/base: prepare to merge EvQ init functions
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (19 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
                   ` (41 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

v1 and v2 defines are the same except output length.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 52 +++++++++++++-------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 5b733bb88c..50d723ecb4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2458,8 +2458,8 @@ efx_mcdi_init_evq(
 {
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
 	int npages;
@@ -2476,13 +2476,13 @@ efx_mcdi_init_evq(
 
 	req.emr_cmd = MC_CMD_INIT_EVQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
 
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
@@ -2509,37 +2509,37 @@ efx_mcdi_init_evq(
 		rc = EINVAL;
 		goto fail2;
 	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
 	} else {
 		unsigned int ticks;
 
 		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
 			goto fail3;
 
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
 	}
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
 
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
 	for (i = 0; i < npages; i++) {
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (20 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
                   ` (40 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

The decision on which version of the INIT_EVQ command to use may
be done inside the function itself. Caller should just provide
enough information sufficient in both cases. It avoids code
duplication and simplifies maintenance.

If v2 is not supported, keep decision about low-latency hint outside
the MCDI helper function since it will differ on Riverhead (there is
no EVB yet, but still want merging for better throughput).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  |  54 +++---
 drivers/common/sfc_efx/base/efx_impl.h |  11 --
 drivers/common/sfc_efx/base/efx_mcdi.c | 228 ++++++++-----------------
 3 files changed, 95 insertions(+), 198 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 18f19e816d..e2b5c62d5d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -130,6 +130,7 @@ ef10_ev_qcreate(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	uint32_t irq;
 	efx_rc_t rc;
+	boolean_t low_latency;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
@@ -175,42 +176,29 @@ ef10_ev_qcreate(
 	 * created. See bug58606.
 	 */
 
-	if (encp->enc_init_evq_v2_supported) {
-		/*
-		 * On Medford the low latency license is required to enable RX
-		 * and event cut through and to disable RX batching.  If event
-		 * queue type in flags is auto, we let the firmware decide the
-		 * settings to use. If the adapter has a low latency license,
-		 * it will choose the best settings for low latency, otherwise
-		 * it will choose the best settings for throughput.
-		 */
-		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
-		    flags);
-		if (rc != 0)
-			goto fail2;
-	} else {
-		/*
-		 * On Huntington we need to specify the settings to use.
-		 * If event queue type in flags is auto, we favour throughput
-		 * if the adapter is running virtualization supporting firmware
-		 * (i.e. the full featured firmware variant)
-		 * and latency otherwise. The Ethernet Virtual Bridging
-		 * capability is used to make this decision. (Note though that
-		 * the low latency firmware variant is also best for
-		 * throughput and corresponding type should be specified
-		 * to choose it.)
-		 */
-		boolean_t low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
-		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
-		    low_latency);
-		if (rc != 0)
-			goto fail3;
-	}
+	/*
+	 * On Huntington we need to specify the settings to use.
+	 * If event queue type in flags is auto, we favour throughput
+	 * if the adapter is running virtualization supporting firmware
+	 * (i.e. the full featured firmware variant)
+	 * and latency otherwise. The Ethernet Virtual Bridging
+	 * capability is used to make this decision. (Note though that
+	 * the low latency firmware variant is also best for
+	 * throughput and corresponding type should be specified
+	 * to choose it.)
+	 *
+	 * If FW supports EvQ types (e.g. on Medford and Medford2) the
+	 * type which is specified in flags is passed to FW to make the
+	 * decision and low_latency hint is ignored.
+	 */
+	low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    low_latency);
+	if (rc != 0)
+		goto fail2;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index bf1cfc49ca..47e4dcb01f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1422,17 +1422,6 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency);
 
-LIBEFX_INTERNAL
-extern	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags);
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_fini_evq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 50d723ecb4..69d2327839 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2456,146 +2456,14 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
 		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
 	boolean_t interrupting;
 	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
+	int ev_merge;
 	unsigned int evq_type;
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2622,24 +2490,68 @@ efx_mcdi_init_evq_v2(
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
 
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
+	if (encp->enc_init_evq_v2_supported) {
+		/*
+		 * On Medford the low latency license is required to enable RX
+		 * and event cut through and to disable RX batching.  If event
+		 * queue type in flags is auto, we let the firmware decide the
+		 * settings to use. If the adapter has a low latency license,
+		 * it will choose the best settings for low latency, otherwise
+		 * it will choose the best settings for throughput.
+		 */
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
+		/* EvQ type controls merging, no manual settings */
+		ev_merge = 0;
+		ev_cut_through = 0;
+	} else {
+		/* EvQ types other than manual are not supported */
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_MANUAL;
+		/*
+		 * On Huntington RX and TX event batching can only be requested
+		 * together (even if the datapath firmware doesn't actually
+		 * support RX batching). If event cut through is enabled no RX
+		 * batching will occur.
+		 *
+		 * So always enable RX and TX event batching, and enable event
+		 * cut through if we want low latency operation.
+		 */
+		ev_merge = 1;
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			ev_cut_through = low_latency ? 1 : 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			ev_cut_through = 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			ev_cut_through = 1;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
 	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+
+	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
 
 	/* If the value is zero then disable the timer */
@@ -2683,18 +2595,26 @@ efx_mcdi_init_evq_v2(
 		goto fail4;
 	}
 
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
+	if (encp->enc_init_evq_v2_supported) {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail5;
+		}
+		EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+			    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+	} else {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail6;
+		}
 	}
 
 	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
 
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
 fail5:
 	EFSYS_PROBE(fail5);
 fail4:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 23/60] common/sfc_efx/base: add event queue module for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (21 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
                   ` (39 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Events are significantly reworked on Riverhead, so it is better
to implement own set of callbacks to simplify future development
and avoid inheritance of legacy code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c     |  22 ++
 drivers/common/sfc_efx/base/efx_impl.h   |   4 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |  19 +-
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_ev.c   | 265 +++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  73 +++++++
 6 files changed, 379 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 4d11c531ce..edc1b182c9 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -109,6 +109,22 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_ev_ops_t	__efx_ev_rhead_ops = {
+	rhead_ev_init,				/* eevo_init */
+	rhead_ev_fini,				/* eevo_fini */
+	rhead_ev_qcreate,			/* eevo_qcreate */
+	rhead_ev_qdestroy,			/* eevo_qdestroy */
+	rhead_ev_qprime,			/* eevo_qprime */
+	rhead_ev_qpost,				/* eevo_qpost */
+	rhead_ev_qpoll,				/* eevo_qpoll */
+	rhead_ev_qmoderate,			/* eevo_qmoderate */
+#if EFSYS_OPT_QSTATS
+	rhead_ev_qstats_update,			/* eevo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_ev_init(
@@ -150,6 +166,12 @@ efx_ev_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eevop = &__efx_ev_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 47e4dcb01f..f6b0850a65 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,7 +1408,7 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
@@ -1428,7 +1428,7 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 69d2327839..841dacc1c8 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,7 +2443,20 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+#define	INIT_EVQ_MAXNBUFS	MC_CMD_INIT_EVQ_V2_IN_DMA_ADDR_MAXNUM
+
 #if EFX_OPTS_EF10()
+# if (INIT_EVQ_MAXNBUFS < EF10_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFX_OPTS_EF10 */
+#if EFSYS_OPT_RIVERHEAD
+# if (INIT_EVQ_MAXNBUFS < RHEAD_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFSYS_OPT_RIVERHEAD */
 
 	__checkReturn	efx_rc_t
 efx_mcdi_init_evq(
@@ -2459,7 +2472,7 @@ efx_mcdi_init_evq(
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
 	int ev_cut_through;
@@ -2472,7 +2485,7 @@ efx_mcdi_init_evq(
 	efx_rc_t rc;
 
 	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
+	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
 	}
@@ -2667,6 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index ea2517ba26..8e50f82154 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
new file mode 100644
index 0000000000..fa74e408ae
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -0,0 +1,265 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD
+
+/*
+ * Non-interrupting event queue requires interrrupting event queue to
+ * refer to for wake-up events even if wake ups are never used.
+ * It could be even non-allocated event queue.
+ */
+#define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
+
+
+	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+
+	return (0);
+}
+
+			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep)
+{
+	uint32_t irq;
+	efx_rc_t rc;
+
+	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
+
+	/* Set up the handler table */
+	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_driver	= NULL; /* FIXME */
+	eep->ee_drv_gen	= NULL; /* FIXME */
+	eep->ee_mcdi	= NULL; /* FIXME */
+
+	/* Set up the event queue */
+	/* INIT_EVQ expects function-relative vector number */
+	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT) {
+		irq = index;
+	} else if (index == EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX) {
+		irq = index;
+		flags = (flags & ~EFX_EVQ_FLAGS_NOTIFY_MASK) |
+		    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT;
+	} else {
+		irq = EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX;
+	}
+
+	/*
+	 * Interrupts may be raised for events immediately after the queue is
+	 * created. See bug58606.
+	 */
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    B_FALSE);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep)
+{
+	efx_nic_t *enp = eep->ee_enp;
+
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	(void) efx_mcdi_fini_evq(enp, eep->ee_index);
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t rptr;
+	efx_dword_t dword;
+
+	rptr = count & eep->ee_mask;
+
+	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
+	    ERF_GZ_IDX, rptr);
+	/* EVQ_INT_PRIME lives function control window only on Riverhead */
+	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+
+	return (0);
+}
+
+			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data)
+{
+	_NOTE(ARGUNUSED(eep, data))
+
+	/* Not implemented yet */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+/*
+ * Poll event queue in batches. Size of the batch is equal to cache line
+ * size divided by event size.
+ *
+ * Event queue is written by NIC and read by CPU. If CPU starts reading
+ * of events on the cache line, read all remaining events in a tight
+ * loop while event is present.
+ */
+#define	EF100_EV_BATCH	8
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_PRESENT(_qword, _phase_bit)				\
+	(EFX_QWORD_FIELD((_qword), ESF_GZ_EV_EVQ_PHASE) == _phase_bit)
+
+			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EF100_EV_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_BATCH - (count & (EF100_EV_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_PRESENT(ev[total], phase_bit))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
+			switch (code) {
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_BATCH);
+				batch += (EF100_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us)
+{
+	_NOTE(ARGUNUSED(eep, us))
+
+	return (ENOTSUP);
+}
+
+
+#if EFSYS_OPT_QSTATS
+			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < EV_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, eep->ee_stat[id]);
+		eep->ee_stat[id] = 0;
+	}
+}
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index b95302a13f..dc8a40cd2a 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -12,6 +12,13 @@ extern "C" {
 #endif
 
 
+/*
+ * Riverhead requires physically contiguos event rings (so, just one
+ * DMA address is sufficient to represent it), but MCDI interface is still
+ * in terms of 4k size 4k-aligned DMA buffers.
+ */
+#define	RHEAD_EVQ_MAXNBUFS	32
+
 #define	RHEAD_EVQ_MAXNEVS	16384
 #define	RHEAD_EVQ_MINNEVS	256
 
@@ -98,6 +105,72 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* EV */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 /* INTR */
 
 LIBEFX_INTERNAL
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (22 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
                   ` (38 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Client drivers relying on interrupts will fail to complete event
queue creation on Riverhead boards as the latter have no support
for INIT_DONE events which means that it's useless to wait until
initialisation callback is triggered by interrupt-driven polling.

Client drivers which avoid interrupt-driven polling still handle
INIT_DONE events by direct polling and will fail to do so.

Solve this problem by adding an extra poll-once method which
will be called by client drivers after queue creation (probably,
with driver-specific lock being held). The method will invoke
initialisation callback on Riverhead and do nothing on the other
boards. Then the drivers will proceed with normal waiting which
will complete immediately in the case of Riverhead.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  8 +++++
 drivers/common/sfc_efx/base/efx_ev.c          | 30 +++++++++++++++++++
 drivers/common/sfc_efx/base/hunt_nic.c        |  6 ++++
 drivers/common/sfc_efx/base/medford2_nic.c    |  6 ++++
 drivers/common/sfc_efx/base/medford_nic.c     |  6 ++++
 drivers/common/sfc_efx/base/rhead_nic.c       |  6 ++++
 drivers/common/sfc_efx/base/siena_nic.c       |  6 ++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 drivers/net/sfc/sfc_ev.c                      | 12 ++++++--
 9 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c7fe814ca0..2c49280a43 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1443,6 +1443,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
 #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+	boolean_t		enc_evq_init_done_ev_supported;
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
@@ -2430,6 +2431,13 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+LIBEFX_API
+extern			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 LIBEFX_API
 extern			void
 efx_ev_qpoll(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index edc1b182c9..99a7743edb 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -423,6 +423,36 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+/*
+ * This method is needed to ensure that eec_initialized callback
+ * is invoked after queue creation. The callback will be invoked
+ * on Riverhead boards which have no support for INIT_DONE events
+ * and will do nothing on other boards.
+ *
+ * The client drivers must call this method after calling efx_ev_create().
+ * The call must be done with the same locks being held (if any) which are
+ * normally acquired around efx_ev_qpoll() calls to ensure that
+ * eec_initialized callback is invoked within the same locking context.
+ */
+			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	const efx_nic_cfg_t *encp;
+
+	EFSYS_ASSERT(eep != NULL);
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(eecp != NULL);
+	EFSYS_ASSERT(eecp->eec_initialized != NULL);
+
+	encp = efx_nic_cfg_get(eep->ee_enp);
+
+	if (encp->enc_evq_init_done_ev_supported == B_FALSE)
+		(void) eecp->eec_initialized(arg);
+}
+
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/hunt_nic.c b/drivers/common/sfc_efx/base/hunt_nic.c
index 75c9050070..489c2d35d3 100644
--- a/drivers/common/sfc_efx/base/hunt_nic.c
+++ b/drivers/common/sfc_efx/base/hunt_nic.c
@@ -76,6 +76,12 @@ hunt_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford2_nic.c b/drivers/common/sfc_efx/base/medford2_nic.c
index 1a454fc34b..f19435a202 100644
--- a/drivers/common/sfc_efx/base/medford2_nic.c
+++ b/drivers/common/sfc_efx/base/medford2_nic.c
@@ -44,6 +44,12 @@ medford2_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford_nic.c b/drivers/common/sfc_efx/base/medford_nic.c
index 6c85b0c841..6ad9af9403 100644
--- a/drivers/common/sfc_efx/base/medford_nic.c
+++ b/drivers/common/sfc_efx/base/medford_nic.c
@@ -42,6 +42,12 @@ medford_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index c83d18e6ab..b779b4f8e1 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -51,6 +51,12 @@ rhead_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
+	/*
+	 * Riverhead event queue creation completes
+	 * immediately (no initial event).
+	 */
+	encp->enc_evq_init_done_ev_supported = B_FALSE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index b9b6d1951c..beabac0d38 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -135,6 +135,12 @@ siena_board_cfg(
 	encp->enc_rx_scale_additional_modes_supported = B_FALSE;
 #endif /* EFSYS_OPT_RX_SCALE */
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
 	/* Fragments must not span 4k boundaries. */
 	encp->enc_tx_dma_desc_boundary = 4096;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 5e2a7ad919..9b1715bfee 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -6,6 +6,7 @@ INTERNAL {
 	efx_ev_fini;
 	efx_ev_init;
 	efx_ev_qcreate;
+	efx_ev_qcreate_check_init_done;
 	efx_ev_qdestroy;
 	efx_ev_qmoderate;
 	efx_ev_qpending;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 83115e8775..7e5676fa45 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -608,6 +608,8 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	else
 		evq_flags |= EFX_EVQ_FLAGS_NOTIFY_DISABLED;
 
+	evq->init_state = SFC_EVQ_STARTING;
+
 	/* Create the common code event queue */
 	rc = efx_ev_qcreate(sa->nic, hw_index, esmp, evq->entries,
 			    0 /* unused on EF10 */, 0, evq_flags,
@@ -632,7 +634,13 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 		evq->callbacks = &sfc_ev_callbacks;
 	}
 
-	evq->init_state = SFC_EVQ_STARTING;
+	/*
+	 * Poll once to ensure that eec_initialized callback is invoked in
+	 * case if the hardware does not support INIT_DONE events. If the
+	 * hardware supports INIT_DONE events, this will do nothing, and the
+	 * corresponding event will be processed by sfc_ev_qpoll() below.
+	 */
+	efx_ev_qcreate_check_init_done(evq->common, evq->callbacks, evq);
 
 	/* Wait for the initialization event */
 	total_delay_us = 0;
@@ -665,10 +673,10 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	return 0;
 
 fail_timedout:
-	evq->init_state = SFC_EVQ_INITIALIZED;
 	efx_ev_qdestroy(evq->common);
 
 fail_ev_qcreate:
+	evq->init_state = SFC_EVQ_INITIALIZED;
 	sfc_log_init(sa, "failed %d", rc);
 	return rc;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 25/60] common/sfc_efx/base: handle MCDI events on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (23 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
                   ` (37 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

EF100 MCDI event layout is same as on EF10 except added QDMA phase
bit which is unused on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c   | 17 +++++++------
 drivers/common/sfc_efx/base/ef10_impl.h |  8 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  | 33 ++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index e2b5c62d5d..aec1c468a4 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -47,13 +47,6 @@ ef10_ev_drv_gen(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-static	__checkReturn	boolean_t
-ef10_ev_mcdi(
-	__in		efx_evq_t *eep,
-	__in		efx_qword_t *eqp,
-	__in		const efx_ev_callbacks_t *eecp,
-	__in_opt	void *arg);
-
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_set_evq_tmr(
@@ -857,7 +850,11 @@ ef10_ev_drv_gen(
 	return (should_abort);
 }
 
-static	__checkReturn	boolean_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	boolean_t
 ef10_ev_mcdi(
 	__in		efx_evq_t *eep,
 	__in		efx_qword_t *eqp,
@@ -1064,6 +1061,10 @@ ef10_ev_mcdi(
 	return (should_abort);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 		void
 ef10_ev_rxlabel_init(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e933d88135..e77fb4ddea 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -158,6 +158,14 @@ ef10_ev_rxlabel_fini(
 	__in		efx_evq_t *eep,
 	__in		unsigned int label);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+ef10_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 /* INTR */
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index fa74e408ae..0205769e70 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -17,6 +17,14 @@
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_init(
 	__in		efx_nic_t *enp)
@@ -54,7 +62,7 @@ rhead_ev_qcreate(
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
-	eep->ee_mcdi	= NULL; /* FIXME */
+	eep->ee_mcdi	= rhead_ev_mcdi;
 
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
@@ -193,6 +201,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_MCDI:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			default:
 				EFSYS_PROBE3(bad_event,
 				    unsigned int, eep->ee_index,
@@ -262,4 +274,23 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t ret;
+
+	/*
+	 * Event format was changed post Riverhead R1 and now
+	 * MCDI event layout on EF100 is exactly the same as on EF10
+	 * except added QDMA phase bit which is unused on EF10.
+	 */
+	ret = ef10_ev_mcdi(eep, eqp, eecp, arg);
+
+	return (ret);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (24 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
                   ` (36 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

RxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement RxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 184 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  28 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 187 +++++++++++++++++++++++++
 3 files changed, 215 insertions(+), 184 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index bfa55337c2..f27058963f 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -10,190 +10,6 @@
 
 #if EFX_OPTS_EF10()
 
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		efx_evq_t *eep,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
-	int npages = efx_rxq_nbufs(enp, ndescs);
-	int i;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	efx_rc_t rc;
-	uint32_t dma_mode;
-	boolean_t want_outer_classes;
-	boolean_t no_cont_ev;
-
-	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
-		/* TODO: Support scatter in NO_CONT_EV mode */
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	if (ps_bufsize > 0)
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
-		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
-	else
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
-
-	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
-		/*
-		 * WANT_OUTER_CLASSES can only be specified on hardware which
-		 * supports tunnel encapsulation offloads, even though it is
-		 * effectively the behaviour the hardware gives.
-		 *
-		 * Also, on hardware which does support such offloads, older
-		 * firmware rejects the flag if the offloads are not supported
-		 * by the current firmware variant, which means this may fail if
-		 * the capabilities are not updated when the firmware variant
-		 * changes. This is not an issue on newer firmware, as it was
-		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
-		 * specified on all firmware variants.
-		 */
-		want_outer_classes = B_TRUE;
-	} else {
-		want_outer_classes = B_FALSE;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
-	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
-	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
-	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
-	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
-	    INIT_RXQ_EXT_IN_DMA_MODE,
-	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
-	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
-	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
-
-	if (es_bufs_per_desc > 0) {
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
-	}
-
-	if (encp->enc_init_rxq_with_buffer_size)
-		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
-		MC_CMD_FINI_RXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the RXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
 efx_mcdi_rss_context_alloc(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f6b0850a65..48f853cf91 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,34 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 841dacc1c8..8bf7c86c3a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2682,4 +2682,191 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
+		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	int npages = efx_rxq_nbufs(enp, ndescs);
+	int i;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	efx_rc_t rc;
+	uint32_t dma_mode;
+	boolean_t want_outer_classes;
+	boolean_t no_cont_ev;
+
+	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
+	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+		/* TODO: Support scatter in NO_CONT_EV mode */
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	if (ps_bufsize > 0)
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
+	else if (es_bufs_per_desc > 0)
+		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
+	else
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
+
+	if (encp->enc_tunnel_encapsulations_supported != 0 &&
+	    !want_inner_classes) {
+		/*
+		 * WANT_OUTER_CLASSES can only be specified on hardware which
+		 * supports tunnel encapsulation offloads, even though it is
+		 * effectively the behaviour the hardware gives.
+		 *
+		 * Also, on hardware which does support such offloads, older
+		 * firmware rejects the flag if the offloads are not supported
+		 * by the current firmware variant, which means this may fail if
+		 * the capabilities are not updated when the firmware variant
+		 * changes. This is not an issue on newer firmware, as it was
+		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
+		 * specified on all firmware variants.
+		 */
+		want_outer_classes = B_TRUE;
+	} else {
+		want_outer_classes = B_FALSE;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
+	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
+	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
+	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
+	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_DMA_MODE,
+	    dma_mode,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
+	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
+
+	if (es_bufs_per_desc > 0) {
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
+		    es_bufs_per_desc);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
+		    hol_block_timeout);
+	}
+
+	if (encp->enc_init_rxq_with_buffer_size)
+		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
+		    buf_size);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
+		MC_CMD_FINI_RXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 27/60] common/sfc_efx/base: move TxQ init/fini wrappers to generic
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (25 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
                   ` (35 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

TxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement TxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_tx.c  | 133 -------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  17 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 133 +++++++++++++++++++++++++
 3 files changed, 150 insertions(+), 133 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index e2f9ebac46..61c7e49fe8 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -20,139 +20,6 @@
 #define	EFX_TX_QSTAT_INCR(_etp, _stat)
 #endif
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		uint32_t target_evq,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		uint16_t flags,
-	__in		efsys_mem_t *esmp)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
-		MC_CMD_INIT_TXQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
-	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	npages = efx_txq_nbufs(enp, ndescs);
-	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
-
-	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
-	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
-	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
-	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
-	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
-	    INIT_TXQ_IN_CRC_MODE, 0,
-	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
-		MC_CMD_FINI_TXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the TXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 	__checkReturn	efx_rc_t
 ef10_tx_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 48f853cf91..7d470619e1 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1456,6 +1456,23 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8bf7c86c3a..a2ac053f0c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2867,6 +2867,139 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+		MC_CMD_INIT_TXQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	npages = efx_txq_nbufs(enp, ndescs);
+	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
+
+	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
+	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
+	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
+	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
+	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
+	    INIT_TXQ_IN_CRC_MODE, 0,
+	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
+		MC_CMD_FINI_TXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 28/60] common/sfc_efx/base: switch TxQ init to extended version
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (26 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
                   ` (34 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Extended version of MCDI allows up to 64 DMA addresses which are
required for Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index a2ac053f0c..8db52acd66 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2878,8 +2878,7 @@ efx_mcdi_init_txq(
 	__in		efsys_mem_t *esmp)
 {
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_TXQ_EXT_IN_LEN,
 		MC_CMD_INIT_TXQ_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2887,7 +2886,7 @@ efx_mcdi_init_txq(
 	int i;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	EFSYS_ASSERT(MC_CMD_INIT_TXQ_EXT_IN_DMA_ADDR_MAXNUM >=
 	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
 
 	if ((esmp == NULL) ||
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 29/60] common/sfc_efx/base: maintain RxQ counter in generic code
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (27 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
                   ` (33 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

The counter is incremeted in generic efx_rx_qcreate(), but was
asserted and decremented in NIC family specific queue create and
destroy callbacks.  Move assert and decrement to generic functions
as well to make NIC family specific callbacks shorter.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 4 ----
 drivers/common/sfc_efx/base/efx_rx.c  | 9 +++++----
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index f27058963f..7004ab2aca 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -844,7 +844,6 @@ ef10_rx_qcreate(
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1022,9 +1021,6 @@ ef10_rx_qdestroy(
 
 	ef10_ev_rxlabel_fini(eep, label);
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index cce34cfce9..a361112849 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -819,6 +819,8 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
+	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
+
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
@@ -975,6 +977,9 @@ efx_rx_qdestroy(
 
 	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
 
+	EFSYS_ASSERT(enp->en_rx_qcount != 0);
+	--enp->en_rx_qcount;
+
 	erxop->erxo_qdestroy(erp);
 }
 
@@ -1626,7 +1631,6 @@ siena_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS ==
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1697,9 +1701,6 @@ siena_rx_qdestroy(
 	efx_nic_t *enp = erp->er_enp;
 	efx_oword_t oword;
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	/* Purge descriptor queue */
 	EFX_ZERO_OWORD(oword);
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 30/60] common/sfc_efx/base: free Rx queue structure in generic code
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (28 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
                   ` (32 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Rx queue structure is allocated in generic code, but was freed in NIC
family specific callbacks. Move free to generic function makes NIC
family specific callbacks shorter and reduces code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 3 ---
 drivers/common/sfc_efx/base/efx_rx.c  | 6 +++---
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 7004ab2aca..58152be768 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -1015,13 +1015,10 @@ ef10_rx_qcreate(
 ef10_rx_qdestroy(
 	__in	efx_rxq_t *erp)
 {
-	efx_nic_t *enp = erp->er_enp;
 	efx_evq_t *eep = erp->er_eep;
 	unsigned int label = erp->er_label;
 
 	ef10_ev_rxlabel_fini(eep, label);
-
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 		void
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index a361112849..d208c2292e 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -981,6 +981,9 @@ efx_rx_qdestroy(
 	--enp->en_rx_qcount;
 
 	erxop->erxo_qdestroy(erp);
+
+	/* Free the RXQ object */
+	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 	__checkReturn	efx_rc_t
@@ -1706,9 +1709,6 @@ siena_rx_qdestroy(
 
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
-
-	/* Free the RXQ object */
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 static		void
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 31/60] common/sfc_efx/base: move Rx index check to generic code
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (29 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
                   ` (31 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Make NIC family specific functions a bit shorter and reduce
code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 45 +++++++++++----------------
 drivers/common/sfc_efx/base/efx_rx.c  | 31 +++++++++---------
 2 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 58152be768..48666be5b5 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -845,16 +845,11 @@ ef10_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail2;
+			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
 		ps_buf_size = 0;
@@ -863,7 +858,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_PACKED_STREAM:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail2;
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
@@ -883,7 +878,7 @@ ef10_rx_qcreate(
 			break;
 		default:
 			rc = ENOTSUP;
-			goto fail4;
+			goto fail3;
 		}
 		erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
 		break;
@@ -892,7 +887,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 		ps_buf_size = 0;
 		es_bufs_per_desc =
@@ -907,7 +902,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 	default:
 		rc = ENOTSUP;
-		goto fail6;
+		goto fail5;
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -915,13 +910,13 @@ ef10_rx_qcreate(
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail7;
+			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
 		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
-			goto fail8;
+			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -932,17 +927,17 @@ ef10_rx_qcreate(
 	if (es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail9;
+			goto fail8;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail10;
+			goto fail9;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail11;
+			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -964,7 +959,7 @@ ef10_rx_qcreate(
 		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
 		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
 		    es_buf_stride, hol_block_timeout)) != 0)
-		goto fail12;
+		goto fail11;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
@@ -975,36 +970,34 @@ ef10_rx_qcreate(
 
 	return (0);
 
-fail12:
-	EFSYS_PROBE(fail12);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail11:
 	EFSYS_PROBE(fail11);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail10:
 	EFSYS_PROBE(fail10);
 fail9:
 	EFSYS_PROBE(fail9);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
 fail8:
 	EFSYS_PROBE(fail8);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail7:
 	EFSYS_PROBE(fail7);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail6:
 	EFSYS_PROBE(fail6);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail5:
 	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail3:
 	EFSYS_PROBE(fail3);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
 	EFSYS_PROBE(fail2);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index d208c2292e..bacab5ec67 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -824,11 +824,16 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
+	if (index >= encp->enc_rxq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	if (!ISP2(ndescs) ||
 	    ndescs < encp->enc_rxq_min_ndescs ||
 	    ndescs > encp->enc_rxq_max_ndescs) {
 		rc = EINVAL;
-		goto fail1;
+		goto fail2;
 	}
 
 	/* Allocate an RXQ object */
@@ -836,7 +841,7 @@ efx_rx_qcreate_internal(
 
 	if (erp == NULL) {
 		rc = ENOMEM;
-		goto fail2;
+		goto fail3;
 	}
 
 	erp->er_magic = EFX_RXQ_MAGIC;
@@ -847,17 +852,19 @@ efx_rx_qcreate_internal(
 
 	if ((rc = erxop->erxo_qcreate(enp, index, label, type, type_data, esmp,
 	    ndescs, id, flags, eep, erp)) != 0)
-		goto fail3;
+		goto fail4;
 
 	enp->en_rx_qcount++;
 	*erpp = erp;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
+fail4:
+	EFSYS_PROBE(fail4);
 
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1635,10 +1642,6 @@ siena_rx_qcreate(
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 	for (size = 0;
 	    (1U << size) <= encp->enc_rxq_max_ndescs / encp->enc_rxq_min_ndescs;
 	    size++)
@@ -1646,7 +1649,7 @@ siena_rx_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 
 	switch (type) {
@@ -1656,7 +1659,7 @@ siena_rx_qcreate(
 
 	default:
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	if (flags & EFX_RXQ_FLAG_SCATTER) {
@@ -1664,7 +1667,7 @@ siena_rx_qcreate(
 		jumbo = B_TRUE;
 #else
 		rc = EINVAL;
-		goto fail4;
+		goto fail3;
 #endif	/* EFSYS_OPT_RX_SCATTER */
 	}
 
@@ -1684,11 +1687,9 @@ siena_rx_qcreate(
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
-fail4:
-	EFSYS_PROBE(fail4);
-#endif
 fail3:
 	EFSYS_PROBE(fail3);
+#endif
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 32/60] common/sfc_efx/base: implement Rx control path for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (30 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
                   ` (30 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Reuse EF10 RSS-related functions since current version of the RSS
interface is compatible with EF10.

Implement own functions to create and destroy Rx queues which reuse
MCDI wrappers which are shared with EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c    |  11 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   8 +-
 drivers/common/sfc_efx/base/efx_rx.c     |  35 +++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h | 129 +++++++++
 drivers/common/sfc_efx/base/rhead_rx.c   | 316 +++++++++++++++++++++++
 7 files changed, 498 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 48666be5b5..61e0dab5b9 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
@@ -375,6 +375,8 @@ ef10_rx_init(
 	return (0);
 }
 
+#if EFX_OPTS_EF10()
+
 #if EFSYS_OPT_RX_SCATTER
 	__checkReturn	efx_rc_t
 ef10_rx_scatter_enable(
@@ -386,6 +388,8 @@ ef10_rx_scatter_enable(
 }
 #endif	/* EFSYS_OPT_RX_SCATTER */
 
+#endif	/* EFX_OPTS_EF10() */
+
 #if EFSYS_OPT_RX_SCALE
 	__checkReturn	efx_rc_t
 ef10_rx_scale_context_alloc(
@@ -542,6 +546,7 @@ ef10_rx_scale_tbl_set(
 }
 #endif /* EFSYS_OPT_RX_SCALE */
 
+#if EFX_OPTS_EF10()
 
 /*
  * EF10 RX pseudo-header
@@ -1014,6 +1019,8 @@ ef10_rx_qdestroy(
 	ef10_ev_rxlabel_fini(eep, label);
 }
 
+#endif /* EFX_OPTS_EF10() */
+
 		void
 ef10_rx_fini(
 	__in	efx_nic_t *enp)
@@ -1028,4 +1035,4 @@ ef10_rx_fini(
 #endif /* EFSYS_OPT_RX_SCALE */
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d470619e1..fac2815f25 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1428,10 +1428,6 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1456,6 +1452,10 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8db52acd66..6a227858e6 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2680,10 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
 	__in		efx_nic_t *enp,
@@ -2867,6 +2863,10 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index bacab5ec67..5f17bf3afe 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -180,6 +180,35 @@ static const efx_rx_ops_t __efx_rx_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_rx_ops_t __efx_rx_rhead_ops = {
+	rhead_rx_init,				/* erxo_init */
+	rhead_rx_fini,				/* erxo_fini */
+#if EFSYS_OPT_RX_SCATTER
+	rhead_rx_scatter_enable,		/* erxo_scatter_enable */
+#endif
+#if EFSYS_OPT_RX_SCALE
+	rhead_rx_scale_context_alloc,		/* erxo_scale_context_alloc */
+	rhead_rx_scale_context_free,		/* erxo_scale_context_free */
+	rhead_rx_scale_mode_set,		/* erxo_scale_mode_set */
+	rhead_rx_scale_key_set,			/* erxo_scale_key_set */
+	rhead_rx_scale_tbl_set,			/* erxo_scale_tbl_set */
+	rhead_rx_prefix_hash,			/* erxo_prefix_hash */
+#endif
+	rhead_rx_prefix_pktlen,			/* erxo_prefix_pktlen */
+	rhead_rx_qpost,				/* erxo_qpost */
+	rhead_rx_qpush,				/* erxo_qpush */
+#if EFSYS_OPT_RX_PACKED_STREAM
+	NULL,					/* erxo_qpush_ps_credits */
+	NULL,					/* erxo_qps_packet_info */
+#endif
+	rhead_rx_qflush,			/* erxo_qflush */
+	rhead_rx_qenable,			/* erxo_qenable */
+	rhead_rx_qcreate,			/* erxo_qcreate */
+	rhead_rx_qdestroy,			/* erxo_qdestroy */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_rx_init(
@@ -226,6 +255,12 @@ efx_rx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		erxop = &__efx_rx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8e50f82154..aff5017cff 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -55,6 +55,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_rx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index dc8a40cd2a..4b7a07e5cb 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -226,6 +226,135 @@ rhead_intr_fini(
 	__in		efx_nic_t *enp);
 
 
+/* RX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_fini(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_RX_SCATTER
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size);
+
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer);
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp);
+
+LIBEFX_INTERNAL
+extern				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qpush(
+	__in		efx_rxq_t *erp,
+	__in		unsigned int added,
+	__inout		unsigned int *pushedp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_rx_qenable(
+	__in		efx_rxq_t *erp);
+
+union efx_rxq_type_data_u;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const union efx_rxq_type_data_u *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qdestroy(
+	__in		efx_rxq_t *erp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
new file mode 100644
index 0000000000..0081b3ea53
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -0,0 +1,316 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_init(enp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+		void
+rhead_rx_fini(
+	__in	efx_nic_t *enp)
+{
+	ef10_rx_fini(enp);
+}
+
+#if EFSYS_OPT_RX_SCATTER
+	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size)
+{
+	_NOTE(ARGUNUSED(enp, buf_size))
+	/* Nothing to do here */
+	return (0);
+}
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_alloc(enp, type, num_queues, rss_contextp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_free(enp, rss_context);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_mode_set(enp, rss_context, alg, type, insert);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_key_set(enp, rss_context, key, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_tbl_set(enp, rss_context, table, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer)
+{
+	_NOTE(ARGUNUSED(enp, func, buffer))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp)
+{
+	_NOTE(ARGUNUSED(enp, buffer, lengthp))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added)
+{
+	_NOTE(ARGUNUSED(erp, addrp, size, ndescs, completed, added))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+			void
+rhead_rx_qpush(
+	__in	efx_rxq_t *erp,
+	__in	unsigned int added,
+	__inout	unsigned int *pushedp)
+{
+	_NOTE(ARGUNUSED(erp, added, pushedp))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in	efx_rxq_t *erp)
+{
+	efx_nic_t *enp = erp->er_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_rxq(enp, erp->er_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed. Callers need to know that
+	 * the RXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qenable(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const efx_rxq_type_data_t *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_rc_t rc;
+	boolean_t disable_scatter;
+
+	_NOTE(ARGUNUSED(id))
+
+	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS <=
+	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
+	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
+
+	switch (type) {
+	case EFX_RXQ_TYPE_DEFAULT:
+		if (type_data == NULL) {
+			rc = EINVAL;
+			goto fail1;
+		}
+		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		break;
+	default:
+		rc = ENOTSUP;
+		goto fail2;
+	}
+
+	/* Scatter can only be disabled if the firmware supports doing so */
+	if (flags & EFX_RXQ_FLAG_SCATTER)
+		disable_scatter = B_FALSE;
+	else
+		disable_scatter = encp->enc_rx_disable_scatter_supported;
+
+	/*
+	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
+	 * EF100 host interface both inner and outer classes are provided
+	 * by HW if applicable.
+	 */
+
+	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
+		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
+		    0, 0, 0, 0, 0)) != 0)
+		goto fail3;
+
+	erp->er_eep = eep;
+	erp->er_label = label;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qdestroy(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+	/* Nothing to do here */
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 33/60] common/sfc_efx/base: implement Tx control path for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (31 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
                   ` (29 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Tx control path on Riverhead is very similar to EF10, but datapath
differs a lot since Tx descriptor size is 16 bytes (vs 8 bytes on EF10).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |   6 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   6 +-
 drivers/common/sfc_efx/base/efx_tx.c     |  33 ++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  83 ++++++++++
 drivers/common/sfc_efx/base/rhead_tx.c   | 192 +++++++++++++++++++++++
 6 files changed, 311 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fac2815f25..d7e11c6323 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1452,10 +1452,6 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
@@ -1473,7 +1469,7 @@ efx_mcdi_fini_txq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 6a227858e6..278c5e2a64 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2863,10 +2863,6 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
@@ -2999,6 +2995,6 @@ efx_mcdi_fini_txq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index 38c64e028b..d7f31fd46d 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -205,6 +205,33 @@ static const efx_tx_ops_t	__efx_tx_medford2_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tx_ops_t	__efx_tx_rhead_ops = {
+	rhead_tx_init,				/* etxo_init */
+	rhead_tx_fini,				/* etxo_fini */
+	rhead_tx_qcreate,			/* etxo_qcreate */
+	rhead_tx_qdestroy,			/* etxo_qdestroy */
+	rhead_tx_qpost,				/* etxo_qpost */
+	rhead_tx_qpush,				/* etxo_qpush */
+	rhead_tx_qpace,				/* etxo_qpace */
+	rhead_tx_qflush,			/* etxo_qflush */
+	rhead_tx_qenable,			/* etxo_qenable */
+	NULL,					/* etxo_qpio_enable */
+	NULL,					/* etxo_qpio_disable */
+	NULL,					/* etxo_qpio_write */
+	NULL,					/* etxo_qpio_post */
+	rhead_tx_qdesc_post,			/* etxo_qdesc_post */
+	NULL,					/* etxo_qdesc_dma_create */
+	NULL,					/* etxo_qdesc_tso_create */
+	NULL,					/* etxo_qdesc_tso2_create */
+	NULL,					/* etxo_qdesc_vlantci_create */
+	NULL,					/* etxo_qdesc_checksum_create */
+#if EFSYS_OPT_QSTATS
+	rhead_tx_qstats_update,			/* etxo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_tx_init(
@@ -251,6 +278,12 @@ efx_tx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etxop = &__efx_tx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index aff5017cff..8f944bb45b 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -56,6 +56,7 @@ sources = [
 	'rhead_intr.c',
 	'rhead_nic.c',
 	'rhead_rx.c',
+	'rhead_tx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 4b7a07e5cb..fa5e2b4915 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -355,6 +355,89 @@ rhead_rx_qdestroy(
 	__in		efx_rxq_t *erp);
 
 
+/* TX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_tx_qdestroy(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *ebp,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qdesc_post(
+	__in		efx_txq_t *etp,
+	__in_ecount(n)	efx_desc_t *ed,
+	__in		unsigned int n,
+	__in		unsigned int completed,
+	__inout		unsigned int *addedp);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_tx.c b/drivers/common/sfc_efx/base/rhead_tx.c
new file mode 100644
index 0000000000..4c60f329d1
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tx.c
@@ -0,0 +1,192 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+	return (0);
+}
+
+			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp)
+{
+	efx_rc_t rc;
+
+	/*
+	 * NMC manages the NMMU entries, and so buffer table IDs are
+	 * ignored here
+	 */
+	_NOTE(ARGUNUSED(id))
+
+	if ((rc = efx_mcdi_init_txq(enp, ndescs, eep->ee_index, label, index,
+	    flags, esmp)) != 0)
+		goto fail1;
+
+	/*
+	 * Return the initial queue index which is zero since no option
+	 * descriptors are sent at start of day.
+	 */
+	*addedp = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_tx_qdestroy(
+	__in	efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *eb,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(eb))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed)
+{
+	_NOTE(ARGUNUSED(etp, added, pushed))
+
+	/* FIXME Implement the method for Riverhead */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ns))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp)
+{
+	efx_nic_t *enp = etp->et_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_txq(enp, etp->et_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed. Callers need to know that
+	 * the TXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qdesc_post(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_desc_t *ed,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ed))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#if EFSYS_OPT_QSTATS
+
+			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < TX_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, etp->et_stat[id]);
+		etp->et_stat[id] = 0;
+	}
+}
+
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (32 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
                   ` (28 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Rx/Tx queue DMA sync should not assume descriptor size to be the same
for all NIC familties since it Tx descritor size is 16 on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 2 +-
 drivers/common/sfc_efx/base/ef10_tx.c  | 4 ++--
 drivers/common/sfc_efx/base/efx_impl.h | 9 +++++----
 drivers/common/sfc_efx/base/efx_rx.c   | 2 +-
 drivers/common/sfc_efx/base/efx_tx.c   | 2 +-
 5 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 61e0dab5b9..2f0d2d2f5b 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -693,7 +693,7 @@ ef10_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    EF10_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_VI_WRITED(enp, ER_DZ_RX_DESC_UPD_REG,
 	    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index 61c7e49fe8..7cc9324b4b 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -375,7 +375,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_DOORBELL_WRITEO(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &oword);
@@ -391,7 +391,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_WRITED2(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index d7e11c6323..52f974073f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1292,15 +1292,16 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
-#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr)	\
+#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size,	\
+				      _wptr, _owptr)			\
 	do {								\
 		unsigned int _new = (_wptr);				\
 		unsigned int _old = (_owptr);				\
 									\
 		if ((_new) >= (_old))					\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
-			    (_old) * sizeof (efx_desc_t),		\
-			    ((_new) - (_old)) * sizeof (efx_desc_t));	\
+			    (_old) * (_desc_size),			\
+			    ((_new) - (_old)) * (_desc_size));		\
 		else							\
 			/*						\
 			 * It is cheaper to sync entire map than sync	\
@@ -1309,7 +1310,7 @@ struct efx_txq_s {
 			 */						\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
 			    0,						\
-			    (_entries) * sizeof (efx_desc_t));		\
+			    (_entries) * (_desc_size));			\
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 5f17bf3afe..14eda45f4a 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1581,7 +1581,7 @@ siena_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    SIENA_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_RX_DESC_UPD_REGP0,
 			    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index d7f31fd46d..d9568bf4a6 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -866,7 +866,7 @@ siena_tx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-	    wptr, pushed & etp->et_mask);
+	    SIENA_TXQ_DESC_SIZE, wptr, pushed & etp->et_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_TX_DESC_UPD_REGP0,
 			    etp->et_index, &dword, B_FALSE);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 35/60] common/sfc_efx/base: handle Rx events for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (33 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
                   ` (27 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Rx event on Riverhead provides a number of received packets and
no classification/offloads information is available Rx event.

Introduce a new event callback to be implemented by drivers.
The callback provides information about the number of completed
packets. libefx-based drivers should implement the new callback
for Riverhead and keep the old one for Siena and EF10 NICs.
The new callback may be used for Medford2 NO_CONT_EV Rx mode
support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  8 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 56 +++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2c49280a43..983b723145 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2277,6 +2277,13 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t size,
 	__in		uint16_t flags);
 
+typedef	__checkReturn	boolean_t
+(*efx_rx_packets_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int num_packets,
+	__in		uint32_t flags);
+
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 
 /*
@@ -2394,6 +2401,7 @@ typedef __checkReturn	boolean_t
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
+	efx_rx_packets_ev_t		eec_rx_packets;
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 0205769e70..a624b1dd94 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -58,7 +65,7 @@ rhead_ev_qcreate(
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
 	/* Set up the handler table */
-	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
@@ -201,6 +208,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_RX_PKTS:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -274,6 +285,49 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t label;
+	uint32_t num_packets;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_RX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_RX event reports the number of received
+	 * packets (unlike EF10 which reports a descriptor index).
+	 * The client driver is responsible for maintaining the Rx
+	 * descriptor index, and computing how many descriptors are
+	 * occupied by each received packet (based on the Rx buffer size
+	 * and the packet length from the Rx prefix).
+	 */
+	num_packets = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_NUM_PKT);
+
+	/*
+	 * The receive event may indicate more than one packet, and so
+	 * does not contain the packet length. Read the packet length
+	 * from the prefix when handling each packet.
+	 */
+	EFSYS_ASSERT(eecp->eec_rx_packets != NULL);
+	should_abort = eecp->eec_rx_packets(arg, label, num_packets,
+	    EFX_PKT_PREFIX_LEN);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 36/60] common/sfc_efx/base: handle Tx complete on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (34 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
                   ` (26 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Introduce a new event callback which has the same prototype, but
provides number of completed descriptors instead of the last
completed descriptor index.

When all libefx-based drivers implement the new callback, libefx
may be updated to use it for Siena and EF10 family NICs and
the old one may be removed.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 51 +++++++++++++++++++++++++-
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 983b723145..2437980c9e 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2319,6 +2319,12 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t label,
 	__in		uint32_t id);
 
+typedef	__checkReturn	boolean_t
+(*efx_tx_ndescs_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int ndescs);
+
 #define	EFX_EXCEPTION_RX_RECOVERY	0x00000001
 #define	EFX_EXCEPTION_RX_DSC_ERROR	0x00000002
 #define	EFX_EXCEPTION_TX_DSC_ERROR	0x00000003
@@ -2406,6 +2412,7 @@ typedef struct efx_ev_callbacks_s {
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
 	efx_tx_ev_t			eec_tx;
+	efx_tx_ndescs_ev_t		eec_tx_ndescs;
 	efx_exception_ev_t		eec_exception;
 	efx_rxq_flush_done_ev_t		eec_rxq_flush_done;
 	efx_rxq_flush_failed_ev_t	eec_rxq_flush_failed;
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index a624b1dd94..48998ccf65 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -23,6 +23,13 @@ rhead_ev_rx_packets(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -66,7 +73,7 @@ rhead_ev_qcreate(
 
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
-	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_tx	= rhead_ev_tx_completion;
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
@@ -212,6 +219,10 @@ rhead_ev_qpoll(
 				should_abort = eep->ee_rx(eep,
 				    &(ev[index]), eecp, arg);
 				break;
+			case ESE_GZ_EF100_EV_TX_COMPLETION:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -328,6 +339,44 @@ rhead_ev_rx_packets(
 	return (should_abort);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t num_descs;
+	uint32_t label;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_TX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_TX event reports the number of completed Tx
+	 * descriptors (on EF10, the event reports the low bits of the
+	 * index of the last completed descriptor).
+	 * The client driver completion callback will compute the
+	 * descriptor index, so that is not needed here.
+	 */
+	num_descs = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_NUM_DESC);
+
+	EFSYS_PROBE2(tx_ndescs, uint32_t, label, unsigned int, num_descs);
+
+	EFSYS_ASSERT(eecp->eec_tx_ndescs != NULL);
+	should_abort = eecp->eec_tx_ndescs(arg, label, num_descs);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 37/60] common/sfc_efx/base: indicate support for TSO version 3
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (35 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
                   ` (25 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead boards support TSO version 3.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 6 ++++++
 drivers/common/sfc_efx/base/efx.h       | 1 +
 drivers/common/sfc_efx/base/siena_nic.c | 1 +
 3 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 80dc99aed5..43f3412f35 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1109,6 +1109,12 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_fw_assisted_tso_v2_encap_enabled = B_FALSE;
 
+	/* Check if TSOv3 is supported */
+	if (CAP_FLAGS2(req, TX_TSO_V3))
+		encp->enc_tso_v3_enabled = B_TRUE;
+	else
+		encp->enc_tso_v3_enabled = B_FALSE;
+
 	/* Check if the firmware has vadapter/vport/vswitch support */
 	if (CAP_FLAGS1(req, EVB))
 		encp->enc_datapath_cap_evb = B_TRUE;
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2437980c9e..08f7cddc95 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1469,6 +1469,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
+	boolean_t		enc_tso_v3_enabled;
 	/* Number of TSO contexts on the NIC (FATSOv2) */
 	uint32_t		enc_fw_assisted_tso_v2_n_contexts;
 	boolean_t		enc_hw_tx_insert_vlan_enabled;
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index beabac0d38..9c30e27f59 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -176,6 +176,7 @@ siena_board_cfg(
 	encp->enc_fw_assisted_tso_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_n_contexts = 0;
+	encp->enc_tso_v3_enabled = B_FALSE;
 	encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
 	encp->enc_rx_packed_stream_supported = B_FALSE;
 	encp->enc_rx_var_packed_stream_supported = B_FALSE;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 38/60] common/sfc_efx/base: report restrictions for TSO version 3
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (36 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
                   ` (24 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead puts a number of restrictions on TSO transactions.
Reflect some of them in the NIC configuration structure.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 21 +++++++++++++++++++++
 drivers/common/sfc_efx/base/efx.h       | 10 ++++++++++
 drivers/common/sfc_efx/base/rhead_nic.c | 23 +++++++++++++++++++----
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 43f3412f35..927af87e0d 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2077,6 +2077,27 @@ ef10_nic_board_cfg(
 	 */
 	encp->enc_tx_tso_tcp_header_offset_limit = EF10_TCP_HEADER_OFFSET_LIMIT;
 
+	/* EF10 TSO engine demands that packet header be contiguous. */
+	encp->enc_tx_tso_max_header_ndescs = 1;
+
+	/* The overall TSO header length is not limited. */
+	encp->enc_tx_tso_max_header_length = UINT32_MAX;
+
+	/*
+	 * There are no specific limitations on the number of
+	 * TSO payload descriptors.
+	 */
+	encp->enc_tx_tso_max_payload_ndescs = UINT32_MAX;
+
+	/* TSO superframe payload length is not limited. */
+	encp->enc_tx_tso_max_payload_length = UINT32_MAX;
+
+	/*
+	 * Limitation on the maximum number of outgoing packets per
+	 * TSO transaction described in SF-108452-SW.
+	 */
+	encp->enc_tx_tso_max_nframes = 32767;
+
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
 	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 08f7cddc95..a2c2e49bba 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1466,6 +1466,16 @@ typedef struct efx_nic_cfg_s {
 	 * the hardware to apply TSO packet edits.
 	 */
 	uint32_t		enc_tx_tso_tcp_header_offset_limit;
+	/* Maximum number of header DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_ndescs;
+	/* Maximum header length acceptable by TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_length;
+	/* Maximum number of payload DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_ndescs;
+	/* Maximum payload length per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_length;
+	/* Maximum number of frames to be generated per TSO transaction. */
+	uint32_t		enc_tx_tso_max_nframes;
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index b779b4f8e1..7fb28eae31 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -33,11 +33,26 @@ rhead_board_cfg(
 	encp->enc_tx_dma_desc_boundary = 0;
 
 	/*
-	 * Maximum number of bytes into the frame the TCP header can start for
-	 * firmware assisted TSO to work.
-	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 * Initialise design parameters to either a runtime value read from
+	 * the design parameters area or the well known default value
+	 * (see SF-119689-TC section 4.4 for details).
+	 * FIXME: Read design parameters area values.
 	 */
-	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+	encp->enc_tx_tso_max_header_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_header_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT;
+	encp->enc_tx_tso_max_payload_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_payload_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT;
+	encp->enc_tx_tso_max_nframes =
+	    ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT;
+
+	/*
+	 * Riverhead does not put any restrictions on TCP header offset limit.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = UINT32_MAX;
 
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 39/60] common/sfc_efx: do not include libefx headers from efsys.h
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (37 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
                   ` (23 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

efsys.h may depends on target system headers only. Otherwise, it could
result in cross-dependency when libefx header depends on efsys.h and
efsys.h depends on the libefx header.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/efsys.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 1567d91588..e191cb5b6a 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -50,7 +50,6 @@ extern "C" {
 #else
 #error "Cannot determine system endianness"
 #endif
-#include "efx_types.h"
 
 
 typedef bool boolean_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 40/60] common/sfc_efx/base: add API to get Rx prefix information
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (38 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
                   ` (22 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Define default Siena, EF10 default, packed stream, equal-stride
superbuffer and Riverhead default prefixes in order to make an API
to get Rx prefix layout information generic and usable on all NICs.

Riverhead supports many Rx prefixes. Riverhead FW supports MCDI to
choose Rx prefix based on required Rx prefix fields and allows to
query the prefix layout using MCDI. The patch prepares to introduce
the support in libefx and provides fallback for NICs and FW which
lacks the support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c         | 80 ++++++++++++++++++-
 drivers/common/sfc_efx/base/efx.h             | 61 ++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h        |  1 +
 drivers/common/sfc_efx/base/efx_rx.c          | 29 +++++++
 drivers/common/sfc_efx/base/efx_types.h       |  1 +
 drivers/common/sfc_efx/base/rhead_rx.c        | 30 +++++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 7 files changed, 201 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 2f0d2d2f5b..43d545b377 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -549,8 +549,8 @@ ef10_rx_scale_tbl_set(
 #if EFX_OPTS_EF10()
 
 /*
- * EF10 RX pseudo-header
- * ---------------------
+ * EF10 RX pseudo-header (aka Rx prefix)
+ * -------------------------------------
  *
  * Receive packets are prefixed by an (optional) 14 byte pseudo-header:
  *
@@ -566,7 +566,77 @@ ef10_rx_scale_tbl_set(
  *       (32bit little-endian)
  *
  * See "The RX Pseudo-header" in SF-109306-TC.
+ *
+ * EF10 does not support Rx prefix choice using MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
  */
+static const efx_rx_prefix_layout_t ef10_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 14,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH]			=
+		    { 0,  32, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI]		=
+		    { 32, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI]	=
+		    { 48, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_LENGTH]			=
+		    { 64, 16, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP]		=
+		    { 80, 32, B_FALSE },
+	}
+};
+
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+/*
+ * EF10 packed stream Rx prefix layout.
+ *
+ * See SF-112241-TC Full speed capture for Huntington and Medford section 4.5.
+ */
+static const efx_rx_prefix_layout_t ef10_packed_stream_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 8,
+	.erpl_fields	= {
+#define	EF10_PS_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_DZ_PS_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_PS_RX_PREFIX_FIELD(PARTIAL_TSTAMP, TSTAMP),
+		EF10_PS_RX_PREFIX_FIELD(LENGTH, CAP_LEN),
+		EF10_PS_RX_PREFIX_FIELD(ORIG_LENGTH, ORIG_LEN),
+
+#undef	EF10_PS_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+
+/*
+ * EF10 equal stride super-buffer Rx prefix layout.
+ *
+ * See SF-119419-TC DPDK Firmware Driver Interface section 3.4.
+ */
+static const efx_rx_prefix_layout_t ef10_essb_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ES_EZ_ESSB_RX_PREFIX_LEN,
+	.erpl_fields	= {
+#define	EF10_ESSB_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_EZ_ESSB_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_ESSB_RX_PREFIX_FIELD(LENGTH, DATA_LEN),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK, MARK),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH_VALID, HASH_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK_VALID, MARK_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_FLAG, MATCH_FLAG),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH, HASH),
+
+#undef	EF10_ESSB_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	__checkReturn	efx_rc_t
 ef10_rx_prefix_pktlen(
@@ -836,6 +906,7 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
 	boolean_t disable_scatter;
 	boolean_t want_inner_classes;
@@ -852,6 +923,7 @@ ef10_rx_qcreate(
 
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
+		erpl = &ef10_default_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
@@ -861,6 +933,7 @@ ef10_rx_qcreate(
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
+		erpl = &ef10_packed_stream_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail2;
@@ -890,6 +963,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
+		erpl = &ef10_essb_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail4;
@@ -973,6 +1047,8 @@ ef10_rx_qcreate(
 
 	erp->er_ev_qstate = &erp->er_eep->ee_rxq_state[label];
 
+	erp->er_prefix_layout = *erpl;
+
 	return (0);
 
 fail11:
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index a2c2e49bba..3f5cf619e5 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1396,6 +1396,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
+	/* Maximum Rx prefix size if many Rx prefixes are supported */
 	uint32_t		enc_rx_prefix_size;
 	uint32_t		enc_rx_buf_align_start;
 	uint32_t		enc_rx_buf_align_end;
@@ -2760,6 +2761,66 @@ efx_rxq_nbufs(
 
 #define	EFX_RXQ_LIMIT(_ndescs)		((_ndescs) - 16)
 
+/*
+ * libefx representation of the Rx prefix layout information.
+ *
+ * The information may be used inside libefx to implement Rx prefix fields
+ * accessors and by drivers which process Rx prefix itself.
+ */
+
+/*
+ * All known Rx prefix fields.
+ *
+ * An Rx prefix may have a subset of these fields.
+ */
+typedef enum efx_rx_prefix_field_e {
+	EFX_RX_PREFIX_FIELD_LENGTH = 0,
+	EFX_RX_PREFIX_FIELD_ORIG_LENGTH,
+	EFX_RX_PREFIX_FIELD_CLASS,
+	EFX_RX_PREFIX_FIELD_RSS_HASH,
+	EFX_RX_PREFIX_FIELD_RSS_HASH_VALID,
+	EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP,
+	EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_USER_FLAG,
+	EFX_RX_PREFIX_FIELD_USER_MARK,
+	EFX_RX_PREFIX_FIELD_USER_MARK_VALID,
+	EFX_RX_PREFIX_FIELD_CSUM_FRAME,
+	EFX_RX_PREFIX_FIELD_INGRESS_VPORT,
+	EFX_RX_PREFIX_NFIELDS
+} efx_rx_prefix_field_t;
+
+/*
+ * Location and endianess of a field in Rx prefix.
+ *
+ * If width is zero, the field is not present.
+ */
+typedef struct efx_rx_prefix_field_info_s {
+	uint16_t			erpfi_offset_bits;
+	uint8_t				erpfi_width_bits;
+	boolean_t			erpfi_big_endian;
+} efx_rx_prefix_field_info_t;
+
+/* Helper macro to define Rx prefix fields */
+#define	EFX_RX_PREFIX_FIELD(_efx, _field, _big_endian)		\
+	[EFX_RX_PREFIX_FIELD_ ## _efx] = {			\
+		.erpfi_offset_bits	= EFX_LOW_BIT(_field),	\
+		.erpfi_width_bits	= EFX_WIDTH(_field),	\
+		.erpfi_big_endian	= (_big_endian),	\
+	}
+
+typedef struct efx_rx_prefix_layout_s {
+	uint32_t			erpl_id;
+	uint8_t				erpl_length;
+	efx_rx_prefix_field_info_t	erpl_fields[EFX_RX_PREFIX_NFIELDS];
+} efx_rx_prefix_layout_t;
+
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp);
+
 typedef enum efx_rxq_type_e {
 	EFX_RXQ_TYPE_DEFAULT,
 	EFX_RXQ_TYPE_PACKED_STREAM,
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 52f974073f..01869155fa 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -944,6 +944,7 @@ struct efx_rxq_s {
 	size_t				er_buf_size;
 	efsys_mem_t			*er_esmp;
 	efx_evq_rxq_state_t		*er_ev_qstate;
+	efx_rx_prefix_layout_t		er_prefix_layout;
 };
 
 #define	EFX_RXQ_MAGIC	0x15022005
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 14eda45f4a..3536b0eb07 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1059,6 +1059,18 @@ efx_pseudo_hdr_hash_get(
 }
 #endif	/* EFSYS_OPT_RX_SCALE */
 
+	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
+
+	*erplp = erp->er_prefix_layout;
+
+	return (0);
+}
+
 #if EFSYS_OPT_SIENA
 
 static	__checkReturn	efx_rc_t
@@ -1477,6 +1489,21 @@ siena_rx_scale_tbl_set(
  *   LL.LL         LFSR hash     (16-bit big-endian)
  */
 
+/*
+ * Provide Rx prefix layout with Toeplitz hash only since LSFR is
+ * used by no supported drivers.
+ *
+ * Siena does not support Rx prefix choice via MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
+ */
+static const efx_rx_prefix_layout_t siena_toeplitz_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 16,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] = { 12 * 8, 32, B_TRUE },
+	}
+};
+
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	uint32_t
 siena_rx_prefix_hash(
@@ -1719,6 +1746,8 @@ siena_rx_qcreate(
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
 
+	erp->er_prefix_layout = siena_toeplitz_rx_prefix_layout;
+
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ae8a1031df..ab35e61b84 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -1628,6 +1628,7 @@ extern int fix_lint;
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
 #endif
 
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 0081b3ea53..c9ab3f92e1 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,35 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Default Rx prefix layout on Riverhead if FW does not support Rx
+ * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
+ * using MC_CMD_QUERY_RX_PREFIX_ID.
+ *
+ * See SF-119689-TC Riverhead Host Interface section 6.4.
+ */
+static const efx_rx_prefix_layout_t rhead_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ESE_GZ_RX_PKT_PREFIX_LEN,
+	.erpl_fields	= {
+#define	RHEAD_RX_PREFIX_FIELD(_name, _big_endian) \
+	EFX_RX_PREFIX_FIELD(_name, ESF_GZ_RX_PREFIX_ ## _name, _big_endian)
+
+		RHEAD_RX_PREFIX_FIELD(LENGTH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH_VALID, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_FLAG, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CLASS, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(PARTIAL_TSTAMP, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_MARK, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(INGRESS_VPORT, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CSUM_FRAME, B_TRUE),
+		RHEAD_RX_PREFIX_FIELD(VLAN_STRIP_TCI, B_TRUE),
+
+#undef	RHEAD_RX_PREFIX_FIELD
+	}
+};
+
 	__checkReturn	efx_rc_t
 rhead_rx_init(
 	__in		efx_nic_t *enp)
@@ -292,6 +321,7 @@ rhead_rx_qcreate(
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
 
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 9b1715bfee..16fffee321 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -130,6 +130,7 @@ INTERNAL {
 	efx_rx_fini;
 	efx_rx_hash_default_support_get;
 	efx_rx_init;
+	efx_rx_prefix_get_layout;
 	efx_rx_qcreate;
 	efx_rx_qcreate_es_super_buffer;
 	efx_rx_qdestroy;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 41/60] common/sfc_efx/base: group RxQ parameters into a structure
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (39 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
                   ` (21 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Make number of efx_mcdi_init_rxq() arguments reasonable before
addition of one more argument.
Non essential parameters not supported in some cases are moved
into helper structure.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 57 +++++++++++---------------
 drivers/common/sfc_efx/base/efx_impl.h | 20 +++++----
 drivers/common/sfc_efx/base/efx_mcdi.c | 33 ++++++---------
 drivers/common/sfc_efx/base/rhead_rx.c | 14 ++++---
 4 files changed, 58 insertions(+), 66 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 43d545b377..ea5f514f18 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -906,21 +906,18 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_init_rxq_params_t params;
 	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
-	boolean_t want_inner_classes;
-	unsigned int ps_buf_size;
-	uint32_t es_bufs_per_desc = 0;
-	uint32_t es_max_dma_len = 0;
-	uint32_t es_buf_stride = 0;
-	uint32_t hol_block_timeout = 0;
 
 	_NOTE(ARGUNUSED(id, erp))
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+	params.buf_size = erp->er_buf_size;
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		erpl = &ef10_default_rx_prefix_layout;
@@ -929,7 +926,6 @@ ef10_rx_qcreate(
 			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
-		ps_buf_size = 0;
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
@@ -940,19 +936,19 @@ ef10_rx_qcreate(
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_512K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_128K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
 			break;
 		default:
 			rc = ENOTSUP;
@@ -968,14 +964,13 @@ ef10_rx_qcreate(
 			rc = EINVAL;
 			goto fail4;
 		}
-		ps_buf_size = 0;
-		es_bufs_per_desc =
+		params.es_bufs_per_desc =
 		    type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
-		es_max_dma_len =
+		params.es_max_dma_len =
 		    type_data->ertd_es_super_buffer.eessb_max_dma_len;
-		es_buf_stride =
+		params.es_buf_stride =
 		    type_data->ertd_es_super_buffer.eessb_buf_stride;
-		hol_block_timeout =
+		params.hol_block_timeout =
 		    type_data->ertd_es_super_buffer.eessb_hol_block_timeout;
 		break;
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -985,59 +980,57 @@ ef10_rx_qcreate(
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
-	if (ps_buf_size != 0) {
+	if (params.ps_buf_size != 0) {
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
-		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
+		if ((params.ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
 			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
-	EFSYS_ASSERT(ps_buf_size == 0);
+	EFSYS_ASSERT(params.ps_buf_size == 0);
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
-	if (es_bufs_per_desc > 0) {
+	if (params.es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail8;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail9;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-	EFSYS_ASSERT(es_bufs_per_desc == 0);
+	EFSYS_ASSERT(params.es_bufs_per_desc == 0);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	if (flags & EFX_RXQ_FLAG_INNER_CLASSES)
-		want_inner_classes = B_TRUE;
+		params.want_inner_classes = B_TRUE;
 	else
-		want_inner_classes = B_FALSE;
+		params.want_inner_classes = B_FALSE;
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
-		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
-		    es_buf_stride, hol_block_timeout)) != 0)
+		    esmp, &params)) != 0)
 		goto fail11;
 
 	erp->er_eep = eep;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 01869155fa..c373192554 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,17 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+typedef struct efx_mcdi_init_rxq_params_s {
+	boolean_t	disable_scatter;
+	boolean_t	want_inner_classes;
+	uint32_t	buf_size;
+	uint32_t	ps_buf_size;
+	uint32_t	es_bufs_per_desc;
+	uint32_t	es_max_dma_len;
+	uint32_t	es_buf_stride;
+	uint32_t	hol_block_timeout;
+} efx_mcdi_init_rxq_params_t;
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1439,14 +1450,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout);
+	__in		const efx_mcdi_init_rxq_params_t *params);
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 278c5e2a64..aa19c7c759 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2688,14 +2688,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
+	__in		const efx_mcdi_init_rxq_params_t *params)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
@@ -2719,21 +2712,21 @@ efx_mcdi_init_rxq(
 	}
 
 	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+	if ((no_cont_ev == B_TRUE) && (params->disable_scatter == B_FALSE)) {
 		/* TODO: Support scatter in NO_CONT_EV mode */
 		rc = EINVAL;
 		goto fail2;
 	}
 
-	if (ps_bufsize > 0)
+	if (params->ps_buf_size > 0)
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
+	else if (params->es_bufs_per_desc > 0)
 		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
 	else
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
 
 	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
+	    !params->want_inner_classes) {
 		/*
 		 * WANT_OUTER_CLASSES can only be specified on hardware which
 		 * supports tunnel encapsulation offloads, even though it is
@@ -2768,31 +2761,31 @@ efx_mcdi_init_rxq(
 	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
 	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
 	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, params->disable_scatter,
 	    INIT_RXQ_EXT_IN_DMA_MODE,
 	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, params->ps_buf_size,
 	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
 	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
 
-	if (es_bufs_per_desc > 0) {
+	if (params->es_bufs_per_desc > 0) {
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
+		    params->es_bufs_per_desc);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, params->es_max_dma_len);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, params->es_buf_stride);
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
+		    params->hol_block_timeout);
 	}
 
 	if (encp->enc_init_rxq_with_buffer_size)
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
+		    params->buf_size);
 
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index c9ab3f92e1..38c905444a 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -280,8 +280,8 @@ rhead_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_mcdi_init_rxq_params_t params;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
 
 	_NOTE(ARGUNUSED(id))
 
@@ -289,13 +289,15 @@ rhead_rx_qcreate(
 	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
 		}
-		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		params.buf_size = type_data->ertd_default.ed_buf_size;
 		break;
 	default:
 		rc = ENOTSUP;
@@ -304,9 +306,9 @@ rhead_rx_qcreate(
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
@@ -315,12 +317,12 @@ rhead_rx_qcreate(
 	 */
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
-		    0, 0, 0, 0, 0)) != 0)
+		    esmp, &params)) != 0)
 		goto fail3;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_buf_size = params.buf_size;
 	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (40 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
                   ` (20 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Riverhead supports many Rx prefixes. The Rx prefix may be chosen
based on which information is required.

To have better performance choose the smallest Rx prefix which
meets our requirements.

Right now there is no way to specify requirements on Rx queue
creation, but it could be added in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h |   1 +
 drivers/common/sfc_efx/base/efx_mcdi.c |  10 +-
 drivers/common/sfc_efx/base/rhead_rx.c | 333 ++++++++++++++++++++++++-
 3 files changed, 338 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c373192554..fc0a654f80 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1439,6 +1439,7 @@ typedef struct efx_mcdi_init_rxq_params_s {
 	uint32_t	es_max_dma_len;
 	uint32_t	es_buf_stride;
 	uint32_t	hol_block_timeout;
+	uint32_t	prefix_id;
 } efx_mcdi_init_rxq_params_t;
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index aa19c7c759..b8e45b458d 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2692,8 +2692,8 @@ efx_mcdi_init_rxq(
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V5_IN_LEN,
+		MC_CMD_INIT_RXQ_V5_OUT_LEN);
 	int npages = efx_rxq_nbufs(enp, ndescs);
 	int i;
 	efx_qword_t *dma_addr;
@@ -2747,9 +2747,9 @@ efx_mcdi_init_rxq(
 
 	req.emr_cmd = MC_CMD_INIT_RXQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V5_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V5_OUT_LEN;
 
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
@@ -2787,6 +2787,8 @@ efx_mcdi_init_rxq(
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
 		    params->buf_size);
 
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_V5_IN_RX_PREFIX_ID, params->prefix_id);
+
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 38c905444a..d683f280ce 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,12 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Maximum number of Rx prefixes supported by Rx prefix choice to be
+ * returned from firmware.
+ */
+#define	RHEAD_RX_PREFIX_IDS_MAX		16
+
 /*
  * Default Rx prefix layout on Riverhead if FW does not support Rx
  * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
@@ -265,6 +271,312 @@ rhead_rx_qenable(
 	_NOTE(ARGUNUSED(erp))
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_get_rx_prefix_ids(
+	__in					efx_nic_t *enp,
+	__in					uint32_t mcdi_fields_mask,
+	__in					unsigned int max_ids,
+	__out					unsigned int *nids,
+	__out_ecount_part(max_ids, *nids)	uint32_t *idsp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	uint32_t num;
+
+	req.emr_cmd = MC_CMD_GET_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_GET_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, GET_RX_PREFIX_ID_IN_FIELDS, mcdi_fields_mask);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_GET_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	num = MCDI_OUT_DWORD(req, GET_RX_PREFIX_ID_OUT_NUM_RX_PREFIX_IDS);
+
+	if (req.emr_out_length_used != MC_CMD_GET_RX_PREFIX_ID_OUT_LEN(num)) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	*nids = MIN(num, max_ids);
+
+	EFX_STATIC_ASSERT(sizeof (idsp[0]) ==
+	    MC_CMD_GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID_LEN);
+	memcpy(idsp,
+	    MCDI_OUT2(req, uint32_t, GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID),
+	    *nids * sizeof (idsp[0]));
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rx_prefix_field_t
+efx_mcdi_rx_prefix_field_map(unsigned int mcdi_idx)
+{
+	static const efx_rx_prefix_field_t efx_mcdi_to_rx_prefix_field[] = {
+#define	EFX_MCDI_TO_RX_PREFIX_FIELD(_field) \
+	[RX_PREFIX_FIELD_INFO_ ## _field] = EFX_RX_PREFIX_FIELD_ ## _field
+
+		EFX_MCDI_TO_RX_PREFIX_FIELD(LENGTH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH_VALID),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_FLAG),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CLASS),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(PARTIAL_TSTAMP),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_MARK),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(INGRESS_VPORT),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CSUM_FRAME),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(VLAN_STRIP_TCI),
+
+#undef	EFX_MCDI_TO_RX_PREFIX_FIELD
+	};
+
+	if (mcdi_idx >= EFX_ARRAY_SIZE(efx_mcdi_to_rx_prefix_field))
+		return (EFX_RX_PREFIX_NFIELDS);
+
+	return (efx_mcdi_to_rx_prefix_field[mcdi_idx]);
+}
+
+static	__checkReturn	int
+efx_rx_prefix_field_map_to_mcdi(
+	__in		efx_rx_prefix_field_t field)
+{
+	static const int efx_rx_prefix_field_to_mcdi[] = {
+		[EFX_RX_PREFIX_FIELD_LENGTH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH),
+		[EFX_RX_PREFIX_FIELD_ORIG_LENGTH] = -1,
+		[EFX_RX_PREFIX_FIELD_CLASS] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CLASS),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH_VALID] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID),
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP),
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI),
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI] = -1,
+		[EFX_RX_PREFIX_FIELD_USER_FLAG] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG),
+		[EFX_RX_PREFIX_FIELD_USER_MARK] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK),
+		[EFX_RX_PREFIX_FIELD_USER_MARK_VALID] = -1,
+		[EFX_RX_PREFIX_FIELD_CSUM_FRAME] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME),
+		[EFX_RX_PREFIX_FIELD_INGRESS_VPORT] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT),
+	};
+
+	if (field >= EFX_ARRAY_SIZE(efx_rx_prefix_field_to_mcdi))
+		return (-1);
+
+	return (efx_rx_prefix_field_to_mcdi[field]);
+}
+
+static	__checkReturn	efx_rc_t
+efx_rx_prefix_fields_mask_to_mcdi(
+	__in		uint32_t fields_mask,
+	__out		uint32_t *mcdi_fields_maskp)
+{
+	uint32_t mcdi_fields_mask = 0;
+	unsigned int i;
+
+	for (i = 0; i < EFX_RX_PREFIX_NFIELDS; ++i) {
+		if (fields_mask & (1U << i)) {
+			int mcdi_field = efx_rx_prefix_field_map_to_mcdi(i);
+
+			if (mcdi_field < 0)
+				return (EINVAL);
+
+			mcdi_fields_mask |= (1U << mcdi_field);
+		}
+	}
+
+	*mcdi_fields_maskp = mcdi_fields_mask;
+	return (0);
+}
+
+static	__checkReturn	efx_rc_t
+efx_mcdi_query_rx_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t prefix_id,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	size_t response_len;
+	const efx_dword_t *resp;
+	const efx_dword_t *finfo;
+	unsigned int num_fields;
+	unsigned int mcdi_field;
+	efx_rx_prefix_field_t field;
+	unsigned int i;
+
+	req.emr_cmd = MC_CMD_QUERY_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, QUERY_RX_PREFIX_ID_IN_RX_PREFIX_ID, prefix_id);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	if (MCDI_OUT_BYTE(req, QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE) !=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE_FIXED) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	EFX_STATIC_ASSERT(MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN >=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST);
+	response_len = req.emr_out_length_used -
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST;
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail4;
+	}
+
+	resp = MCDI_OUT2(req, efx_dword_t, QUERY_RX_PREFIX_ID_OUT_RESPONSE);
+
+	memset(erplp, 0, sizeof (*erplp));
+	erplp->erpl_id = prefix_id;
+	erplp->erpl_length =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_PREFIX_LENGTH_BYTES);
+	num_fields =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_FIELD_COUNT);
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LEN(num_fields)) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	finfo = (const efx_dword_t *)((const uint8_t *)resp +
+	     RX_PREFIX_FIXED_RESPONSE_FIELDS_OFST);
+
+	for (i = 0; i < num_fields; ++i, ++finfo) {
+		mcdi_field = EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_TYPE);
+
+		field = efx_mcdi_rx_prefix_field_map(mcdi_field);
+		if (field >= EFX_RX_PREFIX_NFIELDS)
+			continue;
+
+		erplp->erpl_fields[field].erpfi_offset_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_OFFSET_BITS);
+		erplp->erpl_fields[field].erpfi_width_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_WIDTH_BITS);
+	}
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+rhead_rx_choose_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t fields_mask,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_rx_prefix_layout_t erpl;
+	uint32_t prefix_ids[RHEAD_RX_PREFIX_IDS_MAX];
+	uint32_t mcdi_fields_mask;
+	unsigned int num = 0;
+	unsigned int i;
+	efx_rc_t rc;
+
+	rc = efx_rx_prefix_fields_mask_to_mcdi(fields_mask, &mcdi_fields_mask);
+	if (rc != 0)
+		goto fail1;
+
+	memset(erplp, 0, sizeof (*erplp));
+
+	rc = efx_mcdi_get_rx_prefix_ids(enp, mcdi_fields_mask,
+	    EFX_ARRAY_SIZE(prefix_ids), &num, prefix_ids);
+	if (rc == ENOTSUP) {
+		/* Not supported MCDI, use default prefix ID */
+		*erplp = rhead_default_rx_prefix_layout;
+		goto done;
+	}
+	if (rc != 0)
+		goto fail2;
+
+	if (num == 0) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	for (i = 0; i < num; ++i) {
+		rc = efx_mcdi_query_rx_prefix_id(enp, prefix_ids[i], &erpl);
+		if (rc != 0)
+			goto fail4;
+
+		/* Choose the smallest prefix which meets our requirements */
+		if (i == 0 || erpl.erpl_length < erplp->erpl_length)
+			*erplp = erpl;
+	}
+
+done:
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 rhead_rx_qcreate(
 	__in		efx_nic_t *enp,
@@ -281,6 +593,7 @@ rhead_rx_qcreate(
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_init_rxq_params_t params;
+	efx_rx_prefix_layout_t erpl;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))
@@ -310,6 +623,20 @@ rhead_rx_qcreate(
 	else
 		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
+	/*
+	 * LENGTH is required in EF100 host interface, as receive events
+	 * do not include the packet length.
+	 * NOTE: Required fields are hard-wired now. Future designs will
+	 * want to allow the client (driver) code to have control over
+	 * which fields are required or may be allow to request so-called
+	 * default Rx prefix (which ID is equal to 0).
+	 */
+	if ((rc = rhead_rx_choose_prefix_id(enp,
+	    (1U << EFX_RX_PREFIX_FIELD_LENGTH), &erpl)) != 0)
+		goto fail3;
+
+	params.prefix_id = erpl.erpl_id;
+
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
 	 * EF100 host interface both inner and outer classes are provided
@@ -318,15 +645,17 @@ rhead_rx_qcreate(
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
 		    esmp, &params)) != 0)
-		goto fail3;
+		goto fail4;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
 	erp->er_buf_size = params.buf_size;
-	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
+	erp->er_prefix_layout = erpl;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 43/60] common/sfc_efx/base: add function control window concept
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (41 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
                   ` (19 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window can be located at a different offset than
other windows on Riverhead. Meaning that the drivers must handle
accesses to the function control window differently in case of EF100.

Add accessor macros for function control window and change
EFX NIC create API to facilitate that accessors.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 21 ++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  1 +
 drivers/common/sfc_efx/base/efx_impl.h  | 39 +++++++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_nic.c   |  9 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  |  2 +-
 drivers/common/sfc_efx/base/rhead_nic.c |  2 +-
 drivers/net/sfc/sfc.c                   |  3 +-
 7 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 727f14826e..b324ec825b 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -56,7 +56,7 @@ ef10_mcdi_init(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -166,7 +166,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -179,7 +179,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -237,11 +237,18 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
-	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
-	    ER_GZ_MC_SFT_STATUS_OFST);
-
 	/* Update MC reboot status word */
-	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG,
+			      &dword, B_FALSE);
+		break;
+	}
 	new_status = dword.ed_u32[0];
 
 	/* MC has rebooted if the value has changed */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 3f5cf619e5..0d4f5e5e70 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -150,6 +150,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fc0a654f80..b1457f361a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -846,6 +846,7 @@ struct efx_nic_s {
 			int			ena_vi_base;
 			int			ena_vi_count;
 			int			ena_vi_shift;
+			uint32_t		ena_fcw_base;
 #if EFSYS_OPT_VPD
 			caddr_t			ena_svpd;
 			size_t			ena_svpd_length;
@@ -1114,6 +1115,9 @@ struct efx_txq_s {
  * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers,
  * to ensure the correct runtime VI window size is used on Medford2.
  *
+ * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control
+ * window registers, to ensure the correct starting offset is used.
+ *
  * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers.
  */
 
@@ -1218,6 +1222,41 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/*
+ * Accessors for memory BAR function control window registers.
+ *
+ * The function control window is located at an offset which can be
+ * non-zero in case of Riverhead.
+ */
+
+#if EFSYS_OPT_RIVERHEAD
+
+#define	EFX_BAR_FCW_READD(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+		EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_BAR_FCW_WRITED(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+		EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 /*
  * Accessors for memory BAR per-VI registers.
  *
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 465e2c7a36..3dc287a095 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -215,6 +215,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp)
 {
@@ -316,6 +317,7 @@ efx_nic_create(
 		    EFX_FEATURE_MCDI |
 		    EFX_FEATURE_MAC_HEADER_FILTERS |
 		    EFX_FEATURE_MCDI_DMA;
+		enp->en_arch.ef10.ena_fcw_base = fcw_offset;
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
@@ -324,6 +326,11 @@ efx_nic_create(
 		goto fail2;
 	}
 
+	if ((family != EFX_FAMILY_RIVERHEAD) && (fcw_offset != 0)) {
+		rc = EINVAL;
+		goto fail3;
+	}
+
 	enp->en_family = family;
 	enp->en_esip = esip;
 	enp->en_esbp = esbp;
@@ -333,6 +340,8 @@ efx_nic_create(
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 48998ccf65..9b2e758f53 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -133,7 +133,7 @@ rhead_ev_qprime(
 	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
 	    ERF_GZ_IDX, rptr);
 	/* EVQ_INT_PRIME lives function control window only on Riverhead */
-	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+	EFX_BAR_FCW_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword);
 
 	return (0);
 }
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 7fb28eae31..a773a43bcc 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -456,7 +456,7 @@ rhead_nic_hw_unavailable(
 	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
 		return (B_TRUE);
 
-	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
 	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
 		goto unavail;
 
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 03ea5dc128..4be65c15dc 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -1046,7 +1046,8 @@ sfc_probe(struct sfc_adapter *sa)
 	sfc_log_init(sa, "create nic");
 	rte_spinlock_init(&sa->nic_lock);
 	rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa,
-			    &sa->mem_bar, &sa->nic_lock, &enp);
+			    &sa->mem_bar, 0,
+			    &sa->nic_lock, &enp);
 	if (rc != 0)
 		goto fail_nic_create;
 	sa->nic = enp;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 44/60] common/sfc_efx/base: add function control window lookup API
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (42 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
                   ` (18 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Riverhead NIC may provide a locator of function control window
(EF100 resource locator).
The locator may be present in a Xilinx capabilities table which
itself is located by looking into extended PCI capabilities.

PCI capabilities are made possible to access by adding PCI config
space interface to efsys.

APIs are implemented to facilitate function control window lookup:
 - API to find an extended PCI capability given a capability ID;
 - API to read Xilinx PCI capability;

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  33 ++
 drivers/common/sfc_efx/base/efx_check.h       |   6 +
 drivers/common/sfc_efx/base/efx_impl.h        |  61 ++++
 drivers/common/sfc_efx/base/efx_nic.c         |  41 +++
 drivers/common/sfc_efx/base/efx_pci.c         | 302 ++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build       |   2 +
 drivers/common/sfc_efx/base/rhead_impl.h      |  13 +
 drivers/common/sfc_efx/base/rhead_pci.c       |  68 ++++
 drivers/common/sfc_efx/efsys.h                |   2 +
 .../sfc_efx/rte_common_sfc_efx_version.map    |   1 +
 10 files changed, 529 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 0d4f5e5e70..f6dd9db301 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -59,6 +59,19 @@ typedef enum efx_family_e {
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
+typedef enum efx_bar_type_e {
+	EFX_BAR_TYPE_MEM,
+	EFX_BAR_TYPE_IO
+} efx_bar_type_t;
+
+typedef struct efx_bar_region_s {
+	efx_bar_type_t		ebr_type;
+	int			ebr_index;
+	efsys_dma_addr_t	ebr_offset;
+	efsys_dma_addr_t	ebr_length;
+} efx_bar_region_t;
+
+/* The function is deprecated. It is used only if Riverhead is not supported. */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_family(
@@ -67,6 +80,26 @@ efx_family(
 	__out		efx_family_t *efp,
 	__out		unsigned int *membarp);
 
+#if EFSYS_OPT_PCI
+
+/* Determine EFX family and perform lookup of the function control window
+ *
+ * The function requires PCI config handle from which all memory bars can
+ * be accessed.
+ * A user of the API must be aware of memory bars indexes (not available
+ * on Windows).
+ */
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
+
 
 #define	EFX_PCI_VENID_SFC			0x1924
 #define	EFX_PCI_VENID_XILINX			0x10EE
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 978321cf67..af90a4c373 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -378,4 +378,10 @@
 # endif
 #endif /* EFSYS_OPT_EVB */
 
+#if EFSYS_OPT_PCI
+# if !EFSYS_OPT_RIVERHEAD
+#  error "PCI requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_PCI */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b1457f361a..422f97c5ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1558,6 +1558,67 @@ efx_mcdi_mac_stats(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Find the next extended capability in a PCI device's config space
+ * with specified capability id.
+ * Passing 0 offset makes the function search from the start.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if a capability is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp);
+
+/*
+ * Get the next extended capability in a PCI device's config space.
+ * Passing 0 offset makes the function get the first capability.
+ * If search succeeds, the capability is in modified offset.
+ *
+ * Returns ENOENT if there is no next capability.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp);
+
+/*
+ * Find the next Xilinx capabilities table location by searching
+ * PCI extended capabilities.
+ *
+ * Returns ENOENT if a table location is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
+
+/*
+ * Read a Xilinx extended PCI capability that gives the location
+ * of a Xilinx capabilities table.
+ *
+ * Returns ENOENT if the extended PCI capability does not contain
+ * Xilinx capabilities table locator.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp);
+
+#endif /* EFSYS_OPT_PCI */
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 3dc287a095..dcf0987ebf 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -103,6 +103,47 @@ efx_family(
 	return (ENOTSUP);
 }
 
+#if EFSYS_OPT_PCI
+
+	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp)
+{
+	efx_rc_t rc;
+	unsigned int membar;
+
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			if (rc == 0)
+				*efp = EFX_FAMILY_RIVERHEAD;
+
+			return (rc);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
+	rc = efx_family(venid, devid, efp, &membar);
+	if (rc == 0) {
+		ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+		ebrp->ebr_index = membar;
+		ebrp->ebr_offset = 0;
+		ebrp->ebr_length = 0;
+	}
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
 
 #if EFSYS_OPT_SIENA
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
new file mode 100644
index 0000000000..8707220849
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -0,0 +1,302 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	efx_rc_t rc = 0;
+	size_t next;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (*offsetp == 0) {
+		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
+	} else {
+		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail2;
+		}
+
+		next = EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_NEXT);
+		if (next < ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE)
+			rc = ENOENT;
+		else
+			*offsetp = next;
+	}
+
+	/*
+	 * Returns 0 if the next capability is present otherwise ENOENT
+	 * indicating that the function finished correctly.
+	 */
+	return (rc);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	size_t position;
+	efx_rc_t rc;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	position = *offsetp;
+
+	while (1) {
+		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		EFSYS_PCI_CONFIG_READD(espcp, position +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail3;
+		}
+
+		if (EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_ID) ==
+		    cap_id) {
+			*offsetp = position;
+			rc = 0;
+			break;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
+{
+	size_t cap_offset;
+	efx_rc_t rc;
+
+	if (pci_cap_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	cap_offset = *pci_cap_offsetp;
+
+	while (1) {
+		unsigned int tbl_bar;
+		efsys_dma_addr_t tbl_offset;
+
+		rc = efx_pci_config_find_next_ext_cap(espcp,
+				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		/*
+		 * The found extended PCI capability is a vendor-specific
+		 * capability, but not necessarily a Xilinx capabilities table
+		 * locator. Try to read it and skip it if the capability is
+		 * not the locator.
+		 */
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+						       &tbl_bar, &tbl_offset);
+		if (rc == 0) {
+			*xilinx_tbl_barp = tbl_bar;
+			*xilinx_tbl_offsetp = tbl_offset;
+			*pci_cap_offsetp = cap_offset;
+			break;
+		} else {
+			if (rc == ENOENT)
+				continue;
+			else
+				goto fail3;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp)
+{
+	size_t vsec_offset = cap_offset + ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE;
+	efx_dword_t cap_hdr;
+	efx_oword_t vsec;
+	uint32_t vsec_len;
+	uint32_t vsec_id;
+	uint32_t vsec_rev;
+	uint32_t offset_low;
+	uint32_t offset_high = 0;
+	unsigned int bar;
+	efsys_dma_addr_t offset;
+	efx_rc_t rc;
+
+	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+			       &cap_hdr, &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail1;
+	}
+
+	if (EFX_DWORD_FIELD(cap_hdr, ESF_GZ_PCI_EXPRESS_XCAP_VER) !=
+	    ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
+			       &vsec.eo_dword[0], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail3;
+	}
+
+	vsec_len = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_LEN);
+	vsec_id = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_ID);
+	vsec_rev = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_VER);
+
+	/*
+	 * Condition of the vendor-specific extended PCI capability not being
+	 * a Xilinx capabilities table locator.
+	 */
+	if (vsec_id != ESE_GZ_XILINX_VSEC_ID) {
+		rc = ENOENT;
+		goto fail4;
+	}
+
+	if (vsec_rev != ESE_GZ_VSEC_VER_XIL_CFGBAR ||
+	    vsec_len < ESE_GZ_VSEC_LEN_MIN) {
+		rc = EINVAL;
+		goto fail5;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
+			       &vsec.eo_dword[1], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail6;
+	}
+
+	bar = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_BAR);
+	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
+
+	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
+		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
+				&vsec.eo_dword[2], &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail7;
+		}
+
+		offset_high = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_HI);
+	}
+
+	/* High bits of low offset are discarded by the shift */
+	offset = offset_low << ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT;
+
+	/*
+	 * Avoid the 'left shift count >= width of type' warning on systems
+	 * without uint64_t support.
+	 */
+#if EFSYS_HAS_UINT64
+	offset |= (uint64_t)offset_high << ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT;
+#else
+	_NOTE(ARGUNUSED(offset_high))
+#endif
+
+	*offsetp = offset;
+	*barp = bar;
+
+	return (0);
+
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8f944bb45b..21feb36c73 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -19,6 +19,7 @@ sources = [
 	'efx_mon.c',
 	'efx_nic.c',
 	'efx_nvram.c',
+	'efx_pci.c',
 	'efx_phy.c',
 	'efx_port.c',
 	'efx_proxy.c',
@@ -55,6 +56,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_pci.c',
 	'rhead_rx.c',
 	'rhead_tx.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index fa5e2b4915..777179fb17 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,19 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Perform discovery of function control window by looking for a
+ * EF100 locator in Xilinx capabilities tables.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
 }
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
new file mode 100644
index 0000000000..f8e372b79c
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp)
+{
+	boolean_t xilinx_tbl_found = B_FALSE;
+	unsigned int xilinx_tbl_bar;
+	efsys_dma_addr_t xilinx_tbl_offset;
+	size_t pci_capa_offset = 0;
+	boolean_t bar_found = B_FALSE;
+	efx_rc_t rc = ENOENT;
+
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
+	 * the following discovery steps.
+	 */
+	while (1) {
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+							&xilinx_tbl_bar,
+							&xilinx_tbl_offset);
+		if (rc != 0) {
+			/*
+			 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+			 * defines the following fallbacks for the memory bar
+			 * and the offset when no Xilinx capabilities table is
+			 * found.
+			 */
+			if (rc == ENOENT && xilinx_tbl_found == B_FALSE) {
+				ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+				ebrp->ebr_index = EFX_MEM_BAR_RIVERHEAD;
+				ebrp->ebr_offset = 0;
+				ebrp->ebr_length = 0;
+				bar_found = B_TRUE;
+				break;
+			} else {
+				goto fail1;
+			}
+
+		}
+
+		xilinx_tbl_found = B_TRUE;
+	}
+
+	if (bar_found == B_FALSE)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index e191cb5b6a..de1c1c38e3 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -162,6 +162,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 0
 
+#define EFSYS_OPT_PCI 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 16fffee321..627469a025 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -19,6 +19,7 @@ INTERNAL {
 	efx_evq_size;
 
 	efx_family;
+	efx_family_probe_bar;
 
 	efx_filter_fini;
 	efx_filter_init;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 45/60] common/sfc_efx/base: add efsys API to find a memory BAR
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (43 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
                   ` (17 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window lookup needs memory BARs handles to
search Xilinx capabilities tables.

Define an API to get a memory BAR handle by a PCIe device handle and
BAR index.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index f8e372b79c..47e89cf8a2 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -20,6 +20,7 @@ rhead_pci_nic_membar_lookup(
 	size_t pci_capa_offset = 0;
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
+	efsys_bar_t xil_eb;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -50,13 +51,19 @@ rhead_pci_nic_membar_lookup(
 		}
 
 		xilinx_tbl_found = B_TRUE;
+
+		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		if (rc != 0)
+			goto fail2;
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail2;
+		goto fail3;
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (44 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
                   ` (16 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

APIs for searching a capability in a Xilinx capabilities table and
reading table entries are needed for function control window lookup
to get the bar index and offset of the window.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   | 15 ++++++
 drivers/common/sfc_efx/base/efx_pci.c    | 61 ++++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  7 +++
 drivers/common/sfc_efx/base/rhead_nic.c  | 50 +++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_pci.c  | 51 +++++++++++++++++++-
 5 files changed, 183 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 422f97c5ca..dfe5f1fecf 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1617,6 +1617,21 @@ efx_pci_read_ext_cap_xilinx_table(
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
 
+/*
+ * Find a capability with specified format_id in a Xilinx capabilities table.
+ * Searching is started from provided offset, taking skip_first into account.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if an entry with specified format id is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp);
+
 #endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index 8707220849..1c31c126c6 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -299,4 +299,65 @@ efx_pci_read_ext_cap_xilinx_table(
 	return (rc);
 }
 
+	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp)
+{
+	efsys_dma_addr_t offset = *entry_offsetp;
+	boolean_t skip = skip_first;
+	efx_qword_t header;
+	uint32_t format;
+	uint32_t last;
+	efx_rc_t rc;
+
+	if (entry_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	rc = ENOENT;
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+	 * describes the following discovery steps.
+	 */
+	do {
+		/*
+		 * Xilinx Capabilities Table requries 32bit aligned reads.
+		 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+		 */
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+				&header.eq_dword[0], B_FALSE);
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+				&header.eq_dword[1], B_FALSE);
+
+		format = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_FORMAT);
+		last = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_LAST);
+
+		if (skip == B_FALSE && format == format_id) {
+			*entry_offsetp = offset;
+			rc = 0;
+			break;
+		}
+
+		offset += EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_SIZE);
+		skip = B_FALSE;
+	} while (last == B_FALSE);
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that
+	 * search finished correctly.
+	 */
+	return (rc);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 777179fb17..c75483926c 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -451,6 +451,13 @@ rhead_pci_nic_membar_lookup(
 
 #endif /* EFSYS_OPT_PCI */
 
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index a773a43bcc..58838ab5c7 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -518,4 +518,54 @@ rhead_nic_register_test(
 
 #endif	/* EFSYS_OPT_DIAG */
 
+	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp)
+{
+	efx_oword_t entry;
+	uint32_t rev;
+	uint32_t len;
+	efx_rc_t rc;
+
+	/*
+	 * Xilinx Capabilities Table requries 32bit aligned reads.
+	 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+	 */
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+			&entry.eo_dword[0], B_FALSE);
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+			&entry.eo_dword[1], B_FALSE);
+
+	rev = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_REV);
+	len = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_SIZE);
+
+	if (rev != ESE_GZ_CFGBAR_ENTRY_REV_EF100 ||
+	    len < ESE_GZ_CFGBAR_ENTRY_SIZE_EF100) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_EF100_BAR) / 8),
+			&entry.eo_dword[2], B_FALSE);
+
+	ebrp->ebr_index = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_EF100_BAR);
+	ebrp->ebr_offset = EFX_OWORD_FIELD32(entry,
+			ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF) <<
+			ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT;
+	ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+	ebrp->ebr_length = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 47e89cf8a2..0a6e72f076 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -9,6 +9,41 @@
 
 #if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
 
+/*
+ * Search for a EF100 resource locator from the given offset of an entry
+ * in a Xilinx capabilities table.
+ */
+static	__checkReturn			efx_rc_t
+rhead_xilinx_cap_tbl_find_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t tbl_offset,
+	__out				efx_bar_region_t *ef100_ebrp)
+{
+	efx_rc_t rc;
+	efsys_dma_addr_t entry_offset = tbl_offset;
+
+	rc = efx_pci_xilinx_cap_tbl_find(esbp, ESE_GZ_CFGBAR_ENTRY_EF100,
+					   B_FALSE, &entry_offset);
+	if (rc != 0) {
+		/* EF100 locator not found (ENOENT) or other error */
+		goto fail1;
+	}
+
+	rc = rhead_nic_xilinx_cap_tbl_read_ef100_locator(esbp, entry_offset,
+							 ef100_ebrp);
+	if (rc != 0)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
@@ -55,13 +90,27 @@ rhead_pci_nic_membar_lookup(
 		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
 		if (rc != 0)
 			goto fail2;
+
+		rc = rhead_xilinx_cap_tbl_find_ef100_locator(&xil_eb,
+							     xilinx_tbl_offset,
+							     ebrp);
+		if (rc == 0) {
+			/* Found valid EF100 locator. */
+			bar_found = B_TRUE;
+			break;
+		} else if (rc != ENOENT) {
+			/* Table access failed, so terminate search. */
+			goto fail3;
+		}
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail3;
+		goto fail4;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (45 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
                   ` (15 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Check that BAR lookup was successful by looking at the content
of signature register.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 0a6e72f076..dfb163b96d 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -56,6 +56,9 @@ rhead_pci_nic_membar_lookup(
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
 	efsys_bar_t xil_eb;
+	efsys_bar_t nic_eb;
+	efx_dword_t magic_ed;
+	uint32_t magic;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -107,8 +110,25 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
+	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	if (rc != 0)
+		goto fail5;
+
+	EFSYS_BAR_READD(&nic_eb, ebrp->ebr_offset + ER_GZ_NIC_MAGIC_OFST,
+			&magic_ed, B_FALSE);
+
+	magic = EFX_DWORD_FIELD(magic_ed, ERF_GZ_NIC_MAGIC);
+	if (magic != EFE_GZ_NIC_MAGIC_EXPECTED) {
+		rc = EINVAL;
+		goto fail6;
+	}
+
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (46 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
                   ` (14 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

The procedures for destroying UDP tunnels are NIC family specific,
so they should be implemented separately for each of them.

Check for supported UDP encapsulation is removed from generic
operations since it is no longer used by the generic libefx API.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |  2 +-
 drivers/common/sfc_efx/base/efx_tunnel.c | 39 +++++++++++++++---------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index dfe5f1fecf..64156de884 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -303,8 +303,8 @@ efx_filter_reconfigure(
 
 #if EFSYS_OPT_TUNNEL
 typedef struct efx_tunnel_ops_s {
-	boolean_t	(*eto_udp_encap_supported)(efx_nic_t *);
 	efx_rc_t	(*eto_reconfigure)(efx_nic_t *);
+	void		(*eto_fini)(efx_nic_t *);
 } efx_tunnel_ops_t;
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index b1d1407bd2..5f2186c4c8 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -12,8 +12,8 @@
 
 #if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
 };
 #endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
@@ -26,9 +26,13 @@ static	__checkReturn	efx_rc_t
 ef10_tunnel_reconfigure(
 	__in		efx_nic_t *enp);
 
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp);
+
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
-	ef10_udp_encap_supported,	/* eto_udp_encap_supported */
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
+	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
@@ -204,22 +208,12 @@ efx_tunnel_init(
 efx_tunnel_fini(
 	__in		efx_nic_t *enp)
 {
-	boolean_t resetting;
-
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
-	if ((enp->en_etop->eto_udp_encap_supported != NULL) &&
-	    enp->en_etop->eto_udp_encap_supported(enp)) {
-		/*
-		 * The UNLOADING flag allows the MC to suppress the datapath
-		 * reset if it was set on the last call to
-		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
-		 */
-		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
-		    &resetting);
-	}
+	if (enp->en_etop->eto_fini != NULL)
+		enp->en_etop->eto_fini(enp);
 
 	enp->en_etop = NULL;
 	enp->en_mod_flags &= ~EFX_MOD_TUNNEL;
@@ -476,6 +470,23 @@ ef10_tunnel_reconfigure(
 
 	return (rc);
 }
+
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	boolean_t resetting;
+
+	if (ef10_udp_encap_supported(enp) != B_FALSE) {
+		/*
+		 * The UNLOADING flag allows the MC to suppress the datapath
+		 * reset if it was set on the last call to
+		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
+		 */
+		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
+		    &resetting);
+	}
+}
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
 #endif /* EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (47 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
                   ` (13 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

UDP tunnel reconfigure operation takes UDP tunnel table, which contains
entries that need to be applied to HW. This approach does not retain
information about what entries were removed or added, which is required
for Riverhead.

Add states to the table entries to indicate add or remove operations.
On tunnel reconfiguration added and removed entries become busy to
indicate that the entries are currently configured and to prevent add or
remove operations from other threads. After tunnel reconfiguration is
complete, the states are reset - added entries become applied and
removed entries are purged from the table.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        |   9 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   9 +
 drivers/common/sfc_efx/base/efx_tunnel.c | 276 +++++++++++++++++++++--
 3 files changed, 269 insertions(+), 25 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index f6dd9db301..b603e263e6 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -3659,6 +3659,9 @@ efx_tunnel_config_udp_add(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of the port is in progress in other thread.
+ */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
@@ -3666,8 +3669,12 @@ efx_tunnel_config_udp_remove(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of any of the tunnel entries
+ * is in progress in other thread.
+ */
 LIBEFX_API
-extern			void
+extern	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in		efx_nic_t *enp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 64156de884..1ae4eeaf88 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -489,9 +489,18 @@ siena_filter_tbl_clear(
 
 #if EFSYS_OPT_TUNNEL
 
+/* State of a UDP tunnel table entry */
+typedef enum efx_tunnel_udp_entry_state_e {
+	EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */
+	EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */
+	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
+} efx_tunnel_udp_entry_state_t;
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
+	boolean_t			etue_busy;
+	efx_tunnel_udp_entry_state_t	etue_state;
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 5f2186c4c8..204871e00d 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -7,6 +7,43 @@
 #include "efx.h"
 #include "efx_impl.h"
 
+/*
+ * State diagram of the UDP tunnel table entries
+ * (efx_tunnel_udp_entry_state_t and busy flag):
+ *
+ *                             +---------+
+ *                    +--------| APPLIED |<-------+
+ *                    |        +---------+        |
+ *                    |                           |
+ *                    |                efx_tunnel_reconfigure (end)
+ *   efx_tunnel_config_udp_remove                 |
+ *                    |                    +------------+
+ *                    v                    | BUSY ADDED |
+ *               +---------+               +------------+
+ *               | REMOVED |                      ^
+ *               +---------+                      |
+ *                    |               efx_tunnel_reconfigure (begin)
+ *  efx_tunnel_reconfigure (begin)                |
+ *                    |                           |
+ *                    v                     +-----------+
+ *            +--------------+              |   ADDED   |<---------+
+ *            | BUSY REMOVED |              +-----------+          |
+ *            +--------------+                    |                |
+ *                    |              efx_tunnel_config_udp_remove  |
+ *  efx_tunnel_reconfigure (end)                  |                |
+ *                    |                           |                |
+ *                    |        +---------+        |                |
+ *                    |        |+-------+|        |                |
+ *                    +------->|| empty ||<-------+                |
+ *                             |+-------+|                         |
+ *                             +---------+        efx_tunnel_config_udp_add
+ *                                  |                              |
+ *                                  +------------------------------+
+ *
+ * Note that there is no BUSY APPLIED state since removing an applied entry
+ * should not be blocked by ongoing reconfiguration in another thread -
+ * reconfiguration will remove only busy entries.
+ */
 
 #if EFSYS_OPT_TUNNEL
 
@@ -36,6 +73,24 @@ static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+/* Indicates that an entry is to be set */
+static	__checkReturn		boolean_t
+ef10_entry_staged(
+	__in			efx_tunnel_udp_entry_t *entry)
+{
+	switch (entry->etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		return (entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		return (!entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		return (B_TRUE);
+	default:
+		EFSYS_ASSERT(0);
+		return (B_FALSE);
+	}
+}
+
 static	__checkReturn		efx_rc_t
 efx_mcdi_set_tunnel_encap_udp_ports(
 	__in			efx_nic_t *enp,
@@ -51,11 +106,17 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	efx_rc_t rc;
 	unsigned int i;
 	unsigned int entries_num;
+	unsigned int entry;
 
-	if (etcp == NULL)
-		entries_num = 0;
-	else
-		entries_num = etcp->etc_udp_entries_num;
+	entries_num = 0;
+	if (etcp != NULL) {
+		for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+			if (ef10_entry_staged(&etcp->etc_udp_entries[i]) !=
+			    B_FALSE) {
+				entries_num++;
+			}
+		}
+	}
 
 	req.emr_cmd = MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS;
 	req.emr_in_buf = payload;
@@ -73,9 +134,12 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	MCDI_IN_SET_WORD(req, SET_TUNNEL_ENCAP_UDP_PORTS_IN_NUM_ENTRIES,
 	    entries_num);
 
-	for (i = 0; i < entries_num; ++i) {
+	for (i = 0, entry = 0; entry < entries_num; ++entry, ++i) {
 		uint16_t mcdi_udp_protocol;
 
+		while (ef10_entry_staged(&etcp->etc_udp_entries[i]) == B_FALSE)
+			i++;
+
 		switch (etcp->etc_udp_entries[i].etue_protocol) {
 		case EFX_TUNNEL_PROTOCOL_VXLAN:
 			mcdi_udp_protocol = TUNNEL_ENCAP_UDP_PORT_ENTRY_VXLAN;
@@ -97,7 +161,7 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_LEN);
 		EFX_POPULATE_DWORD_2(
 		    MCDI_IN2(req, efx_dword_t,
-			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[i],
+			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[entry],
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_UDP_PORT,
 		    etcp->etc_udp_entries[i].etue_port,
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_PROTOCOL,
@@ -230,7 +294,8 @@ efx_tunnel_config_find_udp_tunnel_entry(
 	for (i = 0; i < etcp->etc_udp_entries_num; ++i) {
 		efx_tunnel_udp_entry_t *p = &etcp->etc_udp_entries[i];
 
-		if (p->etue_port == port) {
+		if (p->etue_port == port &&
+		    p->etue_state != EFX_TUNNEL_UDP_ENTRY_REMOVED) {
 			*entryp = i;
 			return (0);
 		}
@@ -281,6 +346,8 @@ efx_tunnel_config_udp_add(
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_port = port;
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_protocol =
 	    protocol;
+	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_state =
+	    EFX_TUNNEL_UDP_ENTRY_ADDED;
 
 	etcp->etc_udp_entries_num++;
 
@@ -304,6 +371,61 @@ efx_tunnel_config_udp_add(
 	return (rc);
 }
 
+/*
+ * Returns the index of the entry after the deleted one,
+ * or one past the last entry.
+ */
+static			unsigned int
+efx_tunnel_config_udp_do_remove(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
+	etcp->etc_udp_entries_num--;
+
+	if (entry < etcp->etc_udp_entries_num) {
+		memmove(&etcp->etc_udp_entries[entry],
+		    &etcp->etc_udp_entries[entry + 1],
+		    (etcp->etc_udp_entries_num - entry) *
+		    sizeof (etcp->etc_udp_entries[0]));
+	}
+
+	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
+	    sizeof (etcp->etc_udp_entries[0]));
+
+	return (entry);
+}
+
+/*
+ * Returns the index of the entry after the specified one,
+ * or one past the last entry. The index is correct whether
+ * the specified entry was removed or not.
+ */
+static			unsigned int
+efx_tunnel_config_udp_remove_prepare(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	unsigned int next = entry + 1;
+
+	switch (etcp->etc_udp_entries[entry].etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		next = efx_tunnel_config_udp_do_remove(etcp, entry);
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		etcp->etc_udp_entries[entry].etue_state =
+		    EFX_TUNNEL_UDP_ENTRY_REMOVED;
+		break;
+	default:
+		EFSYS_ASSERT(0);
+		break;
+	}
+
+	return (next);
+}
+
 	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
 	__in		efx_nic_t *enp,
@@ -323,28 +445,25 @@ efx_tunnel_config_udp_remove(
 	if (rc != 0)
 		goto fail1;
 
-	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
-		rc = EINVAL;
+	if (etcp->etc_udp_entries[entry].etue_busy != B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
 	}
 
-	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
-	etcp->etc_udp_entries_num--;
-
-	if (entry < etcp->etc_udp_entries_num) {
-		memmove(&etcp->etc_udp_entries[entry],
-		    &etcp->etc_udp_entries[entry + 1],
-		    (etcp->etc_udp_entries_num - entry) *
-		    sizeof (etcp->etc_udp_entries[0]));
+	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
+		rc = EINVAL;
+		goto fail3;
 	}
 
-	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
-	    sizeof (etcp->etc_udp_entries[0]));
+	(void) efx_tunnel_config_udp_remove_prepare(etcp, entry);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
+
 fail2:
 	EFSYS_PROBE(fail2);
 
@@ -355,21 +474,51 @@ efx_tunnel_config_udp_remove(
 	return (rc);
 }
 
-			void
+static			boolean_t
+efx_tunnel_table_all_available(
+	__in			efx_tunnel_cfg_t *etcp)
+{
+	unsigned int i;
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		if (etcp->etc_udp_entries[i].etue_busy != B_FALSE)
+			return (B_FALSE);
+	}
+
+	return (B_TRUE);
+}
+
+	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in			efx_nic_t *enp)
 {
 	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
 	efsys_lock_state_t state;
+	unsigned int i;
+	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
 	EFSYS_LOCK(enp->en_eslp, state);
 
-	etcp->etc_udp_entries_num = 0;
-	memset(etcp->etc_udp_entries, 0, sizeof (etcp->etc_udp_entries));
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
+		goto fail1;
+	}
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num)
+		i = efx_tunnel_config_udp_remove_prepare(etcp, i);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (rc);
 }
 
 	__checkReturn	efx_rc_t
@@ -377,6 +526,12 @@ efx_tunnel_reconfigure(
 	__in		efx_nic_t *enp)
 {
 	const efx_tunnel_ops_t *etop = enp->en_etop;
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_tunnel_udp_entry_t *entry;
+	boolean_t locked = B_FALSE;
+	efsys_lock_state_t state;
+	boolean_t resetting;
+	unsigned int i;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
@@ -386,16 +541,89 @@ efx_tunnel_reconfigure(
 		goto fail1;
 	}
 
-	if ((rc = enp->en_etop->eto_reconfigure(enp)) != 0)
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
+	}
 
-	return (0);
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_state != EFX_TUNNEL_UDP_ENTRY_APPLIED)
+			entry->etue_busy = B_TRUE;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	rc = enp->en_etop->eto_reconfigure(enp);
+	if (rc != 0 && rc != EAGAIN)
+		goto fail3;
+
+	resetting = (rc == EAGAIN) ? B_TRUE : B_FALSE;
+
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	/*
+	 * Delete entries marked for removal since they are no longer
+	 * needed after successful NIC-specific reconfiguration.
+	 * Added entries become applied because they are installed in
+	 * the hardware.
+	 */
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num) {
+		unsigned int next = i + 1;
+
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_busy != B_FALSE) {
+			entry->etue_busy = B_FALSE;
+
+			switch (entry->etue_state) {
+			case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_ADDED:
+				entry->etue_state =
+				    EFX_TUNNEL_UDP_ENTRY_APPLIED;
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+				next = efx_tunnel_config_udp_do_remove(etcp, i);
+				break;
+			default:
+				EFSYS_ASSERT(0);
+				break;
+			}
+		}
+
+		i = next;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	return ((resetting == B_FALSE) ? 0 : EAGAIN);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+	EFSYS_ASSERT(locked == B_FALSE);
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++)
+		etcp->etc_udp_entries[i].etue_busy = B_FALSE;
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
 
 fail2:
 	EFSYS_PROBE(fail2);
 
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	if (locked)
+		EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (rc);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (48 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
                   ` (12 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

EF100 uses VNIC encapsulation rule MCDI for configuring UDP
tunnels in HW individually. Use busy added and removed states
of UDP tunnel table entries for the implementation.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c  |  10 +-
 drivers/common/sfc_efx/base/efx_impl.h     |   7 +
 drivers/common/sfc_efx/base/efx_mcdi.h     |  11 +
 drivers/common/sfc_efx/base/efx_tunnel.c   |  25 +-
 drivers/common/sfc_efx/base/meson.build    |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h   |  14 +
 drivers/common/sfc_efx/base/rhead_nic.c    |  17 +
 drivers/common/sfc_efx/base/rhead_tunnel.c | 343 +++++++++++++++++++++
 8 files changed, 418 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 51e6f1a210..0e5f04fe3b 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -1328,9 +1328,15 @@ ef10_filter_supported_filters(
 		rc = efx_mcdi_get_parser_disp_info(enp, &buffer[next_buf_idx],
 		    next_buf_length, B_TRUE, &mcdi_encap_list_length);
 		if (rc != 0) {
-			if (rc == ENOSPC)
+			if (rc == ENOSPC) {
 				no_space = B_TRUE;
-			else
+			} else if (rc == EINVAL) {
+				/*
+				 * Do not fail if the MCDI do not recognize the
+				 * query for encapsulated packet filters.
+				 */
+				mcdi_encap_list_length = 0;
+			} else
 				goto fail2;
 		} else {
 			for (i = next_buf_idx;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ae4eeaf88..be3f3f6bf5 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -496,11 +496,18 @@ typedef enum efx_tunnel_udp_entry_state_e {
 	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
 } efx_tunnel_udp_entry_state_t;
 
+#if EFSYS_OPT_RIVERHEAD
+typedef uint32_t	efx_vnic_encap_rule_handle_t;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
 	boolean_t			etue_busy;
 	efx_tunnel_udp_entry_state_t	etue_state;
+#if EFSYS_OPT_RIVERHEAD
+	efx_vnic_encap_rule_handle_t	etue_handle;
+#endif /* EFSYS_OPT_RIVERHEAD */
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h
index 97ac8bf496..77a3d636e2 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_mcdi.h
@@ -384,6 +384,17 @@ efx_mcdi_phy_module_get_info(
 		MC_CMD_ ## _field9, _value9,				\
 		MC_CMD_ ## _field10, _value10)
 
+/*
+ * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in
+ * network order to avoid conversion to little-endian that is done in
+ * other setters.
+ */
+#define	MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value)
+
+#define	MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value)
+
 #define	MCDI_OUT(_emr, _type, _ofst)					\
 	((_type *)((_emr).emr_out_buf + (_ofst)))
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 204871e00d..02b83d97ed 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -47,13 +47,6 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
-static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_reconfigure */
-	NULL,	/* eto_fini */
-};
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
-
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
 ef10_udp_encap_supported(
@@ -66,13 +59,29 @@ ef10_tunnel_reconfigure(
 static			void
 ef10_tunnel_fini(
 	__in		efx_nic_t *enp);
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
+	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
+};
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
 	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tunnel_ops_t	__efx_tunnel_rhead_ops = {
+	rhead_tunnel_reconfigure,	/* eto_reconfigure */
+	rhead_tunnel_fini,		/* eto_fini */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 /* Indicates that an entry is to be set */
 static	__checkReturn		boolean_t
 ef10_entry_staged(
@@ -241,7 +250,7 @@ efx_tunnel_init(
 
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		etop = &__efx_tunnel_dummy_ops;
+		etop = &__efx_tunnel_rhead_ops;
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 21feb36c73..e0acbda993 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -58,6 +58,7 @@ sources = [
 	'rhead_nic.c',
 	'rhead_pci.c',
 	'rhead_rx.c',
+	'rhead_tunnel.c',
 	'rhead_tx.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index c75483926c..38cd30d388 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,20 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_TUNNEL
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_TUNNEL */
+
 #if EFSYS_OPT_PCI
 
 /*
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 58838ab5c7..7d7073ad5e 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -22,6 +22,23 @@ rhead_board_cfg(
 	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
 		goto fail1;
 
+	/*
+	 * The tunnel encapsulation initialization happens unconditionally
+	 * for now.
+	 */
+	encp->enc_tunnel_encapsulations_supported =
+	    (1u << EFX_TUNNEL_PROTOCOL_VXLAN) |
+	    (1u << EFX_TUNNEL_PROTOCOL_GENEVE) |
+	    (1u << EFX_TUNNEL_PROTOCOL_NVGRE);
+
+	/*
+	 * Software limitation inherited from EF10. This limit is not
+	 * increased since the hardware does not report this limit, it is
+	 * handled internally resulting in a tunnel add error when there is no
+	 * space for more UDP tunnels.
+	 */
+	encp->enc_tunnel_config_udp_entries_max = EFX_TUNNEL_MAXNENTRIES;
+
 	encp->enc_clk_mult = 1; /* not used for Riverhead */
 
 	/*
diff --git a/drivers/common/sfc_efx/base/rhead_tunnel.c b/drivers/common/sfc_efx/base/rhead_tunnel.c
new file mode 100644
index 0000000000..92f12ab4e8
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tunnel.c
@@ -0,0 +1,343 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2020 Xilinx, Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL
+
+/* Match by Ether-type */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_ETHER_TYPE \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN)
+/* Match by outer VLAN ID */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_OUTER_VID \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN)
+/* Match by local IP host address */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_HOST \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN)
+/* Match by IP transport protocol */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN)
+/* Match by local TCP/UDP port */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN)
+
+/*
+ * Helper structure to pass parameters to MCDI function to add a VNIC
+ * encapsulation rule.
+ */
+typedef struct efx_vnic_encap_rule_spec_s {
+	uint32_t		evers_mport_selector; /* Host-endian */
+	uint32_t		evers_match_flags; /* Host-endian */
+	uint16_t		evers_ether_type; /* Host-endian */
+	uint16_t		evers_outer_vid; /* Host-endian */
+	efx_oword_t		evers_loc_host; /* Big-endian */
+	uint8_t			evers_ip_proto;
+	uint16_t		evers_loc_port; /* Host-endian */
+	efx_tunnel_protocol_t	evers_encap_type;
+} efx_vnic_encap_rule_spec_t;
+
+static				uint32_t
+efx_tunnel_protocol2mae_encap_type(
+	__in		efx_tunnel_protocol_t proto,
+	__out		uint32_t *typep)
+{
+	efx_rc_t rc;
+
+	switch (proto) {
+	case EFX_TUNNEL_PROTOCOL_NONE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NONE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_VXLAN:
+		*typep = MAE_MCDI_ENCAP_TYPE_VXLAN;
+		break;
+	case EFX_TUNNEL_PROTOCOL_GENEVE:
+		*typep = MAE_MCDI_ENCAP_TYPE_GENEVE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_NVGRE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NVGRE;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_add(
+	__in			efx_nic_t *enp,
+	__in			const efx_vnic_encap_rule_spec_t *spec,
+	__out			efx_vnic_encap_rule_handle_t *handle)
+
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN);
+	uint32_t encap_type;
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_ADD;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR,
+	    spec->evers_mport_selector);
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS,
+	    spec->evers_match_flags);
+
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE,
+	    __CPU_TO_BE_16(spec->evers_ether_type));
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD,
+	    __CPU_TO_BE_16(spec->evers_outer_vid));
+
+	/*
+	 * Address is already in network order as well as the MCDI field,
+	 * so plain copy is used.
+	 */
+	EFX_STATIC_ASSERT(sizeof (spec->evers_loc_host) ==
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+	memcpy(MCDI_IN2(req, uint8_t, VNIC_ENCAP_RULE_ADD_IN_DST_IP),
+	    &spec->evers_loc_host.eo_byte[0],
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+
+	MCDI_IN_SET_BYTE(req, VNIC_ENCAP_RULE_ADD_IN_IP_PROTO,
+	    spec->evers_ip_proto);
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_DST_PORT,
+	    __CPU_TO_BE_16(spec->evers_loc_port));
+
+	rc = efx_tunnel_protocol2mae_encap_type(spec->evers_encap_type,
+	    &encap_type);
+	if (rc != 0)
+		goto fail1;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE, encap_type);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail2;
+	}
+
+	if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	if (handle != NULL)
+		*handle = MCDI_OUT_DWORD(req, VNIC_ENCAP_RULE_ADD_OUT_HANDLE);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_remove(
+       __in                    efx_nic_t *enp,
+       __in                    efx_vnic_encap_rule_handle_t handle)
+
+{
+       efx_mcdi_req_t req;
+       EFX_MCDI_DECLARE_BUF(payload,
+               MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN,
+               MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN);
+       efx_rc_t rc;
+
+       req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_REMOVE;
+       req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN;
+
+       MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_REMOVE_IN_HANDLE, handle);
+
+       efx_mcdi_execute(enp, &req);
+
+       if (req.emr_rc != 0) {
+               rc = req.emr_rc;
+               goto fail1;
+       }
+
+       if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN) {
+               rc = EMSGSIZE;
+               goto fail2;
+       }
+
+       return (0);
+
+fail2:
+       EFSYS_PROBE(fail2);
+
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+       return (rc);
+}
+
+static			void
+rhead_vnic_encap_rule_spec_init(
+	__in		const efx_tunnel_udp_entry_t *etuep,
+	__out		efx_vnic_encap_rule_spec_t *spec)
+{
+	memset(spec, 0, sizeof (*spec));
+
+	spec->evers_mport_selector = MAE_MPORT_SELECTOR_ASSIGNED;
+	spec->evers_match_flags = EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO |
+	    EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT;
+	spec->evers_ip_proto = EFX_IPPROTO_UDP;
+	spec->evers_loc_port = etuep->etue_port;
+	spec->evers_encap_type = etuep->etue_protocol;
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_add(
+	__in		efx_nic_t *enp,
+	__inout		efx_tunnel_udp_entry_t *etuep)
+{
+	efx_vnic_encap_rule_spec_t spec;
+
+	rhead_vnic_encap_rule_spec_init(etuep, &spec);
+	return (efx_mcdi_vnic_encap_rule_add(enp, &spec, &etuep->etue_handle));
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_remove(
+	__in		efx_nic_t *enp,
+	__in		efx_tunnel_udp_entry_t *etuep)
+{
+	return (efx_mcdi_vnic_encap_rule_remove(enp, etuep->etue_handle));
+}
+
+	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp)
+{
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_rc_t rc;
+	efsys_lock_state_t state;
+	efx_tunnel_cfg_t etc;
+	efx_tunnel_cfg_t added;
+	unsigned int i;
+	unsigned int j;
+
+	memset(&added, 0, sizeof(added));
+
+	/*
+	 * Make a local copy of UDP tunnel table to release the lock
+	 * when executing MCDIs.
+	 */
+	EFSYS_LOCK(enp->en_eslp, state);
+	memcpy(&etc, etcp, sizeof (etc));
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etc.etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *etc_entry = &etc.etc_udp_entries[i];
+
+		if (etc_entry->etue_busy == B_FALSE)
+			continue;
+
+		switch (etc_entry->etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			rc = rhead_udp_port_tunnel_add(enp, etc_entry);
+			if (rc != 0)
+				goto fail1;
+			added.etc_udp_entries[added.etc_udp_entries_num] =
+			    *etc_entry;
+			added.etc_udp_entries_num++;
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			rc = rhead_udp_port_tunnel_remove(enp, etc_entry);
+			if (rc != 0)
+				goto fail2;
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	/*
+	 * Adding or removing non-busy entries does not change the
+	 * order of busy entries. Therefore one linear search iteration
+	 * suffices.
+	 */
+	for (i = 0, j = 0; i < etcp->etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *cur_entry = &etcp->etc_udp_entries[i];
+		efx_tunnel_udp_entry_t *added_entry = &added.etc_udp_entries[j];
+
+		if (cur_entry->etue_state == EFX_TUNNEL_UDP_ENTRY_ADDED &&
+		    cur_entry->etue_port == added_entry->etue_port) {
+			cur_entry->etue_handle = added_entry->etue_handle;
+			j++;
+		}
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	while (i-- > 0) {
+		if (etc.etc_udp_entries[i].etue_busy == B_FALSE)
+			continue;
+
+		switch (etc.etc_udp_entries[i].etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			(void) rhead_udp_port_tunnel_remove(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			(void) rhead_udp_port_tunnel_add(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	return (rc);
+}
+
+			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_tunnel_config_clear(enp);
+	(void) efx_tunnel_reconfigure(enp);
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 51/60] common/sfc_efx/base: replace PCI efsys macros with functions
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (49 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
                   ` (11 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

efsys macros that manipulate PCI devices cannot be defined in
common sfc_efx DPDK driver since in DPDK build the bus drivers
that provide required functionality are built after common drivers.

Replace the macros with function callbacks to remove that build
dependency. Drivers now should pass the callbacks directly to
efx function instead of defining implementation in efsys.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        | 29 ++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h   |  4 +++
 drivers/common/sfc_efx/base/efx_nic.c    |  3 ++-
 drivers/common/sfc_efx/base/efx_pci.c    | 34 +++++++++++++-----------
 drivers/common/sfc_efx/base/rhead_impl.h |  1 +
 drivers/common/sfc_efx/base/rhead_pci.c  |  8 +++---
 6 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index b603e263e6..67438b59e6 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -82,6 +82,34 @@ efx_family(
 
 #if EFSYS_OPT_PCI
 
+typedef struct efx_pci_ops_s {
+	/*
+	 * Function for reading PCIe configuration space.
+	 *
+	 * espcp	System-specific PCIe device handle;
+	 * offset	Offset inside PCIe configuration space to start reading
+	 *		from;
+	 * edp		EFX DWORD structure that should be populated by function
+	 *		in little-endian order;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_config_readd)(efsys_pci_config_t *espcp,
+					    uint32_t offset, efx_dword_t *edp);
+	/*
+	 * Function for finding PCIe memory bar handle by its index from a PCIe
+	 * device handle. The found memory bar is available in read-only mode.
+	 *
+	 * configp	System-specific PCIe device handle;
+	 * index	Memory bar index;
+	 * memp		Pointer to the found memory bar handle;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_find_mem_bar)(efsys_pci_config_t *configp,
+					    int index, efsys_bar_t *memp);
+} efx_pci_ops_t;
+
 /* Determine EFX family and perform lookup of the function control window
  *
  * The function requires PCI config handle from which all memory bars can
@@ -95,6 +123,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index be3f3f6bf5..f58586bee0 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1588,6 +1588,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp);
 
@@ -1602,6 +1603,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp);
 
 /*
@@ -1614,6 +1616,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
@@ -1629,6 +1632,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index dcf0987ebf..a78c4c3737 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -110,6 +110,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp)
 {
@@ -121,7 +122,7 @@ efx_family_probe_bar(
 #if EFSYS_OPT_RIVERHEAD
 		case EFX_PCI_DEVID_RIVERHEAD:
 		case EFX_PCI_DEVID_RIVERHEAD_VF:
-			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			rc = rhead_pci_nic_membar_lookup(espcp, epop, ebrp);
 			if (rc == 0)
 				*efp = EFX_FAMILY_RIVERHEAD;
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index 1c31c126c6..5eccfbe35d 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -12,6 +12,7 @@
 	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp)
 {
 	efx_dword_t hdr;
@@ -26,9 +27,9 @@ efx_pci_config_next_ext_cap(
 	if (*offsetp == 0) {
 		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
 	} else {
-		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+		rc = epop->epo_config_readd(espcp, *offsetp +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail2;
@@ -58,6 +59,7 @@ efx_pci_config_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp)
 {
@@ -73,7 +75,7 @@ efx_pci_config_find_next_ext_cap(
 	position = *offsetp;
 
 	while (1) {
-		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		rc = efx_pci_config_next_ext_cap(espcp, epop, &position);
 		if (rc != 0) {
 			if (rc == ENOENT)
 				break;
@@ -81,9 +83,9 @@ efx_pci_config_find_next_ext_cap(
 				goto fail2;
 		}
 
-		EFSYS_PCI_CONFIG_READD(espcp, position +
+		rc = epop->epo_config_readd(espcp, position +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail3;
@@ -116,6 +118,7 @@ efx_pci_config_find_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
@@ -134,7 +137,7 @@ efx_pci_find_next_xilinx_cap_table(
 		unsigned int tbl_bar;
 		efsys_dma_addr_t tbl_offset;
 
-		rc = efx_pci_config_find_next_ext_cap(espcp,
+		rc = efx_pci_config_find_next_ext_cap(espcp, epop,
 				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
 		if (rc != 0) {
 			if (rc == ENOENT)
@@ -149,7 +152,7 @@ efx_pci_find_next_xilinx_cap_table(
 		 * locator. Try to read it and skip it if the capability is
 		 * not the locator.
 		 */
-		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, epop, cap_offset,
 						       &tbl_bar, &tbl_offset);
 		if (rc == 0) {
 			*xilinx_tbl_barp = tbl_bar;
@@ -183,6 +186,7 @@ efx_pci_find_next_xilinx_cap_table(
 	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp)
@@ -199,9 +203,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	efsys_dma_addr_t offset;
 	efx_rc_t rc;
 
-	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+	rc = epop->epo_config_readd(espcp, cap_offset +
 			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-			       &cap_hdr, &rc);
+			       &cap_hdr);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail1;
@@ -213,9 +217,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail2;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
-			       &vsec.eo_dword[0], &rc);
+			       &vsec.eo_dword[0]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail3;
@@ -240,9 +244,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail5;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
-			       &vsec.eo_dword[1], &rc);
+			       &vsec.eo_dword[1]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail6;
@@ -252,9 +256,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
 
 	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
-		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+		rc = epop->epo_config_readd(espcp, vsec_offset +
 				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
-				&vsec.eo_dword[2], &rc);
+				&vsec.eo_dword[2]);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail7;
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 38cd30d388..e9d3d76ae4 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -461,6 +461,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp);
 
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index dfb163b96d..0f4b4cb910 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -47,6 +47,7 @@ rhead_xilinx_cap_tbl_find_ef100_locator(
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp)
 {
 	boolean_t xilinx_tbl_found = B_FALSE;
@@ -65,7 +66,8 @@ rhead_pci_nic_membar_lookup(
 	 * the following discovery steps.
 	 */
 	while (1) {
-		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, epop,
+							&pci_capa_offset,
 							&xilinx_tbl_bar,
 							&xilinx_tbl_offset);
 		if (rc != 0) {
@@ -90,7 +92,7 @@ rhead_pci_nic_membar_lookup(
 
 		xilinx_tbl_found = B_TRUE;
 
-		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		rc = epop->epo_find_mem_bar(espcp, xilinx_tbl_bar, &xil_eb);
 		if (rc != 0)
 			goto fail2;
 
@@ -110,7 +112,7 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
-	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	rc = epop->epo_find_mem_bar(espcp, ebrp->ebr_index, &nic_eb);
 	if (rc != 0)
 		goto fail5;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (50 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
                   ` (10 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

There is no difference yet in EVB support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_evb.c  |  8 ++++----
 drivers/common/sfc_efx/base/efx_check.h |  4 ++--
 drivers/common/sfc_efx/base/efx_evb.c   | 24 ++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_evb.c b/drivers/common/sfc_efx/base/ef10_evb.c
index aeeaa5189f..089d791543 100644
--- a/drivers/common/sfc_efx/base/ef10_evb.c
+++ b/drivers/common/sfc_efx/base/ef10_evb.c
@@ -9,13 +9,13 @@
 
 #if EFSYS_OPT_EVB
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_evb_init(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	return (0);
 }
@@ -24,7 +24,7 @@ ef10_evb_init(
 ef10_evb_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 }
 
 static	__checkReturn	efx_rc_t
@@ -545,5 +545,5 @@ ef10_evb_vport_stats(
 			EFX_STATS_UPLOAD, 0));
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #endif /* EFSYS_OPT_EVB */
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index af90a4c373..f9f97946e5 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -373,8 +373,8 @@
 
 #if EFSYS_OPT_EVB
 /* Support enterprise virtual bridging */
-# if !(EFX_OPTS_EF10())
-#  error "EVB requires EF10 arch"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10())
+#  error "EVB requires RIVERHEAD or EF10 arch"
 # endif
 #endif /* EFSYS_OPT_EVB */
 
diff --git a/drivers/common/sfc_efx/base/efx_evb.c b/drivers/common/sfc_efx/base/efx_evb.c
index 17318b7e11..b6c9b88fc2 100644
--- a/drivers/common/sfc_efx/base/efx_evb.c
+++ b/drivers/common/sfc_efx/base/efx_evb.c
@@ -46,6 +46,24 @@ static const efx_evb_ops_t	__efx_evb_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_evb_ops_t	__efx_evb_rhead_ops = {
+	ef10_evb_init,			/* eeo_init */
+	ef10_evb_fini,			/* eeo_fini */
+	ef10_evb_vswitch_alloc,		/* eeo_vswitch_alloc */
+	ef10_evb_vswitch_free,		/* eeo_vswitch_free */
+	ef10_evb_vport_alloc,		/* eeo_vport_alloc */
+	ef10_evb_vport_free,		/* eeo_vport_free */
+	ef10_evb_vport_mac_addr_add,	/* eeo_vport_mac_addr_add */
+	ef10_evb_vport_mac_addr_del,	/* eeo_vport_mac_addr_del */
+	ef10_evb_vadaptor_alloc,	/* eeo_vadaptor_alloc */
+	ef10_evb_vadaptor_free,		/* eeo_vadaptor_free */
+	ef10_evb_vport_assign,		/* eeo_vport_assign */
+	ef10_evb_vport_reconfigure,	/* eeo_vport_reconfigure */
+	ef10_evb_vport_stats,		/* eeo_vport_stats */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_evb_init(
 	__in		efx_nic_t *enp)
@@ -83,6 +101,12 @@ efx_evb_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eeop = &__efx_evb_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (51 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
                   ` (9 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev

Riverhead has EVB support similar to EF10 and NIC must allocate
its vAdaptor on init.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h |  5 +++
 drivers/common/sfc_efx/base/ef10_nic.c  | 10 +++++-
 drivers/common/sfc_efx/base/rhead_nic.c | 43 +++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e77fb4ddea..d7b3c3db52 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -234,6 +234,11 @@ efx_mcdi_vadaptor_free(
 	__in		efx_nic_t *enp,
 	__in		uint32_t port_id);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+ef10_upstream_port_vadaptor_alloc(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 ef10_nic_probe(
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 927af87e0d..7a11930242 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2321,7 +2321,11 @@ ef10_nic_reset(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
 ef10_upstream_port_vadaptor_alloc(
 	__in		efx_nic_t *enp)
 {
@@ -2373,6 +2377,10 @@ ef10_upstream_port_vadaptor_alloc(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 ef10_nic_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 7d7073ad5e..dbb067d563 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -336,6 +336,7 @@ rhead_nic_init(
 	uint32_t vi_count, vi_base, vi_shift;
 	uint32_t vi_window_size;
 	efx_rc_t rc;
+	boolean_t alloc_vadaptor = B_TRUE;
 
 	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
 	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
@@ -387,12 +388,34 @@ rhead_nic_init(
 	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
 	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
 
-	enp->en_vport_id = EVB_PORT_ID_NULL;
-
 	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
 
+	/*
+	 * For SR-IOV use case, vAdaptor is allocated for PF and associated VFs
+	 * during NIC initialization when vSwitch is created and vPorts are
+	 * allocated. Hence, skip vAdaptor allocation for EVB and update vPort
+	 * ID in NIC structure with the one allocated for PF.
+	 */
+
+	enp->en_vport_id = EVB_PORT_ID_ASSIGNED;
+#if EFSYS_OPT_EVB
+	if ((enp->en_vswitchp != NULL) && (enp->en_vswitchp->ev_evcp != NULL)) {
+		/* For EVB use vPort allocated on vSwitch */
+		enp->en_vport_id = enp->en_vswitchp->ev_evcp->evc_vport_id;
+		alloc_vadaptor = B_FALSE;
+	}
+#endif
+	if (alloc_vadaptor != B_FALSE) {
+		/* Allocate a vAdaptor attached to our upstream vPort/pPort */
+		if ((rc = ef10_upstream_port_vadaptor_alloc(enp)) != 0)
+			goto fail5;
+	}
+
 	return (0);
 
+fail5:
+	EFSYS_PROBE(fail5);
+
 fail4:
 	EFSYS_PROBE(fail4);
 
@@ -497,6 +520,22 @@ rhead_nic_set_hw_unavailable(
 rhead_nic_fini(
 	__in		efx_nic_t *enp)
 {
+	boolean_t do_vadaptor_free = B_TRUE;
+
+#if EFSYS_OPT_EVB
+	if (enp->en_vswitchp != NULL) {
+		/*
+		 * For SR-IOV the vAdaptor is freed with the vSwitch,
+		 * so do not free it here.
+		 */
+		do_vadaptor_free = B_FALSE;
+	}
+#endif
+	if (do_vadaptor_free != B_FALSE) {
+		(void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id);
+		enp->en_vport_id = EVB_PORT_ID_NULL;
+	}
+
 	(void) efx_mcdi_free_vis(enp);
 	enp->en_arch.ef10.ena_vi_count = 0;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 54/60] common/sfc_efx/base: add option for extended width events
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (52 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
                   ` (8 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses event queues with 256bit extended width events to
support descriptor proxy queues.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 7 +++++++
 drivers/common/sfc_efx/efsys.h          | 1 +
 2 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index f9f97946e5..40ba57be6f 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -384,4 +384,11 @@
 # endif
 #endif /* EFSYS_OPT_PCI */
 
+/* Support extended width event queues */
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+# if !EFSYS_OPT_RIVERHEAD
+#  error "EV_EXTENDED_WIDTH requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index de1c1c38e3..f74b703cda 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -142,6 +142,7 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_FILTER 1
 #define EFSYS_OPT_RX_SCATTER 0
 
+#define EFSYS_OPT_EV_EXTENDED_WIDTH 0
 #define EFSYS_OPT_EV_PREFETCH 0
 
 #define EFSYS_OPT_DECODE_INTR_FATAL 0
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 55/60] common/sfc_efx/base: add 256bit type
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (53 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
                   ` (7 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 requires support for extended-width event descriptors
for use with descriptor proxy queues. Extend libefx types
used for hardware access (and endian conversion) to support
a 256bit data type.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_types.h | 580 +++++++++++++++++++++++-
 1 file changed, 571 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ab35e61b84..f7ec9a7378 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -19,16 +19,16 @@ extern "C" {
 /*
  * Bitfield access
  *
- * Solarflare NICs make extensive use of bitfields up to 128 bits
- * wide.  Since there is no native 128-bit datatype on most systems,
+ * Solarflare NICs make extensive use of bitfields up to 256 bits
+ * wide.  Since there is no native 256-bit datatype on most systems,
  * and since 64-bit datatypes are inefficient on 32-bit systems and
  * vice versa, we wrap accesses in a way that uses the most efficient
  * datatype.
  *
  * The NICs are PCI devices and therefore little-endian.  Since most
  * of the quantities that we deal with are DMAed to/from host memory,
- * we define	our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
- * to be little-endian.
+ * we define our datatypes (efx_xword_t, efx_oword_t, efx_qword_t and
+ * efx_dword_t) to be little-endian.
  *
  * In the less common case of using PIO for individual register
  * writes, we construct the little-endian datatype in host memory and
@@ -93,10 +93,22 @@ extern "C" {
 #define	EFX_DWORD_3_LBN 96
 #define	EFX_DWORD_3_WIDTH 32
 
+#define	EFX_DWORD_4_LBN 128
+#define	EFX_DWORD_4_WIDTH 32
+
+#define	EFX_DWORD_5_LBN 160
+#define	EFX_DWORD_5_WIDTH 32
+
+#define	EFX_DWORD_6_LBN 192
+#define	EFX_DWORD_6_WIDTH 32
+
+#define	EFX_DWORD_7_LBN 224
+#define	EFX_DWORD_7_WIDTH 32
+
 /*
- * There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
- * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
- * support field widths larger than 32 bits.
+ * There are intentionally no EFX_QWORD_<N> field definitions here as the
+ * implementation of EFX_QWORD_FIELD, EFX_OWORD_FIELD and EFX_XWORD_FIELD
+ * do not support field widths larger than 32 bits.
  */
 
 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
@@ -220,6 +232,28 @@ typedef union efx_oword_u {
 	uint8_t eo_u8[16];
 } efx_oword_t;
 
+/*
+ * A hexaword (i.e. 256-bit) datatype
+ *
+ * This datatype is defined to be little-endian.
+ */
+typedef union efx_xword_u {
+	efx_byte_t ex_byte[32];
+	efx_word_t ex_word[16];
+	efx_dword_t ex_dword[8];
+	efx_qword_t ex_qword[4];
+	efx_oword_t ex_oword[2];
+#if EFSYS_HAS_SSE2_M128
+	__m128i ex_u128[2];
+#endif
+#if EFSYS_HAS_UINT64
+	uint64_t ex_u64[4];
+#endif
+	uint32_t ex_u32[8];
+	uint16_t ex_u16[16];
+	uint8_t ex_u8[32];
+} efx_xword_t;
+
 #pragma pack()
 
 #define	__SWAP16(_x)				\
@@ -295,6 +329,9 @@ typedef union efx_oword_u {
 /* Format string for printing an efx_oword_t */
 #define	EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
 
+/* Format string for printing an efx_xword_t */
+#define	EFX_XWORD_FMT "0x%08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x"
+
 /* Parameters for printing an efx_byte_t */
 #define	EFX_BYTE_VAL(_byte)					\
 	((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
@@ -319,6 +356,17 @@ typedef union efx_oword_u {
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])),	\
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
 
+/* Parameters for printing an efx_xword_t */
+#define	EFX_XWORD_VAL(_xword)					\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[7])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[6])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[5])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[4])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[3])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[2])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[1])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[0]))
+
 /*
  * Stop lint complaining about some shifts.
  */
@@ -389,6 +437,34 @@ extern int fix_lint;
 #define	EFX_EXTRACT8(_element, _min, _max, _low, _high)			\
 	EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
 
+#define	EFX_EXTRACT_XWORD64(_xword, _low, _high)			\
+	(EFX_EXTRACT64((_xword).ex_u64[0], FIX_LINT(0), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[1], FIX_LINT(64), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[2], FIX_LINT(128), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[3], FIX_LINT(192), FIX_LINT(255),	\
+	    _low, _high))
+
+#define	EFX_EXTRACT_XWORD32(_oword, _low, _high)			\
+	(EFX_EXTRACT32((_xword).ex_u32[0], FIX_LINT(0), FIX_LINT(31),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[1], FIX_LINT(32), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[2], FIX_LINT(64), FIX_LINT(95),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[3], FIX_LINT(96), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[4], FIX_LINT(128), FIX_LINT(159),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[5], FIX_LINT(160), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[6], FIX_LINT(192), FIX_LINT(223),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[7], FIX_LINT(224), FIX_LINT(255),	\
+	    _low, _high))
+
 #define	EFX_EXTRACT_OWORD64(_oword, _low, _high)			\
 	(EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63),	\
 	    _low, _high) |						\
@@ -428,6 +504,14 @@ extern int fix_lint;
 	    _low, _high))
 
 
+#define	EFX_XWORD_FIELD64(_xword, _field)				\
+	((uint32_t)EFX_EXTRACT_XWORD64(_xword, EFX_LOW_BIT(_field),	\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
+#define	EFX_XWORD_FIELD32(_xword, _field)				\
+	(EFX_EXTRACT_XWORD32(_xword, EFX_LOW_BIT(_field),		\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
 #define	EFX_OWORD_FIELD64(_oword, _field)				\
 	((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field),	\
 	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
@@ -457,6 +541,22 @@ extern int fix_lint;
 	    EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
 
 
+#define	EFX_XWORD_IS_EQUAL64(_xword_a, _xword_b)			\
+	((_xword_a).ex_u64[0] == (_xword_b).ex_u64[0] &&		\
+	    (_xword_a).ex_u64[1] == (_xword_b).ex_u64[1] &&		\
+	    (_xword_a).ex_u64[2] == (_xword_b).ex_u64[2] &&		\
+	    (_xword_a).ex_u64[3] == (_xword_b).ex_u64[3])
+
+#define	EFX_XWORD_IS_EQUAL32(_xword_a, _xword_b)			\
+	((_xword_a).ex_u32[0] == (_xword_b).ex_u32[0] &&		\
+	    (_xword_a).ex_u32[1] == (_xword_b).ex_u32[1] &&		\
+	    (_xword_a).ex_u32[2] == (_xword_b).ex_u32[2] &&		\
+	    (_xword_a).ex_u32[3] == (_xword_b).ex_u32[3] &&		\
+	    (_xword_a).ex_u32[4] == (_xword_b).ex_u32[4] &&		\
+	    (_xword_a).ex_u32[5] == (_xword_b).ex_u32[5] &&		\
+	    (_xword_a).ex_u32[6] == (_xword_b).ex_u32[6] &&		\
+	    (_xword_a).ex_u32[7] == (_xword_b).ex_u32[7])
+
 #define	EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b)			\
 	((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] &&		\
 	    (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
@@ -484,6 +584,22 @@ extern int fix_lint;
 	((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
 
 
+#define	EFX_XWORD_IS_ZERO64(_xword)					\
+	(((_xword).ex_u64[0] |						\
+	    (_xword).ex_u64[1] |					\
+	    (_xword).ex_u64[2] |					\
+	    (_xword).ex_u64[3]) == 0)
+
+#define	EFX_XWORD_IS_ZERO32(_xword)					\
+	(((_xword).ex_u32[0] |						\
+	    (_xword).ex_u32[1] |					\
+	    (_xword).ex_u32[2] |					\
+	    (_xword).ex_u32[3] |					\
+	    (_xword).ex_u32[4] |					\
+	    (_xword).ex_u32[5] |					\
+	    (_xword).ex_u32[6] |					\
+	    (_xword).ex_u32[7]) == 0)
+
 #define	EFX_OWORD_IS_ZERO64(_oword)					\
 	(((_oword).eo_u64[0] |						\
 	    (_oword).eo_u64[1]) == 0)
@@ -511,6 +627,22 @@ extern int fix_lint;
 	(((_byte).eb_u8[0]) == 0)
 
 
+#define	EFX_XWORD_IS_SET64(_xword)					\
+	(((_xword).ex_u64[0] &						\
+	    (_xword).ex_u64[1] &					\
+	    (_xword).ex_u64[2] &					\
+	    (_xword).ex_u64[3]) == ~((uint64_t)0))
+
+#define	EFX_XWORD_IS_SET32(_xword)					\
+	(((_xword).ex_u32[0] &						\
+	    (_xword).ex_u32[1] &					\
+	    (_xword).ex_u32[2] &					\
+	    (_xword).ex_u32[3] &					\
+	    (_xword).ex_u32[4] &					\
+	    (_xword).ex_u32[5] &					\
+	    (_xword).ex_u32[6] &					\
+	    (_xword).ex_u32[7]) == ~((uint32_t)0))
+
 #define	EFX_OWORD_IS_SET64(_oword)					\
 	(((_oword).eo_u64[0] &						\
 	    (_oword).eo_u64[1]) == ~((uint64_t)0))
@@ -668,6 +800,108 @@ extern int fix_lint;
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) |	\
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
 
+#define	EFX_POPULATE_XWORD64(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = EFX_INSERT_FIELDS64(0, 63,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = EFX_INSERT_FIELDS64(64, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = EFX_INSERT_FIELDS64(128, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = EFX_INSERT_FIELDS64(192, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_POPULATE_XWORD32(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = EFX_INSERT_FIELDS32(32, 63,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = EFX_INSERT_FIELDS32(64, 95,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = EFX_INSERT_FIELDS32(96, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = EFX_INSERT_FIELDS32(128, 159,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = EFX_INSERT_FIELDS32(160, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = EFX_INSERT_FIELDS32(192, 223,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = EFX_INSERT_FIELDS32(224, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_POPULATE_OWORD64(_oword,					\
 	    _field1, _value1, _field2, _value2, _field3, _value3,	\
 	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
@@ -815,6 +1049,82 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/* Populate a hexaword field with various numbers of arguments */
+#define	EFX_POPULATE_XWORD_10 EFX_POPULATE_XWORD
+
+#define	EFX_POPULATE_XWORD_9(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
+	EFX_POPULATE_XWORD_10(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)
+
+#define	EFX_POPULATE_XWORD_8(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)				\
+	EFX_POPULATE_XWORD_9(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)
+
+#define	EFX_POPULATE_XWORD_7(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)						\
+	EFX_POPULATE_XWORD_8(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)
+
+#define	EFX_POPULATE_XWORD_6(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
+	EFX_POPULATE_XWORD_7(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)
+
+#define	EFX_POPULATE_XWORD_5(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)				\
+	EFX_POPULATE_XWORD_6(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)
+
+#define	EFX_POPULATE_XWORD_4(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)						\
+	EFX_POPULATE_XWORD_5(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)
+
+#define	EFX_POPULATE_XWORD_3(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3)	\
+	EFX_POPULATE_XWORD_4(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3)
+
+#define	EFX_POPULATE_XWORD_2(_xword,					\
+	    _field1, _value1, _field2, _value2)				\
+	EFX_POPULATE_XWORD_3(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2)
+
+#define	EFX_POPULATE_XWORD_1(_xword,					\
+	    _field1, _value1)						\
+	EFX_POPULATE_XWORD_2(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1)
+
+#define	EFX_ZERO_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_1(_xword, EFX_DUMMY_FIELD, 0)
+
+#define	EFX_SET_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_8(_xword,					\
+	    EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff,		\
+	    EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff,		\
+	    EFX_DWORD_4, 0xffffffff, EFX_DWORD_5, 0xffffffff,		\
+	    EFX_DWORD_6, 0xffffffff, EFX_DWORD_7, 0xffffffff)
+
 /* Populate an octword field with various numbers of arguments */
 #define	EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
 
@@ -1210,6 +1520,64 @@ extern int fix_lint;
 #define	EFX_INPLACE_MASK8(_min, _max, _field)				\
 	EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
 
+#define	EFX_SET_XWORD_FIELD64(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = (((_xword).ex_u64[0] &		\
+		    ~EFX_INPLACE_MASK64(0, 63, _field)) |		\
+		    EFX_INSERT_FIELD64(0, 63, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = (((_xword).ex_u64[1] &		\
+		    ~EFX_INPLACE_MASK64(64, 127, _field)) |		\
+		    EFX_INSERT_FIELD64(64, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = (((_xword).ex_u64[2] &		\
+		    ~EFX_INPLACE_MASK64(128, 191, _field)) |		\
+		    EFX_INSERT_FIELD64(128, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = (((_xword).ex_u64[3] &		\
+		    ~EFX_INPLACE_MASK64(192, 255, _field)) |		\
+		    EFX_INSERT_FIELD64(192, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_FIELD32(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = (((_xword).ex_u32[0] &		\
+		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
+		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = (((_xword).ex_u32[1] &		\
+		    ~EFX_INPLACE_MASK32(32, 63, _field)) |		\
+		    EFX_INSERT_FIELD32(32, 63, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = (((_xword).ex_u32[2] &		\
+		    ~EFX_INPLACE_MASK32(64, 95, _field)) |		\
+		    EFX_INSERT_FIELD32(64, 95, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = (((_xword).ex_u32[3] &		\
+		    ~EFX_INPLACE_MASK32(96, 127, _field)) |		\
+		    EFX_INSERT_FIELD32(96, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = (((_xword).ex_u32[4] &		\
+		    ~EFX_INPLACE_MASK32(128, 159, _field)) |		\
+		    EFX_INSERT_FIELD32(128, 159, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = (((_xword).ex_u32[5] &		\
+		    ~EFX_INPLACE_MASK32(160, 191, _field)) |		\
+		    EFX_INSERT_FIELD32(160, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = (((_xword).ex_u32[6] &		\
+		    ~EFX_INPLACE_MASK32(192, 223, _field)) |		\
+		    EFX_INSERT_FIELD32(192, 223, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = (((_xword).ex_u32[7] &		\
+		    ~EFX_INPLACE_MASK32(224, 255, _field)) |		\
+		    EFX_INSERT_FIELD32(224, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_SET_OWORD_FIELD64(_oword, _field, _value)			\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1317,6 +1685,107 @@ extern int fix_lint;
 		(uint8_t)(1 << EFX_SSUB((_bit), (_base))) :		\
 		0U)
 
+#define	EFX_SET_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_TEST_XWORD_BIT64(_xword, _bit)				\
+	(((_xword).ex_u64[0] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u64[1] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u64[2] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u64[3] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)))))
+
+#define	EFX_TEST_XWORD_BIT32(_xword, _bit)				\
+	(((_xword).ex_u32[0] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u32[1] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) ||	\
+	((_xword).ex_u32[2] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u32[3] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))) ||	\
+	((_xword).ex_u32[4] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u32[5] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)))) ||\
+	((_xword).ex_u32[6] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)))) ||\
+	((_xword).ex_u32[7] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)))))
+
+
 #define	EFX_SET_OWORD_BIT64(_oword, _bit)				\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1486,6 +1955,50 @@ extern int fix_lint;
 		    __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
 
 
+#define	EFX_OR_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] |= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] |= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] |= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] |= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_OR_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] |= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] |= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] |= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] |= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] |= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] |= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] |= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] |= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] &= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] &= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] &= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] &= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] &= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] &= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] &= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] &= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] &= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] &= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] &= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] &= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_OR_OWORD64(_oword1, _oword2)				\
 	do {								\
 		(_oword1).eo_u64[0] |= (_oword2).eo_u64[0];		\
@@ -1580,53 +2093,102 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+
 #if EFSYS_USE_UINT64
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD64
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD64
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD64
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL64
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL64
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL64
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO64
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO64
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO64
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET64
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET64
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET64
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD64
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD64
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD64
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD64
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD64
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD64
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT64
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT64
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT64
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT64
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT64
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT64
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT64
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT64
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT64
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD64
+#define	EFX_AND_XWORD		EFX_AND_XWORD64
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD64
 #define	EFX_AND_OWORD		EFX_AND_OWORD64
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD64
 #define	EFX_AND_QWORD		EFX_AND_QWORD64
-#else
+
+#else /* EFSYS_USE_UINT64 */
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD32
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD32
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD32
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL32
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL32
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL32
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO32
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO32
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO32
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET32
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET32
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET32
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD32
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD32
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD32
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD32
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD32
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD32
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT32
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT32
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT32
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT32
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT32
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT32
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT32
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT32
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT32
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD32
+#define	EFX_AND_XWORD		EFX_AND_XWORD32
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD32
 #define	EFX_AND_OWORD		EFX_AND_OWORD32
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD32
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
-#endif
+
+#endif /* EFSYS_USE_UINT64 */
 
 
 #ifdef	__cplusplus
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 56/60] common/sfc_efx/base: support creation of extended width EvQ
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (54 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
                   ` (6 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Add a flag to request an extended width event queue, and
check that the supplied buffer is large enough to hold the
event queue descriptors.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c    |  2 +
 drivers/common/sfc_efx/base/ef10_nic.c   | 18 +++++++-
 drivers/common/sfc_efx/base/efx.h        | 12 +++++-
 drivers/common/sfc_efx/base/efx_ev.c     | 53 ++++++++++++++++++++----
 drivers/common/sfc_efx/base/efx_mcdi.c   | 20 +++++++--
 drivers/common/sfc_efx/base/rhead_ev.c   | 19 ++++++++-
 drivers/common/sfc_efx/base/rhead_impl.h |  4 ++
 drivers/common/sfc_efx/base/rhead_nic.c  |  6 +++
 drivers/net/sfc/sfc_ev.c                 |  6 +--
 9 files changed, 120 insertions(+), 20 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index aec1c468a4..8e7cc27d63 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -127,6 +127,8 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 7a11930242..81cd436424 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1043,14 +1043,14 @@ ef10_get_datapath_caps(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_CAPABILITIES_IN_LEN,
-		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
+		MC_CMD_GET_CAPABILITIES_V7_OUT_LEN);
 	efx_rc_t rc;
 
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V5_OUT_LEN;
+	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V7_OUT_LEN;
 
 	efx_mcdi_execute_quiet(enp, &req);
 
@@ -1073,6 +1073,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
+#define	CAP_FLAGS3(_req, _flag)						\
+	(((_req).emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V7_OUT_LEN) && \
+	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V7_OUT_FLAGS3) &	\
+	    (1u << (MC_CMD_GET_CAPABILITIES_V7_OUT_ ## _flag ## _LBN))))
+
 	/* Check if RXDP firmware inserts 14 byte prefix */
 	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
 		encp->enc_rx_prefix_size = 14;
@@ -1202,6 +1207,15 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_init_evq_v2_supported = B_FALSE;
 
+	/*
+	 * Check if firmware supports extended width event queues, which have
+	 * a different event descriptor layout.
+	 */
+	if (CAP_FLAGS3(req, EXTENDED_WIDTH_EVQS_SUPPORTED))
+		encp->enc_init_evq_extended_width_supported = B_TRUE;
+	else
+		encp->enc_init_evq_extended_width_supported = B_FALSE;
+
 	/*
 	 * Check if the NO_CONT_EV mode for RX events is supported.
 	 */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 67438b59e6..eea2ce3594 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1456,6 +1456,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_evq_timer_quantum_ns;
 	uint32_t		enc_evq_timer_max_us;
 	uint32_t		enc_clk_mult;
+	uint32_t		enc_ev_ew_desc_size;
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
@@ -1557,6 +1558,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_allow_set_mac_with_installed_filters;
 	boolean_t		enc_enhanced_set_mac_supported;
 	boolean_t		enc_init_evq_v2_supported;
+	boolean_t		enc_init_evq_extended_width_supported;
 	boolean_t		enc_no_cont_ev_mode_supported;
 	boolean_t		enc_init_rxq_with_buffer_size;
 	boolean_t		enc_rx_packed_stream_supported;
@@ -2264,13 +2266,15 @@ LIBEFX_API
 extern	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 LIBEFX_API
 extern	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 #define	EFX_EVQ_FLAGS_TYPE_MASK		(0x3)
 #define	EFX_EVQ_FLAGS_TYPE_AUTO		(0x0)
@@ -2291,6 +2295,10 @@ efx_evq_nbufs(
  */
 #define	EFX_EVQ_FLAGS_NO_CONT_EV	(0x10)
 
+/* Configure EVQ for extended width events (EF100 only) */
+#define	EFX_EVQ_FLAGS_EXTENDED_WIDTH	(0x20)
+
+
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_ev_qcreate(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 99a7743edb..32e7fff3af 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -201,19 +201,35 @@ efx_ev_init(
 	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 
-	return (ndescs * encp->enc_ev_desc_size);
+	desc_size = encp->enc_ev_desc_size;
+
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#else
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+#endif
+
+	return (ndescs * desc_size);
 }
 
 	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
-	return (EFX_DIV_ROUND_UP(efx_evq_size(enp, ndescs), EFX_BUF_SIZE));
+	size_t size;
+
+	size = efx_evq_size(enp, ndescs, flags);
+
+	return (EFX_DIV_ROUND_UP(size, EFX_BUF_SIZE));
 }
 
 		void
@@ -282,6 +298,13 @@ efx_ev_qcreate(
 		goto fail4;
 	}
 
+	if ((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) &&
+	    (encp->enc_ev_ew_desc_size == 0)) {
+		/* Extended width event descriptors are not supported. */
+		rc = EINVAL;
+		goto fail5;
+	}
+
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
 	EFSYS_ASSERT(ISP2(encp->enc_evq_min_nevs));
 
@@ -289,14 +312,20 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail5;
+		goto fail6;
+	}
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * encp->enc_ev_desc_size)) {
+		/* Buffer too small for event queue descriptors. */
+		rc = EINVAL;
+		goto fail7;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail6;
+		goto fail8;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -319,16 +348,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail7;
+		goto fail9;
 
 	return (0);
 
-fail7:
-	EFSYS_PROBE(fail7);
+fail9:
+	EFSYS_PROBE(fail9);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
 fail6:
 	EFSYS_PROBE(fail6);
 fail5:
@@ -1255,6 +1288,8 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index b8e45b458d..ede052a26a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2475,6 +2475,7 @@ efx_mcdi_init_evq(
 		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
+	int ev_extended_width;
 	int ev_cut_through;
 	int ev_merge;
 	unsigned int evq_type;
@@ -2484,7 +2485,7 @@ efx_mcdi_init_evq(
 	int i;
 	efx_rc_t rc;
 
-	npages = efx_evq_nbufs(enp, nevs);
+	npages = efx_evq_nbufs(enp, nevs, flags);
 	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
@@ -2558,14 +2559,27 @@ efx_mcdi_init_evq(
 		}
 	}
 
-	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
+	/*
+	 * On EF100, extended width event queues have a different event
+	 * descriptor layout and are used to support descriptor proxy queues.
+	 */
+	ev_extended_width = 0;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (encp->enc_init_evq_extended_width_supported) {
+		if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+			ev_extended_width = 1;
+	}
+#endif
+
+	MCDI_IN_POPULATE_DWORD_8(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
 	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
 	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type,
+	    INIT_EVQ_V2_IN_FLAG_EXT_WIDTH, ev_extended_width);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 9b2e758f53..49d7c3f69d 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -66,11 +66,26 @@ rhead_ev_qcreate(
 	__in		uint32_t flags,
 	__in		efx_evq_t *eep)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 	uint32_t irq;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	desc_size = encp->enc_ev_desc_size;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#endif
+	EFSYS_ASSERT(desc_size != 0);
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * desc_size)) {
+		/* Buffer too small for event queue descriptors */
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= rhead_ev_tx_completion;
@@ -98,10 +113,12 @@ rhead_ev_qcreate(
 	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 	    B_FALSE);
 	if (rc != 0)
-		goto fail1;
+		goto fail2;
 
 	return (0);
 
+fail2:
+	EFSYS_PROBE(fail2);
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index e9d3d76ae4..023d98ac87 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -32,6 +32,10 @@ extern "C" {
 #define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
 #define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+#define	RHEAD_EVQ_EW_DESC_SIZE	(sizeof (efx_xword_t))
+#endif
+
 
 /* NIC */
 
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index dbb067d563..c55e20cb4c 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -129,6 +129,12 @@ rhead_board_cfg(
 	encp->enc_evq_timer_quantum_ns = 0;
 	encp->enc_evq_timer_max_us = 0;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	encp->enc_ev_ew_desc_size = RHEAD_EVQ_EW_DESC_SIZE;
+#else
+	encp->enc_ev_ew_desc_size = 0;
+#endif
+
 	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
 	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
 	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 7e5676fa45..cc7d5d1179 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -600,7 +600,7 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 
 	/* Clear all events */
 	(void)memset((void *)esmp->esm_base, 0xff,
-		     efx_evq_size(sa->nic, evq->entries));
+		     efx_evq_size(sa->nic, evq->entries, evq_flags));
 
 	if ((sa->intr.lsc_intr && hw_index == sa->mgmt_evq_index) ||
 	    (sa->intr.rxq_intr && evq->dp_rxq != NULL))
@@ -833,8 +833,8 @@ sfc_ev_qinit(struct sfc_adapter *sa,
 
 	/* Allocate DMA space */
 	rc = sfc_dma_alloc(sa, sfc_evq_type2str(type), type_index,
-			   efx_evq_size(sa->nic, evq->entries), socket_id,
-			   &evq->mem);
+			   efx_evq_size(sa->nic, evq->entries, sa->evq_flags),
+			   socket_id, &evq->mem);
 	if (rc != 0)
 		goto fail_dma_alloc;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 57/60] common/sfc_efx/base: poll extended width event queues
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (55 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
                   ` (5 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Extended width queues use a different layout and so require
a different polling loop.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 155 ++++++++++++++++++++++++-
 1 file changed, 154 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 49d7c3f69d..0458104c64 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -30,7 +30,6 @@ rhead_ev_tx_completion(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
@@ -38,6 +37,22 @@ rhead_ev_mcdi(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 
 	__checkReturn	efx_rc_t
 rhead_ev_init(
@@ -200,6 +215,13 @@ rhead_ev_qpoll(
 	unsigned int index;
 	size_t offset;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) {
+		rhead_ev_ew_qpoll(eep, countp, eecp, arg);
+		return;
+	}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
 	EFSYS_ASSERT(countp != NULL);
 	EFSYS_ASSERT(eecp != NULL);
@@ -285,6 +307,137 @@ rhead_ev_qpoll(
 	*countp = count;
 }
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+
+	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
+	switch (code) {
+	default:
+		/* Omit currently unused reserved bits from the probe. */
+		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_7),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_4),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_3),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_2),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+	}
+
+	return (should_abort);
+}
+
+/*
+ * Poll extended width event queue. Size of the batch is equal to cache line
+ * size divided by event size.
+ */
+#define	EF100_EV_EW_BATCH	2
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_EW_PRESENT(_xword, _phase_bit)				\
+	(EFX_XWORD_FIELD((_xword), ESF_GZ_EV_256_EV32_PHASE) == (_phase_bit))
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_xword_t ev[EF100_EV_EW_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_EW_BATCH - (count & (EF100_EV_EW_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_xword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READX(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_EW_PRESENT(ev[total], phase_bit))
+				break;
+
+			/* Omit unused reserved bits from the probe. */
+			EFSYS_PROBE7(ew_event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_7),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_4),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_3),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_2),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_xword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			should_abort =
+			    rhead_ev_ew_dispatch(eep, &(ev[index]), eecp, arg);
+
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_EW_BATCH);
+				batch += (EF100_EV_EW_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_qmoderate(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 58/60] common/sfc_efx/base: handle normal events in extended width
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (56 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
                   ` (4 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Process the encasulated events as for the normal event loop. The phase
bit in the encapsulated event should be ignored, as the polling loop
uses the phase bit from the extended-width event.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 79 +++++++++++++++++---------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 0458104c64..2ee6d9ce17 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static			boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 static	__checkReturn	boolean_t
 rhead_ev_rx_packets(
 	__in		efx_evq_t *eep,
@@ -181,6 +188,41 @@ rhead_ev_qpost(
 	EFSYS_ASSERT(B_FALSE);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	code = EFX_QWORD_FIELD(*eventp, ESF_GZ_E_TYPE);
+	switch (code) {
+	case ESE_GZ_EF100_EV_RX_PKTS:
+		should_abort = eep->ee_rx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_TX_COMPLETION:
+		should_abort = eep->ee_tx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_MCDI:
+		should_abort = eep->ee_mcdi(eep, eventp, eecp, arg);
+		break;
+	default:
+		EFSYS_PROBE3(bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+		break;
+	}
+
+	return (should_abort);
+}
+
 /*
  * Poll event queue in batches. Size of the batch is equal to cache line
  * size divided by event size.
@@ -248,37 +290,12 @@ rhead_ev_qpoll(
 		/* Process the batch of events */
 		for (index = 0; index < total; ++index) {
 			boolean_t should_abort;
-			uint32_t code;
 
 			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
-			switch (code) {
-			case ESE_GZ_EF100_EV_RX_PKTS:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_TX_COMPLETION:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_MCDI:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
+			should_abort =
+			    rhead_ev_dispatch(eep, &(ev[index]), eecp, arg);
+
 			if (should_abort) {
 				/* Ignore subsequent events */
 				total = index + 1;
@@ -322,6 +339,12 @@ rhead_ev_ew_dispatch(
 
 	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
 	switch (code) {
+	case ESE_GZ_EF100_EVEW_64BIT:
+		/* NOTE: ignore phase bit in encapsulated 64bit event. */
+		should_abort =
+		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
+		break;
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 59/60] common/sfc_efx/base: add option for descriptor proxy queues
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (57 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
                   ` (3 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses descriptor proxy queues to support virtio-blk proxy.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 10 ++++++++++
 drivers/common/sfc_efx/efsys.h          |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 40ba57be6f..8f42d87a04 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -391,4 +391,14 @@
 # endif
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
+/* Support descriptor proxy queues */
+#if EFSYS_OPT_DESC_PROXY
+# if !EFSYS_OPT_RIVERHEAD
+#  error "DESC_PROXY requires RIVERHEAD"
+# endif
+# if !EFSYS_OPT_EV_EXTENDED_WIDTH
+#  error "DESC_PROXY requires EV_EXTENDED_WIDTH"
+# endif
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index f74b703cda..9ad7c82b86 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -165,6 +165,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_PCI 0
 
+#define EFSYS_OPT_DESC_PROXY 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH 60/60] common/sfc_efx/base: handle descriptor proxy queue events
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (58 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
@ 2020-09-22  8:49 ` Andrew Rybchenko
  2020-09-22  9:20 ` [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (2 subsequent siblings)
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  8:49 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

The TXQ_DESC and VIRTQ_DESC events are used to pass host descriptors
over an extended width event queue to an application processor for
handling. See SF-122927-TC and SF-122966-SW for details.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx.h      | 32 +++++++++
 drivers/common/sfc_efx/base/efx_impl.h | 10 +++
 drivers/common/sfc_efx/base/rhead_ev.c | 95 ++++++++++++++++++++++++++
 3 files changed, 137 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index eea2ce3594..4278b4d66d 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2487,6 +2487,33 @@ typedef __checkReturn	boolean_t
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_DESC_PROXY
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_txq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		efx_oword_t txq_desc);
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_virtq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		uint16_t avail,
+	__in		efx_oword_t virtq_desc);
+
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
@@ -2511,6 +2538,11 @@ typedef struct efx_ev_callbacks_s {
 #if EFSYS_OPT_MAC_STATS
 	efx_mac_stats_ev_t		eec_mac_stats;
 #endif	/* EFSYS_OPT_MAC_STATS */
+#if EFSYS_OPT_DESC_PROXY
+	efx_desc_proxy_txq_desc_ev_t	eec_desc_proxy_txq_desc;
+	efx_desc_proxy_virtq_desc_ev_t	eec_desc_proxy_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 } efx_ev_callbacks_t;
 
 LIBEFX_API
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f58586bee0..196fd4a79c 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -902,6 +902,11 @@ struct efx_nic_s {
 typedef	boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *,
     const efx_ev_callbacks_t *, void *);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+typedef	boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *,
+    const efx_ev_callbacks_t *, void *);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 typedef struct efx_evq_rxq_state_s {
 	unsigned int			eers_rx_read_ptr;
 	unsigned int			eers_rx_mask;
@@ -934,6 +939,11 @@ struct efx_evq_s {
 	efx_ev_handler_t		ee_mcdi;
 #endif	/* EFSYS_OPT_MCDI */
 
+#if EFSYS_OPT_DESC_PROXY
+	efx_ev_ew_handler_t		ee_ew_txq_desc;
+	efx_ev_ew_handler_t		ee_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	efx_evq_rxq_state_t		ee_rxq_state[EFX_EV_RX_NLABELS];
 };
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 2ee6d9ce17..a871206097 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -58,6 +58,22 @@ rhead_ev_ew_qpoll(
 	__inout		unsigned int *countp,
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_DESC_PROXY */
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
 
@@ -115,6 +131,11 @@ rhead_ev_qcreate(
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
 
+#if EFSYS_OPT_DESC_PROXY
+	eep->ee_ew_txq_desc	= rhead_ev_ew_txq_desc;
+	eep->ee_ew_virtq_desc	= rhead_ev_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
 	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
@@ -345,6 +366,16 @@ rhead_ev_ew_dispatch(
 		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
 		break;
 
+#if EFSYS_OPT_DESC_PROXY
+	case ESE_GZ_EF100_EVEW_TXQ_DESC:
+		should_abort = eep->ee_ew_txq_desc(eep, eventp, eecp, arg);
+		break;
+
+	case ESE_GZ_EF100_EVEW_VIRTQ_DESC:
+		should_abort = eep->ee_ew_virtq_desc(eep, eventp, eecp, arg);
+		break;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
@@ -589,4 +620,68 @@ rhead_ev_mcdi(
 	return (ret);
 }
 
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t txq_desc;
+	uint16_t vi_id;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_TXQ_DP_VI_ID);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	txq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_txq_desc != NULL);
+	should_abort = eecp->eec_desc_proxy_txq_desc(arg, vi_id, txq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t virtq_desc;
+	uint16_t vi_id;
+	uint16_t avail;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_VI_ID);
+	avail = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_AVAIL_ENTRY);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	virtq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_virtq_desc != NULL);
+	should_abort =
+	    eecp->eec_desc_proxy_virtq_desc(arg, vi_id, avail, virtq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (59 preceding siblings ...)
  2020-09-22  8:49 ` [dpdk-dev] [PATCH 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
@ 2020-09-22  9:20 ` Andrew Rybchenko
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
  62 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:20 UTC (permalink / raw)
  To: dev

On 9/22/20 11:48 AM, Andrew Rybchenko wrote:
> Riverhead is a new NIC family, the first one with EF100 architecture.
> Control interface is an MCDI similar to EF10. Datapath interface is
> completely new.
> 
> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
> enabled.
> 
> EF10-based NICs are tested with the patch series applied with and
> without EFSYS_OPT_RIVERHEAD enabled.
> 
> net/sfc patches will follow.

Self NACK, I'll send v2 to fix spelling and code style in few places.

^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (60 preceding siblings ...)
  2020-09-22  9:20 ` [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
@ 2020-09-22  9:33 ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
                     ` (60 more replies)
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
  62 siblings, 61 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Riverhead is a new NIC family, the first one with EF100 architecture.
Control interface is an MCDI similar to EF10. Datapath interface is
completely new.

The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
enabled.

EF10-based NICs are tested with the patch series applied with and
without EFSYS_OPT_RIVERHEAD enabled.

net/sfc patches will follow.

v2:
 - fix spelling in few patches
 - use tabs to indent instead of spaces

Andrew Rybchenko (41):
  common/sfc_efx/base: add EF100 registers definitions
  common/sfc_efx/base: update MCDI headers
  common/sfc_efx/base: add event queue operation to do polling
  common/sfc_efx/base: add efsys option for Riverhead
  common/sfc_efx/base: add Riverhead NIC family
  common/sfc_efx/base: update registers check for Riverhead
  common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  common/sfc_efx/base: use EF10 PHY methods for Riverhead
  common/sfc_efx/base: move 14b prefix check out of caps get
  common/sfc_efx/base: remove PF count get from caps get
  common/sfc_efx/base: factor out helper to get board config
  common/sfc_efx/base: set NIC features in generic place
  common/sfc_efx/base: factor out MCDI entity reset helper
  common/sfc_efx/base: add Riverhead support to NIC module
  common/sfc_efx/base: use dummy tunnel ops for Riverhead
  common/sfc_efx/base: use EF10 filter methods for Riverhead
  common/sfc_efx/base: use EF10 MAC methods for Riverhead
  common/sfc_efx/base: add interrupts module for Riverhead
  common/sfc_efx/base: move EvQ init/fini wrappers to generic
  common/sfc_efx/base: move EvQ create generic checks
  common/sfc_efx/base: prepare to merge EvQ init functions
  common/sfc_efx/base: merge versions of init EvQ wrappers
  common/sfc_efx/base: add event queue module for Riverhead
  common/sfc_efx/base: handle MCDI events on Riverhead
  common/sfc_efx/base: move RxQ init/fini wrappers to generic
  common/sfc_efx/base: move TxQ init/fini wrappers to generic
  common/sfc_efx/base: switch TxQ init to extended version
  common/sfc_efx/base: maintain RxQ counter in generic code
  common/sfc_efx/base: free Rx queue structure in generic code
  common/sfc_efx/base: move Rx index check to generic code
  common/sfc_efx/base: implement Rx control path for Riverhead
  common/sfc_efx/base: implement Tx control path for Riverhead
  common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  common/sfc_efx/base: handle Rx events for Riverhead
  common/sfc_efx/base: handle Tx complete on Riverhead
  common/sfc_efx: do not include libefx headers from efsys.h
  common/sfc_efx/base: add API to get Rx prefix information
  common/sfc_efx/base: group RxQ parameters into a structure
  common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  common/sfc_efx/base: use EF10 EVB methods for Riverhead
  common/sfc_efx/base: allocate vAdaptor on Riverhead

Andy Moreton (7):
  common/sfc_efx/base: add option for extended width events
  common/sfc_efx/base: add 256bit type
  common/sfc_efx/base: support creation of extended width EvQ
  common/sfc_efx/base: poll extended width event queues
  common/sfc_efx/base: handle normal events in extended width
  common/sfc_efx/base: add option for descriptor proxy queues
  common/sfc_efx/base: handle descriptor proxy queue events

Igor Romanov (9):
  common/sfc_efx/base: add function control window concept
  common/sfc_efx/base: add function control window lookup API
  common/sfc_efx/base: add efsys API to find a memory BAR
  common/sfc_efx/base: add Xilinx capabilities table lookup
  common/sfc_efx/base: add NIC magic check on BAR lookup
  common/sfc_efx/base: introduce UDP tunnel destruct operation
  common/sfc_efx/base: introduce states for UDP tunnel entries
  common/sfc_efx/base: support UDP tunnel operations for EF100
  common/sfc_efx/base: replace PCI efsys macros with functions

Ivan Malov (3):
  common/sfc_efx/base: complete EvQ creation on Riverhead
  common/sfc_efx/base: indicate support for TSO version 3
  common/sfc_efx/base: report restrictions for TSO version 3

 drivers/common/sfc_efx/base/ef10_ev.c         |  391 +-
 drivers/common/sfc_efx/base/ef10_evb.c        |    8 +-
 drivers/common/sfc_efx/base/ef10_filter.c     |   24 +-
 drivers/common/sfc_efx/base/ef10_impl.h       |   38 +
 drivers/common/sfc_efx/base/ef10_mac.c        |    6 +-
 drivers/common/sfc_efx/base/ef10_mcdi.c       |   55 +-
 drivers/common/sfc_efx/base/ef10_nic.c        |  413 +-
 drivers/common/sfc_efx/base/ef10_phy.c        |    4 +-
 drivers/common/sfc_efx/base/ef10_rx.c         |  384 +-
 drivers/common/sfc_efx/base/ef10_tx.c         |  137 +-
 drivers/common/sfc_efx/base/efx.h             |  226 +-
 drivers/common/sfc_efx/base/efx_check.h       |   71 +-
 drivers/common/sfc_efx/base/efx_ev.c          |  456 +-
 drivers/common/sfc_efx/base/efx_evb.c         |   24 +
 drivers/common/sfc_efx/base/efx_filter.c      |   18 +
 drivers/common/sfc_efx/base/efx_impl.h        |  252 +-
 drivers/common/sfc_efx/base/efx_intr.c        |   20 +
 drivers/common/sfc_efx/base/efx_mac.c         |   32 +
 drivers/common/sfc_efx/base/efx_mcdi.c        |  588 +-
 drivers/common/sfc_efx/base/efx_mcdi.h        |   11 +
 drivers/common/sfc_efx/base/efx_nic.c         |  102 +
 drivers/common/sfc_efx/base/efx_pci.c         |  367 ++
 drivers/common/sfc_efx/base/efx_phy.c         |   26 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h  |  934 +++
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5241 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 drivers/common/sfc_efx/base/efx_rx.c          |  112 +-
 drivers/common/sfc_efx/base/efx_tunnel.c      |  342 +-
 drivers/common/sfc_efx/base/efx_tx.c          |   35 +-
 drivers/common/sfc_efx/base/efx_types.h       |  581 +-
 drivers/common/sfc_efx/base/hunt_nic.c        |    6 +
 drivers/common/sfc_efx/base/medford2_nic.c    |    6 +
 drivers/common/sfc_efx/base/medford_nic.c     |    6 +
 drivers/common/sfc_efx/base/meson.build       |   10 +-
 drivers/common/sfc_efx/base/rhead_ev.c        |  687 +++
 drivers/common/sfc_efx/base/rhead_impl.h      |  484 ++
 drivers/common/sfc_efx/base/rhead_intr.c      |  104 +
 drivers/common/sfc_efx/base/rhead_nic.c       |  633 ++
 drivers/common/sfc_efx/base/rhead_pci.c       |  146 +
 drivers/common/sfc_efx/base/rhead_rx.c        |  677 +++
 drivers/common/sfc_efx/base/rhead_tunnel.c    |  343 ++
 drivers/common/sfc_efx/base/rhead_tx.c        |  192 +
 drivers/common/sfc_efx/base/siena_nic.c       |   10 +-
 drivers/common/sfc_efx/efsys.h                |    9 +-
 .../sfc_efx/rte_common_sfc_efx_version.map    |    3 +
 drivers/net/sfc/sfc.c                         |    3 +-
 drivers/net/sfc/sfc_ev.c                      |   18 +-
 48 files changed, 12951 insertions(+), 1487 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 01/60] common/sfc_efx/base: add EF100 registers definitions
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
                     ` (59 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_impl.h       |   1 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h | 934 +++++++++++++++++++
 2 files changed, 935 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d6a31d298..87c7d5df52 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -10,6 +10,7 @@
 #include "efx.h"
 #include "efx_regs.h"
 #include "efx_regs_ef10.h"
+#include "efx_regs_ef100.h"
 #if EFSYS_OPT_MCDI
 #include "efx_mcdi.h"
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_regs_ef100.h b/drivers/common/sfc_efx/base/efx_regs_ef100.h
new file mode 100644
index 0000000000..1842150737
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_regs_ef100.h
@@ -0,0 +1,934 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_EFX_EF100_REGS_H
+#define	_SYS_EFX_EF100_REGS_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/**************************************************************************
+ * NOTE: the line below marks the start of the autogenerated section
+ * EF100 registers and descriptors
+ *
+ **************************************************************************
+ */
+
+/*
+ * HW_REV_ID_REG(32bit):
+ * Hardware revision info register
+ */
+
+#define	ER_GZ_HW_REV_ID_REG_OFST 0x00000000
+/* rhead=rhead_host_regs */
+#define	ER_GZ_HW_REV_ID_REG_RESET 0x0
+
+
+
+
+/*
+ * NIC_REV_ID(32bit):
+ * SoftNIC revision info register
+ */
+
+#define	ER_GZ_NIC_REV_ID_OFST 0x00000004
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_REV_ID_RESET 0x0
+
+
+
+
+/*
+ * NIC_MAGIC(32bit):
+ * Signature register that should contain a well-known value
+ */
+
+#define	ER_GZ_NIC_MAGIC_OFST 0x00000008
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_MAGIC_RESET 0x0
+
+
+#define	ERF_GZ_NIC_MAGIC_LBN 0
+#define	ERF_GZ_NIC_MAGIC_WIDTH 32
+#define	EFE_GZ_NIC_MAGIC_EXPECTED 0xEF100FCB
+
+
+/*
+ * MC_SFT_STATUS(32bit):
+ * MC soft status
+ */
+
+#define	ER_GZ_MC_SFT_STATUS_OFST 0x00000010
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_SFT_STATUS_STEP 4
+#define	ER_GZ_MC_SFT_STATUS_ROWS 2
+#define	ER_GZ_MC_SFT_STATUS_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_LWRD_REG(32bit):
+ * MC doorbell register, low word
+ */
+
+#define	ER_GZ_MC_DB_LWRD_REG_OFST 0x00000020
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_LWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_HWRD_REG(32bit):
+ * MC doorbell register, high word
+ */
+
+#define	ER_GZ_MC_DB_HWRD_REG_OFST 0x00000024
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_HWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * EVQ_INT_PRIME(32bit):
+ * Prime EVQ
+ */
+
+#define	ER_GZ_EVQ_INT_PRIME_OFST 0x00000040
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_INT_PRIME_RESET 0x0
+
+
+#define	ERF_GZ_IDX_LBN 16
+#define	ERF_GZ_IDX_WIDTH 16
+#define	ERF_GZ_EVQ_ID_LBN 0
+#define	ERF_GZ_EVQ_ID_WIDTH 16
+
+
+/*
+ * INT_AGG_RING_PRIME(32bit):
+ * Prime interrupt aggregation ring.
+ */
+
+#define	ER_GZ_INT_AGG_RING_PRIME_OFST 0x00000048
+/* rhead=rhead_host_regs */
+#define	ER_GZ_INT_AGG_RING_PRIME_RESET 0x0
+
+
+/* defined as ERF_GZ_IDX_LBN 16; */
+/* defined as ERF_GZ_IDX_WIDTH 16 */
+#define	ERF_GZ_RING_ID_LBN 0
+#define	ERF_GZ_RING_ID_WIDTH 16
+
+
+/*
+ * EVQ_TMR(32bit):
+ * EVQ timer control
+ */
+
+#define	ER_GZ_EVQ_TMR_OFST 0x00000104
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_TMR_STEP 65536
+#define	ER_GZ_EVQ_TMR_ROWS 1024
+#define	ER_GZ_EVQ_TMR_RESET 0x0
+
+
+
+
+/*
+ * EVQ_UNSOL_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for unsolicited events.
+ */
+
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_OFST 0x00000108
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * EVQ_DESC_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for descriptor proxy events.
+ */
+
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_OFST 0x00000110
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * RX_RING_DOORBELL(32bit):
+ * Ring Rx doorbell.
+ */
+
+#define	ER_GZ_RX_RING_DOORBELL_OFST 0x00000180
+/* rhead=rhead_host_regs */
+#define	ER_GZ_RX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_RX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_RX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_RX_RING_PIDX_LBN 16
+#define	ERF_GZ_RX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_RING_DOORBELL(32bit):
+ * Ring Tx doorbell.
+ */
+
+#define	ER_GZ_TX_RING_DOORBELL_OFST 0x00000200
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_TX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_TX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_TX_RING_PIDX_LBN 16
+#define	ERF_GZ_TX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_DESC_PUSH(128bit):
+ * Tx ring descriptor push. Reserved for future use.
+ */
+
+#define	ER_GZ_TX_DESC_PUSH_OFST 0x00000210
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_DESC_PUSH_STEP 65536
+#define	ER_GZ_TX_DESC_PUSH_ROWS 1024
+#define	ER_GZ_TX_DESC_PUSH_RESET 0x0
+
+
+
+
+/*
+ * THE_TIME(64bit):
+ * NIC hardware time
+ */
+
+#define	ER_GZ_THE_TIME_OFST 0x00000280
+/* rhead=rhead_host_regs */
+#define	ER_GZ_THE_TIME_STEP 65536
+#define	ER_GZ_THE_TIME_ROWS 1024
+#define	ER_GZ_THE_TIME_RESET 0x0
+
+
+#define	ERF_GZ_THE_TIME_SECS_LBN 32
+#define	ERF_GZ_THE_TIME_SECS_WIDTH 32
+#define	ERF_GZ_THE_TIME_NANOS_LBN 2
+#define	ERF_GZ_THE_TIME_NANOS_WIDTH 30
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_LBN 1
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_WIDTH 1
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_LBN 0
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_WIDTH 1
+
+
+/*
+ * PARAMS_TLV_LEN(32bit):
+ * Size of design parameters area in bytes
+ */
+
+#define	ER_GZ_PARAMS_TLV_LEN_OFST 0x00000c00
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_LEN_STEP 65536
+#define	ER_GZ_PARAMS_TLV_LEN_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_LEN_RESET 0x0
+
+
+
+
+/*
+ * PARAMS_TLV(8160bit):
+ * Design parameters
+ */
+
+#define	ER_GZ_PARAMS_TLV_OFST 0x00000c04
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_STEP 65536
+#define	ER_GZ_PARAMS_TLV_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_RESET 0x0
+
+
+
+
+/* ES_EW_EMBEDDED_EVENT */
+#define	ESF_GZ_EV_256_EVENT_DW0_LBN 0
+#define	ESF_GZ_EV_256_EVENT_DW0_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_DW1_LBN 32
+#define	ESF_GZ_EV_256_EVENT_DW1_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_LBN 0
+#define	ESF_GZ_EV_256_EVENT_WIDTH 64
+#define	ESE_GZ_EW_EMBEDDED_EVENT_STRUCT_SIZE 64
+
+
+/* ES_NMMU_PAGESZ_2M_ADDR */
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_LBN 59
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_WIDTH 5
+#define	ESE_GZ_NMMU_PAGE_SIZE_2M 9
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_WIDTH 32
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_LBN 53
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_WIDTH 6
+#define	ESF_GZ_NMMU_2M_PAGE_ID_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_WIDTH 38
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_LBN 0
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_WIDTH 21
+#define	ESE_GZ_NMMU_PAGESZ_2M_ADDR_STRUCT_SIZE 64
+
+
+/* ES_PARAM_TLV */
+#define	ESF_GZ_TLV_VALUE_LBN 16
+#define	ESF_GZ_TLV_VALUE_WIDTH 8
+#define	ESE_GZ_TLV_VALUE_LENMIN 8
+#define	ESE_GZ_TLV_VALUE_LENMAX 2040
+#define	ESF_GZ_TLV_LEN_LBN 8
+#define	ESF_GZ_TLV_LEN_WIDTH 8
+#define	ESF_GZ_TLV_TYPE_LBN 0
+#define	ESF_GZ_TLV_TYPE_WIDTH 8
+#define	ESE_GZ_DP_NMMU_GROUP_SIZE 5
+#define	ESE_GZ_DP_EVQ_UNSOL_CREDIT_SEQ_BITS 4
+#define	ESE_GZ_DP_TX_EV_NUM_DESCS_BITS 3
+#define	ESE_GZ_DP_RX_EV_NUM_PACKETS_BITS 2
+#define	ESE_GZ_DP_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_GZ_DP_PAD 0
+#define	ESE_GZ_PARAM_TLV_STRUCT_SIZE 24
+
+
+/* ES_PCI_EXPRESS_XCAP_HDR */
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_LBN 20
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_WIDTH 12
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_LBN 16
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_WIDTH 4
+#define	ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC 1
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_LBN 0
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_WIDTH 16
+#define	ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR 0xb
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_STRUCT_SIZE 32
+
+
+/* ES_RHEAD_BASE_EVENT */
+#define	ESF_GZ_E_TYPE_LBN 60
+#define	ESF_GZ_E_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EV_DRIVER 5
+#define	ESE_GZ_EF100_EV_MCDI 4
+#define	ESE_GZ_EF100_EV_CONTROL 3
+#define	ESE_GZ_EF100_EV_TX_TIMESTAMP 2
+#define	ESE_GZ_EF100_EV_TX_COMPLETION 1
+#define	ESE_GZ_EF100_EV_RX_PKTS 0
+#define	ESF_GZ_EV_EVQ_PHASE_LBN 59
+#define	ESF_GZ_EV_EVQ_PHASE_WIDTH 1
+#define	ESE_GZ_RHEAD_BASE_EVENT_STRUCT_SIZE 64
+
+
+/* ES_RHEAD_EW_EVENT */
+#define	ESF_GZ_EV_256_EV32_PHASE_LBN 255
+#define	ESF_GZ_EV_256_EV32_PHASE_WIDTH 1
+#define	ESF_GZ_EV_256_EV32_TYPE_LBN 251
+#define	ESF_GZ_EV_256_EV32_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EVEW_VIRTQ_DESC 2
+#define	ESE_GZ_EF100_EVEW_TXQ_DESC 1
+#define	ESE_GZ_EF100_EVEW_64BIT 0
+#define	ESE_GZ_RHEAD_EW_EVENT_STRUCT_SIZE 256
+
+
+/* ES_RX_DESC */
+#define	ESF_GZ_RX_BUF_ADDR_DW0_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_LBN 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_WIDTH 64
+#define	ESE_GZ_RX_DESC_STRUCT_SIZE 64
+
+
+/* ES_TXQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_WIDTH 128
+#define	ESE_GZ_TXQ_DESC_PROXY_EVENT_STRUCT_SIZE 144
+
+
+/* ES_TX_DESC_TYPE */
+#define	ESF_GZ_TX_DESC_TYPE_LBN 124
+#define	ESF_GZ_TX_DESC_TYPE_WIDTH 4
+#define	ESE_GZ_TX_DESC_TYPE_DESC2CMPT 7
+#define	ESE_GZ_TX_DESC_TYPE_MEM2MEM 4
+#define	ESE_GZ_TX_DESC_TYPE_SEG 3
+#define	ESE_GZ_TX_DESC_TYPE_TSO 2
+#define	ESE_GZ_TX_DESC_TYPE_PREFIX 1
+#define	ESE_GZ_TX_DESC_TYPE_SEND 0
+#define	ESE_GZ_TX_DESC_TYPE_STRUCT_SIZE 128
+
+
+/* ES_VIRTQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_LBN 144
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_VQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_WIDTH 128
+#define	ESE_GZ_VIRTQ_DESC_PROXY_EVENT_STRUCT_SIZE 160
+
+
+/* ES_XIL_CFGBAR_TBL_ENTRY */
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_LBN 96
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_LBN 100
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_WIDTH 60
+#define	ESE_GZ_CONT_CAP_OFFSET_BYTES_SHIFT 4
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_LBN 67
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_WIDTH 29
+#define	ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT 4
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_LBN 67
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_WIDTH 1
+#define	ESF_GZ_CFGBAR_EF100_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_EF100_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_LBN 32
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_WIDTH 32
+#define	ESE_GZ_CFGBAR_ENTRY_SIZE_EF100 12
+#define	ESE_GZ_CFGBAR_ENTRY_HEADER_SIZE 8
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_LBN 28
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_WIDTH 1
+#define	ESF_GZ_CFGBAR_ENTRY_REV_LBN 20
+#define	ESF_GZ_CFGBAR_ENTRY_REV_WIDTH 8
+#define	ESE_GZ_CFGBAR_ENTRY_REV_EF100 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_LBN 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_WIDTH 20
+#define	ESE_GZ_CFGBAR_ENTRY_LAST 0xfffff
+#define	ESE_GZ_CFGBAR_ENTRY_CONT_CAP_ADDR 0xffffe
+#define	ESE_GZ_CFGBAR_ENTRY_EF100 0xef100
+#define	ESE_GZ_XIL_CFGBAR_TBL_ENTRY_STRUCT_SIZE 128
+
+
+/* ES_XIL_CFGBAR_VSEC */
+#define	ESF_GZ_VSEC_TBL_OFF_HI_LBN 64
+#define	ESF_GZ_VSEC_TBL_OFF_HI_WIDTH 32
+#define	ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT 32
+#define	ESF_GZ_VSEC_TBL_OFF_LO_LBN 36
+#define	ESF_GZ_VSEC_TBL_OFF_LO_WIDTH 28
+#define	ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT 4
+#define	ESF_GZ_VSEC_TBL_BAR_LBN 32
+#define	ESF_GZ_VSEC_TBL_BAR_WIDTH 4
+#define	ESE_GZ_VSEC_BAR_NUM_INVALID 7
+#define	ESE_GZ_VSEC_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_VSEC_LEN_LBN 20
+#define	ESF_GZ_VSEC_LEN_WIDTH 12
+#define	ESE_GZ_VSEC_LEN_HIGH_OFFT 16
+#define	ESE_GZ_VSEC_LEN_MIN 12
+#define	ESF_GZ_VSEC_VER_LBN 16
+#define	ESF_GZ_VSEC_VER_WIDTH 4
+#define	ESE_GZ_VSEC_VER_XIL_CFGBAR 0
+#define	ESF_GZ_VSEC_ID_LBN 0
+#define	ESF_GZ_VSEC_ID_WIDTH 16
+#define	ESE_GZ_XILINX_VSEC_ID 0x20
+#define	ESE_GZ_XIL_CFGBAR_VSEC_STRUCT_SIZE 96
+
+
+/* ES_rh_egres_hclass */
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_LBN 15
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_LBN 13
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_LBN 12
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_LBN 10
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_LBN 8
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_LBN 5
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_WIDTH 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_LBN 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_LBN 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_LBN 0
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_WIDTH 2
+#define	ESE_GZ_RH_EGRES_HCLASS_STRUCT_SIZE 16
+
+
+/* ES_sf_driver */
+#define	ESF_GZ_DRIVER_E_TYPE_LBN 60
+#define	ESF_GZ_DRIVER_E_TYPE_WIDTH 4
+#define	ESF_GZ_DRIVER_PHASE_LBN 59
+#define	ESF_GZ_DRIVER_PHASE_WIDTH 1
+#define	ESF_GZ_DRIVER_DATA_DW0_LBN 0
+#define	ESF_GZ_DRIVER_DATA_DW0_WIDTH 32
+#define	ESF_GZ_DRIVER_DATA_DW1_LBN 32
+#define	ESF_GZ_DRIVER_DATA_DW1_WIDTH 27
+#define	ESF_GZ_DRIVER_DATA_LBN 0
+#define	ESF_GZ_DRIVER_DATA_WIDTH 59
+#define	ESE_GZ_SF_DRIVER_STRUCT_SIZE 64
+
+
+/* ES_sf_ev_rsvd */
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_LBN 34
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_WIDTH 3
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_LBN 30
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_WIDTH 4
+#define	ESF_GZ_EV_RSVD_SRC_QID_LBN 18
+#define	ESF_GZ_EV_RSVD_SRC_QID_WIDTH 12
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_LBN 2
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_WIDTH 16
+#define	ESF_GZ_EV_RSVD_TBD_LBN 0
+#define	ESF_GZ_EV_RSVD_TBD_WIDTH 2
+#define	ESE_GZ_SF_EV_RSVD_STRUCT_SIZE 37
+
+
+/* ES_sf_flush_evnt */
+#define	ESF_GZ_EV_FLSH_E_TYPE_LBN 60
+#define	ESF_GZ_EV_FLSH_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_FLSH_PHASE_LBN 59
+#define	ESF_GZ_EV_FLSH_PHASE_WIDTH 1
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_LBN 53
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_WIDTH 6
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_LBN 42
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_WIDTH 11
+#define	ESF_GZ_EV_FLSH_RSVD_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_WIDTH 43
+#define	ESF_GZ_EV_FLSH_LABEL_LBN 4
+#define	ESF_GZ_EV_FLSH_LABEL_WIDTH 6
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_LBN 0
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_WIDTH 4
+#define	ESE_GZ_SF_FLUSH_EVNT_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_pkts */
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_RXPKTS_PHASE_LBN 59
+#define	ESF_GZ_EV_RXPKTS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RXPKTS_RSVD_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_WIDTH 37
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_LBN 0
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_WIDTH 16
+#define	ESE_GZ_SF_RX_PKTS_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_prefix */
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_LBN 160
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_LBN 144
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_LBN 128
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_MARK_LBN 96
+#define	ESF_GZ_RX_PREFIX_USER_MARK_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_LBN 64
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_LBN 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_CLASS_LBN 16
+#define	ESF_GZ_RX_PREFIX_CLASS_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_LBN 15
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_LBN 14
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_LENGTH_LBN 0
+#define	ESF_GZ_RX_PREFIX_LENGTH_WIDTH 14
+#define	ESE_GZ_SF_RX_PREFIX_STRUCT_SIZE 176
+
+
+/* ES_sf_rxtx_generic */
+#define	ESF_GZ_EV_BARRIER_LBN 167
+#define	ESF_GZ_EV_BARRIER_WIDTH 1
+#define	ESF_GZ_EV_RSVD_DW0_LBN 130
+#define	ESF_GZ_EV_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RSVD_DW1_LBN 162
+#define	ESF_GZ_EV_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RSVD_LBN 130
+#define	ESF_GZ_EV_RSVD_WIDTH 37
+#define	ESF_GZ_EV_DPRXY_LBN 129
+#define	ESF_GZ_EV_DPRXY_WIDTH 1
+#define	ESF_GZ_EV_VIRTIO_LBN 128
+#define	ESF_GZ_EV_VIRTIO_WIDTH 1
+#define	ESF_GZ_EV_COUNT_DW0_LBN 0
+#define	ESF_GZ_EV_COUNT_DW0_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW1_LBN 32
+#define	ESF_GZ_EV_COUNT_DW1_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW2_LBN 64
+#define	ESF_GZ_EV_COUNT_DW2_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW3_LBN 96
+#define	ESF_GZ_EV_COUNT_DW3_WIDTH 32
+#define	ESF_GZ_EV_COUNT_LBN 0
+#define	ESF_GZ_EV_COUNT_WIDTH 128
+#define	ESE_GZ_SF_RXTX_GENERIC_STRUCT_SIZE 168
+
+
+/* ES_sf_ts_stamp */
+#define	ESF_GZ_EV_TS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TS_PHASE_LBN 59
+#define	ESF_GZ_EV_TS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TS_RSVD_LBN 56
+#define	ESF_GZ_EV_TS_RSVD_WIDTH 3
+#define	ESF_GZ_EV_TS_STATUS_LBN 54
+#define	ESF_GZ_EV_TS_STATUS_WIDTH 2
+#define	ESF_GZ_EV_TS_Q_LABEL_LBN 48
+#define	ESF_GZ_EV_TS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TS_DESC_ID_LBN 32
+#define	ESF_GZ_EV_TS_DESC_ID_WIDTH 16
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_LBN 0
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_WIDTH 32
+#define	ESE_GZ_SF_TS_STAMP_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_cmplt */
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TXCMPL_PHASE_LBN 59
+#define	ESF_GZ_EV_TXCMPL_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_TXCMPL_RSVD_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_WIDTH 37
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_LBN 0
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_WIDTH 16
+#define	ESE_GZ_SF_TX_CMPLT_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_desc2cmpt_dsc_fmt */
+#define	ESF_GZ_D2C_TGT_VI_ID_LBN 108
+#define	ESF_GZ_D2C_TGT_VI_ID_WIDTH 16
+#define	ESF_GZ_D2C_CMPT2_LBN 107
+#define	ESF_GZ_D2C_CMPT2_WIDTH 1
+#define	ESF_GZ_D2C_ABS_VI_ID_LBN 106
+#define	ESF_GZ_D2C_ABS_VI_ID_WIDTH 1
+#define	ESF_GZ_D2C_ORDERED_LBN 105
+#define	ESF_GZ_D2C_ORDERED_WIDTH 1
+#define	ESF_GZ_D2C_SKIP_N_LBN 97
+#define	ESF_GZ_D2C_SKIP_N_WIDTH 8
+#define	ESF_GZ_D2C_RSVD_DW0_LBN 64
+#define	ESF_GZ_D2C_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_D2C_RSVD_DW1_LBN 96
+#define	ESF_GZ_D2C_RSVD_DW1_WIDTH 1
+#define	ESF_GZ_D2C_RSVD_LBN 64
+#define	ESF_GZ_D2C_RSVD_WIDTH 33
+#define	ESF_GZ_D2C_COMPLETION_DW0_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_DW0_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_LBN 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_WIDTH 64
+#define	ESE_GZ_SF_TX_DESC2CMPT_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_mem2mem_dsc_fmt */
+#define	ESF_GZ_M2M_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_M2M_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_M2M_RSVD_LBN 120
+#define	ESF_GZ_M2M_RSVD_WIDTH 2
+#define	ESF_GZ_M2M_ADDR_SPC_LBN 108
+#define	ESF_GZ_M2M_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_M2M_LEN_MINUS_1_LBN 64
+#define	ESF_GZ_M2M_LEN_MINUS_1_WIDTH 20
+#define	ESF_GZ_M2M_ADDR_DW0_LBN 0
+#define	ESF_GZ_M2M_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_DW1_LBN 32
+#define	ESF_GZ_M2M_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_LBN 0
+#define	ESF_GZ_M2M_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_MEM2MEM_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_ovr_dsc_fmt */
+#define	ESF_GZ_TX_PREFIX_MARK_EN_LBN 123
+#define	ESF_GZ_TX_PREFIX_MARK_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_LBN 122
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_LBN 121
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_LBN 120
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_WIDTH 32
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_LBN 96
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_WIDTH 24
+#define	ESF_GZ_TX_PREFIX_RSRVD_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_WIDTH 56
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_LBN 48
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_LBN 32
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_MARK_LBN 0
+#define	ESF_GZ_TX_PREFIX_MARK_WIDTH 32
+#define	ESE_GZ_SF_TX_OVR_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_seg_dsc_fmt */
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_TX_SEG_RSVD2_LBN 120
+#define	ESF_GZ_TX_SEG_RSVD2_WIDTH 2
+#define	ESF_GZ_TX_SEG_ADDR_SPC_LBN 108
+#define	ESF_GZ_TX_SEG_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_TX_SEG_RSVD_LBN 80
+#define	ESF_GZ_TX_SEG_RSVD_WIDTH 4
+#define	ESF_GZ_TX_SEG_LEN_LBN 64
+#define	ESF_GZ_TX_SEG_LEN_WIDTH 16
+#define	ESF_GZ_TX_SEG_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_SEG_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_std_dsc_fmt */
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_SEND_RSVD_LBN 99
+#define	ESF_GZ_TX_SEND_RSVD_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_LBN 97
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_LBN 92
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_WIDTH 5
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_LBN 83
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_WIDTH 9
+#define	ESF_GZ_TX_SEND_NUM_SEGS_LBN 78
+#define	ESF_GZ_TX_SEND_NUM_SEGS_WIDTH 5
+#define	ESF_GZ_TX_SEND_LEN_LBN 64
+#define	ESF_GZ_TX_SEND_LEN_WIDTH 14
+#define	ESF_GZ_TX_SEND_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_STD_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_tso_dsc_fmt */
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_TSO_RSVD_LBN 94
+#define	ESF_GZ_TX_TSO_RSVD_WIDTH 7
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_LBN 93
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_LBN 85
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_LBN 77
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_LBN 69
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_LBN 64
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_WIDTH 5
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_LBN 42
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_WIDTH 22
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_LBN 34
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_LBN 33
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_LBN 32
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_LBN 31
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_LBN 29
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_LBN 27
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_LBN 17
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_WIDTH 10
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_LBN 14
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_WIDTH 3
+#define	ESF_GZ_TX_TSO_MSS_LBN 0
+#define	ESF_GZ_TX_TSO_MSS_WIDTH 14
+#define	ESE_GZ_SF_TX_TSO_DSC_FMT_STRUCT_SIZE 124
+
+
+
+/* Enum DESIGN_PARAMS */
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT 17
+#define	ESE_EF100_DP_GZ_VI_STRIDES 16
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES 15
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS 14
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN 13
+#define	ESE_EF100_DP_GZ_COMPAT 12
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES 11
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS 10
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN 9
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY 8
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS 6
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN 5
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS 4
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE 3
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS 2
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_EF100_DP_GZ_PAD 0
+
+/* Enum DESIGN_PARAM_DEFAULTS */
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT 0x3fffff
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS_DEFAULT 0x1106
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT 0x3ff
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT_DEFAULT 640
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS_DEFAULT 512
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES_DEFAULT 512
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT 192
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE_DEFAULT 32
+#define	ESE_EF100_DP_GZ_VI_STRIDES_DEFAULT 16
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS_DEFAULT 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT 4
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS_DEFAULT 2
+#define	ESE_EF100_DP_GZ_COMPAT_DEFAULT 0
+
+/* Enum HOST_IF_CONSTANTS */
+#define	ESE_GZ_FCW_LEN 0x4C
+#define	ESE_GZ_RX_PKT_PREFIX_LEN 22
+
+/* Enum PCI_CONSTANTS */
+#define	ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE 256
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE 4
+
+/* Enum RH_HCLASS_L2_CLASS */
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_E2_0123VLAN 1
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_OTHER 0
+
+/* Enum RH_HCLASS_L2_STATUS */
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_RESERVED 3
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_FCS_ERR 2
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_LEN_ERR 1
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_OK 0
+
+/* Enum RH_HCLASS_L3_CLASS */
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP6 2
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4BAD 1
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4GOOD 0
+
+/* Enum RH_HCLASS_L4_CLASS */
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_FRAG 2
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_UDP 1
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_TCP 0
+
+/* Enum RH_HCLASS_L4_CSUM */
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_GOOD 1
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_BAD_OR_UNKNOWN 0
+
+/* Enum RH_HCLASS_TUNNEL_CLASS */
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_7 7
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_6 6
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_5 5
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_4 4
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_GENEVE 3
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NVGRE 2
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_VXLAN 1
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NONE 0
+
+/* Enum TX_DESC_CSO_PARTIAL_EN */
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_TCP 2
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_UDP 1
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_OFF 0
+
+/* Enum TX_DESC_CS_INNER_L3 */
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_GENEVE 3
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_NVGRE 2
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_VXLAN 1
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_OFF 0
+
+/* Enum TX_DESC_IP4_ID */
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD16 2
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD15 1
+#define	ESE_GZ_TX_DESC_IP4_ID_NO_OP 0
+/*************************************************************************
+ * NOTE: the comment line above marks the end of the autogenerated section
+ */
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _SYS_EFX_EF100_REGS_H */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-23 17:20     ` Ferruh Yigit
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
                     ` (58 subsequent siblings)
  60 siblings, 1 reply; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5241 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 3 files changed, 5173 insertions(+), 271 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi.h b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
index ffb9a9b02a..34a473aa46 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_H
@@ -405,7 +405,22 @@
  */
 #define	MC_CMD_ERR_PIOBUFS_PRESENT 0x101b
 
-/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10
+/* MC_CMD_RESOURCE_SPECIFIER enum */
+/* enum: Any */
+#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
+#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe /* enum */
+
+/* MAE_MCDI_ENCAP_TYPE enum: Encapsulation type. Defines how the payload will
+ * be parsed to an inner frame. Other values are reserved. Unknown values
+ * should be treated same as NONE.
+ */
+#define	MAE_MCDI_ENCAP_TYPE_NONE 0x0 /* enum */
+/* enum: Don't assume enum aligns with support bitmask... */
+#define	MAE_MCDI_ENCAP_TYPE_VXLAN 0x1
+#define	MAE_MCDI_ENCAP_TYPE_NVGRE 0x2 /* enum */
+#define	MAE_MCDI_ENCAP_TYPE_GENEVE 0x3 /* enum */
+
+/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10/EF100
  * platforms
  */
 #define	MCDI_EVENT_LEN 8
@@ -423,14 +438,19 @@
 #define	MCDI_EVENT_LEVEL_FATAL 0x3
 #define	MCDI_EVENT_DATA_OFST 0
 #define	MCDI_EVENT_DATA_LEN 4
+#define	MCDI_EVENT_CMDDONE_SEQ_OFST 0
 #define	MCDI_EVENT_CMDDONE_SEQ_LBN 0
 #define	MCDI_EVENT_CMDDONE_SEQ_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_DATALEN_OFST 0
 #define	MCDI_EVENT_CMDDONE_DATALEN_LBN 8
 #define	MCDI_EVENT_CMDDONE_DATALEN_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_ERRNO_OFST 0
 #define	MCDI_EVENT_CMDDONE_ERRNO_LBN 16
 #define	MCDI_EVENT_CMDDONE_ERRNO_WIDTH 8
+#define	MCDI_EVENT_LINKCHANGE_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_WIDTH 16
+#define	MCDI_EVENT_LINKCHANGE_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_SPEED_LBN 16
 #define	MCDI_EVENT_LINKCHANGE_SPEED_WIDTH 4
 /* enum: Link is down or link speed could not be determined */
@@ -449,26 +469,36 @@
 #define	MCDI_EVENT_LINKCHANGE_SPEED_50G 0x6
 /* enum: 100Gbs */
 #define	MCDI_EVENT_LINKCHANGE_SPEED_100G 0x7
+#define	MCDI_EVENT_LINKCHANGE_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_LBN 20
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_WIDTH 4
+#define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_MONITOR_OFST 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_STATE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_STATE_LBN 8
 #define	MCDI_EVENT_SENSOREVT_STATE_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_VALUE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_VALUE_LBN 16
 #define	MCDI_EVENT_SENSOREVT_VALUE_WIDTH 16
+#define	MCDI_EVENT_FWALERT_DATA_OFST 0
 #define	MCDI_EVENT_FWALERT_DATA_LBN 8
 #define	MCDI_EVENT_FWALERT_DATA_WIDTH 24
+#define	MCDI_EVENT_FWALERT_REASON_OFST 0
 #define	MCDI_EVENT_FWALERT_REASON_LBN 0
 #define	MCDI_EVENT_FWALERT_REASON_WIDTH 8
 /* enum: SRAM Access. */
 #define	MCDI_EVENT_FWALERT_REASON_SRAM_ACCESS 0x1
+#define	MCDI_EVENT_FLR_VF_OFST 0
 #define	MCDI_EVENT_FLR_VF_LBN 0
 #define	MCDI_EVENT_FLR_VF_WIDTH 8
+#define	MCDI_EVENT_TX_ERR_TXQ_OFST 0
 #define	MCDI_EVENT_TX_ERR_TXQ_LBN 0
 #define	MCDI_EVENT_TX_ERR_TXQ_WIDTH 12
+#define	MCDI_EVENT_TX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_TX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_TX_ERR_TYPE_WIDTH 4
 /* enum: Descriptor loader reported failure */
@@ -483,12 +513,16 @@
 #define	MCDI_EVENT_TX_OPT_IN_PKT 0x8
 /* enum: DMA or PIO data access error */
 #define	MCDI_EVENT_TX_ERR_BAD_DMA_OR_PIO 0x9
+#define	MCDI_EVENT_TX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_TX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_TX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_TX_FLUSH_TXQ_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_LBN 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_WIDTH 12
+#define	MCDI_EVENT_PTP_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_WIDTH 8
 /* enum: PLL lost lock */
@@ -499,6 +533,7 @@
 #define	MCDI_EVENT_PTP_ERR_FIFO 0x3
 /* enum: Merge queue overflow */
 #define	MCDI_EVENT_PTP_ERR_QUEUE 0x4
+#define	MCDI_EVENT_AOE_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_WIDTH 8
 /* enum: AOE failed to load - no valid image? */
@@ -545,8 +580,10 @@
 #define	MCDI_EVENT_AOE_FPGA_CLOCKS_PROGRAM_FAILED 0x13
 /* enum: Notify that FPGA Controller is alive to serve MCDI requests */
 #define	MCDI_EVENT_AOE_FC_RUNNING 0x14
+#define	MCDI_EVENT_AOE_ERR_DATA_OFST 0
 #define	MCDI_EVENT_AOE_ERR_DATA_LBN 8
 #define	MCDI_EVENT_AOE_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_WIDTH 8
 /* enum: FC Assert happened, but the register information is not available */
@@ -554,6 +591,7 @@
 /* enum: The register information for FC Assert is ready for readinng by driver
  */
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_DATA_READY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_WIDTH 8
 /* enum: Reading from NV failed */
@@ -574,28 +612,38 @@
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_SIZE 0x7
 /* enum: Unsupported DDR rank */
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_RANK 0x8
+#define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_WIDTH 8
 /* enum: Primary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_PRIMARY 0x0
 /* enum: Secondary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_SECONDARY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_WIDTH 8
+#define	MCDI_EVENT_RX_ERR_RXQ_OFST 0
 #define	MCDI_EVENT_RX_ERR_RXQ_LBN 0
 #define	MCDI_EVENT_RX_ERR_RXQ_WIDTH 12
+#define	MCDI_EVENT_RX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_RX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_RX_ERR_TYPE_WIDTH 4
+#define	MCDI_EVENT_RX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_RX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_RX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_RX_FLUSH_RXQ_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_LBN 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_WIDTH 12
+#define	MCDI_EVENT_MC_REBOOT_COUNT_OFST 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_LBN 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_WIDTH 16
+#define	MCDI_EVENT_MUM_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_WIDTH 8
 /* enum: MUM failed to load - no valid image? */
@@ -604,10 +652,13 @@
 #define	MCDI_EVENT_MUM_ASSERT 0x2
 /* enum: MUM not kicking watchdog */
 #define	MCDI_EVENT_MUM_WATCHDOG 0x3
+#define	MCDI_EVENT_MUM_ERR_DATA_OFST 0
 #define	MCDI_EVENT_MUM_ERR_DATA_LBN 8
 #define	MCDI_EVENT_MUM_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_DBRET_SEQ_OFST 0
 #define	MCDI_EVENT_DBRET_SEQ_LBN 0
 #define	MCDI_EVENT_DBRET_SEQ_WIDTH 8
+#define	MCDI_EVENT_SUC_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_WIDTH 8
 /* enum: Corrupted or bad SUC application. */
@@ -618,30 +669,48 @@
 #define	MCDI_EVENT_SUC_EXCEPTION 0x3
 /* enum: SUC watchdog timer expired. */
 #define	MCDI_EVENT_SUC_WATCHDOG 0x4
+#define	MCDI_EVENT_SUC_ERR_ADDRESS_OFST 0
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_LBN 8
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_WIDTH 24
+#define	MCDI_EVENT_SUC_ERR_DATA_OFST 0
 #define	MCDI_EVENT_SUC_ERR_DATA_LBN 8
 #define	MCDI_EVENT_SUC_ERR_DATA_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MCDI_EVENT/LINKCHANGE_SPEED */
+#define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_LBN 28
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_WIDTH 1
+#define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_LBN 29
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
+#define	MCDI_EVENT_MODULECHANGE_LD_CAP_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_LBN 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_WIDTH 30
+#define	MCDI_EVENT_MODULECHANGE_SEQ_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_SEQ_LBN 30
 #define	MCDI_EVENT_MODULECHANGE_SEQ_WIDTH 2
 #define	MCDI_EVENT_DATA_LBN 0
 #define	MCDI_EVENT_DATA_WIDTH 32
+/* Alias for PTP_DATA. */
 #define	MCDI_EVENT_SRC_LBN 36
 #define	MCDI_EVENT_SRC_WIDTH 8
+/* Data associated with PTP events which doesn't fit into the main DATA field
+ */
+#define	MCDI_EVENT_PTP_DATA_LBN 36
+#define	MCDI_EVENT_PTP_DATA_WIDTH 8
+/* EF100 specific. Defined by QDMA. The phase bit, changes each time round the
+ * event ring
+ */
+#define	MCDI_EVENT_EV_EVQ_PHASE_LBN 59
+#define	MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
 #define	MCDI_EVENT_EV_CODE_LBN 60
 #define	MCDI_EVENT_EV_CODE_WIDTH 4
 #define	MCDI_EVENT_CODE_LBN 44
@@ -737,6 +806,27 @@
  * contains the value.
  */
 #define	MCDI_EVENT_CODE_DYNAMIC_SENSORS_STATE_CHANGE 0x23
+/* enum: Notification that a descriptor proxy function configuration has been
+ * pushed to "live" status (visible to host). SRC field contains the handle of
+ * the affected descriptor proxy function. DATA field contains the generation
+ * count of configuration set applied. See MC_CMD_DESC_PROXY_FUNC_CONFIG_SET /
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_COMMIT and SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_CONFIG_COMMITTED 0x24
+/* enum: Notification that a descriptor proxy function has been reset. SRC
+ * field contains the handle of the affected descriptor proxy function. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_RESET 0x25
+/* enum: Notification that a driver attached to a descriptor proxy function.
+ * SRC field contains the handle of the affected descriptor proxy function. For
+ * Virtio proxy functions this message consists of two MCDI events, where the
+ * first event's (CONT=1) DATA field carries negotiated virtio feature bits 0
+ * to 31 and the second (CONT=0) carries bits 32 to 63. For EF100 proxy
+ * functions event length and meaning of DATA field is not yet defined. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_DRIVER_ATTACH 0x26
 /* enum: Artificial event generated by host and posted via MC for test
  * purposes.
  */
@@ -888,6 +978,22 @@
 /* The current state of a sensor. */
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_LBN 36
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_WIDTH 8
+#define	MCDI_EVENT_DESC_PROXY_DATA_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_DATA_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_WIDTH 32
+/* Generation count of applied configuration set */
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_WIDTH 32
+/* Virtio features negotiated with the host driver. First event (CONT=1)
+ * carries bits 0 to 31. Second event (CONT=0) carries bits 32 to 63.
+ */
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_WIDTH 32
 
 /* FCDI_EVENT structuredef */
 #define	FCDI_EVENT_LEN 8
@@ -905,6 +1011,7 @@
 #define	FCDI_EVENT_LEVEL_FATAL 0x3
 #define	FCDI_EVENT_DATA_OFST 0
 #define	FCDI_EVENT_DATA_LEN 4
+#define	FCDI_EVENT_LINK_STATE_STATUS_OFST 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_LBN 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_WIDTH 1
 #define	FCDI_EVENT_LINK_DOWN 0x0 /* enum */
@@ -1040,24 +1147,33 @@
 #define	MUM_EVENT_LEVEL_FATAL 0x3
 #define	MUM_EVENT_DATA_OFST 0
 #define	MUM_EVENT_DATA_LEN 4
+#define	MUM_EVENT_SENSOR_ID_OFST 0
 #define	MUM_EVENT_SENSOR_ID_LBN 0
 #define	MUM_EVENT_SENSOR_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_SENSOR_INFO/MC_CMD_SENSOR_INFO_OUT/MASK */
+#define	MUM_EVENT_SENSOR_STATE_OFST 0
 #define	MUM_EVENT_SENSOR_STATE_LBN 8
 #define	MUM_EVENT_SENSOR_STATE_WIDTH 8
+#define	MUM_EVENT_PORT_PHY_READY_OFST 0
 #define	MUM_EVENT_PORT_PHY_READY_LBN 0
 #define	MUM_EVENT_PORT_PHY_READY_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_LINK_UP_OFST 0
 #define	MUM_EVENT_PORT_PHY_LINK_UP_LBN 1
 #define	MUM_EVENT_PORT_PHY_LINK_UP_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOL_LBN 2
 #define	MUM_EVENT_PORT_PHY_TX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOL_LBN 3
 #define	MUM_EVENT_PORT_PHY_RX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOS_LBN 4
 #define	MUM_EVENT_PORT_PHY_TX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOS_LBN 5
 #define	MUM_EVENT_PORT_PHY_RX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_FAULT_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_LBN 6
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_WIDTH 1
 #define	MUM_EVENT_DATA_LBN 0
@@ -1205,16 +1321,22 @@
  * below)
  */
 #define	MC_CMD_COPYCODE_HUNT_IGNORE_CONFIG_MAGIC_ADDR 0x1badc
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_LBN 17
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_LBN 2
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_LBN 3
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_LBN 4
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_LBN 5
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_LBN 6
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_WIDTH 1
 /* Destination address */
@@ -1272,10 +1394,13 @@
 #define	MC_CMD_GET_BOOT_STATUS_OUT_BOOT_OFFSET_NULL 0xdeadbeef
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_LBN 0
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_LBN 1
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_LBN 2
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_WIDTH 1
 
@@ -1547,14 +1672,19 @@
 /* Flags indicating which extended fields are valid */
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_LBN 0
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_LBN 1
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_LBN 2
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_LBN 3
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_LBN 4
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_WIDTH 1
 /* MC firmware unique build ID (as binary SHA-1 value) */
@@ -2088,8 +2218,10 @@
 /* Original field containing queue ID. Now extended to include flags. */
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_LEN 4
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_LBN 0
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_WIDTH 16
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_LBN 31
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_WIDTH 1
 
@@ -2395,12 +2527,16 @@
 /* Various PTP capabilities */
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_LEN 4
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_LBN 0
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_LBN 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_LBN 2
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_LBN 3
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_WIDTH 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RESERVED0_OFST 12
@@ -2728,10 +2864,13 @@
 #define	MC_CMD_DBIWROP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIWROP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LBN 32
@@ -2980,10 +3119,13 @@
 #define	MC_CMD_DBIRDOP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIRDOP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LBN 32
@@ -3051,22 +3193,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_LEN 4
+#define	MC_CMD_DRV_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_PREBOOT_OFST 0
 #define	MC_CMD_DRV_PREBOOT_LBN 1
 #define	MC_CMD_DRV_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3113,22 +3264,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_LEN 4
+/*             MC_CMD_DRV_ATTACH_OFST 0 */
 /*             MC_CMD_DRV_ATTACH_LBN 0 */
 /*             MC_CMD_DRV_ATTACH_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_WIDTH 1
+/*             MC_CMD_DRV_PREBOOT_OFST 0 */
 /*             MC_CMD_DRV_PREBOOT_LBN 1 */
 /*             MC_CMD_DRV_PREBOOT_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3263,6 +3423,7 @@
  */
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_LEN 4
+#define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_LBN 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_WIDTH 1
 
@@ -3381,8 +3542,10 @@
 #define	MC_CMD_PUTS_IN_STRING_NUM(len) (((len)-12)/1)
 #define	MC_CMD_PUTS_IN_DEST_OFST 0
 #define	MC_CMD_PUTS_IN_DEST_LEN 4
+#define	MC_CMD_PUTS_IN_UART_OFST 0
 #define	MC_CMD_PUTS_IN_UART_LBN 0
 #define	MC_CMD_PUTS_IN_UART_WIDTH 1
+#define	MC_CMD_PUTS_IN_PORT_OFST 0
 #define	MC_CMD_PUTS_IN_PORT_LBN 1
 #define	MC_CMD_PUTS_IN_PORT_WIDTH 1
 #define	MC_CMD_PUTS_IN_DHOST_OFST 4
@@ -3415,18 +3578,25 @@
 /* flags */
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_LBN 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN 1
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN 2
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_LBN 3
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_LBN 4
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_LBN 5
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_LBN 6
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_WIDTH 1
 /* ?? */
@@ -3435,46 +3605,67 @@
 /* Bitmask of supported capabilities */
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_OFST 8
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_LEN 4
+#define	MC_CMD_PHY_CAP_10HDX_OFST 8
 #define	MC_CMD_PHY_CAP_10HDX_LBN 1
 #define	MC_CMD_PHY_CAP_10HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10FDX_LBN 2
 #define	MC_CMD_PHY_CAP_10FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100HDX_OFST 8
 #define	MC_CMD_PHY_CAP_100HDX_LBN 3
 #define	MC_CMD_PHY_CAP_100HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100FDX_LBN 4
 #define	MC_CMD_PHY_CAP_100FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000HDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000HDX_LBN 5
 #define	MC_CMD_PHY_CAP_1000HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000FDX_LBN 6
 #define	MC_CMD_PHY_CAP_1000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10000FDX_LBN 7
 #define	MC_CMD_PHY_CAP_10000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_PAUSE_OFST 8
 #define	MC_CMD_PHY_CAP_PAUSE_LBN 8
 #define	MC_CMD_PHY_CAP_PAUSE_WIDTH 1
+#define	MC_CMD_PHY_CAP_ASYM_OFST 8
 #define	MC_CMD_PHY_CAP_ASYM_LBN 9
 #define	MC_CMD_PHY_CAP_ASYM_WIDTH 1
+#define	MC_CMD_PHY_CAP_AN_OFST 8
 #define	MC_CMD_PHY_CAP_AN_LBN 10
 #define	MC_CMD_PHY_CAP_AN_WIDTH 1
+#define	MC_CMD_PHY_CAP_40000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_40000FDX_LBN 11
 #define	MC_CMD_PHY_CAP_40000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_DDM_OFST 8
 #define	MC_CMD_PHY_CAP_DDM_LBN 12
 #define	MC_CMD_PHY_CAP_DDM_WIDTH 1
+#define	MC_CMD_PHY_CAP_100000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100000FDX_LBN 13
 #define	MC_CMD_PHY_CAP_100000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_25000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_25000FDX_LBN 14
 #define	MC_CMD_PHY_CAP_25000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_50000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_50000FDX_LBN 15
 #define	MC_CMD_PHY_CAP_50000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_LBN 16
 #define	MC_CMD_PHY_CAP_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_LBN 17
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_LBN 18
 #define	MC_CMD_PHY_CAP_RS_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_LBN 19
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_LBN 20
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_LBN 21
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_WIDTH 1
 /* ?? */
@@ -4089,20 +4280,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4112,12 +4311,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_LEN 4
+#define	MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1
+#define	MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1
 
@@ -4145,20 +4348,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4168,12 +4379,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_LEN 4
+/*             MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1 */
 /* True local device capabilities (taking into account currently used PMD/MDI,
@@ -4197,24 +4412,36 @@
 /*               FEC_TYPE/TYPE */
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_LBN 4
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_LBN 5
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_HI_BER_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_OFST 40
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_LBN 9
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_WIDTH 1
 
 
 /***********************************/
@@ -4237,12 +4464,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_LEN 4
@@ -4267,12 +4500,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_LEN 4
@@ -4285,8 +4524,10 @@
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_SPEED_LEN 4
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_LEN 1
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_WIDTH 7
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_LBN 7
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_WIDTH 1
 
@@ -4340,8 +4581,10 @@
 #define	MC_CMD_SET_MAC_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_IN_FCNTL_OFST 20
@@ -4360,6 +4603,7 @@
 #define	MC_CMD_FCNTL_GENERATE 0x5
 #define	MC_CMD_SET_MAC_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_WIDTH 1
 
@@ -4378,8 +4622,10 @@
 #define	MC_CMD_SET_MAC_EXT_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_EXT_IN_FCNTL_OFST 20
@@ -4398,6 +4644,7 @@
 /*               MC_CMD_FCNTL_GENERATE 0x5 */
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_WIDTH 1
 /* Select which parameters to configure. A parameter will only be modified if
@@ -4407,14 +4654,19 @@
  */
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_LBN 2
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_LBN 3
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_LBN 4
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_WIDTH 1
 
@@ -4536,18 +4788,25 @@
 #define	MC_CMD_MAC_STATS_IN_DMA_ADDR_HI_OFST 4
 #define	MC_CMD_MAC_STATS_IN_CMD_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CMD_LEN 4
+#define	MC_CMD_MAC_STATS_IN_DMA_OFST 8
 #define	MC_CMD_MAC_STATS_IN_DMA_LBN 0
 #define	MC_CMD_MAC_STATS_IN_DMA_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CLEAR_LBN 1
 #define	MC_CMD_MAC_STATS_IN_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIOD_MS_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_LBN 16
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_WIDTH 16
 /* DMA length. Should be set to MAC_STATS_NUM_STATS * sizeof(uint64_t), as
@@ -5053,8 +5312,10 @@
 /*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_LEN 4 */
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_LEN 4
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_LBN 0
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_WIDTH 1
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_LBN 1
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_WIDTH 1
 
@@ -5211,18 +5472,25 @@
 #define	MC_CMD_NVRAM_INFO_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CRC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_LBN 3
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CMAC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_LBN 6
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_OUT_PHYSDEV_OFST 16
@@ -5242,14 +5510,19 @@
 #define	MC_CMD_NVRAM_INFO_V2_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PHYSDEV_OFST 16
@@ -5298,6 +5571,7 @@
 /*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
 
@@ -5477,10 +5751,13 @@
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_REBOOT_LEN 4
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_LBN 1
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_LBN 2
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_WIDTH 1
 
@@ -5676,6 +5953,7 @@
 #define	MC_CMD_REBOOT_MODE_SNAPPER 0x3
 /* enum: snapper fake POR */
 #define	MC_CMD_REBOOT_MODE_SNAPPER_POR 0x4
+#define	MC_CMD_REBOOT_MODE_IN_FAKE_OFST 0
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_LBN 7
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_WIDTH 1
 
@@ -5748,6 +6026,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -5970,6 +6249,7 @@
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_MASK_LEN 4
 /*            Enum values, see field(s): */
 /*               MC_CMD_SENSOR_INFO_OUT */
+#define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_OFST 0
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_LBN 31
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_WIDTH 1
 /* MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF */
@@ -6025,7 +6305,11 @@
 
 /* MC_CMD_READ_SENSORS_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_IN_LEN 8
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LO_OFST 0
@@ -6033,7 +6317,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_LEN 12
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LO_OFST 0
@@ -6044,7 +6332,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN_V2 msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_LEN 16
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LO_OFST 0
@@ -6055,6 +6347,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -6336,6 +6629,7 @@
 #define	MC_CMD_WORKAROUND_EXT_OUT_LEN 4
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_LEN 4
+#define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_WIDTH 1
 
@@ -6558,10 +6852,13 @@
 #define	MC_CMD_NVRAM_METADATA_OUT_TYPE_LEN 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_LBN 0
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_LBN 1
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_LBN 2
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_WIDTH 1
 /* Subtype ID code for content of this partition */
@@ -6686,6 +6983,7 @@
 #define	MC_CMD_CLP_IN_SET_MAC_V2_RESERVED_LEN 2
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_LBN 0
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_WIDTH 1
 
@@ -6700,6 +6998,7 @@
 /*            MC_CMD_CLP_IN_OP_LEN 4 */
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_LBN 0
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_WIDTH 1
 
@@ -6751,6 +7050,7 @@
 #define	MC_CMD_MUM_IN_LEN 4
 #define	MC_CMD_MUM_IN_OP_HDR_OFST 0
 #define	MC_CMD_MUM_IN_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_OP_OFST 0
 #define	MC_CMD_MUM_IN_OP_LBN 0
 #define	MC_CMD_MUM_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to MUM */
@@ -6892,6 +7192,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_IN_READ 0x0 /* enum */
@@ -6954,12 +7255,14 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_LBN 8
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_READ 0x0 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE 0x1 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG 0x2 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE 0x3 /* enum */
+#define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_LBN 16
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_WIDTH 8
 
@@ -6976,6 +7279,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_WIDTH 8
 
@@ -6985,6 +7289,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_WIDTH 8
 
@@ -6994,6 +7299,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_WIDTH 8
 
@@ -7004,8 +7310,10 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_LEN 4
+#define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_LBN 0
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_WIDTH 8
+#define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_LBN 8
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_WIDTH 8
 
@@ -7023,10 +7331,13 @@
 /* Control flags for clock programming */
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_LEN 4
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_LBN 0
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_LBN 1
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_LBN 2
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_WIDTH 1
 
@@ -7052,6 +7363,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_QSFP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_QSFP_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_WIDTH 4
 #define	MC_CMD_MUM_IN_QSFP_INIT 0x0 /* enum */
@@ -7238,10 +7550,13 @@
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MINNUM 1
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM 63
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM_MCDI2 255
+#define	MC_CMD_MUM_OUT_READ_SENSORS_READING_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_LBN 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_LBN 16
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_WIDTH 8
 
@@ -7267,8 +7582,10 @@
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LP_CAP_LEN 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_LEN 4
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_LBN 0
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_WIDTH 1
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_LBN 1
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_WIDTH 1
 
@@ -7313,8 +7630,10 @@
 /* Discrete (soldered) DDR resistor strap info */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_LEN 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_WIDTH 16
 /* Number of SODIMM info records */
@@ -7328,6 +7647,7 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MINNUM 2
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM 30
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM_MCDI2 126
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_WIDTH 8
 /* enum: SODIMM bank 1 (Top SODIMM for Sorrento) */
@@ -7336,10 +7656,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK2 0x1
 /* enum: Total number of SODIMM banks */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NUM_BANKS 0x2
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_LBN 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_WIDTH 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_LBN 20
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_WIDTH 4
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_POWERED 0x0 /* enum */
@@ -7348,10 +7671,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V5 0x3 /* enum */
 /* enum: Values 5-15 are reserved for future usage */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V8 0x4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_LBN 32
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_LBN 48
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_WIDTH 4
 /* enum: No module present */
@@ -7369,6 +7695,7 @@
 /* enum: Modules may or may not be present, but cannot establish contact by I2C
  */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_REACHABLE 0x6
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_LBN 52
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_WIDTH 12
 
@@ -7677,12 +8004,6 @@
 /* MC_CMD_EVENT_CTRL_OUT msgrequest */
 #define	MC_CMD_EVENT_CTRL_OUT_LEN 0
 
-/* MC_CMD_RESOURCE_SPECIFIER enum */
-/* enum: Any */
-#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
-/* enum: None */
-#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe
-
 /* EVB_PORT_ID structuredef */
 #define	EVB_PORT_ID_LEN 4
 #define	EVB_PORT_ID_PORT_ID_OFST 0
@@ -7902,24 +8223,34 @@
 #define	LICENSED_FEATURES_MASK_LEN 8
 #define	LICENSED_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_FEATURES_PIO_OFST 0
 #define	LICENSED_FEATURES_PIO_LBN 1
 #define	LICENSED_FEATURES_PIO_WIDTH 1
+#define	LICENSED_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_FEATURES_CLOCK_OFST 0
 #define	LICENSED_FEATURES_CLOCK_LBN 3
 #define	LICENSED_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_FEATURES_MASK_LBN 0
@@ -7932,36 +8263,52 @@
 #define	LICENSED_V3_APPS_MASK_LEN 8
 #define	LICENSED_V3_APPS_MASK_LO_OFST 0
 #define	LICENSED_V3_APPS_MASK_HI_OFST 4
+#define	LICENSED_V3_APPS_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_ONLOAD_LBN 0
 #define	LICENSED_V3_APPS_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_PTP_OFST 0
 #define	LICENSED_V3_APPS_PTP_LBN 1
 #define	LICENSED_V3_APPS_PTP_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_LBN 2
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARSECURE_OFST 0
 #define	LICENSED_V3_APPS_SOLARSECURE_LBN 3
 #define	LICENSED_V3_APPS_SOLARSECURE_WIDTH 1
+#define	LICENSED_V3_APPS_PERF_MONITOR_OFST 0
 #define	LICENSED_V3_APPS_PERF_MONITOR_LBN 4
 #define	LICENSED_V3_APPS_PERF_MONITOR_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_LBN 5
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_LBN 6
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_WIDTH 1
+#define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_OFST 0
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_LBN 7
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_WIDTH 1
+#define	LICENSED_V3_APPS_TCP_DIRECT_OFST 0
 #define	LICENSED_V3_APPS_TCP_DIRECT_LBN 8
 #define	LICENSED_V3_APPS_TCP_DIRECT_WIDTH 1
+#define	LICENSED_V3_APPS_LOW_LATENCY_OFST 0
 #define	LICENSED_V3_APPS_LOW_LATENCY_LBN 9
 #define	LICENSED_V3_APPS_LOW_LATENCY_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_LBN 10
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_LBN 11
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_LBN 12
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_WIDTH 1
+#define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_LBN 13
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_DSHBRD_OFST 0
 #define	LICENSED_V3_APPS_DSHBRD_LBN 14
 #define	LICENSED_V3_APPS_DSHBRD_WIDTH 1
+#define	LICENSED_V3_APPS_SCATRD_OFST 0
 #define	LICENSED_V3_APPS_SCATRD_LBN 15
 #define	LICENSED_V3_APPS_SCATRD_WIDTH 1
 #define	LICENSED_V3_APPS_MASK_LBN 0
@@ -7974,24 +8321,34 @@
 #define	LICENSED_V3_FEATURES_MASK_LEN 8
 #define	LICENSED_V3_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_V3_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_V3_FEATURES_PIO_OFST 0
 #define	LICENSED_V3_FEATURES_PIO_LBN 1
 #define	LICENSED_V3_FEATURES_PIO_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_V3_FEATURES_CLOCK_OFST 0
 #define	LICENSED_V3_FEATURES_CLOCK_LBN 3
 #define	LICENSED_V3_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_V3_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_V3_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_V3_FEATURES_MASK_LBN 0
@@ -8044,12 +8401,16 @@
  */
 #define	RSS_MODE_HASH_SELECTOR_OFST 0
 #define	RSS_MODE_HASH_SELECTOR_LEN 1
+#define	RSS_MODE_HASH_SRC_ADDR_OFST 0
 #define	RSS_MODE_HASH_SRC_ADDR_LBN 0
 #define	RSS_MODE_HASH_SRC_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_DST_ADDR_OFST 0
 #define	RSS_MODE_HASH_DST_ADDR_LBN 1
 #define	RSS_MODE_HASH_DST_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_SRC_PORT_OFST 0
 #define	RSS_MODE_HASH_SRC_PORT_LBN 2
 #define	RSS_MODE_HASH_SRC_PORT_WIDTH 1
+#define	RSS_MODE_HASH_DST_PORT_OFST 0
 #define	RSS_MODE_HASH_DST_PORT_LBN 3
 #define	RSS_MODE_HASH_DST_PORT_WIDTH 1
 #define	RSS_MODE_HASH_SELECTOR_LBN 0
@@ -8164,18 +8525,25 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_WIDTH 1
 #define	MC_CMD_INIT_EVQ_IN_TMR_MODE_OFST 20
@@ -8250,20 +8618,28 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LBN 7
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_WIDTH 4
 /* enum: All initialisation flags specified by host. */
@@ -8285,6 +8661,9 @@
  * MC_CMD_INIT_EVQ_V2/MC_CMD_INIT_EVQ_V2_OUT/FLAGS for list of affected flags.
  */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO 0x3
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_OFST 16
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_LBN 11
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_WIDTH 1
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_OFST 20
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_LEN 4
 /* enum: Disabled */
@@ -8335,12 +8714,16 @@
 /* Actual configuration applied on the card */
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_WIDTH 1
 
@@ -8401,20 +8784,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_UNUSED_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_LBN 10
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8458,20 +8849,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8487,8 +8886,10 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8496,10 +8897,13 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8542,20 +8946,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8571,8 +8983,10 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8580,10 +8994,13 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8655,20 +9072,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8684,8 +9109,10 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8693,10 +9120,13 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8781,20 +9211,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8810,8 +9248,10 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8819,10 +9259,13 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8939,22 +9382,31 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8995,30 +9447,51 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_LBN 12
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_LBN 13
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_LBN 14
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_LBN 15
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_LBN 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_LBN 17
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_LEN 4
@@ -9036,8 +9509,10 @@
 /* Flags related to Qbb flow control mode. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_WIDTH 3
 
@@ -9148,8 +9623,10 @@
 /* The handle of the target function. */
 #define	MC_CMD_PROXY_CMD_IN_TARGET_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_LEN 4
+#define	MC_CMD_PROXY_CMD_IN_TARGET_PF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_LBN 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_WIDTH 16
+#define	MC_CMD_PROXY_CMD_IN_TARGET_VF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_LBN 16
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_WIDTH 16
 #define	MC_CMD_PROXY_CMD_IN_VF_NULL 0xffff /* enum */
@@ -9213,6 +9690,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_IN_LEN 108
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9257,6 +9735,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_LEN 112
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9466,32 +9945,46 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_LBN 11
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9539,8 +10032,10 @@
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9606,60 +10101,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9707,8 +10230,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9744,8 +10269,10 @@
  */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9754,8 +10281,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -9827,9 +10356,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_IFRM_DST_IP_LEN 16
 
 /* MC_CMD_FILTER_OP_V3_IN msgrequest: FILTER_OP extension to support additional
- * filter actions for Intel's DPDK (Data Plane Development Kit, dpdk.org) via
- * its rte_flow API. This extension is only useful with the sfc_efx driver
- * included as part of DPDK, used in conjunction with the dpdk datapath
+ * filter actions for EF100. Some of these actions are also supported on EF10,
+ * for Intel's DPDK (Data Plane Development Kit, dpdk.org) via its rte_flow
+ * API. In the latter case, this extension is only useful with the sfc_efx
+ * driver included as part of DPDK, used in conjunction with the dpdk datapath
  * firmware variant.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_LEN 180
@@ -9850,60 +10380,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9951,8 +10509,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9988,8 +10548,10 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9998,8 +10560,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -10069,11 +10633,39 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_OFST 156
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_LEN 16
-/* Set an action for all packets matching this filter. The DPDK driver and dpdk
- * f/w variant use their own specific delivery structures, which are documented
- * in the DPDK Firmware Driver Interface (SF-119419-TC). Requesting anything
- * other than MATCH_ACTION_NONE when the NIC is running another f/w variant
- * will cause the filter insertion to fail with ENOTSUP.
+/* Flags controlling mutations of the user_mark and user_flag fields of
+ * matching packets, with logic as follows: if (req.MATCH_BITOR_FLAG == 1)
+ * user_flag = req.MATCH_SET_FLAG bit_or user_flag; else user_flag =
+ * req.MATCH_SET_FLAG; if (req.MATCH_SET_MARK == 0) user_mark = 0; else if
+ * (req.MATCH_BITOR_MARK == 1) user_mark = req.MATCH_SET_MARK bit_or user_mark;
+ * else user_mark = req.MATCH_SET_MARK; N.B. These flags overlap with the
+ * MATCH_ACTION field, which is deprecated in favour of this field. For the
+ * cases where these flags induce a valid encoding of the MATCH_ACTION field,
+ * the semantics agree.
+ */
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_LBN 0
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_LBN 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_LBN 2
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_LBN 3
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_WIDTH 1
+/* Deprecated: the overlapping MATCH_ACTION_FLAGS field exposes all of the
+ * functionality of this field in an ABI-backwards-compatible manner, and
+ * should be used instead. Any future extensions should be made to the
+ * MATCH_ACTION_FLAGS field, and not to this field. Set an action for all
+ * packets matching this filter. The DPDK driver and (on EF10) dpdk f/w variant
+ * use their own specific delivery structures, which are documented in the DPDK
+ * Firmware Driver Interface (SF-119419-TC). Requesting anything other than
+ * MATCH_ACTION_NONE on an EF10 NIC running another f/w variant will cause the
+ * filter insertion to fail with ENOTSUP.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_OFST 172
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_LEN 4
@@ -10164,6 +10756,10 @@
  * frames (Medford only)
  */
 #define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_ENCAP_RX_MATCHES 0x4
+/* enum: read the list of supported matches for the encapsulation detection
+ * rules inserted by MC_CMD_VNIC_ENCAP_RULE_ADD. (ef100 and later)
+ */
+#define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES 0x5
 
 /* MC_CMD_GET_PARSER_DISP_INFO_OUT msgresponse */
 #define	MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMIN 8
@@ -10198,6 +10794,7 @@
 /* bitfield of filter insertion restrictions */
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_LBN 0
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_WIDTH 1
 
@@ -10243,6 +10840,34 @@
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_OFST 32
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_LEN 4
 
+/* MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT msgresponse: This response is
+ * returned if a MC_CMD_GET_PARSER_DISP_INFO_IN request is sent with OP value
+ * OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES. It contains information about the
+ * supported match types that can be used in the encapsulation detection rules
+ * inserted by MC_CMD_VNIC_ENCAP_RULE_ADD.
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMIN 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX 252
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LEN(num) (8+4*(num))
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_NUM(len) (((len)-8)/4)
+/* The op code OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES is returned. */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_OFST 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_PARSER_DISP_INFO_IN/OP */
+/* number of supported match types */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_OFST 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_LEN 4
+/* array of supported match types (valid MATCH_FLAGS values for
+ * MC_CMD_VNIC_ENCAP_RULE_ADD) sorted in decreasing priority order
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_OFST 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MINNUM 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM 61
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM_MCDI2 253
+
 
 /***********************************/
 /* MC_CMD_PARSER_DISP_RW
@@ -10388,9 +11013,15 @@
 
 /* MC_CMD_GET_PORT_ASSIGNMENT_OUT msgresponse */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN 4
-/* Identifies the port assignment for this function. */
+/* Identifies the port assignment for this function. On EF100, it is possible
+ * for the function to have no network port assigned (either because it is not
+ * yet configured, or assigning a port to a given function personality makes no
+ * sense - e.g. virtio-blk), in which case the return value is NULL_PORT.
+ */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_OFST 0
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_LEN 4
+/* enum: Special value to indicate no port is assigned to a function. */
+#define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_NULL_PORT 0xffffffff
 
 
 /***********************************/
@@ -10497,6 +11128,7 @@
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_MAX_LEN 4
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_LBN 0
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF. */
@@ -10526,6 +11158,7 @@
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_MAX_LEN 4
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_LBN 0
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF, or 0 for no change, or
@@ -10619,10 +11252,13 @@
 /* Combined metadata field. */
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_LEN 4
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_WIDTH 8
 /* TXDPCPU raw table data for queue. */
@@ -10645,14 +11281,19 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LO_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_HI_OFST 60
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_LBN 40
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_WIDTH 24
 /* RXDPCPU raw table data for queue. */
@@ -10675,12 +11316,16 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LO_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_HI_OFST 92
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_WIDTH 8
 
@@ -10832,38 +11477,55 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_WIDTH 31
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_WIDTH 28
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_WIDTH 29
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_LBN 9
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_WIDTH 23
 
@@ -10886,32 +11548,46 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_LBN 10
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_WIDTH 22
 
@@ -11063,62 +11739,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11179,8 +11884,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11228,8 +11935,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11283,62 +11992,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11399,8 +12137,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11448,8 +12188,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11497,70 +12239,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11624,62 +12402,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11740,8 +12547,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11789,8 +12598,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11838,70 +12649,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11990,62 +12837,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12106,8 +12982,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12155,8 +13033,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12204,70 +13084,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12364,62 +13280,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12480,8 +13425,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12529,8 +13476,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12578,70 +13527,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12743,62 +13728,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12859,8 +13873,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12908,8 +13924,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12957,70 +13975,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -13128,190 +14182,2248 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
 
-
-/***********************************/
-/* MC_CMD_V2_EXTN
- * Encapsulation for a v2 extended command
+/* MC_CMD_GET_CAPABILITIES_V7_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LEN 152
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_V2_EXTN 0x7f
-
-/* MC_CMD_V2_EXTN_IN msgrequest */
-#define	MC_CMD_V2_EXTN_IN_LEN 4
-/* the extended command number */
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
-/* the actual length of the encapsulated command (which is not in the v1
- * header)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
-/* Type of command/response */
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
-/* enum: MCDI command directed to or response originating from the MC. */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
-/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
- * are not defined.
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_ALLOC
- * Allocate a pacer bucket (for qau rp or a snapper test)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
-#undef	MC_CMD_0xb2_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
-
-/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_FREE
- * Free a pacer bucket
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_FREE 0xb3
-#undef	MC_CMD_0xb3_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
-
-/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_INIT
- * Initialise pacer bucket with a given rate
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
  */
-#define	MC_CMD_TCM_BUCKET_INIT 0xb4
-#undef	MC_CMD_0xb4_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
-/* the desired maximum fill level */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_TXQ_INIT
- * Initialise txq in pacer with given options or set options
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT 0xb5
-#undef	MC_CMD_0xb5_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
-
-/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
-
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+
+/* MC_CMD_GET_CAPABILITIES_V8_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LEN 160
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_HI_OFST 156
+
+/* MC_CMD_GET_CAPABILITIES_V9_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LEN 184
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+
+/* MC_CMD_GET_CAPABILITIES_V10_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LEN 192
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+/* A bitmap of the queue sizes the device can provide, where bit N being set
+ * indicates that 2**N is a valid size. The device may be limited in the number
+ * of different queue sizes that can exist simultaneously, so a bit being set
+ * here does not guarantee that an attempt to create a queue of that size will
+ * succeed.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_OFST 184
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_LEN 4
+/* A bitmap of queue sizes that are always available, in the same format as
+ * SUPPORTED_QUEUE_SIZES. Attempting to create a queue with one of these sizes
+ * will never fail due to unavailability of the requested size.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
+
+
+/***********************************/
+/* MC_CMD_V2_EXTN
+ * Encapsulation for a v2 extended command
+ */
+#define	MC_CMD_V2_EXTN 0x7f
+
+/* MC_CMD_V2_EXTN_IN msgrequest */
+#define	MC_CMD_V2_EXTN_IN_LEN 4
+/* the extended command number */
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
+/* the actual length of the encapsulated command (which is not in the v1
+ * header)
+ */
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
+/* Type of command/response */
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
+/* enum: MCDI command directed to or response originating from the MC. */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
+/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
+ * are not defined.
+ */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_ALLOC
+ * Allocate a pacer bucket (for qau rp or a snapper test)
+ */
+#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
+#undef	MC_CMD_0xb2_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
+
+/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_FREE
+ * Free a pacer bucket
+ */
+#define	MC_CMD_TCM_BUCKET_FREE 0xb3
+#undef	MC_CMD_0xb3_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
+
+/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_INIT
+ * Initialise pacer bucket with a given rate
+ */
+#define	MC_CMD_TCM_BUCKET_INIT 0xb4
+#undef	MC_CMD_0xb4_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
+/* the desired maximum fill level */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_TXQ_INIT
+ * Initialise txq in pacer with given options or set options
+ */
+#define	MC_CMD_TCM_TXQ_INIT 0xb5
+#undef	MC_CMD_0xb5_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
+
+/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
+
 /* MC_CMD_TCM_TXQ_INIT_OUT msgresponse */
 #define	MC_CMD_TCM_TXQ_INIT_OUT_LEN 0
 
@@ -13387,6 +16499,7 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
 /* The number of VLAN tags to allow for attached v-ports. For VLAN aggregators,
@@ -13481,8 +16594,10 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_LBN 1
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -13494,8 +16609,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 
@@ -13542,8 +16659,10 @@
 /* Flags controlling v-adaptor creation */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_WIDTH 1
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 1
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
 /* The number of VLAN tags to strip on receive */
@@ -13555,8 +16674,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 /* The MAC address to assign to this v-adaptor */
@@ -13677,8 +16798,10 @@
 /* The target function to modify. */
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_LEN 4
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_LBN 0
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_WIDTH 16
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_LBN 16
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_WIDTH 16
 
@@ -13792,12 +16915,68 @@
  * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_SHARED 0x1
-/* Number of queues spanned by this context, in the range 1-64; valid offsets
- * in the indirection table will be in the range 0 to NUM_QUEUES-1.
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_OFST 8
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_LEN 4
 
+/* MC_CMD_RSS_CONTEXT_ALLOC_V2_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_LEN 16
+/* The handle of the owning upstream port */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_LEN 4
+/* The type of context to allocate */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_OFST 4
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_LEN 4
+/* enum: Allocate a context for exclusive use. The key and indirection table
+ * must be explicitly configured.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EXCLUSIVE 0x0
+/* enum: Allocate a context for shared use; this will spread across a range of
+ * queues, but the key and indirection table are pre-configured and may not be
+ * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_SHARED 0x1
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_OFST 8
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_LEN 4
+/* Size of indirection table to be allocated to this context from the pool.
+ * Must be a power of 2. The minimum and maximum table size can be queried
+ * using MC_CMD_GET_CAPABILITIES_V9. If there is not enough space remaining in
+ * the common pool to allocate the requested table size, due to allocating
+ * table space to other RSS contexts, then the command will fail with
+ * MC_CMD_ERR_ENOSPC.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_OFST 12
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_LEN 4
+
 /* MC_CMD_RSS_CONTEXT_ALLOC_OUT msgresponse */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN 4
 /* The handle of the new RSS context. This should be considered opaque to the
@@ -13875,7 +17054,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_TABLE
- * Set the indirection table for an RSS context.
+ * Set the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_SET_TABLE 0xa2
 #undef	MC_CMD_0xa2_PRIVILEGE_CTG
@@ -13897,7 +17078,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_GET_TABLE
- * Get the indirection table for an RSS context.
+ * Get the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE 0xa3
 #undef	MC_CMD_0xa3_PRIVILEGE_CTG
@@ -13917,6 +17100,93 @@
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE_OUT_INDIRECTION_TABLE_LEN 128
 
 
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE
+ * Write a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_SET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE 0x13e
+#undef	MC_CMD_0x13e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMIN 8
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LEN(num) (4+4*(num))
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_NUM(len) (((len)-4)/4)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array of index-value pairs to be written to the table. Structure is
+ * MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_LEN 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM 62
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM_MCDI2 254
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT_LEN 0
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY structuredef */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_LEN 4
+/* The index of the table entry to be written. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LBN 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_WIDTH 16
+/* The value to write into the table entry. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_OFST 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LBN 16
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_WIDTH 16
+
+
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_READ_TABLE
+ * Read a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_GET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE 0x13f
+#undef	MC_CMD_0x13f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13f_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMIN 6
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LEN(num) (4+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_NUM(len) (((len)-4)/2)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array containing the indices of the entries to be read. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM 124
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM_MCDI2 508
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMIN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LEN(num) (0+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_NUM(len) (((len)-0)/2)
+/* A buffer containing the requested entries read from the table. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM 126
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM_MCDI2 510
+
+
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_FLAGS
  * Set various control flags for an RSS context.
@@ -13945,26 +17215,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14004,26 +17285,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14275,8 +17567,10 @@
 /* Flags requesting what should be changed. */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_WIDTH 1
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_LBN 1
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -14288,8 +17582,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_WIDTH 16
 /* The number of MAC addresses to add */
@@ -14304,6 +17600,7 @@
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_LEN 4
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_WIDTH 1
 
@@ -14383,8 +17680,10 @@
 #define	MC_CMD_SET_RXDP_CONFIG_IN_LEN 4
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_LEN 4
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_WIDTH 2
 /* enum: pad to 64 bytes */
@@ -14414,8 +17713,10 @@
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_LEN 4
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_LEN 4
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_WIDTH 2
 /*             Enum values, see field(s): */
@@ -14564,6 +17865,7 @@
  */
 #define	MC_CMD_DPCPU_RPC_IN_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_LBN 8
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_WIDTH 8
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_TXDPCPU_READ 0x6 /* enum */
@@ -14575,14 +17877,19 @@
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SELF_TEST 0x4a /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_CSR_ACCESS 0x4c /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SET_MC_REPLAY_CNTXT 0x4d /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_WIDTH 240
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_STOP_RETURN_RESULT 0x0 /* enum */
@@ -14590,17 +17897,22 @@
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE_READ 0x3 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_PIPELINED_READ 0x4 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_LBN 80
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_CUT_THROUGH 0x1 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD_FIRST 0x3 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_WDATA_OFST 12
@@ -14619,8 +17931,10 @@
 /* DATA */
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_LBN 32
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_OUT_RDATA_OFST 12
@@ -15122,6 +18436,7 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15, Huntington) */
@@ -15248,6 +18563,7 @@
 /* enum: DFE Tap5 - retimer hostside (Medford2 with DS250x retimer (-15 - 15))
  */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_DFE_TAP5_RT_HS 0x2d
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15255,12 +18571,16 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15282,20 +18602,26 @@
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15323,6 +18649,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TX Amplitude (Huntington, Medford, Medford2) */
@@ -15363,6 +18690,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_ADV_RT_HS 0x11
 /* enum: Post-cursor Tap (Retimer Hostside) */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_DLY_RT_HS 0x12
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15370,10 +18698,13 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_WIDTH 8
 
@@ -15395,18 +18726,23 @@
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15447,8 +18783,10 @@
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_WIDTH 1
 /* Scan duration / cycle count */
@@ -15489,8 +18827,10 @@
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_WIDTH 1
 
@@ -15644,6 +18984,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15) */
@@ -15668,6 +19009,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQC 0x9
 /* enum: CTLE EQ Resistor (DC Gain) */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQRES 0xa
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 5
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15687,10 +19029,13 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_14 0xe /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_15 0xf /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_ALL 0x10 /* enum */
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 10
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15712,20 +19057,26 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 5
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 2
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15753,6 +19104,7 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TxMargin (PIPE) */
@@ -15765,12 +19117,15 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_C0 0x3
 /* enum: De-emphasis coefficient C(+1) (PIPE) */
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_CP1 0x4
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 12
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -16335,8 +19690,10 @@
 /* configuration flags */
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_LBN 1
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16379,8 +19736,10 @@
 /* configuration flags */
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_LBN 1
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16501,6 +19860,7 @@
 /* configuration flags */
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16543,6 +19903,7 @@
 /* configuration flags */
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16576,6 +19937,7 @@
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RX_QUEUE_LEN 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_LEN 4
+#define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_LBN 0
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_WIDTH 1
 
@@ -16699,6 +20061,7 @@
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_LEN 8
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_LEN 4
+#define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_LBN 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_WIDTH 1
 /* New mode (TLV_PORT_MODE_*) to set, if override enabled */
@@ -16792,8 +20155,10 @@
  */
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_WIDTH 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_VF_NULL 0xffff /* enum */
@@ -16866,8 +20231,10 @@
  */
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_LEN 4
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_WIDTH 16
 /* New link state mode to be set */
@@ -16986,8 +20353,10 @@
 /* For VFS_OF_PF specify the PF, for ONE specify the target function */
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_WIDTH 16
 /* Privileges to be added to the target functions. For privilege definitions
@@ -17342,34 +20711,49 @@
 /* fields to include in match criteria */
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_LBN 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_LBN 1
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_LBN 2
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_LBN 3
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_LBN 4
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_LBN 5
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_LBN 10
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_LBN 11
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_LBN 12
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_LBN 13
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_LBN 14
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_WIDTH 1
 /* remote MAC address to match (as bytes in network order) */
@@ -17792,6 +21176,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_WIDTH 1
 /* The number of entries in the ENTRIES array */
@@ -17811,6 +21196,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_WIDTH 1
 
@@ -18871,10 +22257,13 @@
 /* Flags specifying what type of security features are being set */
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_LBN 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_LBN 1
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_LBN 31
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_WIDTH 1
 
@@ -18909,6 +22298,7 @@
 #define	MC_CMD_TSA_INFO_IN_LEN 4
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_OP_WIDTH 16
 /* enum: Information about recently discovered local IP address of the adapter
@@ -18946,10 +22336,13 @@
  */
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_LBN 8
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_LBN 16
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_WIDTH 8
 /* enum: ARP reply sent out of the physical port */
@@ -18960,8 +22353,10 @@
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_GRATUITOUS_ARP 0x2
 /* enum: DHCP ACK packet received on the physical port */
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_DHCP_ACK 0x3
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_LBN 24
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_LBN 25
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_WIDTH 7
 /* IPV4 address retrieved from the sampled packets. This field is relevant only
@@ -19001,18 +22396,25 @@
 /* Additional metadata describing the sampled packet */
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_LBN 8
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_LBN 9
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_WIDTH 7
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_WIDTH 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_LBN 17
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_LBN 18
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_WIDTH 1
 /* 128-byte raw prefix of the sampled packet which includes the ethernet
@@ -19034,6 +22436,7 @@
 #define	MC_CMD_TSA_INFO_IN_UNBIND_LEN 12
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_UNBIND_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_WIDTH 16
 /* Type of the unbind attempt. */
@@ -19072,6 +22475,7 @@
 /* sub-operation code info */
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_HOST_INFO_IN_OP_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_LBN 0
 #define	MC_CMD_HOST_INFO_IN_OP_WIDTH 16
 /* enum: Read a 16-byte unique host identifier from the adapter. This UUID
@@ -19138,6 +22542,7 @@
 /* sub-operation code info */
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSAN_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSAN_INFO_IN_OP_WIDTH 16
 /* enum: Read configuration parameters and IDs that uniquely identify an
@@ -19157,10 +22562,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19181,10 +22589,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19270,8 +22681,10 @@
 /* Parameters describing the statistics operation */
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_LEN 4
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_LBN 0
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_WIDTH 1
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_LBN 1
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_WIDTH 1
 /* Counter ID list specification type */
@@ -19458,6 +22871,7 @@
  */
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_OFST 0
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LEN 4
+#define	MC_TSA_IPV4_ITEM_PORT_IDX_OFST 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_LBN 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_WIDTH 8
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LBN 0
@@ -19488,6 +22902,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_WIDTH 16
 /* enum: Request that the adapter verifies that the IPv4 addresses supplied are
@@ -19516,6 +22931,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to validate. */
@@ -19545,6 +22961,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to remove. */
@@ -19579,6 +22996,7 @@
 /* sub-operation code info */
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_SECURE_NIC_INFO_IN_OP_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_LBN 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_WIDTH 16
 /* enum: Get the status of various security settings, all signed along with a
@@ -19811,6 +23229,12 @@
  * FRU_INFORMATION partition. Attempts to write to read-only FRUs are rejected.
  */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE 0x7
+/* enum: Read UDID Vendor Specific ID from SUC persistent storage. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ 0x8
+/* enum: Write UDID Vendor Specific ID to SUC persistent storage for use in
+ * SMBus ARP.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE 0x9
 
 /* MC_CMD_SUC_MANFTEST_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_OUT_LEN 0
@@ -19867,12 +23291,16 @@
 /* The combined status of the calibration operation. */
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_LBN 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_LBN 1
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_LBN 2
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_WIDTH 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_LBN 6
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_WIDTH 2
 
@@ -19936,6 +23364,34 @@
 /* MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT_LEN 0
 
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_LEN 4
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_READ.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_LEN 8
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_OFST 4
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT_LEN 0
+
 
 /***********************************/
 /* MC_CMD_GET_CERTIFICATE
@@ -20112,10 +23568,13 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_NUM(len) (((len)-8)/8)
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_LEN 4
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_LBN 1
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_LBN 31
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_WIDTH 1
 /* The number of rows present in this response. */
@@ -20128,12 +23587,16 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MINNUM 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM 30
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM_MCDI2 126
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_WIDTH 6
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_LBN 6
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_LBN 7
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_LBN 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_WIDTH 24
 /* The time of the LTSSM transition. Times are reported as fractional
@@ -20184,14 +23647,19 @@
  */
 #define	TELEMETRY_CONFIG_FLAGS_OFST 0
 #define	TELEMETRY_CONFIG_FLAGS_LEN 4
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_LBN 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_LBN 1
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_LBN 2
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_LBN 3
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_RESERVED1_OFST 0
 #define	TELEMETRY_CONFIG_RESERVED1_LBN 4
 #define	TELEMETRY_CONFIG_RESERVED1_WIDTH 28
 #define	TELEMETRY_CONFIG_FLAGS_LBN 0
@@ -20320,24 +23788,34 @@
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LEN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LO_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_HI_OFST 4
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_LBN 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_LBN 1
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_LBN 2
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_LBN 3
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_LBN 4
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_LBN 5
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_LBN 6
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_LBN 7
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_LBN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_LBN 9
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_WIDTH 1
 
@@ -20534,36 +24012,24 @@
 
 /* MC_CMD_GET_VPD_IN msgresponse */
 #define	MC_CMD_GET_VPD_IN_LEN 4
-/* To request only VPD tags from a certain origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_OFST 0
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LEN 2
-/* enum: Return all VPD regardless of origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_ALL 0x0
-/* enum: Return only VPD tags generated by MCFW (not stored in NVRAM) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LIVE 0x1
-/* enum: Return only VPD tags stored in NVRAM (not generated by MCFW) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_NVRAM 0x2
 /* VPD address to start from. In case VPD is longer than MCDI buffer
  * (unlikely), user can make multiple calls with different starting addresses.
  */
-#define	MC_CMD_GET_VPD_IN_ADDR_OFST 2
-#define	MC_CMD_GET_VPD_IN_ADDR_LEN 2
+#define	MC_CMD_GET_VPD_IN_ADDR_OFST 0
+#define	MC_CMD_GET_VPD_IN_ADDR_LEN 4
 
 /* MC_CMD_GET_VPD_OUT msgresponse */
-#define	MC_CMD_GET_VPD_OUT_LENMIN 5
+#define	MC_CMD_GET_VPD_OUT_LENMIN 0
 #define	MC_CMD_GET_VPD_OUT_LENMAX 252
 #define	MC_CMD_GET_VPD_OUT_LENMAX_MCDI2 1020
-#define	MC_CMD_GET_VPD_OUT_LEN(num) (4+1*(num))
-#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-4)/1)
-/* Length of VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATALEN_OFST 0
-#define	MC_CMD_GET_VPD_OUT_DATALEN_LEN 4
+#define	MC_CMD_GET_VPD_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-0)/1)
 /* VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATA_OFST 4
+#define	MC_CMD_GET_VPD_OUT_DATA_OFST 0
 #define	MC_CMD_GET_VPD_OUT_DATA_LEN 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 248
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1016
+#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 0
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 252
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1020
 
 
 /***********************************/
@@ -20599,12 +24065,16 @@
 /* General status */
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_LEN 4
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_LBN 0
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_WIDTH 2
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_LBN 2
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_LBN 3
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_LBN 4
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_WIDTH 1
 
@@ -20632,59 +24102,55 @@
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_OFST 24
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_LEN 4
 
-/* EF100_MCDI_EVENT structuredef: The structure of an MCDI_EVENT on EF100
- * platforms
+
+/***********************************/
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN
+ * System lockdown, when enabled firmware updates are blocked.
  */
-#define	EF100_MCDI_EVENT_LEN 8
-/* Defined by QMDA. Will be 1 for all SFC events */
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_LBN 0
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_WIDTH 1
-/* Defined by QMDA. The phase bit, changes each time round the event ring */
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_LBN 1
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
-/* Defined by QDMA. Meaning unclear. */
-#define	EF100_MCDI_EVENT_EV_ERROR_LBN 2
-#define	EF100_MCDI_EVENT_EV_ERROR_WIDTH 1
-/* Defined by QMDA. Indicates a descriptor was consumed. */
-#define	EF100_MCDI_EVENT_EV_DESC_USED_LBN 3
-#define	EF100_MCDI_EVENT_EV_DESC_USED_WIDTH 1
-/* Indicates the top-level type of the event. Event types are as documented in
- * SF-119689-TC and defined in events.yml. For MCDI events it's always
- * EF100_EV_MCDI. HW can generate other event type for its events.
- */
-#define	EF100_MCDI_EVENT_EV_TYPE_LBN 4
-#define	EF100_MCDI_EVENT_EV_TYPE_WIDTH 4
-#define	EF100_MCDI_EVENT_CODE_OFST 1
-#define	EF100_MCDI_EVENT_CODE_LEN 1
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/CODE */
-#define	EF100_MCDI_EVENT_CODE_LBN 8
-#define	EF100_MCDI_EVENT_CODE_WIDTH 8
-/* Data associated with PTP events which doesn't fit into the main DATA field
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN 0x16f
+#undef	MC_CMD_0x16f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16f_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_IN msgrequest: This MCDI command is to enable
+ * only because lockdown can only be disabled by a PMCI command or a cold reset
+ * of the system.
  */
-#define	EF100_MCDI_EVENT_PTP_DATA_OFST 2
-#define	EF100_MCDI_EVENT_PTP_DATA_LEN 1
-#define	EF100_MCDI_EVENT_PTP_DATA_LBN 16
-#define	EF100_MCDI_EVENT_PTP_DATA_WIDTH 8
-/* Alias for PTP_DATA. Nobody uses SRC to mean the source of anything, but
- * there's code that uses it to refer to ptp data
- */
-#define	EF100_MCDI_EVENT_SRC_OFST 2
-#define	EF100_MCDI_EVENT_SRC_LEN 1
-#define	EF100_MCDI_EVENT_SRC_LBN 16
-#define	EF100_MCDI_EVENT_SRC_WIDTH 8
-/* Set if this message continues into another event */
-#define	EF100_MCDI_EVENT_CONT_LBN 24
-#define	EF100_MCDI_EVENT_CONT_WIDTH 1
-#define	EF100_MCDI_EVENT_LEVEL_LBN 25
-#define	EF100_MCDI_EVENT_LEVEL_WIDTH 3
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/LEVEL */
-/* Data associated with this event. Format depends on the event code. */
-#define	EF100_MCDI_EVENT_DATA_OFST 4
-#define	EF100_MCDI_EVENT_DATA_LEN 4
-#define	EF100_MCDI_EVENT_DATA_LBN 32
-#define	EF100_MCDI_EVENT_DATA_WIDTH 32
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_IN_LEN 0
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT msgresponse */
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_TEST_FEATURES
+ * This command returns device details knowledge of which may be required by
+ * test infrastructure. Although safe, it is not intended to be used by
+ * production drivers, and the structure returned intentionally has no public
+ * documentation.
+ */
+#define	MC_CMD_GET_TEST_FEATURES 0x1ac
+#undef	MC_CMD_0x1ac_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ac_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_TEST_FEATURES_IN msgrequest: Request test features. */
+#define	MC_CMD_GET_TEST_FEATURES_IN_LEN 0
+
+/* MC_CMD_GET_TEST_FEATURE_OUT msgresponse */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMIN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX 252
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LEN(num) (0+4*(num))
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_NUM(len) (((len)-0)/4)
+/* Test-specific NIC information. Production drivers must treat this as opaque.
+ * The layout is defined in the private TEST_FEATURES_LAYOUT structure.
+ */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_OFST 0
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_LEN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MINNUM 1
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM 63
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM_MCDI2 255
 
 /* CLOCK_INFO structuredef: Information about a single hardware clock */
 #define	CLOCK_INFO_LEN 28
@@ -20710,6 +24176,7 @@
 /* Assorted flags */
 #define	CLOCK_INFO_FLAGS_OFST 2
 #define	CLOCK_INFO_FLAGS_LEN 2
+#define	CLOCK_INFO_SETTABLE_OFST 2
 #define	CLOCK_INFO_SETTABLE_LBN 0
 #define	CLOCK_INFO_SETTABLE_WIDTH 1
 #define	CLOCK_INFO_FLAGS_LBN 16
@@ -20754,4 +24221,1240 @@
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM 9
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM_MCDI2 36
 
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_ADD
+ * Add a rule for detecting encapsulations in the VNIC stage. Currently this only affects checksum validation in VNIC RX - on TX the send descriptor explicitly specifies encapsulation. These rules are per-VNIC, i.e. only apply to the current driver. If a rule matches, then the packet is considered to have the corresponding encapsulation type, and the inner packet is parsed. It is up to the driver to ensure that overlapping rules are not inserted. (If a packet would match multiple rules, a random one of them will be used.) A rule with the exact same match criteria may not be inserted twice (EALREADY). Only a limited number MATCH_FLAGS values are supported, use MC_CMD_GET_PARSER_DISP_INFO with OP OP_GET_SUPPORTED_VNIC_ENCAP_RULE_MATCHES to get a list of supported combinations. Each driver may only have a limited set of active rules - returns ENOSPC if the caller's table is full.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD 0x16d
+#undef	MC_CMD_0x16d_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16d_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN 36
+/* Set to MAE_MPORT_SELECTOR_ASSIGNED. In the future this may be relaxed. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_LEN 4
+/* Any non-zero bits other than the ones named below or an unsupported
+ * combination will cause the NIC to return EOPNOTSUPP. In the future more
+ * flags may be added.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_LEN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN 3
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_WIDTH 1
+/* Only if MATCH_ETHER_TYPE is set. Ethertype value as bytes in network order.
+ * Currently only IPv4 (0x0800) and IPv6 (0x86DD) ethertypes may be used.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_OFST 8
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_LEN 2
+/* Only if MATCH_OUTER_VLAN is set. VID value as bytes in network order.
+ * (Deprecated)
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_LBN 80
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WIDTH 12
+/* Only if MATCH_OUTER_VLAN is set. Aligned wrapper for OUTER_VLAN_VID. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_LEN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_WIDTH 12
+/* Only if MATCH_DST_IP is set. IP address as bytes in network order. In the
+ * case of IPv4, the IP should be in the first 4 bytes and all other bytes
+ * should be zero.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_OFST 12
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN 16
+/* Only if MATCH_IP_PROTO is set. Currently only UDP proto (17) may be used. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_OFST 28
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_LEN 1
+/* Actions that should be applied to packets match the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_LEN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_WIDTH 1
+/* Only if MATCH_DST_PORT is set. Port number as bytes in network order. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_OFST 30
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_LEN 2
+/* Resulting encapsulation type, as per MAE_MCDI_ENCAP_TYPE enumeration. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_OFST 32
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN 4
+/* Handle to inserted rule. Used for removing the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE
+ * Remove a VNIC encapsulation rule. Packets which would have previously matched the rule will then be considered as unencapsulated. Returns EALREADY if the input HANDLE doesn't correspond to an existing rule.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE 0x16e
+#undef	MC_CMD_0x16e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN 4
+/* Handle which was returned by MC_CMD_VNIC_ENCAP_RULE_ADD. */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN 0
+
+/* UUID structuredef: An RFC4122 standard UUID. The values here are stored in
+ * the endianness specified by the RFC; users should ignore the broken-out
+ * fields and instead do straight memory copies to ensure correct ordering.
+ */
+#define	UUID_LEN 16
+#define	UUID_TIME_LOW_OFST 0
+#define	UUID_TIME_LOW_LEN 4
+#define	UUID_TIME_LOW_LBN 0
+#define	UUID_TIME_LOW_WIDTH 32
+#define	UUID_TIME_MID_OFST 4
+#define	UUID_TIME_MID_LEN 2
+#define	UUID_TIME_MID_LBN 32
+#define	UUID_TIME_MID_WIDTH 16
+#define	UUID_TIME_HI_LBN 52
+#define	UUID_TIME_HI_WIDTH 12
+#define	UUID_VERSION_LBN 48
+#define	UUID_VERSION_WIDTH 4
+#define	UUID_RESERVED_LBN 64
+#define	UUID_RESERVED_WIDTH 2
+#define	UUID_CLK_SEQ_LBN 66
+#define	UUID_CLK_SEQ_WIDTH 14
+#define	UUID_NODE_OFST 10
+#define	UUID_NODE_LEN 6
+#define	UUID_NODE_LBN 80
+#define	UUID_NODE_WIDTH 48
+
+/* MC_CMD_DEVEL_DUMP_VI_ENTRY structuredef */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_LEN 16
+/* Type of entry */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_C2H 0x0 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_H2C 0x1 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_C2H 0x2 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_H2C 0x3 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_C2H 0x4 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_H2C 0x5 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_WRB 0x6 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_PFTCH 0x7 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_QTBL 0x100 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_C2H_QTBL 0x101 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_VIO 0x10a /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_WIDTH 32
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LBN 32
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_WIDTH 32
+/* Size of entry data */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_OFST 8
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LBN 64
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_WIDTH 32
+/* Offset of entry data from start of MCDI message response payload */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_OFST 12
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LBN 96
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DEVEL_DUMP_VI
+ * Dump various parts of the hardware's state for a VI.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI 0x1b5
+#undef	MC_CMD_0x1b5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1b5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_DEVEL_DUMP_VI_IN msgrequest */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_LEN 4
+/* Absolute queue id of queue to dump state for */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_LEN 4
+
+/* MC_CMD_DEVEL_DUMP_VI_OUT msgresponse */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMIN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX_MCDI2 1012
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_NUM(len) (((len)-0)/1)
+/* Number of dump entries returned */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_WIDTH 8
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM_MCDI2 1020
+/* Array of MC_CMD_DEVEL_DUMP_VI_ENTRY structures of length NUM_ENTRIES */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_LEN 16
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM 15
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM_MCDI2 63
+
+/* FUNCTION_PERSONALITY structuredef: The meanings of the personalities are
+ * defined in SF-120734-TC with more information in SF-122717-TC.
+ */
+#define	FUNCTION_PERSONALITY_LEN 4
+#define	FUNCTION_PERSONALITY_ID_OFST 0
+#define	FUNCTION_PERSONALITY_ID_LEN 4
+/* enum: Function has no assigned personality */
+#define	FUNCTION_PERSONALITY_NULL 0x0
+/* enum: Function has an EF100-style function control window and VI windows
+ * with both EF100 and vDPA doorbells.
+ */
+#define	FUNCTION_PERSONALITY_EF100 0x1
+/* enum: Function has virtio net device configuration registers and doorbells
+ * for virtio queue pairs.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_NET 0x2
+/* enum: Function has virtio block device configuration registers and a
+ * doorbell for a single virtqueue.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_BLK 0x3
+/* enum: Function is a Xilinx acceleration device - management function */
+#define	FUNCTION_PERSONALITY_ACCEL_MGMT 0x4
+/* enum: Function is a Xilinx acceleration device - user function */
+#define	FUNCTION_PERSONALITY_ACCEL_USR 0x5
+#define	FUNCTION_PERSONALITY_ID_LBN 0
+#define	FUNCTION_PERSONALITY_ID_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_FEATURES
+ * Get a list of the virtio features supported by the device.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES 0x168
+#undef	MC_CMD_0x168_PRIVILEGE_CTG
+
+#define	MC_CMD_0x168_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_LEN 4
+/* Type of device to get features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_LEN 4
+/* enum: Reserved. Do not use. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_RESERVED 0x0
+/* enum: Net device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_NET 0x1
+/* enum: Block device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_BLOCK 0x2
+
+/* MC_CMD_VIRTIO_GET_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_LEN 8
+/* Features supported by the device. The result is a bitfield in the format of
+ * the feature bits of the specified device type as defined in the virtIO 1.1
+ * specification ( https://docs.oasis-
+ * open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.pdf )
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LO_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_HI_OFST 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_TEST_FEATURES
+ * Query whether a given set of features is supported. Fails with ENOSUP if the
+ * driver requests a feature the device doesn't support. Fails with EINVAL if
+ * the driver fails to request a feature which the device requires.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES 0x169
+#undef	MC_CMD_0x169_PRIVILEGE_CTG
+
+#define	MC_CMD_0x169_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_LEN 16
+/* Type of device to test features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_OFST 4
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_LEN 4
+/* Features requested. Same format as the returned value from
+ * MC_CMD_VIRTIO_GET_FEATURES.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LO_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_HI_OFST 12
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_INIT_QUEUE
+ * Create a virtio virtqueue. Fails with EALREADY if the queue already exists.
+ * Fails with ENOSUP if a feature is requested that isn't supported. Fails with
+ * EINVAL if a required feature isn't requested, or any other parameter is
+ * invalid.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE 0x16a
+#undef	MC_CMD_0x16a_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16a_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_LEN 68
+/* Type of virtqueue to create. A network rxq and a txq can exist at the same
+ * time on a single VI.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/* enum: A network device receive queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_RXQ 0x0
+/* enum: A network device transmit queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_TXQ 0x1
+/* enum: A block device request queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_BLOCK 0x2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, create the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, create queue on the PF. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_VF_NULL 0xffff
+/* Desired instance. This is the function-local index of the associated VI, not
+ * the virtqueue number as counted by the virtqueue spec.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_LEN 4
+/* Queue size, in entries. Must be a power of two. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_OFST 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_LEN 4
+/* Flags */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_LEN 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_LBN 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_WIDTH 1
+/* Address of the descriptor table in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LO_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_HI_OFST 20
+/* Address of the available ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LO_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_HI_OFST 28
+/* Address of the used ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LO_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_HI_OFST 36
+/* PASID to use on PCIe transactions involving this queue. Ignored if the
+ * USE_PASID flag is not set.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_OFST 40
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_LEN 4
+/* Which MSIX vector to use for this virtqueue, or NO_VECTOR if MSIX should not
+ * be used.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_OFST 44
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_LEN 2
+/* enum: Do not enable interrupts for this virtqueue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NO_VECTOR 0xffff
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_OFST 46
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_LEN 2
+/* Virtio features to apply to this queue. Same format as the in the virtio
+ * spec and in the return from MC_CMD_VIRTIO_GET_FEATURES. Must be a subset of
+ * the features returned from MC_CMD_VIRTIO_GET_FEATURES. Features are per-
+ * queue because with vDPA multiple queues on the same function can be passed
+ * through to different virtual hosts as independent devices.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LO_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_HI_OFST 52
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_OUT/FEATURES */
+/* The inital producer index for this queue's used ring. If this queue is being
+ * created to be migrated into, this should be the FINAL_PIDX value returned by
+ * MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from. Otherwise, it
+ * should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_OFST 56
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_LEN 4
+/* The inital consumer index for this queue's available ring. If this queue is
+ * being created to be migrated into, this should be the FINAL_CIDX value
+ * returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
+ * Otherwise, it should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_OFST 60
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_LEN 4
+/* A MAE_MPORT_SELECTOR defining which mport this queue should be associated
+ * with. Use MAE_MPORT_SELECTOR_ASSIGNED to request the default mport for the
+ * function this queue is being created on.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_OFST 64
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_LEN 4
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_RESP_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_FINI_QUEUE
+ * Destroy a virtio virtqueue
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE 0x16b
+#undef	MC_CMD_0x16b_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16b_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_LEN 8
+/* Type of virtqueue to destroy. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_INIT_QUEUE/MC_CMD_VIRTIO_INIT_QUEUE_REQ/QUEUE_TYPE */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, destroy the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, destroy the queue on the PF. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_VF_NULL 0xffff
+/* Instance to destroy */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_LEN 8
+/* The producer index of the used ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_LEN 4
+/* The consumer index of the available ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET
+ * Get the offset in the BAR of the doorbells for a VI. Doesn't require the
+ * queue(s) to be allocated.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET 0x16c
+#undef	MC_CMD_0x16c_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16c_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ msgrequest */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_LEN 8
+/* Type of device to get information for. Matches the device id as defined by
+ * the virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, query the VI
+ * on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_LEN 2
+/* enum: No VF, query the PF. */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_VF_NULL 0xffff
+/* VI instance to query */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_LEN 8
+/* Offset of RX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_LEN 4
+/* Offset of TX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_OFST 4
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_LEN 4
+
+/* MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_LEN 4
+/* Offset of request doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_LEN 4
+
+/* PCIE_FUNCTION structuredef: Structure representing a PCIe function ID
+ * (interface/PF/VF tuple)
+ */
+#define	PCIE_FUNCTION_LEN 8
+/* PCIe PF function number */
+#define	PCIE_FUNCTION_PF_OFST 0
+#define	PCIE_FUNCTION_PF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_PF_ANY 0xfffe
+/* enum: Value representing invalid (null) function */
+#define	PCIE_FUNCTION_PF_NULL 0xffff
+#define	PCIE_FUNCTION_PF_LBN 0
+#define	PCIE_FUNCTION_PF_WIDTH 16
+/* PCIe VF Function number (PF relative) */
+#define	PCIE_FUNCTION_VF_OFST 2
+#define	PCIE_FUNCTION_VF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_VF_ANY 0xfffe
+/* enum: Function is a PF (when PF != PF_NULL) or invalid function (when PF ==
+ * PF_NULL)
+ */
+#define	PCIE_FUNCTION_VF_NULL 0xffff
+#define	PCIE_FUNCTION_VF_LBN 16
+#define	PCIE_FUNCTION_VF_WIDTH 16
+/* PCIe interface of the function */
+#define	PCIE_FUNCTION_INTF_OFST 4
+#define	PCIE_FUNCTION_INTF_LEN 4
+/* enum: Host PCIe interface */
+#define	PCIE_FUNCTION_INTF_HOST 0x0
+/* enum: Application Processor interface */
+#define	PCIE_FUNCTION_INTF_AP 0x1
+#define	PCIE_FUNCTION_INTF_LBN 32
+#define	PCIE_FUNCTION_INTF_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CREATE
+ * Descriptor proxy functions are abstract devices that forward all request
+ * submitted to the host PCIe function (descriptors submitted to Virtio or
+ * EF100 queues) to be handled on another function (most commonly on the
+ * embedded Application Processor), via EF100 descriptor proxy, memory-to-
+ * memory and descriptor-to-completion mechanisms. Primary user is Virtio-blk
+ * subsystem, see SF-122927-TC. This function allocates a new descriptor proxy
+ * function on the host and assigns a user-defined label. The actual function
+ * configuration is not persisted until the caller configures it with
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN and commits with
+ * MC_CMD_DESC_PROXY_FUNC_COMMIT_IN.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE 0x172
+#undef	MC_CMD_0x172_PRIVILEGE_CTG
+
+#define	MC_CMD_0x172_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LEN 52
+/* PCIe Function ID to allocate (as struct PCIE_FUNCTION). Set to
+ * {PF_ANY,VF_ANY,interface} for "any available function" Set to
+ * {PF_ANY,VF_NULL,interface} for "any available PF"
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LO_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_HI_OFST 4
+/* The personality to set. The meanings of the personalities are defined in
+ * SF-120734-TC with more information in SF-122717-TC. At present, we only
+ * support proxying for VIRTIO_BLK
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_OFST 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_LEN 12
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_LEN 4
+/* Allocated function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_HI_OFST 8
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY
+ * Remove an existing descriptor proxy function. Underlying function
+ * personality and configuration reverts back to factory default. Function
+ * configuration is committed immediately to specified store and any function
+ * ownership is released.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY 0x173
+#undef	MC_CMD_0x173_PRIVILEGE_CTG
+
+#define	MC_CMD_0x173_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LEN 44
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_LEN 40
+/* Store from which to remove function configuration */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_DESC_PROXY_FUNC_COMMIT/MC_CMD_DESC_PROXY_FUNC_COMMIT_IN/STORE */
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT_LEN 0
+
+/* VIRTIO_BLK_CONFIG structuredef: Virtio block device configuration. See
+ * Virtio specification v1.1, Sections 5.2.3 and 6 for definition of feature
+ * bits. See Virtio specification v1.1, Section 5.2.4 (struct
+ * virtio_blk_config) for definition of remaining configuration fields
+ */
+#define	VIRTIO_BLK_CONFIG_LEN 68
+/* Virtio block device features to advertise, per Virtio 1.1, 5.2.3 and 6 */
+#define	VIRTIO_BLK_CONFIG_FEATURES_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_LEN 8
+#define	VIRTIO_BLK_CONFIG_FEATURES_LO_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_HI_OFST 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_LBN 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_LBN 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_LBN 2
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_LBN 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_LBN 5
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_LBN 6
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_LBN 7
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_LBN 9
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_LBN 10
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_LBN 11
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_LBN 12
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_LBN 13
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_LBN 14
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_LBN 28
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_LBN 29
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_LBN 32
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_LBN 33
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_LBN 34
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_LBN 35
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_LBN 36
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_LBN 37
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_LBN 38
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_FEATURES_LBN 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_WIDTH 64
+/* The capacity of the device (expressed in 512-byte sectors) */
+#define	VIRTIO_BLK_CONFIG_CAPACITY_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LEN 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LO_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_HI_OFST 12
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LBN 64
+#define	VIRTIO_BLK_CONFIG_CAPACITY_WIDTH 64
+/* Maximum size of any single segment. Only valid when VIRTIO_BLK_F_SIZE_MAX is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_OFST 16
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LBN 128
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_WIDTH 32
+/* Maximum number of segments in a request. Only valid when
+ * VIRTIO_BLK_F_SEG_MAX is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_OFST 20
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LBN 160
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_WIDTH 32
+/* Disk-style geometry - cylinders. Only valid when VIRTIO_BLK_F_GEOMETRY is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_OFST 24
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LEN 2
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LBN 192
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_WIDTH 16
+/* Disk-style geometry - heads. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_HEADS_OFST 26
+#define	VIRTIO_BLK_CONFIG_HEADS_LEN 1
+#define	VIRTIO_BLK_CONFIG_HEADS_LBN 208
+#define	VIRTIO_BLK_CONFIG_HEADS_WIDTH 8
+/* Disk-style geometry - sectors. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SECTORS_OFST 27
+#define	VIRTIO_BLK_CONFIG_SECTORS_LEN 1
+#define	VIRTIO_BLK_CONFIG_SECTORS_LBN 216
+#define	VIRTIO_BLK_CONFIG_SECTORS_WIDTH 8
+/* Block size of disk. Only valid when VIRTIO_BLK_F_BLK_SIZE is set. */
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_OFST 28
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LBN 224
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_WIDTH 32
+/* Block topology - number of logical blocks per physical block (log2). Only
+ * valid when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_OFST 32
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LEN 1
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LBN 256
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_WIDTH 8
+/* Block topology - offset of first aligned logical block. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_OFST 33
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LEN 1
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LBN 264
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_WIDTH 8
+/* Block topology - suggested minimum I/O size in blocks. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_OFST 34
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LEN 2
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LBN 272
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_WIDTH 16
+/* Block topology - optimal (suggested maximum) I/O size in blocks. Only valid
+ * when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_OFST 36
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LBN 288
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_WIDTH 32
+/* Unused, set to zero. Note that virtio_blk_config.writeback is volatile and
+ * not carried in config data.
+ */
+#define	VIRTIO_BLK_CONFIG_UNUSED0_OFST 40
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LEN 2
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LBN 320
+#define	VIRTIO_BLK_CONFIG_UNUSED0_WIDTH 16
+/* Number of queues. Only valid if the VIRTIO_BLK_F_MQ feature is negotiated.
+ */
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_OFST 42
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LEN 2
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LBN 336
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_WIDTH 16
+/* Maximum discard sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_OFST 44
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LBN 352
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_WIDTH 32
+/* Maximum discard segment number. Only valid if VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_OFST 48
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LBN 384
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_WIDTH 32
+/* Discard sector alignment, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_OFST 52
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LEN 4
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LBN 416
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_WIDTH 32
+/* Maximum write zeroes sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_OFST 56
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LBN 448
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_WIDTH 32
+/* Maximum write zeroes segment number. Only valid if VIRTIO_BLK_F_WRITE_ZEROES
+ * is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_OFST 60
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LBN 480
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_WIDTH 32
+/* Write zeroes request can result in deallocating one or more sectors. Only
+ * valid if VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_OFST 64
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LEN 1
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LBN 512
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_WIDTH 8
+/* Unused, set to zero. */
+#define	VIRTIO_BLK_CONFIG_UNUSED1_OFST 65
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LEN 3
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LBN 520
+#define	VIRTIO_BLK_CONFIG_UNUSED1_WIDTH 24
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET
+ * Set configuration for an existing descriptor proxy function. Configuration
+ * data must match function personality. The actual function configuration is
+ * not persisted until the caller commits with MC_CMD_DESC_PROXY_FUNC_COMMIT_IN
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET 0x174
+#undef	MC_CMD_0x174_PRIVILEGE_CTG
+
+#define	MC_CMD_0x174_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMIN 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LEN(num) (20+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_NUM(len) (((len)-20)/1)
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_LEN 16
+/* Configuration data. Format of configuration data is determined implicitly
+ * from function personality referred to by HANDLE. Currently, only supported
+ * format is VIRTIO_BLK_CONFIG.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM 232
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM_MCDI2 1000
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT
+ * Commit function configuration to non-volatile or volatile store. Once
+ * configuration is applied to hardware (which may happen immediately or on
+ * next function/device reset) a DESC_PROXY_FUNC_CONFIG_SET MCDI event will be
+ * delivered to callers MCDI event queue.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT 0x175
+#undef	MC_CMD_0x175_PRIVILEGE_CTG
+
+#define	MC_CMD_0x175_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_LEN 4
+/* enum: Store into non-volatile (dynamic) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_NON_VOLATILE 0x0
+/* enum: Store into volatile (ephemeral) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_VOLATILE 0x1
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_LEN 4
+/* Generation count to be delivered in an event once configuration becomes live
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_OPEN
+ * Retrieve a handle for an existing descriptor proxy function. Returns an
+ * integer handle, valid until function is deallocated, MC rebooted or power-
+ * cycle. Returns ENODEV if no function with given label exists.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN 0x176
+#undef	MC_CMD_0x176_PRIVILEGE_CTG
+
+#define	MC_CMD_0x176_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LEN 40
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMIN 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LEN(num) (40+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_NUM(len) (((len)-40)/1)
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_LEN 4
+/* PCIe Function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_HI_OFST 8
+/* Function personality */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* Function configuration state */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_OFST 16
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_LEN 4
+/* enum: Function configuration is visible to the host (live) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LIVE 0x0
+/* enum: Function configuration is pending reset */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PENDING 0x1
+/* enum: Function configuration is missing (created, but no configuration
+ * committed)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_UNCONFIGURED 0x2
+/* Generation count to be delivered in an event once the configuration becomes
+ * live (if status is "pending")
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_OFST 24
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_LEN 16
+/* Configuration data corresponding to function personality. Currently, only
+ * supported format is VIRTIO_BLK_CONFIG. Not valid if status is UNCONFIGURED.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM 212
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM_MCDI2 980
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE
+ * Releases a handle for an open descriptor proxy function. If proxying was
+ * enabled on the device, the caller is expected to gracefully stop it using
+ * MC_CMD_DESC_PROXY_FUNC_DISABLE prior to calling this function. Closing an
+ * active device without disabling proxying will result in forced close, which
+ * will put the device into a failed state and signal the host driver of the
+ * error (for virtio, DEVICE_NEEDS_RESET flag would be set on the host side)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE 0x1a1
+#undef	MC_CMD_0x1a1_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a1_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_LEN 4
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT_LEN 0
+
+/* DESC_PROXY_FUNC_MAP structuredef */
+#define	DESC_PROXY_FUNC_MAP_LEN 52
+/* PCIe function ID (as struct PCIE_FUNCTION) */
+#define	DESC_PROXY_FUNC_MAP_FUNC_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_LEN 8
+#define	DESC_PROXY_FUNC_MAP_FUNC_LO_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_HI_OFST 4
+#define	DESC_PROXY_FUNC_MAP_FUNC_LBN 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_WIDTH 64
+/* Function personality */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_OFST 8
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LBN 64
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_WIDTH 32
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	DESC_PROXY_FUNC_MAP_LABEL_OFST 12
+#define	DESC_PROXY_FUNC_MAP_LABEL_LEN 40
+#define	DESC_PROXY_FUNC_MAP_LABEL_LBN 96
+#define	DESC_PROXY_FUNC_MAP_LABEL_WIDTH 320
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENUM
+ * Enumerate existing descriptor proxy functions
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM 0x177
+#undef	MC_CMD_0x177_PRIVILEGE_CTG
+
+#define	MC_CMD_0x177_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_LEN 4
+/* Starting index, set to 0 on first request. See
+ * MC_CMD_DESC_PROXY_FUNC_ENUM_OUT/FLAGS.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMIN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX 212
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX_MCDI2 992
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LEN(num) (4+52*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_NUM(len) (((len)-4)/52)
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_LBN 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_WIDTH 1
+/* Function map, as array of DESC_PROXY_FUNC_MAP */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_LEN 52
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM_MCDI2 19
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE
+ * Enable descriptor proxying for function into target event queue. Returns VI
+ * allocation info for the proxy source function, so that the caller can map
+ * absolute VI IDs from descriptor proxy events back to the originating
+ * function.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE 0x178
+#undef	MC_CMD_0x178_PRIVILEGE_CTG
+
+#define	MC_CMD_0x178_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_LEN 4
+/* Descriptor proxy sink queue (caller function relative). Must be extended
+ * width event queue
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_LEN 8
+/* The number of VIs allocated on the function */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_LEN 4
+/* The base absolute VI number allocated to the function. */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE
+ * Disable descriptor proxying for function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE 0x179
+#undef	MC_CMD_0x179_PRIVILEGE_CTG
+
+#define	MC_CMD_0x179_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_LEN 4
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_ADDR_SPC_ID
+ * Get Address space identifier for use in mem2mem descriptors for a given
+ * target. See SF-120734-TC for details on ADDR_SPC_IDs and mem2mem
+ * descriptors.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID 0x1a0
+#undef	MC_CMD_0x1a0_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a0_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_GET_ADDR_SPC_ID_IN msgrequest */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_LEN 16
+/* Resource type to get ADDR_SPC_ID for */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_LEN 4
+/* enum: Address space ID for host/AP memory DMA over the same interface this
+ * MCDI was called on
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_SELF 0x0
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC 0x1
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value specified by PASID
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC_PASID 0x2
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value of relative VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_REL_VI 0x3
+/* enum: Address space ID for host/AP memory DMA via PCI interface, function
+ * and PASID value of absolute VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_ABS_VI 0x4
+/* enum: Address space ID for host memory DMA via PCI interface and function of
+ * descriptor proxy function specified by HANDLE
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_DESC_PROXY_HANDLE 0x5
+/* enum: Address space ID for DMA to/from MC memory */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_MC_MEM 0x6
+/* enum: Address space ID for DMA to/from other SmartNIC memory (on-chip, DDR)
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_NIC_MEM 0x7
+/* PCIe Function ID (as struct PCIE_FUNCTION). Only valid if TYPE is PCI_FUNC,
+ * PCI_FUNC_PASID or REL_VI.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LO_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_HI_OFST 8
+/* PASID value. Only valid if TYPE is PCI_FUNC_PASID. */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_LEN 4
+/* Relative or absolute VI number. Only valid if TYPE is REL_VI or ABS_VI */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_LEN 4
+/* Descriptor proxy function handle. Only valid if TYPE is DESC_PROXY_HANDLE.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_LEN 4
+
+/* MC_CMD_GET_ADDR_SPC_ID_OUT msgresponse */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_LEN 8
+/* Address Space ID for the requested target. Only the lower 36 bits are valid
+ * in the current SmartNIC implementation.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LO_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_HI_OFST 4
+
+/* MAE_MPORT_SELECTOR structuredef: MPORTS are identified by an opaque unsigned
+ * integer value (mport_id) that is guaranteed to be representable within
+ * 32-bits or within any NIC interface field that needs store the value
+ * (whichever is narrowers). This selector structure provides a stable way to
+ * refer to m-ports.
+ */
+#define	MAE_MPORT_SELECTOR_LEN 4
+/* Used to force the tools to output bitfield-style defines for this structure.
+ */
+#define	MAE_MPORT_SELECTOR_FLAT_OFST 0
+#define	MAE_MPORT_SELECTOR_FLAT_LEN 4
+/* enum: An m-port selector value that is guaranteed never to represent a real
+ * mport
+ */
+#define	MAE_MPORT_SELECTOR_NULL 0x0
+/* enum: The m-port assigned to the calling client. */
+#define	MAE_MPORT_SELECTOR_ASSIGNED 0x1000000
+#define	MAE_MPORT_SELECTOR_TYPE_OFST 0
+#define	MAE_MPORT_SELECTOR_TYPE_LBN 24
+#define	MAE_MPORT_SELECTOR_TYPE_WIDTH 8
+/* enum: The MPORT connected to a given physical port */
+#define	MAE_MPORT_SELECTOR_TYPE_PPORT 0x2
+/* enum: The MPORT assigned to a given PCIe function */
+#define	MAE_MPORT_SELECTOR_TYPE_FUNC 0x3
+/* enum: An mport_id */
+#define	MAE_MPORT_SELECTOR_TYPE_MPORT_ID 0x4
+#define	MAE_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_WIDTH 24
+#define	MAE_MPORT_SELECTOR_PPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_LBN 16
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_WIDTH 8
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_WIDTH 16
+/* enum: Used for VF_ID to indicate a physical function. */
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_NULL 0xffff
+/* enum: Used for PF_ID to indicate the physical function of the calling
+ * client. - When used by a PF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the calling function. (For clarity, it is recommended that
+ * clients use ASSIGNED to achieve this behaviour). - When used by a PF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a VF child of the calling
+ * function. - When used by a VF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the PF owning the calling function. - When used by a VF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a sibling VF of the
+ * calling function. - Not meaningful used by a client that is not a PCIe
+ * function.
+ */
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_CALLER 0xff
+#define	MAE_MPORT_SELECTOR_FLAT_LBN 0
+#define	MAE_MPORT_SELECTOR_FLAT_WIDTH 32
+
 #endif /* _SIENA_MC_DRIVER_PCOL_H */
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
index f15c7b2064..aa03e8015a 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_AOE_H
@@ -25,6 +25,7 @@
 #define	MC_CMD_FC_IN_LEN 4
 #define	MC_CMD_FC_IN_OP_HDR_OFST 0
 #define	MC_CMD_FC_IN_OP_HDR_LEN 4
+#define	MC_CMD_FC_IN_OP_OFST 0
 #define	MC_CMD_FC_IN_OP_LBN 0
 #define	MC_CMD_FC_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to FC. */
@@ -152,6 +153,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_MAC_HEADER_OFST 4
 #define	MC_CMD_FC_IN_MAC_HEADER_LEN 4
+#define	MC_CMD_FC_IN_MAC_OP_OFST 4
 #define	MC_CMD_FC_IN_MAC_OP_LBN 0
 #define	MC_CMD_FC_IN_MAC_OP_WIDTH 8
 /* enum: MAC reconfigure handler */
@@ -166,14 +168,17 @@
 #define	MC_CMD_FC_OP_MAC_OP_GET_TX_STATS 0x7
 /* enum: MAC Read status */
 #define	MC_CMD_FC_OP_MAC_OP_READ_STATUS 0x8
+#define	MC_CMD_FC_IN_MAC_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_WIDTH 8
 /* enum: External FPGA port. */
 #define	MC_CMD_FC_PORT_EXT 0x0
 /* enum: Internal Siena-facing FPGA ports. */
 #define	MC_CMD_FC_PORT_INT 0x1
+#define	MC_CMD_FC_IN_MAC_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_MAC_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -210,8 +215,10 @@
 #define	MC_CMD_FC_IN_MAC_SET_LINK_ADDR_HI_OFST 20
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_LEN 4
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_LBN 0
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_LBN 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_WIDTH 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_FCNTL_OFST 28
@@ -249,10 +256,13 @@
 #define	MC_CMD_FC_IN_MAC_GET_STATS_STATS_INDEX_LEN 4
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_LBN 0
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_LBN 1
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_LBN 2
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_WIDTH 1
 /* Number of statistics to read */
@@ -370,6 +380,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_OP_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_OP_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_OP_WIDTH 8
 /* enum: DRAM Test Start */
@@ -385,12 +396,16 @@
 /*            MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_START_T0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_T1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_LBN 1
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_LBN 2
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_LBN 3
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_WIDTH 1
 
@@ -433,6 +448,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_LEN 4
+#define	MC_CMD_FC_IN_READ_MAP_OP_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_OP_LBN 0
 #define	MC_CMD_FC_IN_READ_MAP_OP_WIDTH 8
 /* enum: Get the number of map regions */
@@ -467,16 +483,22 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_LBN 0
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_LBN 1
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_LBN 2
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_LBN 3
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_LBN 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_LBN 5
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_WIDTH 1
 
@@ -486,6 +508,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_IO_REL_HEADER_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_HEADER_LEN 4
+#define	MC_CMD_FC_IN_IO_REL_OP_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_OP_LBN 0
 #define	MC_CMD_FC_IN_IO_REL_OP_WIDTH 8
 /* enum: Get the base address that the FC applies to relative commands */
@@ -494,6 +517,7 @@
 #define	MC_CMD_FC_IN_IO_REL_READ32 0x2
 /* enum: Write data */
 #define	MC_CMD_FC_IN_IO_REL_WRITE32 0x3
+#define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_LBN 8
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_WIDTH 8
 /* enum: Application address space */
@@ -547,6 +571,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_UHLINK_HEADER_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_HEADER_LEN 4
+#define	MC_CMD_FC_IN_UHLINK_OP_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_OP_LBN 0
 #define	MC_CMD_FC_IN_UHLINK_OP_WIDTH 8
 /* enum: Get PHY configuration info */
@@ -565,10 +590,13 @@
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_SET 0x7
 /* enum: Get loopback mode config state on fpga port */
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_GET 0x8
+#define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -668,10 +696,13 @@
 #define	MC_CMD_FC_IN_SET_LINK_SPEED_LEN 4
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_LBN 0
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_POWEROFF_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_LBN 1
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_TXDIS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_LBN 2
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_WIDTH 1
 
@@ -773,12 +804,16 @@
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DATA_LEN 4
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_LBN 0
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_LBN 1
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_LBN 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_LBN 3
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_WIDTH 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_NONE 0x0 /* enum */
@@ -1396,6 +1431,7 @@
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_LEN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_WIDTH 8
 /* enum: Test not yet initiated */
@@ -1406,31 +1442,43 @@
 #define	MC_CMD_FC_OP_DDR_TEST_SUCCESS 0x2
 /* enum: Test did not complete in specified time */
 #define	MC_CMD_FC_OP_DDR_TEST_TIMER_EXPIRED 0x3
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_LBN 11
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_LBN 9
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_LBN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_WIDTH 1
 /* Test result from FPGA */
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_LBN 31
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_LBN 30
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_LBN 29
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_LBN 28
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_LBN 15
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_LBN 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_WIDTH 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_TEST_COMPLETE 0x0 /* enum */
@@ -1447,6 +1495,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_GET_ASSERT_STATE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_LBN 8
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -1455,6 +1504,7 @@
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1
 /* enum: Crash data has been sent */
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2
+#define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -1484,16 +1534,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1501,58 +1557,80 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_WIDTH 8
 #define	MC_CMD_FC_FPGA_TYPE_A7 0xa7 /* enum */
 #define	MC_CMD_FC_FPGA_TYPE_A5 0xa5 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_WIDTH 10
+#define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_WIDTH 2
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 /* enum */
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_WIDTH 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED4_OFST 16
@@ -1563,6 +1641,7 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_WIDTH 16
 
@@ -1570,16 +1649,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1587,66 +1672,94 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_LBN 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_LBN 14
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_LBN 13
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_LBN 11
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_LBN 10
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_LBN 9
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_LBN 7
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_LBN 6
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_LBN 5
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_WIDTH 4
 #define	MC_CMD_FC_FPGA_V2_TYPE_A3 0x0 /* enum */
@@ -1659,28 +1772,35 @@
 #define	MC_CMD_FC_FPGA_V2_TYPE_D7 0xb /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_WIDTH 16
 
@@ -1688,16 +1808,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1705,40 +1831,53 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_WIDTH 16
 
@@ -1746,16 +1885,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1763,14 +1908,18 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
@@ -1779,6 +1928,7 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_WIDTH 16
 
@@ -1787,10 +1937,13 @@
 /* Qsys system ID */
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_LEN 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_WIDTH 4
 
@@ -1888,29 +2041,37 @@
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LEN 48
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_WIDTH 16
 /* Transceiver Transmit settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_WIDTH 16
 /* Transceiver Receive settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_WIDTH 16
 /* Rx eye opening */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_WIDTH 16
 /* PCS status word */
@@ -1919,8 +2080,10 @@
 /* Link status word */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_WIDTH 1
 /* Current SFp parameters applied */
@@ -1944,10 +2107,13 @@
 /* PHY config flags */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_LBN 2
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_WIDTH 1
 
@@ -2024,6 +2190,7 @@
 /* Capabilities of the FPGA/FC */
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_LEN 4
+#define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_LBN 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_WIDTH 1
 
@@ -2117,8 +2284,10 @@
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_LEN 4
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_LBN 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_LBN 1
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_WIDTH 1
 
@@ -2185,14 +2354,19 @@
 /* DDR soak test status word; bits [4:0] are relevant. */
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_LBN 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_LBN 1
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_LBN 2
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_LBN 3
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_LBN 4
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_WIDTH 1
 /* DDR soak test error count */
@@ -2222,6 +2396,7 @@
 #define	MC_CMD_AOE_IN_LEN 4
 #define	MC_CMD_AOE_IN_OP_HDR_OFST 0
 #define	MC_CMD_AOE_IN_OP_HDR_LEN 4
+#define	MC_CMD_AOE_IN_OP_OFST 0
 #define	MC_CMD_AOE_IN_OP_LBN 0
 #define	MC_CMD_AOE_IN_OP_WIDTH 8
 /* enum: FPGA and CPLD information */
@@ -2408,18 +2583,25 @@
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_ADDR_HI_OFST 12
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_LEN 4
+#define	MC_CMD_AOE_IN_MAC_STATS_DMA_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_LBN 0
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_LBN 1
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_LBN 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_WIDTH 16
 /* Length of DMA data (optional) */
@@ -2485,6 +2667,7 @@
 /*            MC_CMD_AOE_IN_CMD_LEN 4 */
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_LEN 4
+#define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_LBN 0
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_WIDTH 8
 /* enum: AOE and associated external port */
@@ -2495,6 +2678,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_DIAGNOSTIC 0x2
 /* enum: Configure link state mode on given AOE port */
 #define	MC_CMD_AOE_IN_LINK_STATE_CUSTOM 0x3
+#define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_LBN 8
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_WIDTH 8
 /* enum: No-op */
@@ -2503,6 +2687,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_OR 0x1
 /* enum: logical AND of all SFP ports link status */
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_AND 0x2
+#define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_LBN 16
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_WIDTH 16
 
@@ -2605,6 +2790,7 @@
 /* FC boot control flags */
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_LEN 4
+#define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_LBN 0
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_WIDTH 1
 
@@ -2624,6 +2810,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_LBN 8
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -2632,6 +2819,7 @@
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1 */
 /* enum: Crash data has been sent */
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2 */
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_LBN 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -2884,12 +3072,16 @@
 /* Information on the module. */
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_PRESENT_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_POWERED_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_POWERED_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_POWERED_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_LBN 3
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_WIDTH 1
 /* Memory size, in MB. */
@@ -2934,21 +3126,28 @@
 /* Flags describing status info on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_WIDTH 1
 /* DDR ECC status on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_LBN 8
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_LBN 16
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_LBN 24
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_WIDTH 8
 
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
index 5209b43ace..8276cfcdb6 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  *
  * The version of this file has MCDI strings really used in the libefx.
  */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 03/60] common/sfc_efx/base: add event queue operation to do polling
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
                     ` (57 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Event queue host interface differ on Riverhead and implementation
will be different.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c   | 325 ++++++++++++++-----------
 drivers/common/sfc_efx/base/efx_impl.h |   2 +
 2 files changed, 182 insertions(+), 145 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index e6a8d4ca1a..21fddfb64d 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -66,6 +66,17 @@ siena_ev_qstats_update(
 
 #endif /* EFSYS_OPT_SIENA */
 
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
+
 #if EFSYS_OPT_SIENA
 static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_init,				/* eevo_init */
@@ -74,6 +85,7 @@ static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_qdestroy,			/* eevo_qdestroy */
 	siena_ev_qprime,			/* eevo_qprime */
 	siena_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	siena_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	siena_ev_qstats_update,			/* eevo_qstats_update */
@@ -89,6 +101,7 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 	ef10_ev_qdestroy,			/* eevo_qdestroy */
 	ef10_ev_qprime,				/* eevo_qprime */
 	ef10_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	ef10_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	ef10_ev_qstats_update,			/* eevo_qstats_update */
@@ -374,8 +387,6 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
-#define	EFX_EV_BATCH	8
-
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
@@ -383,153 +394,15 @@ efx_ev_qpoll(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg)
 {
-	efx_qword_t ev[EFX_EV_BATCH];
-	unsigned int batch;
-	unsigned int total;
-	unsigned int count;
-	unsigned int index;
-	size_t offset;
-
-	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
-
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
-	    FSE_AZ_EV_CODE_DRV_GEN_EV);
-#if EFSYS_OPT_MCDI
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
-	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
-#endif
+	efx_nic_t *enp = eep->ee_enp;
+	const efx_ev_ops_t *eevop = enp->en_eevop;
 
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
-	EFSYS_ASSERT(countp != NULL);
-	EFSYS_ASSERT(eecp != NULL);
-
-	count = *countp;
-	do {
-		/* Read up until the end of the batch period */
-		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (total = 0; total < batch; ++total) {
-			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
-
-			if (!EFX_EV_PRESENT(ev[total]))
-				break;
-
-			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
-
-			offset += sizeof (efx_qword_t);
-		}
-
-#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
-		/*
-		 * Prefetch the next batch when we get within PREFETCH_PERIOD
-		 * of a completed batch. If the batch is smaller, then prefetch
-		 * immediately.
-		 */
-		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
-			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-		/* Process the batch of events */
-		for (index = 0; index < total; ++index) {
-			boolean_t should_abort;
-			uint32_t code;
-
-#if EFSYS_OPT_EV_PREFETCH
-			/* Prefetch if we've now reached the batch period */
-			if (total == batch &&
-			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
-				offset = (count + batch) & eep->ee_mask;
-				offset *= sizeof (efx_qword_t);
-
-				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-			}
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
-			switch (code) {
-			case FSE_AZ_EV_CODE_RX_EV:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_TX_EV:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRIVER_EV:
-				should_abort = eep->ee_driver(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRV_GEN_EV:
-				should_abort = eep->ee_drv_gen(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#if EFSYS_OPT_MCDI
-			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#endif
-			case FSE_AZ_EV_CODE_GLOBAL_EV:
-				if (eep->ee_global) {
-					should_abort = eep->ee_global(eep,
-					    &(ev[index]), eecp, arg);
-					break;
-				}
-				/* else fallthrough */
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
-			if (should_abort) {
-				/* Ignore subsequent events */
-				total = index + 1;
-
-				/*
-				 * Poison batch to ensure the outer
-				 * loop is broken out of.
-				 */
-				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
-				batch += (EFX_EV_BATCH << 1);
-				EFSYS_ASSERT(total != batch);
-				break;
-			}
-		}
-
-		/*
-		 * Now that the hardware has most likely moved onto dma'ing
-		 * into the next cache line, clear the processed events. Take
-		 * care to only clear out events that we've processed
-		 */
-		EFX_SET_QWORD(ev[0]);
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (index = 0; index < total; ++index) {
-			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
-			offset += sizeof (efx_qword_t);
-		}
-
-		count += total;
-
-	} while (total == batch);
+	EFSYS_ASSERT(eevop != NULL &&
+	    eevop->eevo_qpoll != NULL);
 
-	*countp = count;
+	eevop->eevo_qpoll(eep, countp, eecp, arg);
 }
 
 			void
@@ -1484,3 +1357,165 @@ siena_ev_fini(
 }
 
 #endif /* EFSYS_OPT_SIENA */
+
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+#define	EFX_EV_BATCH	8
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EFX_EV_BATCH];
+	unsigned int batch;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
+
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
+	    FSE_AZ_EV_CODE_DRV_GEN_EV);
+#if EFSYS_OPT_MCDI
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
+	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
+#endif
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EFX_EV_PRESENT(ev[total]))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
+		/*
+		 * Prefetch the next batch when we get within PREFETCH_PERIOD
+		 * of a completed batch. If the batch is smaller, then prefetch
+		 * immediately.
+		 */
+		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
+			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+#if EFSYS_OPT_EV_PREFETCH
+			/* Prefetch if we've now reached the batch period */
+			if (total == batch &&
+			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
+				offset = (count + batch) & eep->ee_mask;
+				offset *= sizeof (efx_qword_t);
+
+				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+			}
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
+			switch (code) {
+			case FSE_AZ_EV_CODE_RX_EV:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_TX_EV:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRIVER_EV:
+				should_abort = eep->ee_driver(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRV_GEN_EV:
+				should_abort = eep->ee_drv_gen(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#if EFSYS_OPT_MCDI
+			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#endif
+			case FSE_AZ_EV_CODE_GLOBAL_EV:
+				if (eep->ee_global) {
+					should_abort = eep->ee_global(eep,
+					    &(ev[index]), eecp, arg);
+					break;
+				}
+				/* else fallthrough */
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
+				batch += (EFX_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * Now that the hardware has most likely moved onto dma'ing
+		 * into the next cache line, clear the processed events. Take
+		 * care to only clear out events that we've processed
+		 */
+		EFX_SET_QWORD(ev[0]);
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (index = 0; index < total; ++index) {
+			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
+			offset += sizeof (efx_qword_t);
+		}
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 87c7d5df52..1ef68e2d3a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -85,6 +85,8 @@ typedef struct efx_ev_ops_s {
 	void		(*eevo_qdestroy)(efx_evq_t *);
 	efx_rc_t	(*eevo_qprime)(efx_evq_t *, unsigned int);
 	void		(*eevo_qpost)(efx_evq_t *, uint16_t);
+	void		(*eevo_qpoll)(efx_evq_t *, unsigned int *,
+					const efx_ev_callbacks_t *, void *);
 	efx_rc_t	(*eevo_qmoderate)(efx_evq_t *, unsigned int);
 #if EFSYS_OPT_QSTATS
 	void		(*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 04/60] common/sfc_efx/base: add efsys option for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (2 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
                     ` (56 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 44 ++++++++++++-------------
 drivers/common/sfc_efx/efsys.h          |  3 ++
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 5a04a69e5f..978321cf67 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -47,8 +47,8 @@
 
 #if EFSYS_OPT_CHECK_REG
 /* Verify chip implements accessed registers */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "CHECK_REG requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "CHECK_REG requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_CHECK_REG */
 
@@ -79,21 +79,21 @@
 
 #if EFSYS_OPT_FILTER
 /* Support hardware packet filters */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "FILTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "FILTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_FILTER */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 # if !EFSYS_OPT_FILTER
-#  error "EF10 arch requires FILTER"
+#  error "RIVERHEAD or EF10 arch requires FILTER"
 # endif
 #endif /* EFX_OPTS_EF10() */
 
 #if EFSYS_OPT_LOOPBACK
 /* Support hardware loopback modes */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "LOOPBACK requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "LOOPBACK requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_LOOPBACK */
 
@@ -107,21 +107,21 @@
 
 #if EFSYS_OPT_MAC_STATS
 /* Support MAC statistics */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MAC_STATS requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MAC_STATS requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MAC_STATS */
 
 #if EFSYS_OPT_MCDI
 /* Support management controller messages */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MCDI requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MCDI requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MCDI */
 
-#if (EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#if (EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
 # if !EFSYS_OPT_MCDI
-#  error "EF10 arch or SIENA requires MCDI"
+#  error "RIVERHEAD or EF10 arch or SIENA requires MCDI"
 # endif
 #endif
 
@@ -288,15 +288,15 @@
 
 #if EFSYS_OPT_RX_SCALE
 /* Support receive scaling (RSS) */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCALE requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCALE requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCALE */
 
 #if EFSYS_OPT_RX_SCATTER
 /* Support receive scatter DMA */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCATTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCATTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCATTER */
 
@@ -338,8 +338,8 @@
 
 #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
 /* Support adapters with missing static config (for factory use only) */
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "ALLOW_UNCONFIGURED_NIC requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_ALLOW_UNCONFIGURED_NIC */
 
@@ -359,8 +359,8 @@
 
 /* Support hardware assistance for tunnels */
 #if EFSYS_OPT_TUNNEL
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "TUNNEL requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "TUNNEL requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 46b08f9789..1567d91588 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -105,6 +105,9 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_MEDFORD 1
 /* Enable SFN2xxx support */
 #define EFSYS_OPT_MEDFORD2 1
+/* Disable Riverhead support */
+#define EFSYS_OPT_RIVERHEAD 0
+
 #ifdef RTE_LIBRTE_SFC_EFX_DEBUG
 #define EFSYS_OPT_CHECK_REG 1
 #else
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 05/60] common/sfc_efx/base: add Riverhead NIC family
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (3 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
                     ` (55 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Riverhead is the first NIC family of the EF100 architecture.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 +++++++
 drivers/common/sfc_efx/base/efx_impl.h |  3 +++
 drivers/common/sfc_efx/base/efx_nic.c  | 14 ++++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c1b4876314..2082efe023 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -55,6 +55,7 @@ typedef enum efx_family_e {
 	EFX_FAMILY_HUNTINGTON,
 	EFX_FAMILY_MEDFORD,
 	EFX_FAMILY_MEDFORD2,
+	EFX_FAMILY_RIVERHEAD,
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
@@ -68,6 +69,7 @@ efx_family(
 
 
 #define	EFX_PCI_VENID_SFC			0x1924
+#define	EFX_PCI_VENID_XILINX			0x10EE
 
 #define	EFX_PCI_DEVID_FALCON			0x0710	/* SFC4000 */
 
@@ -90,6 +92,8 @@ efx_family(
 #define	EFX_PCI_DEVID_MEDFORD2			0x0B03	/* SFC9250 PF */
 #define	EFX_PCI_DEVID_MEDFORD2_VF		0x1B03	/* SFC9250 VF */
 
+#define	EFX_PCI_DEVID_RIVERHEAD			0x0100
+#define	EFX_PCI_DEVID_RIVERHEAD_VF		0x1100
 
 #define	EFX_MEM_BAR_SIENA			2
 
@@ -101,6 +105,9 @@ efx_family(
 
 #define	EFX_MEM_BAR_MEDFORD2			0
 
+/* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
+#define	EFX_MEM_BAR_RIVERHEAD			2
+
 
 /* Error codes */
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ef68e2d3a..898770c1cb 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -871,6 +871,9 @@ struct efx_nic_s {
 	 (_enp)->en_family == EFX_FAMILY_MEDFORD || \
 	 (_enp)->en_family == EFX_FAMILY_HUNTINGTON)
 
+#define	EFX_FAMILY_IS_EF100(_enp) \
+	((_enp)->en_family == EFX_FAMILY_RIVERHEAD)
+
 
 #define	EFX_NIC_MAGIC	0x02121996
 
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 267d010524..b5e36661c9 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -85,6 +85,20 @@ efx_family(
 		}
 	}
 
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			*efp = EFX_FAMILY_RIVERHEAD;
+			*membarp = EFX_MEM_BAR_RIVERHEAD;
+			return (0);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
 	*efp = EFX_FAMILY_INVALID;
 	return (ENOTSUP);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 06/60] common/sfc_efx/base: update registers check for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (4 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
                     ` (54 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

Riverhead family got letter 'G' for registers definition.
Registers used for Riverhead should have the letter in the
specification range.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 898770c1cb..f891172086 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1008,6 +1008,10 @@ struct efx_txq_s {
 			rev = 'F';					\
 			break;						\
 									\
+		case EFX_FAMILY_RIVERHEAD:				\
+			rev = 'G';					\
+			break;						\
+									\
 		default:						\
 			rev = '?';					\
 			break;						\
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 07/60] common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (5 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
                     ` (53 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

MCDI on Riverhead is very close to the EF10 and there is no
point to duplicate the code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 46 ++++++++++++++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  8 ++---
 drivers/common/sfc_efx/base/efx_impl.h  |  4 +--
 drivers/common/sfc_efx/base/efx_mcdi.c  | 21 +++++++++++
 4 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 9e8a0c1f69..727f14826e 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_MCDI
 
@@ -27,7 +27,7 @@ ef10_mcdi_init(
 	efx_dword_t dword;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 	EFSYS_ASSERT(enp->en_features & EFX_FEATURE_MCDI_DMA);
 
 	/*
@@ -53,7 +53,16 @@ ef10_mcdi_init(
 		goto fail2;
 	}
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0, 1);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	/* Save initial MC reboot status */
 	(void) ef10_mcdi_poll_reboot(enp);
@@ -133,7 +142,7 @@ ef10_mcdi_send_request(
 	efx_dword_t dword;
 	unsigned int pos;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/* Write the header */
 	for (pos = 0; pos < hdr_len; pos += sizeof (efx_dword_t)) {
@@ -154,11 +163,29 @@ ef10_mcdi_send_request(
 	/* Ring the doorbell to post the command DMA address to the MC */
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) >> 32);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) & 0xffffffff);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 }
 
 	__checkReturn	boolean_t
@@ -210,6 +237,9 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
+	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
+	    ER_GZ_MC_SFT_STATUS_OFST);
+
 	/* Update MC reboot status word */
 	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
 	new_status = dword.ed_u32[0];
@@ -255,7 +285,7 @@ ef10_mcdi_feature_supported(
 	uint32_t privilege_mask = encp->enc_privilege_mask;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/*
 	 * Use privilege mask state at MCDI attach.
@@ -316,4 +346,4 @@ ef10_mcdi_feature_supported(
 
 #endif	/* EFSYS_OPT_MCDI */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2082efe023..c7fe814ca0 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -243,8 +243,8 @@ efx_nic_check_pcie_link_speed(
 
 #if EFSYS_OPT_MCDI
 
-#if EFX_OPTS_EF10()
-/* EF10 architecture NICs require MCDIv2 commands */
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+/* EF10 architecture and Riverhead NICs require MCDIv2 commands */
 #define	WITH_MCDI_V2 1
 #endif
 
@@ -1438,11 +1438,11 @@ typedef struct efx_nic_cfg_s {
 #if EFSYS_OPT_BIST
 	uint32_t		enc_bist_mask;
 #endif	/* EFSYS_OPT_BIST */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	uint32_t		enc_pf;
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f891172086..c7edeaa000 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -37,9 +37,9 @@
 #include "medford2_impl.h"
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 #include "ef10_impl.h"
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #ifdef	__cplusplus
 extern "C" {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8cd651f529..dec3a170a7 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -60,6 +60,21 @@ static const efx_mcdi_ops_t	__efx_mcdi_ef10_ops = {
 
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_mcdi_ops_t	__efx_mcdi_rhead_ops = {
+	ef10_mcdi_init,			/* emco_init */
+	ef10_mcdi_send_request,		/* emco_send_request */
+	ef10_mcdi_poll_reboot,		/* emco_poll_reboot */
+	ef10_mcdi_poll_response,	/* emco_poll_response */
+	ef10_mcdi_read_response,	/* emco_read_response */
+	ef10_mcdi_fini,			/* emco_fini */
+	ef10_mcdi_feature_supported,	/* emco_feature_supported */
+	ef10_mcdi_get_timeout,		/* emco_get_timeout */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 
 	__checkReturn	efx_rc_t
@@ -98,6 +113,12 @@ efx_mcdi_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emcop = &__efx_mcdi_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 08/60] common/sfc_efx/base: use EF10 PHY methods for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (6 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
                     ` (52 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

There is no difference yet in PHY support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_phy.c |  4 ++--
 drivers/common/sfc_efx/base/efx_phy.c  | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 622374f7b6..b9822e4d42 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 static			void
 mcdi_phy_decode_cap(
@@ -755,4 +755,4 @@ ef10_bist_stop(
 
 #endif	/* EFSYS_OPT_BIST */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 841d148852..8df868d80c 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -48,6 +48,26 @@ static const efx_phy_ops_t	__efx_phy_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_phy_ops_t	__efx_phy_rhead_ops = {
+	ef10_phy_power,			/* epo_power */
+	NULL,				/* epo_reset */
+	ef10_phy_reconfigure,		/* epo_reconfigure */
+	ef10_phy_verify,		/* epo_verify */
+	ef10_phy_oui_get,		/* epo_oui_get */
+	ef10_phy_link_state_get,	/* epo_link_state_get */
+#if EFSYS_OPT_PHY_STATS
+	ef10_phy_stats_update,		/* epo_stats_update */
+#endif	/* EFSYS_OPT_PHY_STATS */
+#if EFSYS_OPT_BIST
+	ef10_bist_enable_offline,	/* epo_bist_enable_offline */
+	ef10_bist_start,		/* epo_bist_start */
+	ef10_bist_poll,			/* epo_bist_poll */
+	ef10_bist_stop,			/* epo_bist_stop */
+#endif	/* EFSYS_OPT_BIST */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_phy_probe(
 	__in		efx_nic_t *enp)
@@ -88,6 +108,12 @@ efx_phy_probe(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		epop = &__efx_phy_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD2 */
+
 	default:
 		rc = ENOTSUP;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 09/60] common/sfc_efx/base: move 14b prefix check out of caps get
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (7 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
                     ` (51 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

The function which gets capabilities from MC should simply fill in
NIC configuration. Caller should decide if the configuration is
supported or not.

The change is required to prepare the function to be reused on
Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 33 ++++++++++++++------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 34fa45e8c1..bb5fd50eab 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1062,15 +1062,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
-	/*
-	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
-	 * We only support the 14 byte prefix here.
-	 */
-	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14) == 0) {
-		rc = ENOTSUP;
-		goto fail4;
-	}
-	encp->enc_rx_prefix_size = 14;
+	/* Check if RXDP firmware inserts 14 byte prefix */
+	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
+		encp->enc_rx_prefix_size = 14;
+	else
+		encp->enc_rx_prefix_size = 0;
 
 #if EFSYS_OPT_RX_SCALE
 	/* Check if the firmware supports additional RSS modes */
@@ -1348,7 +1344,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1397,11 +1393,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail5:
-	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
@@ -1932,6 +1926,15 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail8;
 
+	/*
+	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
+	 * We only support the 14 byte prefix here.
+	 */
+	if (encp->enc_rx_prefix_size != 14) {
+		rc = ENOTSUP;
+		goto fail9;
+	}
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1960,7 +1963,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail9;
+			goto fail10;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1976,7 +1979,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail10;
+		goto fail11;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 10/60] common/sfc_efx/base: remove PF count get from caps get
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (8 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
                     ` (50 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

ef10_get_datapath_caps() should simply fill in NIC configuration
based MC_CMD_GET_CAPABILITIES output.

Number of PFs is a part of board configuration should be obtained
in corresponding function.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 37 +++++++++++++-------------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index bb5fd50eab..f7c4601819 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1031,10 +1031,6 @@ ef10_get_datapath_caps(
 		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
 	efx_rc_t rc;
 
-	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
-		goto fail1;
-
-
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
@@ -1045,12 +1041,12 @@ ef10_get_datapath_caps(
 
 	if (req.emr_rc != 0) {
 		rc = req.emr_rc;
-		goto fail2;
+		goto fail1;
 	}
 
 	if (req.emr_out_length_used < MC_CMD_GET_CAPABILITIES_OUT_LEN) {
 		rc = EMSGSIZE;
-		goto fail3;
+		goto fail2;
 	}
 
 #define	CAP_FLAGS1(_req, _flag)						\
@@ -1344,7 +1340,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail4;
+			goto fail3;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1393,11 +1389,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail4:
-	EFSYS_PROBE(fail4);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1856,6 +1850,9 @@ ef10_nic_board_cfg(
 	encp->enc_pf = pf;
 	encp->enc_vf = vf;
 
+	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
+		goto fail4;
+
 	/* MAC address for this function */
 	if (EFX_PCI_FUNCTION_IS_PF(encp)) {
 		rc = efx_mcdi_get_mac_address_pf(enp, mac_addr);
@@ -1880,7 +1877,7 @@ ef10_nic_board_cfg(
 		rc = efx_mcdi_get_mac_address_vf(enp, mac_addr);
 	}
 	if (rc != 0)
-		goto fail4;
+		goto fail5;
 
 	EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
 
@@ -1891,7 +1888,7 @@ ef10_nic_board_cfg(
 		if (rc == EACCES)
 			board_type = 0;
 		else
-			goto fail5;
+			goto fail6;
 	}
 
 	encp->enc_board_type = board_type;
@@ -1899,7 +1896,7 @@ ef10_nic_board_cfg(
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
-		goto fail6;
+		goto fail7;
 
 	/*
 	 * Firmware with support for *_FEC capability bits does not
@@ -1918,13 +1915,13 @@ ef10_nic_board_cfg(
 
 	/* Obtain the default PHY advertised capabilities */
 	if ((rc = ef10_phy_get_link(enp, &els)) != 0)
-		goto fail7;
+		goto fail8;
 	epp->ep_default_adv_cap_mask = els.epls.epls_adv_cap_mask;
 	epp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;
 
 	/* Check capabilities of running datapath firmware */
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
-		goto fail8;
+		goto fail9;
 
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
@@ -1932,7 +1929,7 @@ ef10_nic_board_cfg(
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail9;
+		goto fail10;
 	}
 
 	/* Alignment for WPTR updates */
@@ -1963,7 +1960,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail10;
+			goto fail11;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1979,7 +1976,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail11;
+		goto fail12;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
@@ -1988,10 +1985,12 @@ ef10_nic_board_cfg(
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail12;
+			goto fail13;
 
 	return (0);
 
+fail13:
+	EFSYS_PROBE(fail13);
 fail12:
 	EFSYS_PROBE(fail12);
 fail11:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 11/60] common/sfc_efx/base: factor out helper to get board config
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (9 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
@ 2020-09-22  9:33   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
                     ` (49 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:33 UTC (permalink / raw)
  To: dev

The helper will be used on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 213 ++++++++++++++-----------
 1 file changed, 117 insertions(+), 96 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index f7c4601819..47329ff8dc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1758,60 +1758,9 @@ ef10_external_port_mapping(
 }
 
 static	__checkReturn	efx_rc_t
-ef10_set_workaround_bug26807(
-	__in		efx_nic_t *enp)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	uint32_t flags;
-	efx_rc_t rc;
-
-	/*
-	 * If the bug26807 workaround is enabled, then firmware has enabled
-	 * support for chained multicast filters. Firmware will reset (FLR)
-	 * functions which have filters in the hardware filter table when the
-	 * workaround is enabled/disabled.
-	 *
-	 * We must recheck if the workaround is enabled after inserting the
-	 * first hardware filter, in case it has been changed since this check.
-	 */
-	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
-	    B_TRUE, &flags);
-	if (rc == 0) {
-		encp->enc_bug26807_workaround = B_TRUE;
-		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
-			/*
-			 * Other functions had installed filters before the
-			 * workaround was enabled, and they have been reset
-			 * by firmware.
-			 */
-			EFSYS_PROBE(bug26807_workaround_flr_done);
-			/* FIXME: bump MC warm boot count ? */
-		}
-	} else if (rc == EACCES) {
-		/*
-		 * Unprivileged functions cannot enable the workaround in older
-		 * firmware.
-		 */
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else {
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-ef10_nic_board_cfg(
+efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
-	const efx_nic_ops_t *enop = enp->en_enop;
 	efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	ef10_link_state_t els;
@@ -1892,7 +1841,6 @@ ef10_nic_board_cfg(
 	}
 
 	encp->enc_board_type = board_type;
-	encp->enc_clk_mult = 1; /* not used for EF10 */
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
@@ -1923,15 +1871,128 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail9;
 
+	/* Get interrupt vector limits */
+	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
+		if (EFX_PCI_FUNCTION_IS_PF(encp))
+			goto fail10;
+
+		/* Ignore error (cannot query vector limits from a VF). */
+		base = 0;
+		nvec = 1024;
+	}
+	encp->enc_intr_vec_base = base;
+	encp->enc_intr_limit = nvec;
+
+	/*
+	 * Get the current privilege mask. Note that this may be modified
+	 * dynamically, so this value is informational only. DO NOT use
+	 * the privilege mask to check for sufficient privileges, as that
+	 * can result in time-of-check/time-of-use bugs.
+	 */
+	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
+		goto fail11;
+	encp->enc_privilege_mask = mask;
+
+	return (0);
+
+fail11:
+	EFSYS_PROBE(fail11);
+fail10:
+	EFSYS_PROBE(fail10);
+fail9:
+	EFSYS_PROBE(fail9);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_set_workaround_bug26807(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t flags;
+	efx_rc_t rc;
+
+	/*
+	 * If the bug26807 workaround is enabled, then firmware has enabled
+	 * support for chained multicast filters. Firmware will reset (FLR)
+	 * functions which have filters in the hardware filter table when the
+	 * workaround is enabled/disabled.
+	 *
+	 * We must recheck if the workaround is enabled after inserting the
+	 * first hardware filter, in case it has been changed since this check.
+	 */
+	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
+	    B_TRUE, &flags);
+	if (rc == 0) {
+		encp->enc_bug26807_workaround = B_TRUE;
+		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
+			/*
+			 * Other functions had installed filters before the
+			 * workaround was enabled, and they have been reset
+			 * by firmware.
+			 */
+			EFSYS_PROBE(bug26807_workaround_flr_done);
+			/* FIXME: bump MC warm boot count ? */
+		}
+	} else if (rc == EACCES) {
+		/*
+		 * Unprivileged functions cannot enable the workaround in older
+		 * firmware.
+		 */
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else {
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_nic_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
 	 * We only support the 14 byte prefix here.
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail10;
+		goto fail2;
 	}
 
+	encp->enc_clk_mult = 1; /* not used for EF10 */
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1957,56 +2018,16 @@ ef10_nic_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
-	/* Get interrupt vector limits */
-	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
-		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail11;
-
-		/* Ignore error (cannot query vector limits from a VF). */
-		base = 0;
-		nvec = 1024;
-	}
-	encp->enc_intr_vec_base = base;
-	encp->enc_intr_limit = nvec;
-
-	/*
-	 * Get the current privilege mask. Note that this may be modified
-	 * dynamically, so this value is informational only. DO NOT use
-	 * the privilege mask to check for sufficient privileges, as that
-	 * can result in time-of-check/time-of-use bugs.
-	 */
-	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail12;
-	encp->enc_privilege_mask = mask;
-
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-		goto fail11;
+		goto fail3;
 
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail13;
+			goto fail4;
 
 	return (0);
 
-fail13:
-	EFSYS_PROBE(fail13);
-fail12:
-	EFSYS_PROBE(fail12);
-fail11:
-	EFSYS_PROBE(fail11);
-fail10:
-	EFSYS_PROBE(fail10);
-fail9:
-	EFSYS_PROBE(fail9);
-fail8:
-	EFSYS_PROBE(fail8);
-fail7:
-	EFSYS_PROBE(fail7);
-fail6:
-	EFSYS_PROBE(fail6);
-fail5:
-	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 12/60] common/sfc_efx/base: set NIC features in generic place
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (10 preceding siblings ...)
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
                     ` (48 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

There is no point to duplicate it NIC family specific probe handlers.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 2 --
 drivers/common/sfc_efx/base/efx_nic.c   | 3 +++
 drivers/common/sfc_efx/base/siena_nic.c | 3 ---
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 47329ff8dc..4796dd6b59 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2098,8 +2098,6 @@ ef10_nic_probe(
 	}
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index b5e36661c9..9d6961e2ff 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -318,6 +318,7 @@ efx_nic_probe(
 	__in		efx_nic_t *enp,
 	__in		efx_fw_variant_t efv)
 {
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	const efx_nic_ops_t *enop;
 	efx_rc_t rc;
 
@@ -351,6 +352,8 @@ efx_nic_probe(
 	if ((rc = enop->eno_probe(enp)) != 0)
 		goto fail1;
 
+	encp->enc_features = enp->en_features;
+
 	if ((rc = efx_phy_probe(enp)) != 0)
 		goto fail2;
 
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index bd5e8ceb8a..b9b6d1951c 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -301,7 +301,6 @@ siena_nic_probe(
 	__in		efx_nic_t *enp)
 {
 	efx_port_t *epp = &(enp->en_port);
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	siena_link_state_t sls;
 	unsigned int mask;
 	efx_oword_t oword;
@@ -369,8 +368,6 @@ siena_nic_probe(
 		goto fail12;
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 13/60] common/sfc_efx/base: factor out MCDI entity reset helper
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (11 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
                     ` (47 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

The helper will be reused on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 51 +++++++++++++++++---------
 1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 4796dd6b59..c5990f16cc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1921,6 +1921,39 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
+		MC_CMD_ENTITY_RESET_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_ENTITY_RESET;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
+
+	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
+	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
@@ -2203,9 +2236,6 @@ ef10_nic_set_drv_limits(
 ef10_nic_reset(
 	__in		efx_nic_t *enp)
 {
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
-		MC_CMD_ENTITY_RESET_OUT_LEN);
 	efx_rc_t rc;
 
 	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
@@ -2214,21 +2244,8 @@ ef10_nic_reset(
 	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
 		goto fail2;
 
-	req.emr_cmd = MC_CMD_ENTITY_RESET;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
-
-	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
-	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
 		goto fail3;
-	}
 
 	/* Clear RX/TX DMA queue errors */
 	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 14/60] common/sfc_efx/base: add Riverhead support to NIC module
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (12 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
                     ` (46 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Define basic NIC features and limitations.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h  |  25 ++
 drivers/common/sfc_efx/base/ef10_nic.c   |  52 ++-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   4 +-
 drivers/common/sfc_efx/base/efx_nic.c    |  34 ++
 drivers/common/sfc_efx/base/meson.build  |   3 +-
 drivers/common/sfc_efx/base/rhead_impl.h | 105 +++++
 drivers/common/sfc_efx/base/rhead_nic.c  | 500 +++++++++++++++++++++++
 8 files changed, 716 insertions(+), 15 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index da0ec7fab5..e933d88135 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -1422,12 +1422,37 @@ efx_mcdi_get_vector_cfg(
 	__out_opt	uint32_t *pf_nvecp,
 	__out_opt	uint32_t *vf_nvecp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_alloc_vis(
+	__in		efx_nic_t *enp,
+	__in		uint32_t min_vi_count,
+	__in		uint32_t max_vi_count,
+	__out		uint32_t *vi_basep,
+	__out		uint32_t *vi_countp,
+	__out		uint32_t *vi_shiftp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_free_vis(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn		efx_rc_t
 ef10_get_privilege_mask(
 	__in			efx_nic_t *enp,
 	__out			uint32_t *maskp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_nic_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp);
+
 #if EFSYS_OPT_FW_SUBVARIANT_AWARE
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index c5990f16cc..80dc99aed5 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -10,7 +10,7 @@
 #include "mcdi_mon.h"
 #endif
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #include "ef10_tlv_layout.h"
 
@@ -24,7 +24,7 @@ efx_mcdi_get_port_assignment(
 		MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_ASSIGNMENT;
 	req.emr_in_buf = payload;
@@ -68,7 +68,7 @@ efx_mcdi_get_port_modes(
 		MC_CMD_GET_PORT_MODES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_MODES;
 	req.emr_in_buf = payload;
@@ -223,6 +223,10 @@ ef10_nic_get_port_mode_bandwidth(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn		efx_rc_t
 efx_mcdi_vadaptor_alloc(
 	__in			efx_nic_t *enp,
@@ -292,6 +296,10 @@ efx_mcdi_vadaptor_free(
 	return (rc);
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_get_mac_address_pf(
 	__in			efx_nic_t *enp,
@@ -302,7 +310,7 @@ efx_mcdi_get_mac_address_pf(
 		MC_CMD_GET_MAC_ADDRESSES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -358,7 +366,7 @@ efx_mcdi_get_mac_address_vf(
 		MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_VPORT_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -420,7 +428,7 @@ efx_mcdi_get_clock(
 		MC_CMD_GET_CLOCK_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_CLOCK;
 	req.emr_in_buf = payload;
@@ -569,7 +577,7 @@ efx_mcdi_get_vector_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_alloc_vis(
 	__in		efx_nic_t *enp,
 	__in		uint32_t min_vi_count,
@@ -631,7 +639,7 @@ efx_mcdi_alloc_vis(
 }
 
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_free_vis(
 	__in		efx_nic_t *enp)
 {
@@ -663,6 +671,9 @@ efx_mcdi_free_vis(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_alloc_piobuf(
@@ -978,6 +989,10 @@ ef10_nic_pio_unlink(
 	return (efx_mcdi_unlink_piobuf(enp, vi_index));
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_mcdi_get_pf_count(
 	__in		efx_nic_t *enp,
@@ -1667,6 +1682,19 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_NA_2x2),			/* mode 14 */
 		{ EFX_EXT_PORT_NA, 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Riverhead allocate each port number to a separate
+	 * cage.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 2
+	 */
+	{
+		EFX_FAMILY_RIVERHEAD,
+		(1U << TLV_PORT_MODE_1x1_NA) |			/* mode 0 */
+		(1U << TLV_PORT_MODE_1x4_NA) |			/* mode 1 */
+		(1U << TLV_PORT_MODE_1x1_1x1),			/* mode 2 */
+		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
 };
 
 static	__checkReturn	efx_rc_t
@@ -1757,7 +1785,7 @@ ef10_external_port_mapping(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
@@ -1921,7 +1949,7 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_entity_reset(
 	__in		efx_nic_t *enp)
 {
@@ -1954,6 +1982,10 @@ efx_mcdi_entity_reset(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c7edeaa000..b41b0e5dea 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -41,6 +41,10 @@
 #include "ef10_impl.h"
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+#include "rhead_impl.h"
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -835,7 +839,7 @@ struct efx_nic_s {
 #endif	/* EFSYS_OPT_SIENA */
 		int	enu_unused;
 	} en_u;
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	union en_arch {
 		struct {
 			int			ena_vi_base;
@@ -856,7 +860,7 @@ struct efx_nic_s {
 			size_t			ena_wc_mem_map_size;
 		} ef10;
 	} en_arch;
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #if EFSYS_OPT_EVB
 	const efx_evb_ops_t	*en_eeop;
 	struct efx_vswitch_s    *en_vswitchp;
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index dec3a170a7..ade7f7fed4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2032,7 +2032,7 @@ efx_mcdi_mac_stats_periodic(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 /*
  * This function returns the pf and vf number of a function.  If it is a pf the
@@ -2129,7 +2129,7 @@ efx_mcdi_privilege_mask(
 	return (rc);
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 	__checkReturn		efx_rc_t
 efx_mcdi_set_workaround(
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 9d6961e2ff..465e2c7a36 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -188,6 +188,27 @@ static const efx_nic_ops_t	__efx_nic_medford2_ops = {
 
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_nic_ops_t	__efx_nic_riverhead_ops = {
+	rhead_nic_probe,		/* eno_probe */
+	rhead_board_cfg,		/* eno_board_cfg */
+	rhead_nic_set_drv_limits,	/* eno_set_drv_limits */
+	rhead_nic_reset,		/* eno_reset */
+	rhead_nic_init,			/* eno_init */
+	rhead_nic_get_vi_pool,		/* eno_get_vi_pool */
+	rhead_nic_get_bar_region,	/* eno_get_bar_region */
+	rhead_nic_hw_unavailable,	/* eno_hw_unavailable */
+	rhead_nic_set_hw_unavailable,	/* eno_set_hw_unavailable */
+#if EFSYS_OPT_DIAG
+	rhead_nic_register_test,	/* eno_register_test */
+#endif	/* EFSYS_OPT_DIAG */
+	rhead_nic_fini,			/* eno_fini */
+	rhead_nic_unprobe,		/* eno_unprobe */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_nic_create(
@@ -285,6 +306,19 @@ efx_nic_create(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		enp->en_enop = &__efx_nic_riverhead_ops;
+		enp->en_features =
+		    EFX_FEATURE_IPV6 |
+		    EFX_FEATURE_LINK_EVENTS |
+		    EFX_FEATURE_PERIODIC_MAC_STATS |
+		    EFX_FEATURE_MCDI |
+		    EFX_FEATURE_MAC_HEADER_FILTERS |
+		    EFX_FEATURE_MCDI_DMA;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = ENOTSUP;
 		goto fail2;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8909525c34..6ca5b57023 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -51,7 +51,8 @@ sources = [
 	'ef10_vpd.c',
 	'hunt_nic.c',
 	'medford_nic.c',
-	'medford2_nic.c'
+	'medford2_nic.c',
+	'rhead_nic.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
new file mode 100644
index 0000000000..e25a871cb3
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_RHEAD_IMPL_H
+#define	_SYS_RHEAD_IMPL_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+#define	RHEAD_EVQ_MAXNEVS	16384
+#define	RHEAD_EVQ_MINNEVS	256
+
+#define	RHEAD_RXQ_MAXNDESCS	16384
+#define	RHEAD_RXQ_MINNDESCS	256
+
+#define	RHEAD_TXQ_MAXNDESCS	16384
+#define	RHEAD_TXQ_MINNDESCS	256
+
+#define	RHEAD_EVQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
+
+
+/* NIC */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_DIAG
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp);
+
+#endif	/* EFSYS_OPT_DIAG */
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp);
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_RHEAD_IMPL_H */
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
new file mode 100644
index 0000000000..c83d18e6ab
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -0,0 +1,500 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t end_padding;
+	uint32_t bandwidth;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
+	encp->enc_clk_mult = 1; /* not used for Riverhead */
+
+	/*
+	 * FIXME There are TxSend and TxSeg descriptors on Riverhead.
+	 * TxSeg is bigger than TxSend.
+	 */
+	encp->enc_tx_dma_desc_size_max = EFX_MASK32(ESF_GZ_TX_SEND_LEN);
+	/* No boundary crossing limits */
+	encp->enc_tx_dma_desc_boundary = 0;
+
+	/*
+	 * Maximum number of bytes into the frame the TCP header can start for
+	 * firmware assisted TSO to work.
+	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+
+	/*
+	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
+	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
+	 * resources (allocated to this PCIe function), which is zero until
+	 * after we have allocated VIs.
+	 */
+	encp->enc_evq_limit = 1024;
+	encp->enc_rxq_limit = EFX_RXQ_LIMIT_TARGET;
+	encp->enc_txq_limit = EFX_TXQ_LIMIT_TARGET;
+
+	encp->enc_buftbl_limit = UINT32_MAX;
+
+	/*
+	 * Enable firmware workarounds for hardware errata.
+	 * Expected responses are:
+	 *  - 0 (zero):
+	 *	Success: workaround enabled or disabled as requested.
+	 *  - MC_CMD_ERR_ENOSYS (reported as ENOTSUP):
+	 *	Firmware does not support the MC_CMD_WORKAROUND request.
+	 *	(assume that the workaround is not supported).
+	 *  - MC_CMD_ERR_ENOENT (reported as ENOENT):
+	 *	Firmware does not support the requested workaround.
+	 *  - MC_CMD_ERR_EPERM  (reported as EACCES):
+	 *	Unprivileged function cannot enable/disable workarounds.
+	 *
+	 * See efx_mcdi_request_errcode() for MCDI error translations.
+	 */
+
+	/*
+	 * Replay engine on Riverhead should suppress duplicate packets
+	 * (e.g. because of exact multicast and all-multicast filters
+	 * match) to the same RxQ.
+	 */
+	encp->enc_bug26807_workaround = B_FALSE;
+
+	/*
+	 * Checksums for TSO sends should always be correct on Riverhead.
+	 * FIXME: revisit when TSO support is implemented.
+	 */
+	encp->enc_bug61297_workaround = B_FALSE;
+
+	encp->enc_evq_max_nevs = RHEAD_EVQ_MAXNEVS;
+	encp->enc_evq_min_nevs = RHEAD_EVQ_MINNEVS;
+	encp->enc_rxq_max_ndescs = RHEAD_RXQ_MAXNDESCS;
+	encp->enc_rxq_min_ndescs = RHEAD_RXQ_MINNDESCS;
+	encp->enc_txq_max_ndescs = RHEAD_TXQ_MAXNDESCS;
+	encp->enc_txq_min_ndescs = RHEAD_TXQ_MINNDESCS;
+
+	/* Riverhead FW does not support event queue timers yet. */
+	encp->enc_evq_timer_quantum_ns = 0;
+	encp->enc_evq_timer_max_us = 0;
+
+	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
+	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
+	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
+
+	/* No required alignment for WPTR updates */
+	encp->enc_rx_push_align = 1;
+
+	/* Riverhead supports a single Rx prefix size. */
+	encp->enc_rx_prefix_size = ESE_GZ_RX_PKT_PREFIX_LEN;
+
+	/* Alignment for receive packet DMA buffers. */
+	encp->enc_rx_buf_align_start = 1;
+
+	/* Get the RX DMA end padding alignment configuration. */
+	if ((rc = efx_mcdi_get_rxdp_config(enp, &end_padding)) != 0) {
+		if (rc != EACCES)
+			goto fail2;
+
+		/* Assume largest tail padding size supported by hardware. */
+		end_padding = 128;
+	}
+	encp->enc_rx_buf_align_end = end_padding;
+
+	/*
+	 * Riverhead stores a single global copy of VPD, not per-PF as on
+	 * Huntington.
+	 */
+	encp->enc_vpd_is_global = B_TRUE;
+
+	rc = ef10_nic_get_port_mode_bandwidth(enp, &bandwidth);
+	if (rc != 0)
+		goto fail3;
+	encp->enc_required_pcie_bandwidth_mbps = bandwidth;
+	encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN3;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/* Read and clear any assertion state */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+
+	/* Exit the assertion handler */
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		if (rc != EACCES)
+			goto fail2;
+
+	if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
+		goto fail3;
+
+	/* Get remaining controller-specific board config */
+	if ((rc = enop->eno_board_cfg(enp)) != 0)
+		goto fail4;
+
+	/*
+	 * Set default driver config limits (based on board config).
+	 *
+	 * FIXME: For now allocate a fixed number of VIs which is likely to be
+	 * sufficient and small enough to allow multiple functions on the same
+	 * port.
+	 */
+	edcp->edc_min_vi_count = edcp->edc_max_vi_count =
+	    MIN(128, MAX(encp->enc_rxq_limit, encp->enc_txq_limit));
+
+	/*
+	 * The client driver must configure and enable PIO buffer support,
+	 * but there is no PIO support on Riverhead anyway.
+	 */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+#if EFSYS_OPT_MAC_STATS
+	/* Wipe the MAC statistics */
+	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
+		goto fail5;
+#endif
+
+#if EFSYS_OPT_LOOPBACK
+	if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
+		goto fail6;
+#endif
+
+	return (0);
+
+#if EFSYS_OPT_LOOPBACK
+fail6:
+	EFSYS_PROBE(fail6);
+#endif
+#if EFSYS_OPT_MAC_STATS
+fail5:
+	EFSYS_PROBE(fail5);
+#endif
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_evq_count, max_evq_count;
+	uint32_t min_rxq_count, max_rxq_count;
+	uint32_t min_txq_count, max_txq_count;
+	efx_rc_t rc;
+
+	if (edlp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	/* Get minimum required and maximum usable VI limits */
+	min_evq_count = MIN(edlp->edl_min_evq_count, encp->enc_evq_limit);
+	min_rxq_count = MIN(edlp->edl_min_rxq_count, encp->enc_rxq_limit);
+	min_txq_count = MIN(edlp->edl_min_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_min_vi_count =
+	    MAX(min_evq_count, MAX(min_rxq_count, min_txq_count));
+
+	max_evq_count = MIN(edlp->edl_max_evq_count, encp->enc_evq_limit);
+	max_rxq_count = MIN(edlp->edl_max_rxq_count, encp->enc_rxq_limit);
+	max_txq_count = MIN(edlp->edl_max_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_max_vi_count =
+	    MAX(max_evq_count, MAX(max_rxq_count, max_txq_count));
+
+	/* There is no PIO support on Riverhead */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		goto fail2;
+
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
+		goto fail3;
+
+	/* Clear RX/TX DMA queue errors */
+	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp)
+{
+	const efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_vi_count, max_vi_count;
+	uint32_t vi_count, vi_base, vi_shift;
+	uint32_t vi_window_size;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
+
+	/* Enable reporting of some events (e.g. link change) */
+	if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
+		goto fail1;
+
+	min_vi_count = edcp->edc_min_vi_count;
+	max_vi_count = edcp->edc_max_vi_count;
+
+	/* Ensure that the previously attached driver's VIs are freed */
+	if ((rc = efx_mcdi_free_vis(enp)) != 0)
+		goto fail2;
+
+	/*
+	 * Reserve VI resources (EVQ+RXQ+TXQ) for this PCIe function. If this
+	 * fails then retrying the request for fewer VI resources may succeed.
+	 */
+	vi_count = 0;
+	if ((rc = efx_mcdi_alloc_vis(enp, min_vi_count, max_vi_count,
+		    &vi_base, &vi_count, &vi_shift)) != 0)
+		goto fail3;
+
+	EFSYS_PROBE2(vi_alloc, uint32_t, vi_base, uint32_t, vi_count);
+
+	if (vi_count < min_vi_count) {
+		rc = ENOMEM;
+		goto fail4;
+	}
+
+	enp->en_arch.ef10.ena_vi_base = vi_base;
+	enp->en_arch.ef10.ena_vi_count = vi_count;
+	enp->en_arch.ef10.ena_vi_shift = vi_shift;
+
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, !=,
+	    EFX_VI_WINDOW_SHIFT_INVALID);
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, <=,
+	    EFX_VI_WINDOW_SHIFT_64K);
+	vi_window_size = 1U << enp->en_nic_cfg.enc_vi_window_shift;
+
+	/* Save UC memory mapping details */
+	enp->en_arch.ef10.ena_uc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_uc_mem_map_size =
+	    vi_window_size * enp->en_arch.ef10.ena_vi_count;
+
+	/* No WC memory mapping since PIO is not supported */
+	enp->en_arch.ef10.ena_pio_write_vi_base = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
+
+	enp->en_vport_id = EVB_PORT_ID_NULL;
+
+	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
+
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+
+	(void) efx_mcdi_free_vis(enp);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp)
+{
+	/*
+	 * Report VIs that the client driver can use.
+	 * Do not include VIs used for PIO buffer writes.
+	 */
+	*vi_countp = enp->en_arch.ef10.ena_vi_count;
+
+	return (0);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep)
+{
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/*
+	 * TODO: Specify host memory mapping alignment and granularity
+	 * in efx_drv_limits_t so that they can be taken into account
+	 * when allocating extra VIs for PIO writes.
+	 */
+	switch (region) {
+	case EFX_REGION_VI:
+		/* UC mapped memory BAR region for VI registers */
+		*offsetp = enp->en_arch.ef10.ena_uc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_uc_mem_map_size;
+		break;
+
+	case EFX_REGION_PIO_WRITE_VI:
+		/* WC mapped memory BAR region for piobuf writes */
+		*offsetp = enp->en_arch.ef10.ena_wc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_wc_mem_map_size;
+		break;
+
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	efx_dword_t dword;
+
+	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
+		return (B_TRUE);
+
+	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
+		goto unavail;
+
+	return (B_FALSE);
+
+unavail:
+	rhead_nic_set_hw_unavailable(enp);
+
+	return (B_TRUE);
+}
+
+			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	EFSYS_PROBE(hw_unavail);
+	enp->en_reset_flags |= EFX_RESET_HW_UNAVAIL;
+}
+
+			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_free_vis(enp);
+	enp->en_arch.ef10.ena_vi_count = 0;
+}
+
+			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_drv_attach(enp, B_FALSE);
+}
+
+#if EFSYS_OPT_DIAG
+
+	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* FIXME */
+	_NOTE(ARGUNUSED(enp))
+	_NOTE(CONSTANTCONDITION)
+	if (B_FALSE) {
+		rc = ENOTSUP;
+		goto fail1;
+	}
+	/* FIXME */
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFSYS_OPT_DIAG */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (13 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
                     ` (45 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Riverhead does not support tunnels yet.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_tunnel.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 1cc072f0d9..b1d1407bd2 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -10,12 +10,12 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
 	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
 };
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
@@ -171,6 +171,12 @@ efx_tunnel_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etop = &__efx_tunnel_dummy_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 16/60] common/sfc_efx/base: use EF10 filter methods for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (14 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
                     ` (44 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Filtering MCDI on Riverhead are the same as on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c | 14 +++++++-------
 drivers/common/sfc_efx/base/efx_filter.c  | 18 ++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h    |  4 ++--
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 12c84a5640..51e6f1a210 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_FILTER
 
@@ -94,7 +94,7 @@ ef10_filter_init(
 	efx_rc_t rc;
 	ef10_filter_table_t *eftp;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 #define	MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match))
 	EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_HOST ==
@@ -152,7 +152,7 @@ ef10_filter_init(
 ef10_filter_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if (enp->en_filter.ef_ef10_filter_table != NULL) {
 		EFSYS_KMEM_FREE(enp->en_esip, sizeof (ef10_filter_table_t),
@@ -540,7 +540,7 @@ ef10_filter_restore(
 	efsys_lock_state_t state;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	for (tbl_id = 0; tbl_id < EFX_EF10_FILTER_TBL_ROWS; tbl_id++) {
 
@@ -839,7 +839,7 @@ ef10_filter_add_internal(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	EFSYS_ASSERT(spec->efs_overridden_spec == NULL);
 
@@ -1149,7 +1149,7 @@ ef10_filter_delete(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	hash = ef10_filter_hash(spec);
 
@@ -2138,4 +2138,4 @@ ef10_filter_default_rxq_clear(
 
 #endif /* EFSYS_OPT_FILTER */
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_filter.c b/drivers/common/sfc_efx/base/efx_filter.c
index 3310b738e2..9b4cd08bb8 100644
--- a/drivers/common/sfc_efx/base/efx_filter.c
+++ b/drivers/common/sfc_efx/base/efx_filter.c
@@ -68,6 +68,18 @@ static const efx_filter_ops_t	__efx_filter_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_filter_ops_t	__efx_filter_rhead_ops = {
+	ef10_filter_init,		/* efo_init */
+	ef10_filter_fini,		/* efo_fini */
+	ef10_filter_restore,		/* efo_restore */
+	ef10_filter_add,		/* efo_add */
+	ef10_filter_delete,		/* efo_delete */
+	ef10_filter_supported_filters,	/* efo_supported_filters */
+	ef10_filter_reconfigure,	/* efo_reconfigure */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_filter_insert(
 	__in		efx_nic_t *enp,
@@ -180,6 +192,12 @@ efx_filter_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		efop = &__efx_filter_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b41b0e5dea..cc34a05f95 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -465,9 +465,9 @@ typedef struct efx_filter_s {
 #if EFSYS_OPT_SIENA
 	siena_filter_t		*ef_siena_filter;
 #endif /* EFSYS_OPT_SIENA */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	ef10_filter_table_t	*ef_ef10_filter_table;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 } efx_filter_t;
 
 #if EFSYS_OPT_SIENA
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 17/60] common/sfc_efx/base: use EF10 MAC methods for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (15 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
                     ` (43 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

There is no difference yet in MAC support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mac.c |  6 ++---
 drivers/common/sfc_efx/base/efx_impl.h |  1 +
 drivers/common/sfc_efx/base/efx_mac.c  | 32 ++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mac.c b/drivers/common/sfc_efx/base/ef10_mac.c
index 7e89f34a69..6fe44f13e2 100644
--- a/drivers/common/sfc_efx/base/ef10_mac.c
+++ b/drivers/common/sfc_efx/base/ef10_mac.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_mac_poll(
@@ -351,7 +351,7 @@ ef10_mac_multicast_list_set(
 	const efx_mac_ops_t *emop = epp->ep_emop;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if ((rc = emop->emo_reconfigure(enp)) != 0)
 		goto fail1;
@@ -1039,4 +1039,4 @@ ef10_mac_stats_update(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index cc34a05f95..f2ea08bbf6 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -77,6 +77,7 @@ typedef enum efx_mac_type_e {
 	EFX_MAC_HUNTINGTON,
 	EFX_MAC_MEDFORD,
 	EFX_MAC_MEDFORD2,
+	EFX_MAC_RIVERHEAD,
 	EFX_MAC_NTYPES
 } efx_mac_type_t;
 
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index ae23aad4b2..36aca6787c 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -64,6 +64,31 @@ static const efx_mac_ops_t	__efx_mac_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_mac_ops_t	__efx_mac_rhead_ops = {
+	ef10_mac_poll,				/* emo_poll */
+	ef10_mac_up,				/* emo_up */
+	ef10_mac_addr_set,			/* emo_addr_set */
+	ef10_mac_pdu_set,			/* emo_pdu_set */
+	ef10_mac_pdu_get,			/* emo_pdu_get */
+	ef10_mac_reconfigure,			/* emo_reconfigure */
+	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
+	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
+	ef10_mac_filter_default_rxq_clear,
+					/* emo_filter_default_rxq_clear */
+#if EFSYS_OPT_LOOPBACK
+	ef10_mac_loopback_set,			/* emo_loopback_set */
+#endif	/* EFSYS_OPT_LOOPBACK */
+#if EFSYS_OPT_MAC_STATS
+	ef10_mac_stats_get_mask,		/* emo_stats_get_mask */
+	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
+	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
+	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
+	ef10_mac_stats_update			/* emo_stats_update */
+#endif	/* EFSYS_OPT_MAC_STATS */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn			efx_rc_t
 efx_mac_pdu_set(
 	__in				efx_nic_t *enp,
@@ -873,6 +898,13 @@ efx_mac_select(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emop = &__efx_mac_rhead_ops;
+		type = EFX_MAC_RIVERHEAD;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = EINVAL;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 18/60] common/sfc_efx/base: add interrupts module for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (16 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
                     ` (42 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Riverhead supports interrupt aggregation rings. Right now there
are no plans to support it in libefx, but it is better to have
own set of callbacks to easier handle EF10 and Riverhead
differences in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_intr.c   |  20 +++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  55 ++++++++++++
 drivers/common/sfc_efx/base/rhead_intr.c | 104 +++++++++++++++++++++++
 4 files changed, 180 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c

diff --git a/drivers/common/sfc_efx/base/efx_intr.c b/drivers/common/sfc_efx/base/efx_intr.c
index 7e3cc3c6a0..1dfa19df2e 100644
--- a/drivers/common/sfc_efx/base/efx_intr.c
+++ b/drivers/common/sfc_efx/base/efx_intr.c
@@ -89,6 +89,20 @@ static const efx_intr_ops_t	__efx_intr_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_intr_ops_t	__efx_intr_rhead_ops = {
+	rhead_intr_init,		/* eio_init */
+	rhead_intr_enable,		/* eio_enable */
+	rhead_intr_disable,		/* eio_disable */
+	rhead_intr_disable_unlocked,	/* eio_disable_unlocked */
+	rhead_intr_trigger,		/* eio_trigger */
+	rhead_intr_status_line,		/* eio_status_line */
+	rhead_intr_status_message,	/* eio_status_message */
+	rhead_intr_fatal,		/* eio_fatal */
+	rhead_intr_fini,		/* eio_fini */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_intr_init(
 	__in		efx_nic_t *enp,
@@ -138,6 +152,12 @@ efx_intr_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eiop = &__efx_intr_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(B_FALSE);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 6ca5b57023..ea2517ba26 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_intr.c',
 	'rhead_nic.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index e25a871cb3..b95302a13f 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -98,6 +98,61 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* INTR */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_intr.c b/drivers/common/sfc_efx/base/rhead_intr.c
new file mode 100644
index 0000000000..08c770529f
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_intr.c
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp)
+{
+	_NOTE(ARGUNUSED(enp, type, esmp))
+
+	return (0);
+}
+
+
+			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level)
+{
+	_NOTE(ARGUNUSED(enp, level))
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp)
+{
+	_NOTE(ARGUNUSED(enp, qmaskp))
+
+	/*
+	 * Riverhead does not support line interrupts,
+	 * so this function should never be called.
+	 */
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp)
+{
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	_NOTE(ARGUNUSED(enp, message))
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp)
+{
+	/* Fatal errors are reported via events */
+	_NOTE(ARGUNUSED(enp))
+}
+
+			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (17 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
                     ` (41 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

EvQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement EvQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  | 304 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  33 +++
 drivers/common/sfc_efx/base/efx_mcdi.c | 306 +++++++++++++++++++++++++
 3 files changed, 339 insertions(+), 304 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index f0a135ed57..08729cf71e 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -100,310 +100,6 @@ efx_mcdi_set_evq_tmr(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags,
-	__in		boolean_t low_latency)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	boolean_t interrupting;
-	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
-	unsigned int evq_type;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_evq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
-		MC_CMD_FINI_EVQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the EVQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
 
 	__checkReturn	efx_rc_t
 ef10_ev_init(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f2ea08bbf6..bf1cfc49ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,6 +1408,39 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index ade7f7fed4..5b733bb88c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,4 +2443,310 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	boolean_t interrupting;
+	int ev_cut_through;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	/*
+	 * On Huntington RX and TX event batching can only be requested together
+	 * (even if the datapath firmware doesn't actually support RX
+	 * batching). If event cut through is enabled no RX batching will occur.
+	 *
+	 * So always enable RX and TX event batching, and enable event cut
+	 * through if we want low latency operation.
+	 */
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		ev_cut_through = low_latency ? 1 : 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		ev_cut_through = 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		ev_cut_through = 1;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
+	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
+	boolean_t interrupting;
+	unsigned int evq_type;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
+		MC_CMD_FINI_EVQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the EVQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 20/60] common/sfc_efx/base: move EvQ create generic checks
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (18 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
                     ` (40 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

There is no point to duplicate these generic checks in NIC family
specific handlers.

As the side effect it fixes bug with incorrect interrupt moderation
settings silently ignored on event queue create on Siena.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c | 20 ++-----------
 drivers/common/sfc_efx/base/efx_ev.c  | 42 ++++++++++++++++-----------
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 08729cf71e..18f19e816d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -133,16 +133,6 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	if (us > encp->enc_evq_timer_max_us) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
@@ -156,7 +146,7 @@ ef10_ev_qcreate(
 	if (flags & EFX_EVQ_FLAGS_NO_CONT_EV) {
 		if (enp->en_nic_cfg.enc_no_cont_ev_mode_supported == B_FALSE) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail1;
 		}
 	}
 
@@ -197,7 +187,7 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
 		    flags);
 		if (rc != 0)
-			goto fail4;
+			goto fail2;
 	} else {
 		/*
 		 * On Huntington we need to specify the settings to use.
@@ -214,15 +204,11 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 		    low_latency);
 		if (rc != 0)
-			goto fail5;
+			goto fail3;
 	}
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 21fddfb64d..4d11c531ce 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -236,18 +236,28 @@ efx_ev_qcreate(
 	EFSYS_ASSERT3U(enp->en_ev_qcount + 1, <,
 	    enp->en_nic_cfg.enc_evq_limit);
 
+	if (index >= encp->enc_evq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (us > encp->enc_evq_timer_max_us) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
 	switch (flags & EFX_EVQ_FLAGS_NOTIFY_MASK) {
 	case EFX_EVQ_FLAGS_NOTIFY_INTERRUPT:
 		break;
 	case EFX_EVQ_FLAGS_NOTIFY_DISABLED:
 		if (us != 0) {
 			rc = EINVAL;
-			goto fail1;
+			goto fail3;
 		}
 		break;
 	default:
 		rc = EINVAL;
-		goto fail2;
+		goto fail4;
 	}
 
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
@@ -257,14 +267,14 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail5;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail4;
+		goto fail6;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -287,16 +297,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail5;
+		goto fail7;
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
+fail7:
+	EFSYS_PROBE(fail7);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
@@ -1189,15 +1203,11 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 #endif
 	for (size = 0;
@@ -1207,7 +1217,7 @@ siena_ev_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	/* Set up the handler table */
@@ -1239,13 +1249,11 @@ siena_ev_qcreate(
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
-#if EFSYS_OPT_RX_SCALE
 fail2:
 	EFSYS_PROBE(fail2);
-#endif
+#if EFSYS_OPT_RX_SCALE
 fail1:
+#endif
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
 	return (rc);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 21/60] common/sfc_efx/base: prepare to merge EvQ init functions
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (19 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
                     ` (39 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

v1 and v2 defines are the same except output length.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 52 +++++++++++++-------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 5b733bb88c..50d723ecb4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2458,8 +2458,8 @@ efx_mcdi_init_evq(
 {
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
 	int npages;
@@ -2476,13 +2476,13 @@ efx_mcdi_init_evq(
 
 	req.emr_cmd = MC_CMD_INIT_EVQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
 
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
@@ -2509,37 +2509,37 @@ efx_mcdi_init_evq(
 		rc = EINVAL;
 		goto fail2;
 	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
 	} else {
 		unsigned int ticks;
 
 		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
 			goto fail3;
 
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
 	}
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
 
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
 	for (i = 0; i < npages; i++) {
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (20 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
                     ` (38 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

The decision on which version of the INIT_EVQ command to use may
be done inside the function itself. Caller should just provide
enough information sufficient in both cases. It avoids code
duplication and simplifies maintenance.

If v2 is not supported, keep decision about low-latency hint outside
the MCDI helper function since it will differ on Riverhead (there is
no EVB yet, but still want merging for better throughput).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  |  54 +++---
 drivers/common/sfc_efx/base/efx_impl.h |  11 --
 drivers/common/sfc_efx/base/efx_mcdi.c | 228 ++++++++-----------------
 3 files changed, 95 insertions(+), 198 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 18f19e816d..e2b5c62d5d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -130,6 +130,7 @@ ef10_ev_qcreate(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	uint32_t irq;
 	efx_rc_t rc;
+	boolean_t low_latency;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
@@ -175,42 +176,29 @@ ef10_ev_qcreate(
 	 * created. See bug58606.
 	 */
 
-	if (encp->enc_init_evq_v2_supported) {
-		/*
-		 * On Medford the low latency license is required to enable RX
-		 * and event cut through and to disable RX batching.  If event
-		 * queue type in flags is auto, we let the firmware decide the
-		 * settings to use. If the adapter has a low latency license,
-		 * it will choose the best settings for low latency, otherwise
-		 * it will choose the best settings for throughput.
-		 */
-		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
-		    flags);
-		if (rc != 0)
-			goto fail2;
-	} else {
-		/*
-		 * On Huntington we need to specify the settings to use.
-		 * If event queue type in flags is auto, we favour throughput
-		 * if the adapter is running virtualization supporting firmware
-		 * (i.e. the full featured firmware variant)
-		 * and latency otherwise. The Ethernet Virtual Bridging
-		 * capability is used to make this decision. (Note though that
-		 * the low latency firmware variant is also best for
-		 * throughput and corresponding type should be specified
-		 * to choose it.)
-		 */
-		boolean_t low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
-		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
-		    low_latency);
-		if (rc != 0)
-			goto fail3;
-	}
+	/*
+	 * On Huntington we need to specify the settings to use.
+	 * If event queue type in flags is auto, we favour throughput
+	 * if the adapter is running virtualization supporting firmware
+	 * (i.e. the full featured firmware variant)
+	 * and latency otherwise. The Ethernet Virtual Bridging
+	 * capability is used to make this decision. (Note though that
+	 * the low latency firmware variant is also best for
+	 * throughput and corresponding type should be specified
+	 * to choose it.)
+	 *
+	 * If FW supports EvQ types (e.g. on Medford and Medford2) the
+	 * type which is specified in flags is passed to FW to make the
+	 * decision and low_latency hint is ignored.
+	 */
+	low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    low_latency);
+	if (rc != 0)
+		goto fail2;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index bf1cfc49ca..47e4dcb01f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1422,17 +1422,6 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency);
 
-LIBEFX_INTERNAL
-extern	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags);
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_fini_evq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 50d723ecb4..69d2327839 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2456,146 +2456,14 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
 		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
 	boolean_t interrupting;
 	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
+	int ev_merge;
 	unsigned int evq_type;
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2622,24 +2490,68 @@ efx_mcdi_init_evq_v2(
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
 
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
+	if (encp->enc_init_evq_v2_supported) {
+		/*
+		 * On Medford the low latency license is required to enable RX
+		 * and event cut through and to disable RX batching.  If event
+		 * queue type in flags is auto, we let the firmware decide the
+		 * settings to use. If the adapter has a low latency license,
+		 * it will choose the best settings for low latency, otherwise
+		 * it will choose the best settings for throughput.
+		 */
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
+		/* EvQ type controls merging, no manual settings */
+		ev_merge = 0;
+		ev_cut_through = 0;
+	} else {
+		/* EvQ types other than manual are not supported */
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_MANUAL;
+		/*
+		 * On Huntington RX and TX event batching can only be requested
+		 * together (even if the datapath firmware doesn't actually
+		 * support RX batching). If event cut through is enabled no RX
+		 * batching will occur.
+		 *
+		 * So always enable RX and TX event batching, and enable event
+		 * cut through if we want low latency operation.
+		 */
+		ev_merge = 1;
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			ev_cut_through = low_latency ? 1 : 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			ev_cut_through = 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			ev_cut_through = 1;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
 	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+
+	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
 
 	/* If the value is zero then disable the timer */
@@ -2683,18 +2595,26 @@ efx_mcdi_init_evq_v2(
 		goto fail4;
 	}
 
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
+	if (encp->enc_init_evq_v2_supported) {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail5;
+		}
+		EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+			    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+	} else {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail6;
+		}
 	}
 
 	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
 
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
 fail5:
 	EFSYS_PROBE(fail5);
 fail4:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 23/60] common/sfc_efx/base: add event queue module for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (21 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
                     ` (37 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Events are significantly reworked on Riverhead, so it is better
to implement own set of callbacks to simplify future development
and avoid inheritance of legacy code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c     |  22 ++
 drivers/common/sfc_efx/base/efx_impl.h   |   4 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |  19 +-
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_ev.c   | 265 +++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  73 +++++++
 6 files changed, 379 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 4d11c531ce..edc1b182c9 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -109,6 +109,22 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_ev_ops_t	__efx_ev_rhead_ops = {
+	rhead_ev_init,				/* eevo_init */
+	rhead_ev_fini,				/* eevo_fini */
+	rhead_ev_qcreate,			/* eevo_qcreate */
+	rhead_ev_qdestroy,			/* eevo_qdestroy */
+	rhead_ev_qprime,			/* eevo_qprime */
+	rhead_ev_qpost,				/* eevo_qpost */
+	rhead_ev_qpoll,				/* eevo_qpoll */
+	rhead_ev_qmoderate,			/* eevo_qmoderate */
+#if EFSYS_OPT_QSTATS
+	rhead_ev_qstats_update,			/* eevo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_ev_init(
@@ -150,6 +166,12 @@ efx_ev_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eevop = &__efx_ev_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 47e4dcb01f..f6b0850a65 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,7 +1408,7 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
@@ -1428,7 +1428,7 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 69d2327839..841dacc1c8 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,7 +2443,20 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+#define	INIT_EVQ_MAXNBUFS	MC_CMD_INIT_EVQ_V2_IN_DMA_ADDR_MAXNUM
+
 #if EFX_OPTS_EF10()
+# if (INIT_EVQ_MAXNBUFS < EF10_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFX_OPTS_EF10 */
+#if EFSYS_OPT_RIVERHEAD
+# if (INIT_EVQ_MAXNBUFS < RHEAD_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFSYS_OPT_RIVERHEAD */
 
 	__checkReturn	efx_rc_t
 efx_mcdi_init_evq(
@@ -2459,7 +2472,7 @@ efx_mcdi_init_evq(
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
 	int ev_cut_through;
@@ -2472,7 +2485,7 @@ efx_mcdi_init_evq(
 	efx_rc_t rc;
 
 	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
+	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
 	}
@@ -2667,6 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index ea2517ba26..8e50f82154 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
new file mode 100644
index 0000000000..36e355f209
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -0,0 +1,265 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD
+
+/*
+ * Non-interrupting event queue requires interrupting event queue to
+ * refer to for wake-up events even if wake ups are never used.
+ * It could be even non-allocated event queue.
+ */
+#define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
+
+
+	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+
+	return (0);
+}
+
+			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep)
+{
+	uint32_t irq;
+	efx_rc_t rc;
+
+	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
+
+	/* Set up the handler table */
+	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_driver	= NULL; /* FIXME */
+	eep->ee_drv_gen	= NULL; /* FIXME */
+	eep->ee_mcdi	= NULL; /* FIXME */
+
+	/* Set up the event queue */
+	/* INIT_EVQ expects function-relative vector number */
+	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT) {
+		irq = index;
+	} else if (index == EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX) {
+		irq = index;
+		flags = (flags & ~EFX_EVQ_FLAGS_NOTIFY_MASK) |
+		    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT;
+	} else {
+		irq = EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX;
+	}
+
+	/*
+	 * Interrupts may be raised for events immediately after the queue is
+	 * created. See bug58606.
+	 */
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    B_FALSE);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep)
+{
+	efx_nic_t *enp = eep->ee_enp;
+
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	(void) efx_mcdi_fini_evq(enp, eep->ee_index);
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t rptr;
+	efx_dword_t dword;
+
+	rptr = count & eep->ee_mask;
+
+	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
+	    ERF_GZ_IDX, rptr);
+	/* EVQ_INT_PRIME lives function control window only on Riverhead */
+	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+
+	return (0);
+}
+
+			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data)
+{
+	_NOTE(ARGUNUSED(eep, data))
+
+	/* Not implemented yet */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+/*
+ * Poll event queue in batches. Size of the batch is equal to cache line
+ * size divided by event size.
+ *
+ * Event queue is written by NIC and read by CPU. If CPU starts reading
+ * of events on the cache line, read all remaining events in a tight
+ * loop while event is present.
+ */
+#define	EF100_EV_BATCH	8
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_PRESENT(_qword, _phase_bit)				\
+	(EFX_QWORD_FIELD((_qword), ESF_GZ_EV_EVQ_PHASE) == _phase_bit)
+
+			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EF100_EV_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_BATCH - (count & (EF100_EV_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_PRESENT(ev[total], phase_bit))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
+			switch (code) {
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_BATCH);
+				batch += (EF100_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us)
+{
+	_NOTE(ARGUNUSED(eep, us))
+
+	return (ENOTSUP);
+}
+
+
+#if EFSYS_OPT_QSTATS
+			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < EV_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, eep->ee_stat[id]);
+		eep->ee_stat[id] = 0;
+	}
+}
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index b95302a13f..47885b28dc 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -12,6 +12,13 @@ extern "C" {
 #endif
 
 
+/*
+ * Riverhead requires physically contiguous event rings (so, just one
+ * DMA address is sufficient to represent it), but MCDI interface is still
+ * in terms of 4k size 4k-aligned DMA buffers.
+ */
+#define	RHEAD_EVQ_MAXNBUFS	32
+
 #define	RHEAD_EVQ_MAXNEVS	16384
 #define	RHEAD_EVQ_MINNEVS	256
 
@@ -98,6 +105,72 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* EV */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 /* INTR */
 
 LIBEFX_INTERNAL
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (22 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
                     ` (36 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Client drivers relying on interrupts will fail to complete event
queue creation on Riverhead boards as the latter have no support
for INIT_DONE events which means that it's useless to wait until
initialisation callback is triggered by interrupt-driven polling.

Client drivers which avoid interrupt-driven polling still handle
INIT_DONE events by direct polling and will fail to do so.

Solve this problem by adding an extra poll-once method which
will be called by client drivers after queue creation (probably,
with driver-specific lock being held). The method will invoke
initialisation callback on Riverhead and do nothing on the other
boards. Then the drivers will proceed with normal waiting which
will complete immediately in the case of Riverhead.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  8 +++++
 drivers/common/sfc_efx/base/efx_ev.c          | 30 +++++++++++++++++++
 drivers/common/sfc_efx/base/hunt_nic.c        |  6 ++++
 drivers/common/sfc_efx/base/medford2_nic.c    |  6 ++++
 drivers/common/sfc_efx/base/medford_nic.c     |  6 ++++
 drivers/common/sfc_efx/base/rhead_nic.c       |  6 ++++
 drivers/common/sfc_efx/base/siena_nic.c       |  6 ++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 drivers/net/sfc/sfc_ev.c                      | 12 ++++++--
 9 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c7fe814ca0..2c49280a43 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1443,6 +1443,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
 #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+	boolean_t		enc_evq_init_done_ev_supported;
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
@@ -2430,6 +2431,13 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+LIBEFX_API
+extern			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 LIBEFX_API
 extern			void
 efx_ev_qpoll(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index edc1b182c9..99a7743edb 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -423,6 +423,36 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+/*
+ * This method is needed to ensure that eec_initialized callback
+ * is invoked after queue creation. The callback will be invoked
+ * on Riverhead boards which have no support for INIT_DONE events
+ * and will do nothing on other boards.
+ *
+ * The client drivers must call this method after calling efx_ev_create().
+ * The call must be done with the same locks being held (if any) which are
+ * normally acquired around efx_ev_qpoll() calls to ensure that
+ * eec_initialized callback is invoked within the same locking context.
+ */
+			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	const efx_nic_cfg_t *encp;
+
+	EFSYS_ASSERT(eep != NULL);
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(eecp != NULL);
+	EFSYS_ASSERT(eecp->eec_initialized != NULL);
+
+	encp = efx_nic_cfg_get(eep->ee_enp);
+
+	if (encp->enc_evq_init_done_ev_supported == B_FALSE)
+		(void) eecp->eec_initialized(arg);
+}
+
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/hunt_nic.c b/drivers/common/sfc_efx/base/hunt_nic.c
index 75c9050070..489c2d35d3 100644
--- a/drivers/common/sfc_efx/base/hunt_nic.c
+++ b/drivers/common/sfc_efx/base/hunt_nic.c
@@ -76,6 +76,12 @@ hunt_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford2_nic.c b/drivers/common/sfc_efx/base/medford2_nic.c
index 1a454fc34b..f19435a202 100644
--- a/drivers/common/sfc_efx/base/medford2_nic.c
+++ b/drivers/common/sfc_efx/base/medford2_nic.c
@@ -44,6 +44,12 @@ medford2_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford_nic.c b/drivers/common/sfc_efx/base/medford_nic.c
index 6c85b0c841..6ad9af9403 100644
--- a/drivers/common/sfc_efx/base/medford_nic.c
+++ b/drivers/common/sfc_efx/base/medford_nic.c
@@ -42,6 +42,12 @@ medford_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index c83d18e6ab..b779b4f8e1 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -51,6 +51,12 @@ rhead_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
+	/*
+	 * Riverhead event queue creation completes
+	 * immediately (no initial event).
+	 */
+	encp->enc_evq_init_done_ev_supported = B_FALSE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index b9b6d1951c..beabac0d38 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -135,6 +135,12 @@ siena_board_cfg(
 	encp->enc_rx_scale_additional_modes_supported = B_FALSE;
 #endif /* EFSYS_OPT_RX_SCALE */
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
 	/* Fragments must not span 4k boundaries. */
 	encp->enc_tx_dma_desc_boundary = 4096;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 5e2a7ad919..9b1715bfee 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -6,6 +6,7 @@ INTERNAL {
 	efx_ev_fini;
 	efx_ev_init;
 	efx_ev_qcreate;
+	efx_ev_qcreate_check_init_done;
 	efx_ev_qdestroy;
 	efx_ev_qmoderate;
 	efx_ev_qpending;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 83115e8775..7e5676fa45 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -608,6 +608,8 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	else
 		evq_flags |= EFX_EVQ_FLAGS_NOTIFY_DISABLED;
 
+	evq->init_state = SFC_EVQ_STARTING;
+
 	/* Create the common code event queue */
 	rc = efx_ev_qcreate(sa->nic, hw_index, esmp, evq->entries,
 			    0 /* unused on EF10 */, 0, evq_flags,
@@ -632,7 +634,13 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 		evq->callbacks = &sfc_ev_callbacks;
 	}
 
-	evq->init_state = SFC_EVQ_STARTING;
+	/*
+	 * Poll once to ensure that eec_initialized callback is invoked in
+	 * case if the hardware does not support INIT_DONE events. If the
+	 * hardware supports INIT_DONE events, this will do nothing, and the
+	 * corresponding event will be processed by sfc_ev_qpoll() below.
+	 */
+	efx_ev_qcreate_check_init_done(evq->common, evq->callbacks, evq);
 
 	/* Wait for the initialization event */
 	total_delay_us = 0;
@@ -665,10 +673,10 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	return 0;
 
 fail_timedout:
-	evq->init_state = SFC_EVQ_INITIALIZED;
 	efx_ev_qdestroy(evq->common);
 
 fail_ev_qcreate:
+	evq->init_state = SFC_EVQ_INITIALIZED;
 	sfc_log_init(sa, "failed %d", rc);
 	return rc;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 25/60] common/sfc_efx/base: handle MCDI events on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (23 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
                     ` (35 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

EF100 MCDI event layout is same as on EF10 except added QDMA phase
bit which is unused on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c   | 17 +++++++------
 drivers/common/sfc_efx/base/ef10_impl.h |  8 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  | 33 ++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index e2b5c62d5d..aec1c468a4 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -47,13 +47,6 @@ ef10_ev_drv_gen(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-static	__checkReturn	boolean_t
-ef10_ev_mcdi(
-	__in		efx_evq_t *eep,
-	__in		efx_qword_t *eqp,
-	__in		const efx_ev_callbacks_t *eecp,
-	__in_opt	void *arg);
-
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_set_evq_tmr(
@@ -857,7 +850,11 @@ ef10_ev_drv_gen(
 	return (should_abort);
 }
 
-static	__checkReturn	boolean_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	boolean_t
 ef10_ev_mcdi(
 	__in		efx_evq_t *eep,
 	__in		efx_qword_t *eqp,
@@ -1064,6 +1061,10 @@ ef10_ev_mcdi(
 	return (should_abort);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 		void
 ef10_ev_rxlabel_init(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e933d88135..e77fb4ddea 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -158,6 +158,14 @@ ef10_ev_rxlabel_fini(
 	__in		efx_evq_t *eep,
 	__in		unsigned int label);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+ef10_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 /* INTR */
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 36e355f209..6113cc9cf3 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -17,6 +17,14 @@
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_init(
 	__in		efx_nic_t *enp)
@@ -54,7 +62,7 @@ rhead_ev_qcreate(
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
-	eep->ee_mcdi	= NULL; /* FIXME */
+	eep->ee_mcdi	= rhead_ev_mcdi;
 
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
@@ -193,6 +201,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_MCDI:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			default:
 				EFSYS_PROBE3(bad_event,
 				    unsigned int, eep->ee_index,
@@ -262,4 +274,23 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t ret;
+
+	/*
+	 * Event format was changed post Riverhead R1 and now
+	 * MCDI event layout on EF100 is exactly the same as on EF10
+	 * except added QDMA phase bit which is unused on EF10.
+	 */
+	ret = ef10_ev_mcdi(eep, eqp, eecp, arg);
+
+	return (ret);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (24 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
                     ` (34 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

RxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement RxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 184 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  28 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 187 +++++++++++++++++++++++++
 3 files changed, 215 insertions(+), 184 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index bfa55337c2..f27058963f 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -10,190 +10,6 @@
 
 #if EFX_OPTS_EF10()
 
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		efx_evq_t *eep,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
-	int npages = efx_rxq_nbufs(enp, ndescs);
-	int i;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	efx_rc_t rc;
-	uint32_t dma_mode;
-	boolean_t want_outer_classes;
-	boolean_t no_cont_ev;
-
-	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
-		/* TODO: Support scatter in NO_CONT_EV mode */
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	if (ps_bufsize > 0)
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
-		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
-	else
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
-
-	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
-		/*
-		 * WANT_OUTER_CLASSES can only be specified on hardware which
-		 * supports tunnel encapsulation offloads, even though it is
-		 * effectively the behaviour the hardware gives.
-		 *
-		 * Also, on hardware which does support such offloads, older
-		 * firmware rejects the flag if the offloads are not supported
-		 * by the current firmware variant, which means this may fail if
-		 * the capabilities are not updated when the firmware variant
-		 * changes. This is not an issue on newer firmware, as it was
-		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
-		 * specified on all firmware variants.
-		 */
-		want_outer_classes = B_TRUE;
-	} else {
-		want_outer_classes = B_FALSE;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
-	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
-	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
-	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
-	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
-	    INIT_RXQ_EXT_IN_DMA_MODE,
-	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
-	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
-	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
-
-	if (es_bufs_per_desc > 0) {
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
-	}
-
-	if (encp->enc_init_rxq_with_buffer_size)
-		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
-		MC_CMD_FINI_RXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the RXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
 efx_mcdi_rss_context_alloc(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f6b0850a65..48f853cf91 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,34 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 841dacc1c8..8bf7c86c3a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2682,4 +2682,191 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
+		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	int npages = efx_rxq_nbufs(enp, ndescs);
+	int i;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	efx_rc_t rc;
+	uint32_t dma_mode;
+	boolean_t want_outer_classes;
+	boolean_t no_cont_ev;
+
+	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
+	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+		/* TODO: Support scatter in NO_CONT_EV mode */
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	if (ps_bufsize > 0)
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
+	else if (es_bufs_per_desc > 0)
+		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
+	else
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
+
+	if (encp->enc_tunnel_encapsulations_supported != 0 &&
+	    !want_inner_classes) {
+		/*
+		 * WANT_OUTER_CLASSES can only be specified on hardware which
+		 * supports tunnel encapsulation offloads, even though it is
+		 * effectively the behaviour the hardware gives.
+		 *
+		 * Also, on hardware which does support such offloads, older
+		 * firmware rejects the flag if the offloads are not supported
+		 * by the current firmware variant, which means this may fail if
+		 * the capabilities are not updated when the firmware variant
+		 * changes. This is not an issue on newer firmware, as it was
+		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
+		 * specified on all firmware variants.
+		 */
+		want_outer_classes = B_TRUE;
+	} else {
+		want_outer_classes = B_FALSE;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
+	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
+	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
+	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
+	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_DMA_MODE,
+	    dma_mode,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
+	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
+
+	if (es_bufs_per_desc > 0) {
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
+		    es_bufs_per_desc);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
+		    hol_block_timeout);
+	}
+
+	if (encp->enc_init_rxq_with_buffer_size)
+		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
+		    buf_size);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
+		MC_CMD_FINI_RXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 27/60] common/sfc_efx/base: move TxQ init/fini wrappers to generic
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (25 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
                     ` (33 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

TxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement TxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_tx.c  | 133 -------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  17 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 133 +++++++++++++++++++++++++
 3 files changed, 150 insertions(+), 133 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index e2f9ebac46..61c7e49fe8 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -20,139 +20,6 @@
 #define	EFX_TX_QSTAT_INCR(_etp, _stat)
 #endif
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		uint32_t target_evq,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		uint16_t flags,
-	__in		efsys_mem_t *esmp)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
-		MC_CMD_INIT_TXQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
-	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	npages = efx_txq_nbufs(enp, ndescs);
-	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
-
-	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
-	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
-	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
-	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
-	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
-	    INIT_TXQ_IN_CRC_MODE, 0,
-	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
-		MC_CMD_FINI_TXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the TXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 	__checkReturn	efx_rc_t
 ef10_tx_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 48f853cf91..7d470619e1 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1456,6 +1456,23 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8bf7c86c3a..a2ac053f0c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2867,6 +2867,139 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+		MC_CMD_INIT_TXQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	npages = efx_txq_nbufs(enp, ndescs);
+	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
+
+	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
+	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
+	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
+	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
+	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
+	    INIT_TXQ_IN_CRC_MODE, 0,
+	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
+		MC_CMD_FINI_TXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 28/60] common/sfc_efx/base: switch TxQ init to extended version
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (26 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
                     ` (32 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Extended version of MCDI allows up to 64 DMA addresses which are
required for Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index a2ac053f0c..8db52acd66 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2878,8 +2878,7 @@ efx_mcdi_init_txq(
 	__in		efsys_mem_t *esmp)
 {
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_TXQ_EXT_IN_LEN,
 		MC_CMD_INIT_TXQ_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2887,7 +2886,7 @@ efx_mcdi_init_txq(
 	int i;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	EFSYS_ASSERT(MC_CMD_INIT_TXQ_EXT_IN_DMA_ADDR_MAXNUM >=
 	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
 
 	if ((esmp == NULL) ||
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 29/60] common/sfc_efx/base: maintain RxQ counter in generic code
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (27 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
                     ` (31 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

The counter is incremented in generic efx_rx_qcreate(), but was
asserted and decremented in NIC family specific queue create and
destroy callbacks.  Move assert and decrement to generic functions
as well to make NIC family specific callbacks shorter.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 4 ----
 drivers/common/sfc_efx/base/efx_rx.c  | 9 +++++----
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index f27058963f..7004ab2aca 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -844,7 +844,6 @@ ef10_rx_qcreate(
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1022,9 +1021,6 @@ ef10_rx_qdestroy(
 
 	ef10_ev_rxlabel_fini(eep, label);
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index cce34cfce9..a361112849 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -819,6 +819,8 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
+	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
+
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
@@ -975,6 +977,9 @@ efx_rx_qdestroy(
 
 	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
 
+	EFSYS_ASSERT(enp->en_rx_qcount != 0);
+	--enp->en_rx_qcount;
+
 	erxop->erxo_qdestroy(erp);
 }
 
@@ -1626,7 +1631,6 @@ siena_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS ==
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1697,9 +1701,6 @@ siena_rx_qdestroy(
 	efx_nic_t *enp = erp->er_enp;
 	efx_oword_t oword;
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	/* Purge descriptor queue */
 	EFX_ZERO_OWORD(oword);
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 30/60] common/sfc_efx/base: free Rx queue structure in generic code
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (28 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
                     ` (30 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Rx queue structure is allocated in generic code, but was freed in NIC
family specific callbacks. Move free to generic function makes NIC
family specific callbacks shorter and reduces code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 3 ---
 drivers/common/sfc_efx/base/efx_rx.c  | 6 +++---
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 7004ab2aca..58152be768 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -1015,13 +1015,10 @@ ef10_rx_qcreate(
 ef10_rx_qdestroy(
 	__in	efx_rxq_t *erp)
 {
-	efx_nic_t *enp = erp->er_enp;
 	efx_evq_t *eep = erp->er_eep;
 	unsigned int label = erp->er_label;
 
 	ef10_ev_rxlabel_fini(eep, label);
-
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 		void
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index a361112849..d208c2292e 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -981,6 +981,9 @@ efx_rx_qdestroy(
 	--enp->en_rx_qcount;
 
 	erxop->erxo_qdestroy(erp);
+
+	/* Free the RXQ object */
+	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 	__checkReturn	efx_rc_t
@@ -1706,9 +1709,6 @@ siena_rx_qdestroy(
 
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
-
-	/* Free the RXQ object */
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 static		void
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 31/60] common/sfc_efx/base: move Rx index check to generic code
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (29 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
                     ` (29 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Make NIC family specific functions a bit shorter and reduce
code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 45 +++++++++++----------------
 drivers/common/sfc_efx/base/efx_rx.c  | 31 +++++++++---------
 2 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 58152be768..48666be5b5 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -845,16 +845,11 @@ ef10_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail2;
+			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
 		ps_buf_size = 0;
@@ -863,7 +858,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_PACKED_STREAM:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail2;
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
@@ -883,7 +878,7 @@ ef10_rx_qcreate(
 			break;
 		default:
 			rc = ENOTSUP;
-			goto fail4;
+			goto fail3;
 		}
 		erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
 		break;
@@ -892,7 +887,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 		ps_buf_size = 0;
 		es_bufs_per_desc =
@@ -907,7 +902,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 	default:
 		rc = ENOTSUP;
-		goto fail6;
+		goto fail5;
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -915,13 +910,13 @@ ef10_rx_qcreate(
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail7;
+			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
 		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
-			goto fail8;
+			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -932,17 +927,17 @@ ef10_rx_qcreate(
 	if (es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail9;
+			goto fail8;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail10;
+			goto fail9;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail11;
+			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -964,7 +959,7 @@ ef10_rx_qcreate(
 		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
 		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
 		    es_buf_stride, hol_block_timeout)) != 0)
-		goto fail12;
+		goto fail11;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
@@ -975,36 +970,34 @@ ef10_rx_qcreate(
 
 	return (0);
 
-fail12:
-	EFSYS_PROBE(fail12);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail11:
 	EFSYS_PROBE(fail11);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail10:
 	EFSYS_PROBE(fail10);
 fail9:
 	EFSYS_PROBE(fail9);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
 fail8:
 	EFSYS_PROBE(fail8);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail7:
 	EFSYS_PROBE(fail7);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail6:
 	EFSYS_PROBE(fail6);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail5:
 	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail3:
 	EFSYS_PROBE(fail3);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
 	EFSYS_PROBE(fail2);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index d208c2292e..bacab5ec67 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -824,11 +824,16 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
+	if (index >= encp->enc_rxq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	if (!ISP2(ndescs) ||
 	    ndescs < encp->enc_rxq_min_ndescs ||
 	    ndescs > encp->enc_rxq_max_ndescs) {
 		rc = EINVAL;
-		goto fail1;
+		goto fail2;
 	}
 
 	/* Allocate an RXQ object */
@@ -836,7 +841,7 @@ efx_rx_qcreate_internal(
 
 	if (erp == NULL) {
 		rc = ENOMEM;
-		goto fail2;
+		goto fail3;
 	}
 
 	erp->er_magic = EFX_RXQ_MAGIC;
@@ -847,17 +852,19 @@ efx_rx_qcreate_internal(
 
 	if ((rc = erxop->erxo_qcreate(enp, index, label, type, type_data, esmp,
 	    ndescs, id, flags, eep, erp)) != 0)
-		goto fail3;
+		goto fail4;
 
 	enp->en_rx_qcount++;
 	*erpp = erp;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
+fail4:
+	EFSYS_PROBE(fail4);
 
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1635,10 +1642,6 @@ siena_rx_qcreate(
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 	for (size = 0;
 	    (1U << size) <= encp->enc_rxq_max_ndescs / encp->enc_rxq_min_ndescs;
 	    size++)
@@ -1646,7 +1649,7 @@ siena_rx_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 
 	switch (type) {
@@ -1656,7 +1659,7 @@ siena_rx_qcreate(
 
 	default:
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	if (flags & EFX_RXQ_FLAG_SCATTER) {
@@ -1664,7 +1667,7 @@ siena_rx_qcreate(
 		jumbo = B_TRUE;
 #else
 		rc = EINVAL;
-		goto fail4;
+		goto fail3;
 #endif	/* EFSYS_OPT_RX_SCATTER */
 	}
 
@@ -1684,11 +1687,9 @@ siena_rx_qcreate(
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
-fail4:
-	EFSYS_PROBE(fail4);
-#endif
 fail3:
 	EFSYS_PROBE(fail3);
+#endif
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 32/60] common/sfc_efx/base: implement Rx control path for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (30 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
                     ` (28 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Reuse EF10 RSS-related functions since current version of the RSS
interface is compatible with EF10.

Implement own functions to create and destroy Rx queues which reuse
MCDI wrappers which are shared with EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c    |  11 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   8 +-
 drivers/common/sfc_efx/base/efx_rx.c     |  35 +++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h | 129 +++++++++
 drivers/common/sfc_efx/base/rhead_rx.c   | 316 +++++++++++++++++++++++
 7 files changed, 498 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 48666be5b5..61e0dab5b9 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
@@ -375,6 +375,8 @@ ef10_rx_init(
 	return (0);
 }
 
+#if EFX_OPTS_EF10()
+
 #if EFSYS_OPT_RX_SCATTER
 	__checkReturn	efx_rc_t
 ef10_rx_scatter_enable(
@@ -386,6 +388,8 @@ ef10_rx_scatter_enable(
 }
 #endif	/* EFSYS_OPT_RX_SCATTER */
 
+#endif	/* EFX_OPTS_EF10() */
+
 #if EFSYS_OPT_RX_SCALE
 	__checkReturn	efx_rc_t
 ef10_rx_scale_context_alloc(
@@ -542,6 +546,7 @@ ef10_rx_scale_tbl_set(
 }
 #endif /* EFSYS_OPT_RX_SCALE */
 
+#if EFX_OPTS_EF10()
 
 /*
  * EF10 RX pseudo-header
@@ -1014,6 +1019,8 @@ ef10_rx_qdestroy(
 	ef10_ev_rxlabel_fini(eep, label);
 }
 
+#endif /* EFX_OPTS_EF10() */
+
 		void
 ef10_rx_fini(
 	__in	efx_nic_t *enp)
@@ -1028,4 +1035,4 @@ ef10_rx_fini(
 #endif /* EFSYS_OPT_RX_SCALE */
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d470619e1..fac2815f25 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1428,10 +1428,6 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1456,6 +1452,10 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8db52acd66..6a227858e6 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2680,10 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
 	__in		efx_nic_t *enp,
@@ -2867,6 +2863,10 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index bacab5ec67..5f17bf3afe 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -180,6 +180,35 @@ static const efx_rx_ops_t __efx_rx_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_rx_ops_t __efx_rx_rhead_ops = {
+	rhead_rx_init,				/* erxo_init */
+	rhead_rx_fini,				/* erxo_fini */
+#if EFSYS_OPT_RX_SCATTER
+	rhead_rx_scatter_enable,		/* erxo_scatter_enable */
+#endif
+#if EFSYS_OPT_RX_SCALE
+	rhead_rx_scale_context_alloc,		/* erxo_scale_context_alloc */
+	rhead_rx_scale_context_free,		/* erxo_scale_context_free */
+	rhead_rx_scale_mode_set,		/* erxo_scale_mode_set */
+	rhead_rx_scale_key_set,			/* erxo_scale_key_set */
+	rhead_rx_scale_tbl_set,			/* erxo_scale_tbl_set */
+	rhead_rx_prefix_hash,			/* erxo_prefix_hash */
+#endif
+	rhead_rx_prefix_pktlen,			/* erxo_prefix_pktlen */
+	rhead_rx_qpost,				/* erxo_qpost */
+	rhead_rx_qpush,				/* erxo_qpush */
+#if EFSYS_OPT_RX_PACKED_STREAM
+	NULL,					/* erxo_qpush_ps_credits */
+	NULL,					/* erxo_qps_packet_info */
+#endif
+	rhead_rx_qflush,			/* erxo_qflush */
+	rhead_rx_qenable,			/* erxo_qenable */
+	rhead_rx_qcreate,			/* erxo_qcreate */
+	rhead_rx_qdestroy,			/* erxo_qdestroy */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_rx_init(
@@ -226,6 +255,12 @@ efx_rx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		erxop = &__efx_rx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8e50f82154..aff5017cff 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -55,6 +55,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_rx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 47885b28dc..0ba663653b 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -226,6 +226,135 @@ rhead_intr_fini(
 	__in		efx_nic_t *enp);
 
 
+/* RX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_fini(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_RX_SCATTER
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size);
+
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer);
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp);
+
+LIBEFX_INTERNAL
+extern				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qpush(
+	__in		efx_rxq_t *erp,
+	__in		unsigned int added,
+	__inout		unsigned int *pushedp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_rx_qenable(
+	__in		efx_rxq_t *erp);
+
+union efx_rxq_type_data_u;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const union efx_rxq_type_data_u *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qdestroy(
+	__in		efx_rxq_t *erp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
new file mode 100644
index 0000000000..0081b3ea53
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -0,0 +1,316 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_init(enp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+		void
+rhead_rx_fini(
+	__in	efx_nic_t *enp)
+{
+	ef10_rx_fini(enp);
+}
+
+#if EFSYS_OPT_RX_SCATTER
+	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size)
+{
+	_NOTE(ARGUNUSED(enp, buf_size))
+	/* Nothing to do here */
+	return (0);
+}
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_alloc(enp, type, num_queues, rss_contextp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_free(enp, rss_context);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_mode_set(enp, rss_context, alg, type, insert);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_key_set(enp, rss_context, key, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_tbl_set(enp, rss_context, table, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer)
+{
+	_NOTE(ARGUNUSED(enp, func, buffer))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp)
+{
+	_NOTE(ARGUNUSED(enp, buffer, lengthp))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added)
+{
+	_NOTE(ARGUNUSED(erp, addrp, size, ndescs, completed, added))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+			void
+rhead_rx_qpush(
+	__in	efx_rxq_t *erp,
+	__in	unsigned int added,
+	__inout	unsigned int *pushedp)
+{
+	_NOTE(ARGUNUSED(erp, added, pushedp))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in	efx_rxq_t *erp)
+{
+	efx_nic_t *enp = erp->er_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_rxq(enp, erp->er_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed. Callers need to know that
+	 * the RXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qenable(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const efx_rxq_type_data_t *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_rc_t rc;
+	boolean_t disable_scatter;
+
+	_NOTE(ARGUNUSED(id))
+
+	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS <=
+	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
+	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
+
+	switch (type) {
+	case EFX_RXQ_TYPE_DEFAULT:
+		if (type_data == NULL) {
+			rc = EINVAL;
+			goto fail1;
+		}
+		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		break;
+	default:
+		rc = ENOTSUP;
+		goto fail2;
+	}
+
+	/* Scatter can only be disabled if the firmware supports doing so */
+	if (flags & EFX_RXQ_FLAG_SCATTER)
+		disable_scatter = B_FALSE;
+	else
+		disable_scatter = encp->enc_rx_disable_scatter_supported;
+
+	/*
+	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
+	 * EF100 host interface both inner and outer classes are provided
+	 * by HW if applicable.
+	 */
+
+	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
+		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
+		    0, 0, 0, 0, 0)) != 0)
+		goto fail3;
+
+	erp->er_eep = eep;
+	erp->er_label = label;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qdestroy(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+	/* Nothing to do here */
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 33/60] common/sfc_efx/base: implement Tx control path for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (31 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
                     ` (27 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Tx control path on Riverhead is very similar to EF10, but datapath
differs a lot since Tx descriptor size is 16 bytes (vs 8 bytes on EF10).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |   6 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   6 +-
 drivers/common/sfc_efx/base/efx_tx.c     |  33 ++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  83 ++++++++++
 drivers/common/sfc_efx/base/rhead_tx.c   | 192 +++++++++++++++++++++++
 6 files changed, 311 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fac2815f25..d7e11c6323 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1452,10 +1452,6 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
@@ -1473,7 +1469,7 @@ efx_mcdi_fini_txq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 6a227858e6..278c5e2a64 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2863,10 +2863,6 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
@@ -2999,6 +2995,6 @@ efx_mcdi_fini_txq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index 38c64e028b..d7f31fd46d 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -205,6 +205,33 @@ static const efx_tx_ops_t	__efx_tx_medford2_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tx_ops_t	__efx_tx_rhead_ops = {
+	rhead_tx_init,				/* etxo_init */
+	rhead_tx_fini,				/* etxo_fini */
+	rhead_tx_qcreate,			/* etxo_qcreate */
+	rhead_tx_qdestroy,			/* etxo_qdestroy */
+	rhead_tx_qpost,				/* etxo_qpost */
+	rhead_tx_qpush,				/* etxo_qpush */
+	rhead_tx_qpace,				/* etxo_qpace */
+	rhead_tx_qflush,			/* etxo_qflush */
+	rhead_tx_qenable,			/* etxo_qenable */
+	NULL,					/* etxo_qpio_enable */
+	NULL,					/* etxo_qpio_disable */
+	NULL,					/* etxo_qpio_write */
+	NULL,					/* etxo_qpio_post */
+	rhead_tx_qdesc_post,			/* etxo_qdesc_post */
+	NULL,					/* etxo_qdesc_dma_create */
+	NULL,					/* etxo_qdesc_tso_create */
+	NULL,					/* etxo_qdesc_tso2_create */
+	NULL,					/* etxo_qdesc_vlantci_create */
+	NULL,					/* etxo_qdesc_checksum_create */
+#if EFSYS_OPT_QSTATS
+	rhead_tx_qstats_update,			/* etxo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_tx_init(
@@ -251,6 +278,12 @@ efx_tx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etxop = &__efx_tx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index aff5017cff..8f944bb45b 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -56,6 +56,7 @@ sources = [
 	'rhead_intr.c',
 	'rhead_nic.c',
 	'rhead_rx.c',
+	'rhead_tx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 0ba663653b..c3ffad7208 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -355,6 +355,89 @@ rhead_rx_qdestroy(
 	__in		efx_rxq_t *erp);
 
 
+/* TX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_tx_qdestroy(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *ebp,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qdesc_post(
+	__in		efx_txq_t *etp,
+	__in_ecount(n)	efx_desc_t *ed,
+	__in		unsigned int n,
+	__in		unsigned int completed,
+	__inout		unsigned int *addedp);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_tx.c b/drivers/common/sfc_efx/base/rhead_tx.c
new file mode 100644
index 0000000000..4c60f329d1
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tx.c
@@ -0,0 +1,192 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+	return (0);
+}
+
+			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp)
+{
+	efx_rc_t rc;
+
+	/*
+	 * NMC manages the NMMU entries, and so buffer table IDs are
+	 * ignored here
+	 */
+	_NOTE(ARGUNUSED(id))
+
+	if ((rc = efx_mcdi_init_txq(enp, ndescs, eep->ee_index, label, index,
+	    flags, esmp)) != 0)
+		goto fail1;
+
+	/*
+	 * Return the initial queue index which is zero since no option
+	 * descriptors are sent at start of day.
+	 */
+	*addedp = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_tx_qdestroy(
+	__in	efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *eb,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(eb))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed)
+{
+	_NOTE(ARGUNUSED(etp, added, pushed))
+
+	/* FIXME Implement the method for Riverhead */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ns))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp)
+{
+	efx_nic_t *enp = etp->et_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_txq(enp, etp->et_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed. Callers need to know that
+	 * the TXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qdesc_post(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_desc_t *ed,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ed))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#if EFSYS_OPT_QSTATS
+
+			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < TX_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, etp->et_stat[id]);
+		etp->et_stat[id] = 0;
+	}
+}
+
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (32 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
                     ` (26 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Rx/Tx queue DMA sync should not assume descriptor size to be the same
for all NIC familties since it Tx descritor size is 16 on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 2 +-
 drivers/common/sfc_efx/base/ef10_tx.c  | 4 ++--
 drivers/common/sfc_efx/base/efx_impl.h | 9 +++++----
 drivers/common/sfc_efx/base/efx_rx.c   | 2 +-
 drivers/common/sfc_efx/base/efx_tx.c   | 2 +-
 5 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 61e0dab5b9..2f0d2d2f5b 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -693,7 +693,7 @@ ef10_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    EF10_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_VI_WRITED(enp, ER_DZ_RX_DESC_UPD_REG,
 	    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index 61c7e49fe8..7cc9324b4b 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -375,7 +375,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_DOORBELL_WRITEO(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &oword);
@@ -391,7 +391,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_WRITED2(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index d7e11c6323..52f974073f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1292,15 +1292,16 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
-#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr)	\
+#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size,	\
+				      _wptr, _owptr)			\
 	do {								\
 		unsigned int _new = (_wptr);				\
 		unsigned int _old = (_owptr);				\
 									\
 		if ((_new) >= (_old))					\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
-			    (_old) * sizeof (efx_desc_t),		\
-			    ((_new) - (_old)) * sizeof (efx_desc_t));	\
+			    (_old) * (_desc_size),			\
+			    ((_new) - (_old)) * (_desc_size));		\
 		else							\
 			/*						\
 			 * It is cheaper to sync entire map than sync	\
@@ -1309,7 +1310,7 @@ struct efx_txq_s {
 			 */						\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
 			    0,						\
-			    (_entries) * sizeof (efx_desc_t));		\
+			    (_entries) * (_desc_size));			\
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 5f17bf3afe..14eda45f4a 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1581,7 +1581,7 @@ siena_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    SIENA_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_RX_DESC_UPD_REGP0,
 			    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index d7f31fd46d..d9568bf4a6 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -866,7 +866,7 @@ siena_tx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-	    wptr, pushed & etp->et_mask);
+	    SIENA_TXQ_DESC_SIZE, wptr, pushed & etp->et_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_TX_DESC_UPD_REGP0,
 			    etp->et_index, &dword, B_FALSE);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 35/60] common/sfc_efx/base: handle Rx events for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (33 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
                     ` (25 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Rx event on Riverhead provides a number of received packets and
no classification/offloads information is available Rx event.

Introduce a new event callback to be implemented by drivers.
The callback provides information about the number of completed
packets. libefx-based drivers should implement the new callback
for Riverhead and keep the old one for Siena and EF10 NICs.
The new callback may be used for Medford2 NO_CONT_EV Rx mode
support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  8 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 56 +++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2c49280a43..983b723145 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2277,6 +2277,13 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t size,
 	__in		uint16_t flags);
 
+typedef	__checkReturn	boolean_t
+(*efx_rx_packets_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int num_packets,
+	__in		uint32_t flags);
+
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 
 /*
@@ -2394,6 +2401,7 @@ typedef __checkReturn	boolean_t
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
+	efx_rx_packets_ev_t		eec_rx_packets;
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 6113cc9cf3..44a79e2e5d 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -58,7 +65,7 @@ rhead_ev_qcreate(
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
 	/* Set up the handler table */
-	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
@@ -201,6 +208,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_RX_PKTS:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -274,6 +285,49 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t label;
+	uint32_t num_packets;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_RX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_RX event reports the number of received
+	 * packets (unlike EF10 which reports a descriptor index).
+	 * The client driver is responsible for maintaining the Rx
+	 * descriptor index, and computing how many descriptors are
+	 * occupied by each received packet (based on the Rx buffer size
+	 * and the packet length from the Rx prefix).
+	 */
+	num_packets = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_NUM_PKT);
+
+	/*
+	 * The receive event may indicate more than one packet, and so
+	 * does not contain the packet length. Read the packet length
+	 * from the prefix when handling each packet.
+	 */
+	EFSYS_ASSERT(eecp->eec_rx_packets != NULL);
+	should_abort = eecp->eec_rx_packets(arg, label, num_packets,
+	    EFX_PKT_PREFIX_LEN);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 36/60] common/sfc_efx/base: handle Tx complete on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (34 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
                     ` (24 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Introduce a new event callback which has the same prototype, but
provides number of completed descriptors instead of the last
completed descriptor index.

When all libefx-based drivers implement the new callback, libefx
may be updated to use it for Siena and EF10 family NICs and
the old one may be removed.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 51 +++++++++++++++++++++++++-
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 983b723145..2437980c9e 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2319,6 +2319,12 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t label,
 	__in		uint32_t id);
 
+typedef	__checkReturn	boolean_t
+(*efx_tx_ndescs_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int ndescs);
+
 #define	EFX_EXCEPTION_RX_RECOVERY	0x00000001
 #define	EFX_EXCEPTION_RX_DSC_ERROR	0x00000002
 #define	EFX_EXCEPTION_TX_DSC_ERROR	0x00000003
@@ -2406,6 +2412,7 @@ typedef struct efx_ev_callbacks_s {
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
 	efx_tx_ev_t			eec_tx;
+	efx_tx_ndescs_ev_t		eec_tx_ndescs;
 	efx_exception_ev_t		eec_exception;
 	efx_rxq_flush_done_ev_t		eec_rxq_flush_done;
 	efx_rxq_flush_failed_ev_t	eec_rxq_flush_failed;
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 44a79e2e5d..380729d174 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -23,6 +23,13 @@ rhead_ev_rx_packets(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -66,7 +73,7 @@ rhead_ev_qcreate(
 
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
-	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_tx	= rhead_ev_tx_completion;
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
@@ -212,6 +219,10 @@ rhead_ev_qpoll(
 				should_abort = eep->ee_rx(eep,
 				    &(ev[index]), eecp, arg);
 				break;
+			case ESE_GZ_EF100_EV_TX_COMPLETION:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -328,6 +339,44 @@ rhead_ev_rx_packets(
 	return (should_abort);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t num_descs;
+	uint32_t label;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_TX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_TX event reports the number of completed Tx
+	 * descriptors (on EF10, the event reports the low bits of the
+	 * index of the last completed descriptor).
+	 * The client driver completion callback will compute the
+	 * descriptor index, so that is not needed here.
+	 */
+	num_descs = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_NUM_DESC);
+
+	EFSYS_PROBE2(tx_ndescs, uint32_t, label, unsigned int, num_descs);
+
+	EFSYS_ASSERT(eecp->eec_tx_ndescs != NULL);
+	should_abort = eecp->eec_tx_ndescs(arg, label, num_descs);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 37/60] common/sfc_efx/base: indicate support for TSO version 3
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (35 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
                     ` (23 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead boards support TSO version 3.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 6 ++++++
 drivers/common/sfc_efx/base/efx.h       | 1 +
 drivers/common/sfc_efx/base/siena_nic.c | 1 +
 3 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 80dc99aed5..43f3412f35 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1109,6 +1109,12 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_fw_assisted_tso_v2_encap_enabled = B_FALSE;
 
+	/* Check if TSOv3 is supported */
+	if (CAP_FLAGS2(req, TX_TSO_V3))
+		encp->enc_tso_v3_enabled = B_TRUE;
+	else
+		encp->enc_tso_v3_enabled = B_FALSE;
+
 	/* Check if the firmware has vadapter/vport/vswitch support */
 	if (CAP_FLAGS1(req, EVB))
 		encp->enc_datapath_cap_evb = B_TRUE;
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2437980c9e..08f7cddc95 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1469,6 +1469,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
+	boolean_t		enc_tso_v3_enabled;
 	/* Number of TSO contexts on the NIC (FATSOv2) */
 	uint32_t		enc_fw_assisted_tso_v2_n_contexts;
 	boolean_t		enc_hw_tx_insert_vlan_enabled;
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index beabac0d38..9c30e27f59 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -176,6 +176,7 @@ siena_board_cfg(
 	encp->enc_fw_assisted_tso_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_n_contexts = 0;
+	encp->enc_tso_v3_enabled = B_FALSE;
 	encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
 	encp->enc_rx_packed_stream_supported = B_FALSE;
 	encp->enc_rx_var_packed_stream_supported = B_FALSE;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 38/60] common/sfc_efx/base: report restrictions for TSO version 3
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (36 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
                     ` (22 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead puts a number of restrictions on TSO transactions.
Reflect some of them in the NIC configuration structure.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 21 +++++++++++++++++++++
 drivers/common/sfc_efx/base/efx.h       | 10 ++++++++++
 drivers/common/sfc_efx/base/rhead_nic.c | 23 +++++++++++++++++++----
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 43f3412f35..927af87e0d 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2077,6 +2077,27 @@ ef10_nic_board_cfg(
 	 */
 	encp->enc_tx_tso_tcp_header_offset_limit = EF10_TCP_HEADER_OFFSET_LIMIT;
 
+	/* EF10 TSO engine demands that packet header be contiguous. */
+	encp->enc_tx_tso_max_header_ndescs = 1;
+
+	/* The overall TSO header length is not limited. */
+	encp->enc_tx_tso_max_header_length = UINT32_MAX;
+
+	/*
+	 * There are no specific limitations on the number of
+	 * TSO payload descriptors.
+	 */
+	encp->enc_tx_tso_max_payload_ndescs = UINT32_MAX;
+
+	/* TSO superframe payload length is not limited. */
+	encp->enc_tx_tso_max_payload_length = UINT32_MAX;
+
+	/*
+	 * Limitation on the maximum number of outgoing packets per
+	 * TSO transaction described in SF-108452-SW.
+	 */
+	encp->enc_tx_tso_max_nframes = 32767;
+
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
 	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 08f7cddc95..a2c2e49bba 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1466,6 +1466,16 @@ typedef struct efx_nic_cfg_s {
 	 * the hardware to apply TSO packet edits.
 	 */
 	uint32_t		enc_tx_tso_tcp_header_offset_limit;
+	/* Maximum number of header DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_ndescs;
+	/* Maximum header length acceptable by TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_length;
+	/* Maximum number of payload DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_ndescs;
+	/* Maximum payload length per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_length;
+	/* Maximum number of frames to be generated per TSO transaction. */
+	uint32_t		enc_tx_tso_max_nframes;
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index b779b4f8e1..7fb28eae31 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -33,11 +33,26 @@ rhead_board_cfg(
 	encp->enc_tx_dma_desc_boundary = 0;
 
 	/*
-	 * Maximum number of bytes into the frame the TCP header can start for
-	 * firmware assisted TSO to work.
-	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 * Initialise design parameters to either a runtime value read from
+	 * the design parameters area or the well known default value
+	 * (see SF-119689-TC section 4.4 for details).
+	 * FIXME: Read design parameters area values.
 	 */
-	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+	encp->enc_tx_tso_max_header_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_header_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT;
+	encp->enc_tx_tso_max_payload_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_payload_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT;
+	encp->enc_tx_tso_max_nframes =
+	    ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT;
+
+	/*
+	 * Riverhead does not put any restrictions on TCP header offset limit.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = UINT32_MAX;
 
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 39/60] common/sfc_efx: do not include libefx headers from efsys.h
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (37 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
                     ` (21 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

efsys.h may depends on target system headers only. Otherwise, it could
result in cross-dependency when libefx header depends on efsys.h and
efsys.h depends on the libefx header.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/efsys.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 1567d91588..e191cb5b6a 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -50,7 +50,6 @@ extern "C" {
 #else
 #error "Cannot determine system endianness"
 #endif
-#include "efx_types.h"
 
 
 typedef bool boolean_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 40/60] common/sfc_efx/base: add API to get Rx prefix information
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (38 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
                     ` (20 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Define default Siena, EF10 default, packed stream, equal-stride
superbuffer and Riverhead default prefixes in order to make an API
to get Rx prefix layout information generic and usable on all NICs.

Riverhead supports many Rx prefixes. Riverhead FW supports MCDI to
choose Rx prefix based on required Rx prefix fields and allows to
query the prefix layout using MCDI. The patch prepares to introduce
the support in libefx and provides fallback for NICs and FW which
lacks the support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c         | 80 ++++++++++++++++++-
 drivers/common/sfc_efx/base/efx.h             | 61 ++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h        |  1 +
 drivers/common/sfc_efx/base/efx_rx.c          | 29 +++++++
 drivers/common/sfc_efx/base/efx_types.h       |  1 +
 drivers/common/sfc_efx/base/rhead_rx.c        | 30 +++++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 7 files changed, 201 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 2f0d2d2f5b..43d545b377 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -549,8 +549,8 @@ ef10_rx_scale_tbl_set(
 #if EFX_OPTS_EF10()
 
 /*
- * EF10 RX pseudo-header
- * ---------------------
+ * EF10 RX pseudo-header (aka Rx prefix)
+ * -------------------------------------
  *
  * Receive packets are prefixed by an (optional) 14 byte pseudo-header:
  *
@@ -566,7 +566,77 @@ ef10_rx_scale_tbl_set(
  *       (32bit little-endian)
  *
  * See "The RX Pseudo-header" in SF-109306-TC.
+ *
+ * EF10 does not support Rx prefix choice using MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
  */
+static const efx_rx_prefix_layout_t ef10_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 14,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH]			=
+		    { 0,  32, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI]		=
+		    { 32, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI]	=
+		    { 48, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_LENGTH]			=
+		    { 64, 16, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP]		=
+		    { 80, 32, B_FALSE },
+	}
+};
+
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+/*
+ * EF10 packed stream Rx prefix layout.
+ *
+ * See SF-112241-TC Full speed capture for Huntington and Medford section 4.5.
+ */
+static const efx_rx_prefix_layout_t ef10_packed_stream_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 8,
+	.erpl_fields	= {
+#define	EF10_PS_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_DZ_PS_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_PS_RX_PREFIX_FIELD(PARTIAL_TSTAMP, TSTAMP),
+		EF10_PS_RX_PREFIX_FIELD(LENGTH, CAP_LEN),
+		EF10_PS_RX_PREFIX_FIELD(ORIG_LENGTH, ORIG_LEN),
+
+#undef	EF10_PS_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+
+/*
+ * EF10 equal stride super-buffer Rx prefix layout.
+ *
+ * See SF-119419-TC DPDK Firmware Driver Interface section 3.4.
+ */
+static const efx_rx_prefix_layout_t ef10_essb_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ES_EZ_ESSB_RX_PREFIX_LEN,
+	.erpl_fields	= {
+#define	EF10_ESSB_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_EZ_ESSB_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_ESSB_RX_PREFIX_FIELD(LENGTH, DATA_LEN),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK, MARK),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH_VALID, HASH_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK_VALID, MARK_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_FLAG, MATCH_FLAG),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH, HASH),
+
+#undef	EF10_ESSB_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	__checkReturn	efx_rc_t
 ef10_rx_prefix_pktlen(
@@ -836,6 +906,7 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
 	boolean_t disable_scatter;
 	boolean_t want_inner_classes;
@@ -852,6 +923,7 @@ ef10_rx_qcreate(
 
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
+		erpl = &ef10_default_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
@@ -861,6 +933,7 @@ ef10_rx_qcreate(
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
+		erpl = &ef10_packed_stream_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail2;
@@ -890,6 +963,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
+		erpl = &ef10_essb_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail4;
@@ -973,6 +1047,8 @@ ef10_rx_qcreate(
 
 	erp->er_ev_qstate = &erp->er_eep->ee_rxq_state[label];
 
+	erp->er_prefix_layout = *erpl;
+
 	return (0);
 
 fail11:
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index a2c2e49bba..3f5cf619e5 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1396,6 +1396,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
+	/* Maximum Rx prefix size if many Rx prefixes are supported */
 	uint32_t		enc_rx_prefix_size;
 	uint32_t		enc_rx_buf_align_start;
 	uint32_t		enc_rx_buf_align_end;
@@ -2760,6 +2761,66 @@ efx_rxq_nbufs(
 
 #define	EFX_RXQ_LIMIT(_ndescs)		((_ndescs) - 16)
 
+/*
+ * libefx representation of the Rx prefix layout information.
+ *
+ * The information may be used inside libefx to implement Rx prefix fields
+ * accessors and by drivers which process Rx prefix itself.
+ */
+
+/*
+ * All known Rx prefix fields.
+ *
+ * An Rx prefix may have a subset of these fields.
+ */
+typedef enum efx_rx_prefix_field_e {
+	EFX_RX_PREFIX_FIELD_LENGTH = 0,
+	EFX_RX_PREFIX_FIELD_ORIG_LENGTH,
+	EFX_RX_PREFIX_FIELD_CLASS,
+	EFX_RX_PREFIX_FIELD_RSS_HASH,
+	EFX_RX_PREFIX_FIELD_RSS_HASH_VALID,
+	EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP,
+	EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_USER_FLAG,
+	EFX_RX_PREFIX_FIELD_USER_MARK,
+	EFX_RX_PREFIX_FIELD_USER_MARK_VALID,
+	EFX_RX_PREFIX_FIELD_CSUM_FRAME,
+	EFX_RX_PREFIX_FIELD_INGRESS_VPORT,
+	EFX_RX_PREFIX_NFIELDS
+} efx_rx_prefix_field_t;
+
+/*
+ * Location and endianess of a field in Rx prefix.
+ *
+ * If width is zero, the field is not present.
+ */
+typedef struct efx_rx_prefix_field_info_s {
+	uint16_t			erpfi_offset_bits;
+	uint8_t				erpfi_width_bits;
+	boolean_t			erpfi_big_endian;
+} efx_rx_prefix_field_info_t;
+
+/* Helper macro to define Rx prefix fields */
+#define	EFX_RX_PREFIX_FIELD(_efx, _field, _big_endian)		\
+	[EFX_RX_PREFIX_FIELD_ ## _efx] = {			\
+		.erpfi_offset_bits	= EFX_LOW_BIT(_field),	\
+		.erpfi_width_bits	= EFX_WIDTH(_field),	\
+		.erpfi_big_endian	= (_big_endian),	\
+	}
+
+typedef struct efx_rx_prefix_layout_s {
+	uint32_t			erpl_id;
+	uint8_t				erpl_length;
+	efx_rx_prefix_field_info_t	erpl_fields[EFX_RX_PREFIX_NFIELDS];
+} efx_rx_prefix_layout_t;
+
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp);
+
 typedef enum efx_rxq_type_e {
 	EFX_RXQ_TYPE_DEFAULT,
 	EFX_RXQ_TYPE_PACKED_STREAM,
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 52f974073f..01869155fa 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -944,6 +944,7 @@ struct efx_rxq_s {
 	size_t				er_buf_size;
 	efsys_mem_t			*er_esmp;
 	efx_evq_rxq_state_t		*er_ev_qstate;
+	efx_rx_prefix_layout_t		er_prefix_layout;
 };
 
 #define	EFX_RXQ_MAGIC	0x15022005
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 14eda45f4a..3536b0eb07 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1059,6 +1059,18 @@ efx_pseudo_hdr_hash_get(
 }
 #endif	/* EFSYS_OPT_RX_SCALE */
 
+	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
+
+	*erplp = erp->er_prefix_layout;
+
+	return (0);
+}
+
 #if EFSYS_OPT_SIENA
 
 static	__checkReturn	efx_rc_t
@@ -1477,6 +1489,21 @@ siena_rx_scale_tbl_set(
  *   LL.LL         LFSR hash     (16-bit big-endian)
  */
 
+/*
+ * Provide Rx prefix layout with Toeplitz hash only since LSFR is
+ * used by no supported drivers.
+ *
+ * Siena does not support Rx prefix choice via MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
+ */
+static const efx_rx_prefix_layout_t siena_toeplitz_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 16,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] = { 12 * 8, 32, B_TRUE },
+	}
+};
+
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	uint32_t
 siena_rx_prefix_hash(
@@ -1719,6 +1746,8 @@ siena_rx_qcreate(
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
 
+	erp->er_prefix_layout = siena_toeplitz_rx_prefix_layout;
+
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ae8a1031df..ab35e61b84 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -1628,6 +1628,7 @@ extern int fix_lint;
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
 #endif
 
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 0081b3ea53..c9ab3f92e1 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,35 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Default Rx prefix layout on Riverhead if FW does not support Rx
+ * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
+ * using MC_CMD_QUERY_RX_PREFIX_ID.
+ *
+ * See SF-119689-TC Riverhead Host Interface section 6.4.
+ */
+static const efx_rx_prefix_layout_t rhead_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ESE_GZ_RX_PKT_PREFIX_LEN,
+	.erpl_fields	= {
+#define	RHEAD_RX_PREFIX_FIELD(_name, _big_endian) \
+	EFX_RX_PREFIX_FIELD(_name, ESF_GZ_RX_PREFIX_ ## _name, _big_endian)
+
+		RHEAD_RX_PREFIX_FIELD(LENGTH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH_VALID, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_FLAG, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CLASS, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(PARTIAL_TSTAMP, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_MARK, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(INGRESS_VPORT, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CSUM_FRAME, B_TRUE),
+		RHEAD_RX_PREFIX_FIELD(VLAN_STRIP_TCI, B_TRUE),
+
+#undef	RHEAD_RX_PREFIX_FIELD
+	}
+};
+
 	__checkReturn	efx_rc_t
 rhead_rx_init(
 	__in		efx_nic_t *enp)
@@ -292,6 +321,7 @@ rhead_rx_qcreate(
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
 
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 9b1715bfee..16fffee321 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -130,6 +130,7 @@ INTERNAL {
 	efx_rx_fini;
 	efx_rx_hash_default_support_get;
 	efx_rx_init;
+	efx_rx_prefix_get_layout;
 	efx_rx_qcreate;
 	efx_rx_qcreate_es_super_buffer;
 	efx_rx_qdestroy;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 41/60] common/sfc_efx/base: group RxQ parameters into a structure
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (39 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
                     ` (19 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Make number of efx_mcdi_init_rxq() arguments reasonable before
addition of one more argument.
Non essential parameters not supported in some cases are moved
into helper structure.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 57 +++++++++++---------------
 drivers/common/sfc_efx/base/efx_impl.h | 20 +++++----
 drivers/common/sfc_efx/base/efx_mcdi.c | 33 ++++++---------
 drivers/common/sfc_efx/base/rhead_rx.c | 14 ++++---
 4 files changed, 58 insertions(+), 66 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 43d545b377..ea5f514f18 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -906,21 +906,18 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_init_rxq_params_t params;
 	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
-	boolean_t want_inner_classes;
-	unsigned int ps_buf_size;
-	uint32_t es_bufs_per_desc = 0;
-	uint32_t es_max_dma_len = 0;
-	uint32_t es_buf_stride = 0;
-	uint32_t hol_block_timeout = 0;
 
 	_NOTE(ARGUNUSED(id, erp))
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+	params.buf_size = erp->er_buf_size;
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		erpl = &ef10_default_rx_prefix_layout;
@@ -929,7 +926,6 @@ ef10_rx_qcreate(
 			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
-		ps_buf_size = 0;
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
@@ -940,19 +936,19 @@ ef10_rx_qcreate(
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_512K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_128K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
 			break;
 		default:
 			rc = ENOTSUP;
@@ -968,14 +964,13 @@ ef10_rx_qcreate(
 			rc = EINVAL;
 			goto fail4;
 		}
-		ps_buf_size = 0;
-		es_bufs_per_desc =
+		params.es_bufs_per_desc =
 		    type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
-		es_max_dma_len =
+		params.es_max_dma_len =
 		    type_data->ertd_es_super_buffer.eessb_max_dma_len;
-		es_buf_stride =
+		params.es_buf_stride =
 		    type_data->ertd_es_super_buffer.eessb_buf_stride;
-		hol_block_timeout =
+		params.hol_block_timeout =
 		    type_data->ertd_es_super_buffer.eessb_hol_block_timeout;
 		break;
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -985,59 +980,57 @@ ef10_rx_qcreate(
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
-	if (ps_buf_size != 0) {
+	if (params.ps_buf_size != 0) {
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
-		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
+		if ((params.ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
 			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
-	EFSYS_ASSERT(ps_buf_size == 0);
+	EFSYS_ASSERT(params.ps_buf_size == 0);
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
-	if (es_bufs_per_desc > 0) {
+	if (params.es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail8;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail9;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-	EFSYS_ASSERT(es_bufs_per_desc == 0);
+	EFSYS_ASSERT(params.es_bufs_per_desc == 0);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	if (flags & EFX_RXQ_FLAG_INNER_CLASSES)
-		want_inner_classes = B_TRUE;
+		params.want_inner_classes = B_TRUE;
 	else
-		want_inner_classes = B_FALSE;
+		params.want_inner_classes = B_FALSE;
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
-		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
-		    es_buf_stride, hol_block_timeout)) != 0)
+		    esmp, &params)) != 0)
 		goto fail11;
 
 	erp->er_eep = eep;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 01869155fa..c373192554 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,17 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+typedef struct efx_mcdi_init_rxq_params_s {
+	boolean_t	disable_scatter;
+	boolean_t	want_inner_classes;
+	uint32_t	buf_size;
+	uint32_t	ps_buf_size;
+	uint32_t	es_bufs_per_desc;
+	uint32_t	es_max_dma_len;
+	uint32_t	es_buf_stride;
+	uint32_t	hol_block_timeout;
+} efx_mcdi_init_rxq_params_t;
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1439,14 +1450,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout);
+	__in		const efx_mcdi_init_rxq_params_t *params);
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 278c5e2a64..aa19c7c759 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2688,14 +2688,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
+	__in		const efx_mcdi_init_rxq_params_t *params)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
@@ -2719,21 +2712,21 @@ efx_mcdi_init_rxq(
 	}
 
 	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+	if ((no_cont_ev == B_TRUE) && (params->disable_scatter == B_FALSE)) {
 		/* TODO: Support scatter in NO_CONT_EV mode */
 		rc = EINVAL;
 		goto fail2;
 	}
 
-	if (ps_bufsize > 0)
+	if (params->ps_buf_size > 0)
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
+	else if (params->es_bufs_per_desc > 0)
 		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
 	else
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
 
 	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
+	    !params->want_inner_classes) {
 		/*
 		 * WANT_OUTER_CLASSES can only be specified on hardware which
 		 * supports tunnel encapsulation offloads, even though it is
@@ -2768,31 +2761,31 @@ efx_mcdi_init_rxq(
 	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
 	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
 	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, params->disable_scatter,
 	    INIT_RXQ_EXT_IN_DMA_MODE,
 	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, params->ps_buf_size,
 	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
 	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
 
-	if (es_bufs_per_desc > 0) {
+	if (params->es_bufs_per_desc > 0) {
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
+		    params->es_bufs_per_desc);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, params->es_max_dma_len);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, params->es_buf_stride);
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
+		    params->hol_block_timeout);
 	}
 
 	if (encp->enc_init_rxq_with_buffer_size)
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
+		    params->buf_size);
 
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index c9ab3f92e1..38c905444a 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -280,8 +280,8 @@ rhead_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_mcdi_init_rxq_params_t params;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
 
 	_NOTE(ARGUNUSED(id))
 
@@ -289,13 +289,15 @@ rhead_rx_qcreate(
 	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
 		}
-		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		params.buf_size = type_data->ertd_default.ed_buf_size;
 		break;
 	default:
 		rc = ENOTSUP;
@@ -304,9 +306,9 @@ rhead_rx_qcreate(
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
@@ -315,12 +317,12 @@ rhead_rx_qcreate(
 	 */
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
-		    0, 0, 0, 0, 0)) != 0)
+		    esmp, &params)) != 0)
 		goto fail3;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_buf_size = params.buf_size;
 	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (40 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
                     ` (18 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Riverhead supports many Rx prefixes. The Rx prefix may be chosen
based on which information is required.

To have better performance choose the smallest Rx prefix which
meets our requirements.

Right now there is no way to specify requirements on Rx queue
creation, but it could be added in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h |   1 +
 drivers/common/sfc_efx/base/efx_mcdi.c |  10 +-
 drivers/common/sfc_efx/base/rhead_rx.c | 333 ++++++++++++++++++++++++-
 3 files changed, 338 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c373192554..fc0a654f80 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1439,6 +1439,7 @@ typedef struct efx_mcdi_init_rxq_params_s {
 	uint32_t	es_max_dma_len;
 	uint32_t	es_buf_stride;
 	uint32_t	hol_block_timeout;
+	uint32_t	prefix_id;
 } efx_mcdi_init_rxq_params_t;
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index aa19c7c759..b8e45b458d 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2692,8 +2692,8 @@ efx_mcdi_init_rxq(
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V5_IN_LEN,
+		MC_CMD_INIT_RXQ_V5_OUT_LEN);
 	int npages = efx_rxq_nbufs(enp, ndescs);
 	int i;
 	efx_qword_t *dma_addr;
@@ -2747,9 +2747,9 @@ efx_mcdi_init_rxq(
 
 	req.emr_cmd = MC_CMD_INIT_RXQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V5_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V5_OUT_LEN;
 
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
@@ -2787,6 +2787,8 @@ efx_mcdi_init_rxq(
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
 		    params->buf_size);
 
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_V5_IN_RX_PREFIX_ID, params->prefix_id);
+
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 38c905444a..d683f280ce 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,12 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Maximum number of Rx prefixes supported by Rx prefix choice to be
+ * returned from firmware.
+ */
+#define	RHEAD_RX_PREFIX_IDS_MAX		16
+
 /*
  * Default Rx prefix layout on Riverhead if FW does not support Rx
  * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
@@ -265,6 +271,312 @@ rhead_rx_qenable(
 	_NOTE(ARGUNUSED(erp))
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_get_rx_prefix_ids(
+	__in					efx_nic_t *enp,
+	__in					uint32_t mcdi_fields_mask,
+	__in					unsigned int max_ids,
+	__out					unsigned int *nids,
+	__out_ecount_part(max_ids, *nids)	uint32_t *idsp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	uint32_t num;
+
+	req.emr_cmd = MC_CMD_GET_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_GET_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, GET_RX_PREFIX_ID_IN_FIELDS, mcdi_fields_mask);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_GET_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	num = MCDI_OUT_DWORD(req, GET_RX_PREFIX_ID_OUT_NUM_RX_PREFIX_IDS);
+
+	if (req.emr_out_length_used != MC_CMD_GET_RX_PREFIX_ID_OUT_LEN(num)) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	*nids = MIN(num, max_ids);
+
+	EFX_STATIC_ASSERT(sizeof (idsp[0]) ==
+	    MC_CMD_GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID_LEN);
+	memcpy(idsp,
+	    MCDI_OUT2(req, uint32_t, GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID),
+	    *nids * sizeof (idsp[0]));
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rx_prefix_field_t
+efx_mcdi_rx_prefix_field_map(unsigned int mcdi_idx)
+{
+	static const efx_rx_prefix_field_t efx_mcdi_to_rx_prefix_field[] = {
+#define	EFX_MCDI_TO_RX_PREFIX_FIELD(_field) \
+	[RX_PREFIX_FIELD_INFO_ ## _field] = EFX_RX_PREFIX_FIELD_ ## _field
+
+		EFX_MCDI_TO_RX_PREFIX_FIELD(LENGTH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH_VALID),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_FLAG),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CLASS),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(PARTIAL_TSTAMP),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_MARK),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(INGRESS_VPORT),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CSUM_FRAME),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(VLAN_STRIP_TCI),
+
+#undef	EFX_MCDI_TO_RX_PREFIX_FIELD
+	};
+
+	if (mcdi_idx >= EFX_ARRAY_SIZE(efx_mcdi_to_rx_prefix_field))
+		return (EFX_RX_PREFIX_NFIELDS);
+
+	return (efx_mcdi_to_rx_prefix_field[mcdi_idx]);
+}
+
+static	__checkReturn	int
+efx_rx_prefix_field_map_to_mcdi(
+	__in		efx_rx_prefix_field_t field)
+{
+	static const int efx_rx_prefix_field_to_mcdi[] = {
+		[EFX_RX_PREFIX_FIELD_LENGTH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH),
+		[EFX_RX_PREFIX_FIELD_ORIG_LENGTH] = -1,
+		[EFX_RX_PREFIX_FIELD_CLASS] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CLASS),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH_VALID] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID),
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP),
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI),
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI] = -1,
+		[EFX_RX_PREFIX_FIELD_USER_FLAG] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG),
+		[EFX_RX_PREFIX_FIELD_USER_MARK] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK),
+		[EFX_RX_PREFIX_FIELD_USER_MARK_VALID] = -1,
+		[EFX_RX_PREFIX_FIELD_CSUM_FRAME] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME),
+		[EFX_RX_PREFIX_FIELD_INGRESS_VPORT] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT),
+	};
+
+	if (field >= EFX_ARRAY_SIZE(efx_rx_prefix_field_to_mcdi))
+		return (-1);
+
+	return (efx_rx_prefix_field_to_mcdi[field]);
+}
+
+static	__checkReturn	efx_rc_t
+efx_rx_prefix_fields_mask_to_mcdi(
+	__in		uint32_t fields_mask,
+	__out		uint32_t *mcdi_fields_maskp)
+{
+	uint32_t mcdi_fields_mask = 0;
+	unsigned int i;
+
+	for (i = 0; i < EFX_RX_PREFIX_NFIELDS; ++i) {
+		if (fields_mask & (1U << i)) {
+			int mcdi_field = efx_rx_prefix_field_map_to_mcdi(i);
+
+			if (mcdi_field < 0)
+				return (EINVAL);
+
+			mcdi_fields_mask |= (1U << mcdi_field);
+		}
+	}
+
+	*mcdi_fields_maskp = mcdi_fields_mask;
+	return (0);
+}
+
+static	__checkReturn	efx_rc_t
+efx_mcdi_query_rx_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t prefix_id,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	size_t response_len;
+	const efx_dword_t *resp;
+	const efx_dword_t *finfo;
+	unsigned int num_fields;
+	unsigned int mcdi_field;
+	efx_rx_prefix_field_t field;
+	unsigned int i;
+
+	req.emr_cmd = MC_CMD_QUERY_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, QUERY_RX_PREFIX_ID_IN_RX_PREFIX_ID, prefix_id);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	if (MCDI_OUT_BYTE(req, QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE) !=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE_FIXED) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	EFX_STATIC_ASSERT(MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN >=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST);
+	response_len = req.emr_out_length_used -
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST;
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail4;
+	}
+
+	resp = MCDI_OUT2(req, efx_dword_t, QUERY_RX_PREFIX_ID_OUT_RESPONSE);
+
+	memset(erplp, 0, sizeof (*erplp));
+	erplp->erpl_id = prefix_id;
+	erplp->erpl_length =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_PREFIX_LENGTH_BYTES);
+	num_fields =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_FIELD_COUNT);
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LEN(num_fields)) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	finfo = (const efx_dword_t *)((const uint8_t *)resp +
+	     RX_PREFIX_FIXED_RESPONSE_FIELDS_OFST);
+
+	for (i = 0; i < num_fields; ++i, ++finfo) {
+		mcdi_field = EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_TYPE);
+
+		field = efx_mcdi_rx_prefix_field_map(mcdi_field);
+		if (field >= EFX_RX_PREFIX_NFIELDS)
+			continue;
+
+		erplp->erpl_fields[field].erpfi_offset_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_OFFSET_BITS);
+		erplp->erpl_fields[field].erpfi_width_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_WIDTH_BITS);
+	}
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+rhead_rx_choose_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t fields_mask,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_rx_prefix_layout_t erpl;
+	uint32_t prefix_ids[RHEAD_RX_PREFIX_IDS_MAX];
+	uint32_t mcdi_fields_mask;
+	unsigned int num = 0;
+	unsigned int i;
+	efx_rc_t rc;
+
+	rc = efx_rx_prefix_fields_mask_to_mcdi(fields_mask, &mcdi_fields_mask);
+	if (rc != 0)
+		goto fail1;
+
+	memset(erplp, 0, sizeof (*erplp));
+
+	rc = efx_mcdi_get_rx_prefix_ids(enp, mcdi_fields_mask,
+	    EFX_ARRAY_SIZE(prefix_ids), &num, prefix_ids);
+	if (rc == ENOTSUP) {
+		/* Not supported MCDI, use default prefix ID */
+		*erplp = rhead_default_rx_prefix_layout;
+		goto done;
+	}
+	if (rc != 0)
+		goto fail2;
+
+	if (num == 0) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	for (i = 0; i < num; ++i) {
+		rc = efx_mcdi_query_rx_prefix_id(enp, prefix_ids[i], &erpl);
+		if (rc != 0)
+			goto fail4;
+
+		/* Choose the smallest prefix which meets our requirements */
+		if (i == 0 || erpl.erpl_length < erplp->erpl_length)
+			*erplp = erpl;
+	}
+
+done:
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 rhead_rx_qcreate(
 	__in		efx_nic_t *enp,
@@ -281,6 +593,7 @@ rhead_rx_qcreate(
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_init_rxq_params_t params;
+	efx_rx_prefix_layout_t erpl;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))
@@ -310,6 +623,20 @@ rhead_rx_qcreate(
 	else
 		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
+	/*
+	 * LENGTH is required in EF100 host interface, as receive events
+	 * do not include the packet length.
+	 * NOTE: Required fields are hard-wired now. Future designs will
+	 * want to allow the client (driver) code to have control over
+	 * which fields are required or may be allow to request so-called
+	 * default Rx prefix (which ID is equal to 0).
+	 */
+	if ((rc = rhead_rx_choose_prefix_id(enp,
+	    (1U << EFX_RX_PREFIX_FIELD_LENGTH), &erpl)) != 0)
+		goto fail3;
+
+	params.prefix_id = erpl.erpl_id;
+
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
 	 * EF100 host interface both inner and outer classes are provided
@@ -318,15 +645,17 @@ rhead_rx_qcreate(
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
 		    esmp, &params)) != 0)
-		goto fail3;
+		goto fail4;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
 	erp->er_buf_size = params.buf_size;
-	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
+	erp->er_prefix_layout = erpl;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 43/60] common/sfc_efx/base: add function control window concept
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (41 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
                     ` (17 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window can be located at a different offset than
other windows on Riverhead. Meaning that the drivers must handle
accesses to the function control window differently in case of EF100.

Add accessor macros for function control window and change
EFX NIC create API to facilitate that accessors.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 21 ++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  1 +
 drivers/common/sfc_efx/base/efx_impl.h  | 39 +++++++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_nic.c   |  9 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  |  2 +-
 drivers/common/sfc_efx/base/rhead_nic.c |  2 +-
 drivers/net/sfc/sfc.c                   |  3 +-
 7 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 727f14826e..b324ec825b 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -56,7 +56,7 @@ ef10_mcdi_init(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -166,7 +166,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -179,7 +179,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -237,11 +237,18 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
-	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
-	    ER_GZ_MC_SFT_STATUS_OFST);
-
 	/* Update MC reboot status word */
-	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG,
+			      &dword, B_FALSE);
+		break;
+	}
 	new_status = dword.ed_u32[0];
 
 	/* MC has rebooted if the value has changed */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 3f5cf619e5..0d4f5e5e70 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -150,6 +150,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fc0a654f80..b1457f361a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -846,6 +846,7 @@ struct efx_nic_s {
 			int			ena_vi_base;
 			int			ena_vi_count;
 			int			ena_vi_shift;
+			uint32_t		ena_fcw_base;
 #if EFSYS_OPT_VPD
 			caddr_t			ena_svpd;
 			size_t			ena_svpd_length;
@@ -1114,6 +1115,9 @@ struct efx_txq_s {
  * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers,
  * to ensure the correct runtime VI window size is used on Medford2.
  *
+ * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control
+ * window registers, to ensure the correct starting offset is used.
+ *
  * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers.
  */
 
@@ -1218,6 +1222,41 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/*
+ * Accessors for memory BAR function control window registers.
+ *
+ * The function control window is located at an offset which can be
+ * non-zero in case of Riverhead.
+ */
+
+#if EFSYS_OPT_RIVERHEAD
+
+#define	EFX_BAR_FCW_READD(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+		EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_BAR_FCW_WRITED(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+		EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 /*
  * Accessors for memory BAR per-VI registers.
  *
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 465e2c7a36..3dc287a095 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -215,6 +215,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp)
 {
@@ -316,6 +317,7 @@ efx_nic_create(
 		    EFX_FEATURE_MCDI |
 		    EFX_FEATURE_MAC_HEADER_FILTERS |
 		    EFX_FEATURE_MCDI_DMA;
+		enp->en_arch.ef10.ena_fcw_base = fcw_offset;
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
@@ -324,6 +326,11 @@ efx_nic_create(
 		goto fail2;
 	}
 
+	if ((family != EFX_FAMILY_RIVERHEAD) && (fcw_offset != 0)) {
+		rc = EINVAL;
+		goto fail3;
+	}
+
 	enp->en_family = family;
 	enp->en_esip = esip;
 	enp->en_esbp = esbp;
@@ -333,6 +340,8 @@ efx_nic_create(
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 380729d174..8392a2be5b 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -133,7 +133,7 @@ rhead_ev_qprime(
 	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
 	    ERF_GZ_IDX, rptr);
 	/* EVQ_INT_PRIME lives function control window only on Riverhead */
-	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+	EFX_BAR_FCW_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword);
 
 	return (0);
 }
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 7fb28eae31..a773a43bcc 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -456,7 +456,7 @@ rhead_nic_hw_unavailable(
 	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
 		return (B_TRUE);
 
-	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
 	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
 		goto unavail;
 
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 03ea5dc128..4be65c15dc 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -1046,7 +1046,8 @@ sfc_probe(struct sfc_adapter *sa)
 	sfc_log_init(sa, "create nic");
 	rte_spinlock_init(&sa->nic_lock);
 	rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa,
-			    &sa->mem_bar, &sa->nic_lock, &enp);
+			    &sa->mem_bar, 0,
+			    &sa->nic_lock, &enp);
 	if (rc != 0)
 		goto fail_nic_create;
 	sa->nic = enp;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 44/60] common/sfc_efx/base: add function control window lookup API
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (42 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
                     ` (16 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Riverhead NIC may provide a locator of function control window
(EF100 resource locator).
The locator may be present in a Xilinx capabilities table which
itself is located by looking into extended PCI capabilities.

PCI capabilities are made possible to access by adding PCI config
space interface to efsys.

APIs are implemented to facilitate function control window lookup:
 - API to find an extended PCI capability given a capability ID;
 - API to read Xilinx PCI capability;

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  33 ++
 drivers/common/sfc_efx/base/efx_check.h       |   6 +
 drivers/common/sfc_efx/base/efx_impl.h        |  61 ++++
 drivers/common/sfc_efx/base/efx_nic.c         |  41 +++
 drivers/common/sfc_efx/base/efx_pci.c         | 302 ++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build       |   2 +
 drivers/common/sfc_efx/base/rhead_impl.h      |  13 +
 drivers/common/sfc_efx/base/rhead_pci.c       |  68 ++++
 drivers/common/sfc_efx/efsys.h                |   2 +
 .../sfc_efx/rte_common_sfc_efx_version.map    |   1 +
 10 files changed, 529 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 0d4f5e5e70..f6dd9db301 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -59,6 +59,19 @@ typedef enum efx_family_e {
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
+typedef enum efx_bar_type_e {
+	EFX_BAR_TYPE_MEM,
+	EFX_BAR_TYPE_IO
+} efx_bar_type_t;
+
+typedef struct efx_bar_region_s {
+	efx_bar_type_t		ebr_type;
+	int			ebr_index;
+	efsys_dma_addr_t	ebr_offset;
+	efsys_dma_addr_t	ebr_length;
+} efx_bar_region_t;
+
+/* The function is deprecated. It is used only if Riverhead is not supported. */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_family(
@@ -67,6 +80,26 @@ efx_family(
 	__out		efx_family_t *efp,
 	__out		unsigned int *membarp);
 
+#if EFSYS_OPT_PCI
+
+/* Determine EFX family and perform lookup of the function control window
+ *
+ * The function requires PCI config handle from which all memory bars can
+ * be accessed.
+ * A user of the API must be aware of memory bars indexes (not available
+ * on Windows).
+ */
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
+
 
 #define	EFX_PCI_VENID_SFC			0x1924
 #define	EFX_PCI_VENID_XILINX			0x10EE
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 978321cf67..af90a4c373 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -378,4 +378,10 @@
 # endif
 #endif /* EFSYS_OPT_EVB */
 
+#if EFSYS_OPT_PCI
+# if !EFSYS_OPT_RIVERHEAD
+#  error "PCI requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_PCI */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b1457f361a..422f97c5ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1558,6 +1558,67 @@ efx_mcdi_mac_stats(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Find the next extended capability in a PCI device's config space
+ * with specified capability id.
+ * Passing 0 offset makes the function search from the start.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if a capability is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp);
+
+/*
+ * Get the next extended capability in a PCI device's config space.
+ * Passing 0 offset makes the function get the first capability.
+ * If search succeeds, the capability is in modified offset.
+ *
+ * Returns ENOENT if there is no next capability.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp);
+
+/*
+ * Find the next Xilinx capabilities table location by searching
+ * PCI extended capabilities.
+ *
+ * Returns ENOENT if a table location is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
+
+/*
+ * Read a Xilinx extended PCI capability that gives the location
+ * of a Xilinx capabilities table.
+ *
+ * Returns ENOENT if the extended PCI capability does not contain
+ * Xilinx capabilities table locator.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp);
+
+#endif /* EFSYS_OPT_PCI */
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 3dc287a095..dcf0987ebf 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -103,6 +103,47 @@ efx_family(
 	return (ENOTSUP);
 }
 
+#if EFSYS_OPT_PCI
+
+	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp)
+{
+	efx_rc_t rc;
+	unsigned int membar;
+
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			if (rc == 0)
+				*efp = EFX_FAMILY_RIVERHEAD;
+
+			return (rc);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
+	rc = efx_family(venid, devid, efp, &membar);
+	if (rc == 0) {
+		ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+		ebrp->ebr_index = membar;
+		ebrp->ebr_offset = 0;
+		ebrp->ebr_length = 0;
+	}
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
 
 #if EFSYS_OPT_SIENA
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
new file mode 100644
index 0000000000..8707220849
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -0,0 +1,302 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	efx_rc_t rc = 0;
+	size_t next;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (*offsetp == 0) {
+		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
+	} else {
+		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail2;
+		}
+
+		next = EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_NEXT);
+		if (next < ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE)
+			rc = ENOENT;
+		else
+			*offsetp = next;
+	}
+
+	/*
+	 * Returns 0 if the next capability is present otherwise ENOENT
+	 * indicating that the function finished correctly.
+	 */
+	return (rc);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	size_t position;
+	efx_rc_t rc;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	position = *offsetp;
+
+	while (1) {
+		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		EFSYS_PCI_CONFIG_READD(espcp, position +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail3;
+		}
+
+		if (EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_ID) ==
+		    cap_id) {
+			*offsetp = position;
+			rc = 0;
+			break;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
+{
+	size_t cap_offset;
+	efx_rc_t rc;
+
+	if (pci_cap_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	cap_offset = *pci_cap_offsetp;
+
+	while (1) {
+		unsigned int tbl_bar;
+		efsys_dma_addr_t tbl_offset;
+
+		rc = efx_pci_config_find_next_ext_cap(espcp,
+				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		/*
+		 * The found extended PCI capability is a vendor-specific
+		 * capability, but not necessarily a Xilinx capabilities table
+		 * locator. Try to read it and skip it if the capability is
+		 * not the locator.
+		 */
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+						       &tbl_bar, &tbl_offset);
+		if (rc == 0) {
+			*xilinx_tbl_barp = tbl_bar;
+			*xilinx_tbl_offsetp = tbl_offset;
+			*pci_cap_offsetp = cap_offset;
+			break;
+		} else {
+			if (rc == ENOENT)
+				continue;
+			else
+				goto fail3;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp)
+{
+	size_t vsec_offset = cap_offset + ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE;
+	efx_dword_t cap_hdr;
+	efx_oword_t vsec;
+	uint32_t vsec_len;
+	uint32_t vsec_id;
+	uint32_t vsec_rev;
+	uint32_t offset_low;
+	uint32_t offset_high = 0;
+	unsigned int bar;
+	efsys_dma_addr_t offset;
+	efx_rc_t rc;
+
+	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+			       &cap_hdr, &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail1;
+	}
+
+	if (EFX_DWORD_FIELD(cap_hdr, ESF_GZ_PCI_EXPRESS_XCAP_VER) !=
+	    ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
+			       &vsec.eo_dword[0], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail3;
+	}
+
+	vsec_len = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_LEN);
+	vsec_id = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_ID);
+	vsec_rev = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_VER);
+
+	/*
+	 * Condition of the vendor-specific extended PCI capability not being
+	 * a Xilinx capabilities table locator.
+	 */
+	if (vsec_id != ESE_GZ_XILINX_VSEC_ID) {
+		rc = ENOENT;
+		goto fail4;
+	}
+
+	if (vsec_rev != ESE_GZ_VSEC_VER_XIL_CFGBAR ||
+	    vsec_len < ESE_GZ_VSEC_LEN_MIN) {
+		rc = EINVAL;
+		goto fail5;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
+			       &vsec.eo_dword[1], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail6;
+	}
+
+	bar = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_BAR);
+	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
+
+	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
+		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
+				&vsec.eo_dword[2], &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail7;
+		}
+
+		offset_high = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_HI);
+	}
+
+	/* High bits of low offset are discarded by the shift */
+	offset = offset_low << ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT;
+
+	/*
+	 * Avoid the 'left shift count >= width of type' warning on systems
+	 * without uint64_t support.
+	 */
+#if EFSYS_HAS_UINT64
+	offset |= (uint64_t)offset_high << ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT;
+#else
+	_NOTE(ARGUNUSED(offset_high))
+#endif
+
+	*offsetp = offset;
+	*barp = bar;
+
+	return (0);
+
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8f944bb45b..21feb36c73 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -19,6 +19,7 @@ sources = [
 	'efx_mon.c',
 	'efx_nic.c',
 	'efx_nvram.c',
+	'efx_pci.c',
 	'efx_phy.c',
 	'efx_port.c',
 	'efx_proxy.c',
@@ -55,6 +56,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_pci.c',
 	'rhead_rx.c',
 	'rhead_tx.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index c3ffad7208..c62cf8c2c6 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,19 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Perform discovery of function control window by looking for a
+ * EF100 locator in Xilinx capabilities tables.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
 }
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
new file mode 100644
index 0000000000..f8e372b79c
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp)
+{
+	boolean_t xilinx_tbl_found = B_FALSE;
+	unsigned int xilinx_tbl_bar;
+	efsys_dma_addr_t xilinx_tbl_offset;
+	size_t pci_capa_offset = 0;
+	boolean_t bar_found = B_FALSE;
+	efx_rc_t rc = ENOENT;
+
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
+	 * the following discovery steps.
+	 */
+	while (1) {
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+							&xilinx_tbl_bar,
+							&xilinx_tbl_offset);
+		if (rc != 0) {
+			/*
+			 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+			 * defines the following fallbacks for the memory bar
+			 * and the offset when no Xilinx capabilities table is
+			 * found.
+			 */
+			if (rc == ENOENT && xilinx_tbl_found == B_FALSE) {
+				ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+				ebrp->ebr_index = EFX_MEM_BAR_RIVERHEAD;
+				ebrp->ebr_offset = 0;
+				ebrp->ebr_length = 0;
+				bar_found = B_TRUE;
+				break;
+			} else {
+				goto fail1;
+			}
+
+		}
+
+		xilinx_tbl_found = B_TRUE;
+	}
+
+	if (bar_found == B_FALSE)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index e191cb5b6a..de1c1c38e3 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -162,6 +162,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 0
 
+#define EFSYS_OPT_PCI 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 16fffee321..627469a025 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -19,6 +19,7 @@ INTERNAL {
 	efx_evq_size;
 
 	efx_family;
+	efx_family_probe_bar;
 
 	efx_filter_fini;
 	efx_filter_init;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 45/60] common/sfc_efx/base: add efsys API to find a memory BAR
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (43 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
                     ` (15 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window lookup needs memory BARs handles to
search Xilinx capabilities tables.

Define an API to get a memory BAR handle by a PCIe device handle and
BAR index.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index f8e372b79c..47e89cf8a2 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -20,6 +20,7 @@ rhead_pci_nic_membar_lookup(
 	size_t pci_capa_offset = 0;
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
+	efsys_bar_t xil_eb;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -50,13 +51,19 @@ rhead_pci_nic_membar_lookup(
 		}
 
 		xilinx_tbl_found = B_TRUE;
+
+		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		if (rc != 0)
+			goto fail2;
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail2;
+		goto fail3;
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (44 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
                     ` (14 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

APIs for searching a capability in a Xilinx capabilities table and
reading table entries are needed for function control window lookup
to get the bar index and offset of the window.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   | 15 ++++++
 drivers/common/sfc_efx/base/efx_pci.c    | 61 ++++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  7 +++
 drivers/common/sfc_efx/base/rhead_nic.c  | 50 +++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_pci.c  | 51 +++++++++++++++++++-
 5 files changed, 183 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 422f97c5ca..dfe5f1fecf 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1617,6 +1617,21 @@ efx_pci_read_ext_cap_xilinx_table(
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
 
+/*
+ * Find a capability with specified format_id in a Xilinx capabilities table.
+ * Searching is started from provided offset, taking skip_first into account.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if an entry with specified format id is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp);
+
 #endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index 8707220849..1c31c126c6 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -299,4 +299,65 @@ efx_pci_read_ext_cap_xilinx_table(
 	return (rc);
 }
 
+	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp)
+{
+	efsys_dma_addr_t offset = *entry_offsetp;
+	boolean_t skip = skip_first;
+	efx_qword_t header;
+	uint32_t format;
+	uint32_t last;
+	efx_rc_t rc;
+
+	if (entry_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	rc = ENOENT;
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+	 * describes the following discovery steps.
+	 */
+	do {
+		/*
+		 * Xilinx Capabilities Table requries 32bit aligned reads.
+		 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+		 */
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+				&header.eq_dword[0], B_FALSE);
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+				&header.eq_dword[1], B_FALSE);
+
+		format = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_FORMAT);
+		last = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_LAST);
+
+		if (skip == B_FALSE && format == format_id) {
+			*entry_offsetp = offset;
+			rc = 0;
+			break;
+		}
+
+		offset += EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_SIZE);
+		skip = B_FALSE;
+	} while (last == B_FALSE);
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that
+	 * search finished correctly.
+	 */
+	return (rc);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index c62cf8c2c6..91347c335a 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -451,6 +451,13 @@ rhead_pci_nic_membar_lookup(
 
 #endif /* EFSYS_OPT_PCI */
 
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index a773a43bcc..787afb37a3 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -518,4 +518,54 @@ rhead_nic_register_test(
 
 #endif	/* EFSYS_OPT_DIAG */
 
+	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp)
+{
+	efx_oword_t entry;
+	uint32_t rev;
+	uint32_t len;
+	efx_rc_t rc;
+
+	/*
+	 * Xilinx Capabilities Table requires 32bit aligned reads.
+	 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+	 */
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+			&entry.eo_dword[0], B_FALSE);
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+			&entry.eo_dword[1], B_FALSE);
+
+	rev = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_REV);
+	len = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_SIZE);
+
+	if (rev != ESE_GZ_CFGBAR_ENTRY_REV_EF100 ||
+	    len < ESE_GZ_CFGBAR_ENTRY_SIZE_EF100) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_EF100_BAR) / 8),
+			&entry.eo_dword[2], B_FALSE);
+
+	ebrp->ebr_index = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_EF100_BAR);
+	ebrp->ebr_offset = EFX_OWORD_FIELD32(entry,
+			ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF) <<
+			ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT;
+	ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+	ebrp->ebr_length = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 47e89cf8a2..0a6e72f076 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -9,6 +9,41 @@
 
 #if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
 
+/*
+ * Search for a EF100 resource locator from the given offset of an entry
+ * in a Xilinx capabilities table.
+ */
+static	__checkReturn			efx_rc_t
+rhead_xilinx_cap_tbl_find_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t tbl_offset,
+	__out				efx_bar_region_t *ef100_ebrp)
+{
+	efx_rc_t rc;
+	efsys_dma_addr_t entry_offset = tbl_offset;
+
+	rc = efx_pci_xilinx_cap_tbl_find(esbp, ESE_GZ_CFGBAR_ENTRY_EF100,
+					   B_FALSE, &entry_offset);
+	if (rc != 0) {
+		/* EF100 locator not found (ENOENT) or other error */
+		goto fail1;
+	}
+
+	rc = rhead_nic_xilinx_cap_tbl_read_ef100_locator(esbp, entry_offset,
+							 ef100_ebrp);
+	if (rc != 0)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
@@ -55,13 +90,27 @@ rhead_pci_nic_membar_lookup(
 		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
 		if (rc != 0)
 			goto fail2;
+
+		rc = rhead_xilinx_cap_tbl_find_ef100_locator(&xil_eb,
+							     xilinx_tbl_offset,
+							     ebrp);
+		if (rc == 0) {
+			/* Found valid EF100 locator. */
+			bar_found = B_TRUE;
+			break;
+		} else if (rc != ENOENT) {
+			/* Table access failed, so terminate search. */
+			goto fail3;
+		}
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail3;
+		goto fail4;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (45 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
                     ` (13 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Check that BAR lookup was successful by looking at the content
of signature register.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 0a6e72f076..dfb163b96d 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -56,6 +56,9 @@ rhead_pci_nic_membar_lookup(
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
 	efsys_bar_t xil_eb;
+	efsys_bar_t nic_eb;
+	efx_dword_t magic_ed;
+	uint32_t magic;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -107,8 +110,25 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
+	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	if (rc != 0)
+		goto fail5;
+
+	EFSYS_BAR_READD(&nic_eb, ebrp->ebr_offset + ER_GZ_NIC_MAGIC_OFST,
+			&magic_ed, B_FALSE);
+
+	magic = EFX_DWORD_FIELD(magic_ed, ERF_GZ_NIC_MAGIC);
+	if (magic != EFE_GZ_NIC_MAGIC_EXPECTED) {
+		rc = EINVAL;
+		goto fail6;
+	}
+
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (46 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
                     ` (12 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

The procedures for destroying UDP tunnels are NIC family specific,
so they should be implemented separately for each of them.

Check for supported UDP encapsulation is removed from generic
operations since it is no longer used by the generic libefx API.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |  2 +-
 drivers/common/sfc_efx/base/efx_tunnel.c | 39 +++++++++++++++---------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index dfe5f1fecf..64156de884 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -303,8 +303,8 @@ efx_filter_reconfigure(
 
 #if EFSYS_OPT_TUNNEL
 typedef struct efx_tunnel_ops_s {
-	boolean_t	(*eto_udp_encap_supported)(efx_nic_t *);
 	efx_rc_t	(*eto_reconfigure)(efx_nic_t *);
+	void		(*eto_fini)(efx_nic_t *);
 } efx_tunnel_ops_t;
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index b1d1407bd2..5f2186c4c8 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -12,8 +12,8 @@
 
 #if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
 };
 #endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
@@ -26,9 +26,13 @@ static	__checkReturn	efx_rc_t
 ef10_tunnel_reconfigure(
 	__in		efx_nic_t *enp);
 
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp);
+
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
-	ef10_udp_encap_supported,	/* eto_udp_encap_supported */
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
+	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
@@ -204,22 +208,12 @@ efx_tunnel_init(
 efx_tunnel_fini(
 	__in		efx_nic_t *enp)
 {
-	boolean_t resetting;
-
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
-	if ((enp->en_etop->eto_udp_encap_supported != NULL) &&
-	    enp->en_etop->eto_udp_encap_supported(enp)) {
-		/*
-		 * The UNLOADING flag allows the MC to suppress the datapath
-		 * reset if it was set on the last call to
-		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
-		 */
-		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
-		    &resetting);
-	}
+	if (enp->en_etop->eto_fini != NULL)
+		enp->en_etop->eto_fini(enp);
 
 	enp->en_etop = NULL;
 	enp->en_mod_flags &= ~EFX_MOD_TUNNEL;
@@ -476,6 +470,23 @@ ef10_tunnel_reconfigure(
 
 	return (rc);
 }
+
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	boolean_t resetting;
+
+	if (ef10_udp_encap_supported(enp) != B_FALSE) {
+		/*
+		 * The UNLOADING flag allows the MC to suppress the datapath
+		 * reset if it was set on the last call to
+		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
+		 */
+		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
+		    &resetting);
+	}
+}
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
 #endif /* EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (47 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
                     ` (11 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

UDP tunnel reconfigure operation takes UDP tunnel table, which contains
entries that need to be applied to HW. This approach does not retain
information about what entries were removed or added, which is required
for Riverhead.

Add states to the table entries to indicate add or remove operations.
On tunnel reconfiguration added and removed entries become busy to
indicate that the entries are currently configured and to prevent add or
remove operations from other threads. After tunnel reconfiguration is
complete, the states are reset - added entries become applied and
removed entries are purged from the table.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        |   9 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   9 +
 drivers/common/sfc_efx/base/efx_tunnel.c | 276 +++++++++++++++++++++--
 3 files changed, 269 insertions(+), 25 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index f6dd9db301..b603e263e6 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -3659,6 +3659,9 @@ efx_tunnel_config_udp_add(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of the port is in progress in other thread.
+ */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
@@ -3666,8 +3669,12 @@ efx_tunnel_config_udp_remove(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of any of the tunnel entries
+ * is in progress in other thread.
+ */
 LIBEFX_API
-extern			void
+extern	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in		efx_nic_t *enp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 64156de884..1ae4eeaf88 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -489,9 +489,18 @@ siena_filter_tbl_clear(
 
 #if EFSYS_OPT_TUNNEL
 
+/* State of a UDP tunnel table entry */
+typedef enum efx_tunnel_udp_entry_state_e {
+	EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */
+	EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */
+	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
+} efx_tunnel_udp_entry_state_t;
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
+	boolean_t			etue_busy;
+	efx_tunnel_udp_entry_state_t	etue_state;
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 5f2186c4c8..204871e00d 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -7,6 +7,43 @@
 #include "efx.h"
 #include "efx_impl.h"
 
+/*
+ * State diagram of the UDP tunnel table entries
+ * (efx_tunnel_udp_entry_state_t and busy flag):
+ *
+ *                             +---------+
+ *                    +--------| APPLIED |<-------+
+ *                    |        +---------+        |
+ *                    |                           |
+ *                    |                efx_tunnel_reconfigure (end)
+ *   efx_tunnel_config_udp_remove                 |
+ *                    |                    +------------+
+ *                    v                    | BUSY ADDED |
+ *               +---------+               +------------+
+ *               | REMOVED |                      ^
+ *               +---------+                      |
+ *                    |               efx_tunnel_reconfigure (begin)
+ *  efx_tunnel_reconfigure (begin)                |
+ *                    |                           |
+ *                    v                     +-----------+
+ *            +--------------+              |   ADDED   |<---------+
+ *            | BUSY REMOVED |              +-----------+          |
+ *            +--------------+                    |                |
+ *                    |              efx_tunnel_config_udp_remove  |
+ *  efx_tunnel_reconfigure (end)                  |                |
+ *                    |                           |                |
+ *                    |        +---------+        |                |
+ *                    |        |+-------+|        |                |
+ *                    +------->|| empty ||<-------+                |
+ *                             |+-------+|                         |
+ *                             +---------+        efx_tunnel_config_udp_add
+ *                                  |                              |
+ *                                  +------------------------------+
+ *
+ * Note that there is no BUSY APPLIED state since removing an applied entry
+ * should not be blocked by ongoing reconfiguration in another thread -
+ * reconfiguration will remove only busy entries.
+ */
 
 #if EFSYS_OPT_TUNNEL
 
@@ -36,6 +73,24 @@ static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+/* Indicates that an entry is to be set */
+static	__checkReturn		boolean_t
+ef10_entry_staged(
+	__in			efx_tunnel_udp_entry_t *entry)
+{
+	switch (entry->etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		return (entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		return (!entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		return (B_TRUE);
+	default:
+		EFSYS_ASSERT(0);
+		return (B_FALSE);
+	}
+}
+
 static	__checkReturn		efx_rc_t
 efx_mcdi_set_tunnel_encap_udp_ports(
 	__in			efx_nic_t *enp,
@@ -51,11 +106,17 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	efx_rc_t rc;
 	unsigned int i;
 	unsigned int entries_num;
+	unsigned int entry;
 
-	if (etcp == NULL)
-		entries_num = 0;
-	else
-		entries_num = etcp->etc_udp_entries_num;
+	entries_num = 0;
+	if (etcp != NULL) {
+		for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+			if (ef10_entry_staged(&etcp->etc_udp_entries[i]) !=
+			    B_FALSE) {
+				entries_num++;
+			}
+		}
+	}
 
 	req.emr_cmd = MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS;
 	req.emr_in_buf = payload;
@@ -73,9 +134,12 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	MCDI_IN_SET_WORD(req, SET_TUNNEL_ENCAP_UDP_PORTS_IN_NUM_ENTRIES,
 	    entries_num);
 
-	for (i = 0; i < entries_num; ++i) {
+	for (i = 0, entry = 0; entry < entries_num; ++entry, ++i) {
 		uint16_t mcdi_udp_protocol;
 
+		while (ef10_entry_staged(&etcp->etc_udp_entries[i]) == B_FALSE)
+			i++;
+
 		switch (etcp->etc_udp_entries[i].etue_protocol) {
 		case EFX_TUNNEL_PROTOCOL_VXLAN:
 			mcdi_udp_protocol = TUNNEL_ENCAP_UDP_PORT_ENTRY_VXLAN;
@@ -97,7 +161,7 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_LEN);
 		EFX_POPULATE_DWORD_2(
 		    MCDI_IN2(req, efx_dword_t,
-			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[i],
+			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[entry],
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_UDP_PORT,
 		    etcp->etc_udp_entries[i].etue_port,
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_PROTOCOL,
@@ -230,7 +294,8 @@ efx_tunnel_config_find_udp_tunnel_entry(
 	for (i = 0; i < etcp->etc_udp_entries_num; ++i) {
 		efx_tunnel_udp_entry_t *p = &etcp->etc_udp_entries[i];
 
-		if (p->etue_port == port) {
+		if (p->etue_port == port &&
+		    p->etue_state != EFX_TUNNEL_UDP_ENTRY_REMOVED) {
 			*entryp = i;
 			return (0);
 		}
@@ -281,6 +346,8 @@ efx_tunnel_config_udp_add(
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_port = port;
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_protocol =
 	    protocol;
+	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_state =
+	    EFX_TUNNEL_UDP_ENTRY_ADDED;
 
 	etcp->etc_udp_entries_num++;
 
@@ -304,6 +371,61 @@ efx_tunnel_config_udp_add(
 	return (rc);
 }
 
+/*
+ * Returns the index of the entry after the deleted one,
+ * or one past the last entry.
+ */
+static			unsigned int
+efx_tunnel_config_udp_do_remove(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
+	etcp->etc_udp_entries_num--;
+
+	if (entry < etcp->etc_udp_entries_num) {
+		memmove(&etcp->etc_udp_entries[entry],
+		    &etcp->etc_udp_entries[entry + 1],
+		    (etcp->etc_udp_entries_num - entry) *
+		    sizeof (etcp->etc_udp_entries[0]));
+	}
+
+	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
+	    sizeof (etcp->etc_udp_entries[0]));
+
+	return (entry);
+}
+
+/*
+ * Returns the index of the entry after the specified one,
+ * or one past the last entry. The index is correct whether
+ * the specified entry was removed or not.
+ */
+static			unsigned int
+efx_tunnel_config_udp_remove_prepare(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	unsigned int next = entry + 1;
+
+	switch (etcp->etc_udp_entries[entry].etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		next = efx_tunnel_config_udp_do_remove(etcp, entry);
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		etcp->etc_udp_entries[entry].etue_state =
+		    EFX_TUNNEL_UDP_ENTRY_REMOVED;
+		break;
+	default:
+		EFSYS_ASSERT(0);
+		break;
+	}
+
+	return (next);
+}
+
 	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
 	__in		efx_nic_t *enp,
@@ -323,28 +445,25 @@ efx_tunnel_config_udp_remove(
 	if (rc != 0)
 		goto fail1;
 
-	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
-		rc = EINVAL;
+	if (etcp->etc_udp_entries[entry].etue_busy != B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
 	}
 
-	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
-	etcp->etc_udp_entries_num--;
-
-	if (entry < etcp->etc_udp_entries_num) {
-		memmove(&etcp->etc_udp_entries[entry],
-		    &etcp->etc_udp_entries[entry + 1],
-		    (etcp->etc_udp_entries_num - entry) *
-		    sizeof (etcp->etc_udp_entries[0]));
+	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
+		rc = EINVAL;
+		goto fail3;
 	}
 
-	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
-	    sizeof (etcp->etc_udp_entries[0]));
+	(void) efx_tunnel_config_udp_remove_prepare(etcp, entry);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
+
 fail2:
 	EFSYS_PROBE(fail2);
 
@@ -355,21 +474,51 @@ efx_tunnel_config_udp_remove(
 	return (rc);
 }
 
-			void
+static			boolean_t
+efx_tunnel_table_all_available(
+	__in			efx_tunnel_cfg_t *etcp)
+{
+	unsigned int i;
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		if (etcp->etc_udp_entries[i].etue_busy != B_FALSE)
+			return (B_FALSE);
+	}
+
+	return (B_TRUE);
+}
+
+	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in			efx_nic_t *enp)
 {
 	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
 	efsys_lock_state_t state;
+	unsigned int i;
+	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
 	EFSYS_LOCK(enp->en_eslp, state);
 
-	etcp->etc_udp_entries_num = 0;
-	memset(etcp->etc_udp_entries, 0, sizeof (etcp->etc_udp_entries));
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
+		goto fail1;
+	}
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num)
+		i = efx_tunnel_config_udp_remove_prepare(etcp, i);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (rc);
 }
 
 	__checkReturn	efx_rc_t
@@ -377,6 +526,12 @@ efx_tunnel_reconfigure(
 	__in		efx_nic_t *enp)
 {
 	const efx_tunnel_ops_t *etop = enp->en_etop;
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_tunnel_udp_entry_t *entry;
+	boolean_t locked = B_FALSE;
+	efsys_lock_state_t state;
+	boolean_t resetting;
+	unsigned int i;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
@@ -386,16 +541,89 @@ efx_tunnel_reconfigure(
 		goto fail1;
 	}
 
-	if ((rc = enp->en_etop->eto_reconfigure(enp)) != 0)
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
+	}
 
-	return (0);
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_state != EFX_TUNNEL_UDP_ENTRY_APPLIED)
+			entry->etue_busy = B_TRUE;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	rc = enp->en_etop->eto_reconfigure(enp);
+	if (rc != 0 && rc != EAGAIN)
+		goto fail3;
+
+	resetting = (rc == EAGAIN) ? B_TRUE : B_FALSE;
+
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	/*
+	 * Delete entries marked for removal since they are no longer
+	 * needed after successful NIC-specific reconfiguration.
+	 * Added entries become applied because they are installed in
+	 * the hardware.
+	 */
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num) {
+		unsigned int next = i + 1;
+
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_busy != B_FALSE) {
+			entry->etue_busy = B_FALSE;
+
+			switch (entry->etue_state) {
+			case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_ADDED:
+				entry->etue_state =
+				    EFX_TUNNEL_UDP_ENTRY_APPLIED;
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+				next = efx_tunnel_config_udp_do_remove(etcp, i);
+				break;
+			default:
+				EFSYS_ASSERT(0);
+				break;
+			}
+		}
+
+		i = next;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	return ((resetting == B_FALSE) ? 0 : EAGAIN);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+	EFSYS_ASSERT(locked == B_FALSE);
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++)
+		etcp->etc_udp_entries[i].etue_busy = B_FALSE;
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
 
 fail2:
 	EFSYS_PROBE(fail2);
 
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	if (locked)
+		EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (rc);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (48 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
                     ` (10 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

EF100 uses VNIC encapsulation rule MCDI for configuring UDP
tunnels in HW individually. Use busy added and removed states
of UDP tunnel table entries for the implementation.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
v2:
 - support TABs to indent instead of spaces

 drivers/common/sfc_efx/base/ef10_filter.c  |  10 +-
 drivers/common/sfc_efx/base/efx_impl.h     |   7 +
 drivers/common/sfc_efx/base/efx_mcdi.h     |  11 +
 drivers/common/sfc_efx/base/efx_tunnel.c   |  25 +-
 drivers/common/sfc_efx/base/meson.build    |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h   |  14 +
 drivers/common/sfc_efx/base/rhead_nic.c    |  17 +
 drivers/common/sfc_efx/base/rhead_tunnel.c | 343 +++++++++++++++++++++
 8 files changed, 418 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 51e6f1a210..0e5f04fe3b 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -1328,9 +1328,15 @@ ef10_filter_supported_filters(
 		rc = efx_mcdi_get_parser_disp_info(enp, &buffer[next_buf_idx],
 		    next_buf_length, B_TRUE, &mcdi_encap_list_length);
 		if (rc != 0) {
-			if (rc == ENOSPC)
+			if (rc == ENOSPC) {
 				no_space = B_TRUE;
-			else
+			} else if (rc == EINVAL) {
+				/*
+				 * Do not fail if the MCDI do not recognize the
+				 * query for encapsulated packet filters.
+				 */
+				mcdi_encap_list_length = 0;
+			} else
 				goto fail2;
 		} else {
 			for (i = next_buf_idx;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ae4eeaf88..be3f3f6bf5 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -496,11 +496,18 @@ typedef enum efx_tunnel_udp_entry_state_e {
 	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
 } efx_tunnel_udp_entry_state_t;
 
+#if EFSYS_OPT_RIVERHEAD
+typedef uint32_t	efx_vnic_encap_rule_handle_t;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
 	boolean_t			etue_busy;
 	efx_tunnel_udp_entry_state_t	etue_state;
+#if EFSYS_OPT_RIVERHEAD
+	efx_vnic_encap_rule_handle_t	etue_handle;
+#endif /* EFSYS_OPT_RIVERHEAD */
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h
index 97ac8bf496..77a3d636e2 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_mcdi.h
@@ -384,6 +384,17 @@ efx_mcdi_phy_module_get_info(
 		MC_CMD_ ## _field9, _value9,				\
 		MC_CMD_ ## _field10, _value10)
 
+/*
+ * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in
+ * network order to avoid conversion to little-endian that is done in
+ * other setters.
+ */
+#define	MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value)
+
+#define	MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value)
+
 #define	MCDI_OUT(_emr, _type, _ofst)					\
 	((_type *)((_emr).emr_out_buf + (_ofst)))
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 204871e00d..02b83d97ed 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -47,13 +47,6 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
-static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_reconfigure */
-	NULL,	/* eto_fini */
-};
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
-
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
 ef10_udp_encap_supported(
@@ -66,13 +59,29 @@ ef10_tunnel_reconfigure(
 static			void
 ef10_tunnel_fini(
 	__in		efx_nic_t *enp);
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
+	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
+};
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
 	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tunnel_ops_t	__efx_tunnel_rhead_ops = {
+	rhead_tunnel_reconfigure,	/* eto_reconfigure */
+	rhead_tunnel_fini,		/* eto_fini */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 /* Indicates that an entry is to be set */
 static	__checkReturn		boolean_t
 ef10_entry_staged(
@@ -241,7 +250,7 @@ efx_tunnel_init(
 
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		etop = &__efx_tunnel_dummy_ops;
+		etop = &__efx_tunnel_rhead_ops;
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 21feb36c73..e0acbda993 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -58,6 +58,7 @@ sources = [
 	'rhead_nic.c',
 	'rhead_pci.c',
 	'rhead_rx.c',
+	'rhead_tunnel.c',
 	'rhead_tx.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 91347c335a..4d5307d18b 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,20 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_TUNNEL
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_TUNNEL */
+
 #if EFSYS_OPT_PCI
 
 /*
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 787afb37a3..f965c1735e 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -22,6 +22,23 @@ rhead_board_cfg(
 	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
 		goto fail1;
 
+	/*
+	 * The tunnel encapsulation initialization happens unconditionally
+	 * for now.
+	 */
+	encp->enc_tunnel_encapsulations_supported =
+	    (1u << EFX_TUNNEL_PROTOCOL_VXLAN) |
+	    (1u << EFX_TUNNEL_PROTOCOL_GENEVE) |
+	    (1u << EFX_TUNNEL_PROTOCOL_NVGRE);
+
+	/*
+	 * Software limitation inherited from EF10. This limit is not
+	 * increased since the hardware does not report this limit, it is
+	 * handled internally resulting in a tunnel add error when there is no
+	 * space for more UDP tunnels.
+	 */
+	encp->enc_tunnel_config_udp_entries_max = EFX_TUNNEL_MAXNENTRIES;
+
 	encp->enc_clk_mult = 1; /* not used for Riverhead */
 
 	/*
diff --git a/drivers/common/sfc_efx/base/rhead_tunnel.c b/drivers/common/sfc_efx/base/rhead_tunnel.c
new file mode 100644
index 0000000000..34ba074eac
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tunnel.c
@@ -0,0 +1,343 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2020 Xilinx, Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL
+
+/* Match by Ether-type */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_ETHER_TYPE \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN)
+/* Match by outer VLAN ID */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_OUTER_VID \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN)
+/* Match by local IP host address */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_HOST \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN)
+/* Match by IP transport protocol */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN)
+/* Match by local TCP/UDP port */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN)
+
+/*
+ * Helper structure to pass parameters to MCDI function to add a VNIC
+ * encapsulation rule.
+ */
+typedef struct efx_vnic_encap_rule_spec_s {
+	uint32_t		evers_mport_selector; /* Host-endian */
+	uint32_t		evers_match_flags; /* Host-endian */
+	uint16_t		evers_ether_type; /* Host-endian */
+	uint16_t		evers_outer_vid; /* Host-endian */
+	efx_oword_t		evers_loc_host; /* Big-endian */
+	uint8_t			evers_ip_proto;
+	uint16_t		evers_loc_port; /* Host-endian */
+	efx_tunnel_protocol_t	evers_encap_type;
+} efx_vnic_encap_rule_spec_t;
+
+static				uint32_t
+efx_tunnel_protocol2mae_encap_type(
+	__in		efx_tunnel_protocol_t proto,
+	__out		uint32_t *typep)
+{
+	efx_rc_t rc;
+
+	switch (proto) {
+	case EFX_TUNNEL_PROTOCOL_NONE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NONE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_VXLAN:
+		*typep = MAE_MCDI_ENCAP_TYPE_VXLAN;
+		break;
+	case EFX_TUNNEL_PROTOCOL_GENEVE:
+		*typep = MAE_MCDI_ENCAP_TYPE_GENEVE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_NVGRE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NVGRE;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_add(
+	__in			efx_nic_t *enp,
+	__in			const efx_vnic_encap_rule_spec_t *spec,
+	__out			efx_vnic_encap_rule_handle_t *handle)
+
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN);
+	uint32_t encap_type;
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_ADD;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR,
+	    spec->evers_mport_selector);
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS,
+	    spec->evers_match_flags);
+
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE,
+	    __CPU_TO_BE_16(spec->evers_ether_type));
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD,
+	    __CPU_TO_BE_16(spec->evers_outer_vid));
+
+	/*
+	 * Address is already in network order as well as the MCDI field,
+	 * so plain copy is used.
+	 */
+	EFX_STATIC_ASSERT(sizeof (spec->evers_loc_host) ==
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+	memcpy(MCDI_IN2(req, uint8_t, VNIC_ENCAP_RULE_ADD_IN_DST_IP),
+	    &spec->evers_loc_host.eo_byte[0],
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+
+	MCDI_IN_SET_BYTE(req, VNIC_ENCAP_RULE_ADD_IN_IP_PROTO,
+	    spec->evers_ip_proto);
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_DST_PORT,
+	    __CPU_TO_BE_16(spec->evers_loc_port));
+
+	rc = efx_tunnel_protocol2mae_encap_type(spec->evers_encap_type,
+	    &encap_type);
+	if (rc != 0)
+		goto fail1;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE, encap_type);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail2;
+	}
+
+	if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	if (handle != NULL)
+		*handle = MCDI_OUT_DWORD(req, VNIC_ENCAP_RULE_ADD_OUT_HANDLE);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_remove(
+	__in			efx_nic_t *enp,
+	__in			efx_vnic_encap_rule_handle_t handle)
+
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN,
+	    MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_REMOVE;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_REMOVE_IN_HANDLE, handle);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static			void
+rhead_vnic_encap_rule_spec_init(
+	__in		const efx_tunnel_udp_entry_t *etuep,
+	__out		efx_vnic_encap_rule_spec_t *spec)
+{
+	memset(spec, 0, sizeof (*spec));
+
+	spec->evers_mport_selector = MAE_MPORT_SELECTOR_ASSIGNED;
+	spec->evers_match_flags = EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO |
+	    EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT;
+	spec->evers_ip_proto = EFX_IPPROTO_UDP;
+	spec->evers_loc_port = etuep->etue_port;
+	spec->evers_encap_type = etuep->etue_protocol;
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_add(
+	__in		efx_nic_t *enp,
+	__inout		efx_tunnel_udp_entry_t *etuep)
+{
+	efx_vnic_encap_rule_spec_t spec;
+
+	rhead_vnic_encap_rule_spec_init(etuep, &spec);
+	return (efx_mcdi_vnic_encap_rule_add(enp, &spec, &etuep->etue_handle));
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_remove(
+	__in		efx_nic_t *enp,
+	__in		efx_tunnel_udp_entry_t *etuep)
+{
+	return (efx_mcdi_vnic_encap_rule_remove(enp, etuep->etue_handle));
+}
+
+	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp)
+{
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_rc_t rc;
+	efsys_lock_state_t state;
+	efx_tunnel_cfg_t etc;
+	efx_tunnel_cfg_t added;
+	unsigned int i;
+	unsigned int j;
+
+	memset(&added, 0, sizeof(added));
+
+	/*
+	 * Make a local copy of UDP tunnel table to release the lock
+	 * when executing MCDIs.
+	 */
+	EFSYS_LOCK(enp->en_eslp, state);
+	memcpy(&etc, etcp, sizeof (etc));
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etc.etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *etc_entry = &etc.etc_udp_entries[i];
+
+		if (etc_entry->etue_busy == B_FALSE)
+			continue;
+
+		switch (etc_entry->etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			rc = rhead_udp_port_tunnel_add(enp, etc_entry);
+			if (rc != 0)
+				goto fail1;
+			added.etc_udp_entries[added.etc_udp_entries_num] =
+			    *etc_entry;
+			added.etc_udp_entries_num++;
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			rc = rhead_udp_port_tunnel_remove(enp, etc_entry);
+			if (rc != 0)
+				goto fail2;
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	/*
+	 * Adding or removing non-busy entries does not change the
+	 * order of busy entries. Therefore one linear search iteration
+	 * suffices.
+	 */
+	for (i = 0, j = 0; i < etcp->etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *cur_entry = &etcp->etc_udp_entries[i];
+		efx_tunnel_udp_entry_t *added_entry = &added.etc_udp_entries[j];
+
+		if (cur_entry->etue_state == EFX_TUNNEL_UDP_ENTRY_ADDED &&
+		    cur_entry->etue_port == added_entry->etue_port) {
+			cur_entry->etue_handle = added_entry->etue_handle;
+			j++;
+		}
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	while (i-- > 0) {
+		if (etc.etc_udp_entries[i].etue_busy == B_FALSE)
+			continue;
+
+		switch (etc.etc_udp_entries[i].etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			(void) rhead_udp_port_tunnel_remove(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			(void) rhead_udp_port_tunnel_add(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	return (rc);
+}
+
+			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_tunnel_config_clear(enp);
+	(void) efx_tunnel_reconfigure(enp);
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 51/60] common/sfc_efx/base: replace PCI efsys macros with functions
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (49 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
                     ` (9 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

efsys macros that manipulate PCI devices cannot be defined in
common sfc_efx DPDK driver since in DPDK build the bus drivers
that provide required functionality are built after common drivers.

Replace the macros with function callbacks to remove that build
dependency. Drivers now should pass the callbacks directly to
efx function instead of defining implementation in efsys.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        | 29 ++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h   |  4 +++
 drivers/common/sfc_efx/base/efx_nic.c    |  3 ++-
 drivers/common/sfc_efx/base/efx_pci.c    | 34 +++++++++++++-----------
 drivers/common/sfc_efx/base/rhead_impl.h |  1 +
 drivers/common/sfc_efx/base/rhead_pci.c  |  8 +++---
 6 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index b603e263e6..67438b59e6 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -82,6 +82,34 @@ efx_family(
 
 #if EFSYS_OPT_PCI
 
+typedef struct efx_pci_ops_s {
+	/*
+	 * Function for reading PCIe configuration space.
+	 *
+	 * espcp	System-specific PCIe device handle;
+	 * offset	Offset inside PCIe configuration space to start reading
+	 *		from;
+	 * edp		EFX DWORD structure that should be populated by function
+	 *		in little-endian order;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_config_readd)(efsys_pci_config_t *espcp,
+					    uint32_t offset, efx_dword_t *edp);
+	/*
+	 * Function for finding PCIe memory bar handle by its index from a PCIe
+	 * device handle. The found memory bar is available in read-only mode.
+	 *
+	 * configp	System-specific PCIe device handle;
+	 * index	Memory bar index;
+	 * memp		Pointer to the found memory bar handle;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_find_mem_bar)(efsys_pci_config_t *configp,
+					    int index, efsys_bar_t *memp);
+} efx_pci_ops_t;
+
 /* Determine EFX family and perform lookup of the function control window
  *
  * The function requires PCI config handle from which all memory bars can
@@ -95,6 +123,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index be3f3f6bf5..f58586bee0 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1588,6 +1588,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp);
 
@@ -1602,6 +1603,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp);
 
 /*
@@ -1614,6 +1616,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
@@ -1629,6 +1632,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index dcf0987ebf..a78c4c3737 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -110,6 +110,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp)
 {
@@ -121,7 +122,7 @@ efx_family_probe_bar(
 #if EFSYS_OPT_RIVERHEAD
 		case EFX_PCI_DEVID_RIVERHEAD:
 		case EFX_PCI_DEVID_RIVERHEAD_VF:
-			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			rc = rhead_pci_nic_membar_lookup(espcp, epop, ebrp);
 			if (rc == 0)
 				*efp = EFX_FAMILY_RIVERHEAD;
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index 1c31c126c6..5eccfbe35d 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -12,6 +12,7 @@
 	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp)
 {
 	efx_dword_t hdr;
@@ -26,9 +27,9 @@ efx_pci_config_next_ext_cap(
 	if (*offsetp == 0) {
 		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
 	} else {
-		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+		rc = epop->epo_config_readd(espcp, *offsetp +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail2;
@@ -58,6 +59,7 @@ efx_pci_config_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp)
 {
@@ -73,7 +75,7 @@ efx_pci_config_find_next_ext_cap(
 	position = *offsetp;
 
 	while (1) {
-		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		rc = efx_pci_config_next_ext_cap(espcp, epop, &position);
 		if (rc != 0) {
 			if (rc == ENOENT)
 				break;
@@ -81,9 +83,9 @@ efx_pci_config_find_next_ext_cap(
 				goto fail2;
 		}
 
-		EFSYS_PCI_CONFIG_READD(espcp, position +
+		rc = epop->epo_config_readd(espcp, position +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail3;
@@ -116,6 +118,7 @@ efx_pci_config_find_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
@@ -134,7 +137,7 @@ efx_pci_find_next_xilinx_cap_table(
 		unsigned int tbl_bar;
 		efsys_dma_addr_t tbl_offset;
 
-		rc = efx_pci_config_find_next_ext_cap(espcp,
+		rc = efx_pci_config_find_next_ext_cap(espcp, epop,
 				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
 		if (rc != 0) {
 			if (rc == ENOENT)
@@ -149,7 +152,7 @@ efx_pci_find_next_xilinx_cap_table(
 		 * locator. Try to read it and skip it if the capability is
 		 * not the locator.
 		 */
-		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, epop, cap_offset,
 						       &tbl_bar, &tbl_offset);
 		if (rc == 0) {
 			*xilinx_tbl_barp = tbl_bar;
@@ -183,6 +186,7 @@ efx_pci_find_next_xilinx_cap_table(
 	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp)
@@ -199,9 +203,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	efsys_dma_addr_t offset;
 	efx_rc_t rc;
 
-	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+	rc = epop->epo_config_readd(espcp, cap_offset +
 			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-			       &cap_hdr, &rc);
+			       &cap_hdr);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail1;
@@ -213,9 +217,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail2;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
-			       &vsec.eo_dword[0], &rc);
+			       &vsec.eo_dword[0]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail3;
@@ -240,9 +244,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail5;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
-			       &vsec.eo_dword[1], &rc);
+			       &vsec.eo_dword[1]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail6;
@@ -252,9 +256,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
 
 	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
-		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+		rc = epop->epo_config_readd(espcp, vsec_offset +
 				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
-				&vsec.eo_dword[2], &rc);
+				&vsec.eo_dword[2]);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail7;
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 4d5307d18b..3383c47ec6 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -461,6 +461,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp);
 
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index dfb163b96d..0f4b4cb910 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -47,6 +47,7 @@ rhead_xilinx_cap_tbl_find_ef100_locator(
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp)
 {
 	boolean_t xilinx_tbl_found = B_FALSE;
@@ -65,7 +66,8 @@ rhead_pci_nic_membar_lookup(
 	 * the following discovery steps.
 	 */
 	while (1) {
-		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, epop,
+							&pci_capa_offset,
 							&xilinx_tbl_bar,
 							&xilinx_tbl_offset);
 		if (rc != 0) {
@@ -90,7 +92,7 @@ rhead_pci_nic_membar_lookup(
 
 		xilinx_tbl_found = B_TRUE;
 
-		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		rc = epop->epo_find_mem_bar(espcp, xilinx_tbl_bar, &xil_eb);
 		if (rc != 0)
 			goto fail2;
 
@@ -110,7 +112,7 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
-	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	rc = epop->epo_find_mem_bar(espcp, ebrp->ebr_index, &nic_eb);
 	if (rc != 0)
 		goto fail5;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (50 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
                     ` (8 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

There is no difference yet in EVB support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_evb.c  |  8 ++++----
 drivers/common/sfc_efx/base/efx_check.h |  4 ++--
 drivers/common/sfc_efx/base/efx_evb.c   | 24 ++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_evb.c b/drivers/common/sfc_efx/base/ef10_evb.c
index aeeaa5189f..089d791543 100644
--- a/drivers/common/sfc_efx/base/ef10_evb.c
+++ b/drivers/common/sfc_efx/base/ef10_evb.c
@@ -9,13 +9,13 @@
 
 #if EFSYS_OPT_EVB
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_evb_init(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	return (0);
 }
@@ -24,7 +24,7 @@ ef10_evb_init(
 ef10_evb_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 }
 
 static	__checkReturn	efx_rc_t
@@ -545,5 +545,5 @@ ef10_evb_vport_stats(
 			EFX_STATS_UPLOAD, 0));
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #endif /* EFSYS_OPT_EVB */
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index af90a4c373..f9f97946e5 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -373,8 +373,8 @@
 
 #if EFSYS_OPT_EVB
 /* Support enterprise virtual bridging */
-# if !(EFX_OPTS_EF10())
-#  error "EVB requires EF10 arch"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10())
+#  error "EVB requires RIVERHEAD or EF10 arch"
 # endif
 #endif /* EFSYS_OPT_EVB */
 
diff --git a/drivers/common/sfc_efx/base/efx_evb.c b/drivers/common/sfc_efx/base/efx_evb.c
index 17318b7e11..b6c9b88fc2 100644
--- a/drivers/common/sfc_efx/base/efx_evb.c
+++ b/drivers/common/sfc_efx/base/efx_evb.c
@@ -46,6 +46,24 @@ static const efx_evb_ops_t	__efx_evb_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_evb_ops_t	__efx_evb_rhead_ops = {
+	ef10_evb_init,			/* eeo_init */
+	ef10_evb_fini,			/* eeo_fini */
+	ef10_evb_vswitch_alloc,		/* eeo_vswitch_alloc */
+	ef10_evb_vswitch_free,		/* eeo_vswitch_free */
+	ef10_evb_vport_alloc,		/* eeo_vport_alloc */
+	ef10_evb_vport_free,		/* eeo_vport_free */
+	ef10_evb_vport_mac_addr_add,	/* eeo_vport_mac_addr_add */
+	ef10_evb_vport_mac_addr_del,	/* eeo_vport_mac_addr_del */
+	ef10_evb_vadaptor_alloc,	/* eeo_vadaptor_alloc */
+	ef10_evb_vadaptor_free,		/* eeo_vadaptor_free */
+	ef10_evb_vport_assign,		/* eeo_vport_assign */
+	ef10_evb_vport_reconfigure,	/* eeo_vport_reconfigure */
+	ef10_evb_vport_stats,		/* eeo_vport_stats */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_evb_init(
 	__in		efx_nic_t *enp)
@@ -83,6 +101,12 @@ efx_evb_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eeop = &__efx_evb_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (51 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
                     ` (7 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev

Riverhead has EVB support similar to EF10 and NIC must allocate
its vAdaptor on init.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h |  5 +++
 drivers/common/sfc_efx/base/ef10_nic.c  | 10 +++++-
 drivers/common/sfc_efx/base/rhead_nic.c | 43 +++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e77fb4ddea..d7b3c3db52 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -234,6 +234,11 @@ efx_mcdi_vadaptor_free(
 	__in		efx_nic_t *enp,
 	__in		uint32_t port_id);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+ef10_upstream_port_vadaptor_alloc(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 ef10_nic_probe(
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 927af87e0d..7a11930242 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2321,7 +2321,11 @@ ef10_nic_reset(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
 ef10_upstream_port_vadaptor_alloc(
 	__in		efx_nic_t *enp)
 {
@@ -2373,6 +2377,10 @@ ef10_upstream_port_vadaptor_alloc(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 ef10_nic_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index f965c1735e..9b8f09d12c 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -336,6 +336,7 @@ rhead_nic_init(
 	uint32_t vi_count, vi_base, vi_shift;
 	uint32_t vi_window_size;
 	efx_rc_t rc;
+	boolean_t alloc_vadaptor = B_TRUE;
 
 	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
 	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
@@ -387,12 +388,34 @@ rhead_nic_init(
 	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
 	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
 
-	enp->en_vport_id = EVB_PORT_ID_NULL;
-
 	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
 
+	/*
+	 * For SR-IOV use case, vAdaptor is allocated for PF and associated VFs
+	 * during NIC initialization when vSwitch is created and vPorts are
+	 * allocated. Hence, skip vAdaptor allocation for EVB and update vPort
+	 * ID in NIC structure with the one allocated for PF.
+	 */
+
+	enp->en_vport_id = EVB_PORT_ID_ASSIGNED;
+#if EFSYS_OPT_EVB
+	if ((enp->en_vswitchp != NULL) && (enp->en_vswitchp->ev_evcp != NULL)) {
+		/* For EVB use vPort allocated on vSwitch */
+		enp->en_vport_id = enp->en_vswitchp->ev_evcp->evc_vport_id;
+		alloc_vadaptor = B_FALSE;
+	}
+#endif
+	if (alloc_vadaptor != B_FALSE) {
+		/* Allocate a vAdaptor attached to our upstream vPort/pPort */
+		if ((rc = ef10_upstream_port_vadaptor_alloc(enp)) != 0)
+			goto fail5;
+	}
+
 	return (0);
 
+fail5:
+	EFSYS_PROBE(fail5);
+
 fail4:
 	EFSYS_PROBE(fail4);
 
@@ -497,6 +520,22 @@ rhead_nic_set_hw_unavailable(
 rhead_nic_fini(
 	__in		efx_nic_t *enp)
 {
+	boolean_t do_vadaptor_free = B_TRUE;
+
+#if EFSYS_OPT_EVB
+	if (enp->en_vswitchp != NULL) {
+		/*
+		 * For SR-IOV the vAdaptor is freed with the vSwitch,
+		 * so do not free it here.
+		 */
+		do_vadaptor_free = B_FALSE;
+	}
+#endif
+	if (do_vadaptor_free != B_FALSE) {
+		(void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id);
+		enp->en_vport_id = EVB_PORT_ID_NULL;
+	}
+
 	(void) efx_mcdi_free_vis(enp);
 	enp->en_arch.ef10.ena_vi_count = 0;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 54/60] common/sfc_efx/base: add option for extended width events
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (52 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
                     ` (6 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses event queues with 256bit extended width events to
support descriptor proxy queues.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 7 +++++++
 drivers/common/sfc_efx/efsys.h          | 1 +
 2 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index f9f97946e5..40ba57be6f 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -384,4 +384,11 @@
 # endif
 #endif /* EFSYS_OPT_PCI */
 
+/* Support extended width event queues */
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+# if !EFSYS_OPT_RIVERHEAD
+#  error "EV_EXTENDED_WIDTH requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index de1c1c38e3..f74b703cda 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -142,6 +142,7 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_FILTER 1
 #define EFSYS_OPT_RX_SCATTER 0
 
+#define EFSYS_OPT_EV_EXTENDED_WIDTH 0
 #define EFSYS_OPT_EV_PREFETCH 0
 
 #define EFSYS_OPT_DECODE_INTR_FATAL 0
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 55/60] common/sfc_efx/base: add 256bit type
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (53 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
                     ` (5 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 requires support for extended-width event descriptors
for use with descriptor proxy queues. Extend libefx types
used for hardware access (and endian conversion) to support
a 256bit data type.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_types.h | 580 +++++++++++++++++++++++-
 1 file changed, 571 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ab35e61b84..f7ec9a7378 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -19,16 +19,16 @@ extern "C" {
 /*
  * Bitfield access
  *
- * Solarflare NICs make extensive use of bitfields up to 128 bits
- * wide.  Since there is no native 128-bit datatype on most systems,
+ * Solarflare NICs make extensive use of bitfields up to 256 bits
+ * wide.  Since there is no native 256-bit datatype on most systems,
  * and since 64-bit datatypes are inefficient on 32-bit systems and
  * vice versa, we wrap accesses in a way that uses the most efficient
  * datatype.
  *
  * The NICs are PCI devices and therefore little-endian.  Since most
  * of the quantities that we deal with are DMAed to/from host memory,
- * we define	our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
- * to be little-endian.
+ * we define our datatypes (efx_xword_t, efx_oword_t, efx_qword_t and
+ * efx_dword_t) to be little-endian.
  *
  * In the less common case of using PIO for individual register
  * writes, we construct the little-endian datatype in host memory and
@@ -93,10 +93,22 @@ extern "C" {
 #define	EFX_DWORD_3_LBN 96
 #define	EFX_DWORD_3_WIDTH 32
 
+#define	EFX_DWORD_4_LBN 128
+#define	EFX_DWORD_4_WIDTH 32
+
+#define	EFX_DWORD_5_LBN 160
+#define	EFX_DWORD_5_WIDTH 32
+
+#define	EFX_DWORD_6_LBN 192
+#define	EFX_DWORD_6_WIDTH 32
+
+#define	EFX_DWORD_7_LBN 224
+#define	EFX_DWORD_7_WIDTH 32
+
 /*
- * There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
- * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
- * support field widths larger than 32 bits.
+ * There are intentionally no EFX_QWORD_<N> field definitions here as the
+ * implementation of EFX_QWORD_FIELD, EFX_OWORD_FIELD and EFX_XWORD_FIELD
+ * do not support field widths larger than 32 bits.
  */
 
 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
@@ -220,6 +232,28 @@ typedef union efx_oword_u {
 	uint8_t eo_u8[16];
 } efx_oword_t;
 
+/*
+ * A hexaword (i.e. 256-bit) datatype
+ *
+ * This datatype is defined to be little-endian.
+ */
+typedef union efx_xword_u {
+	efx_byte_t ex_byte[32];
+	efx_word_t ex_word[16];
+	efx_dword_t ex_dword[8];
+	efx_qword_t ex_qword[4];
+	efx_oword_t ex_oword[2];
+#if EFSYS_HAS_SSE2_M128
+	__m128i ex_u128[2];
+#endif
+#if EFSYS_HAS_UINT64
+	uint64_t ex_u64[4];
+#endif
+	uint32_t ex_u32[8];
+	uint16_t ex_u16[16];
+	uint8_t ex_u8[32];
+} efx_xword_t;
+
 #pragma pack()
 
 #define	__SWAP16(_x)				\
@@ -295,6 +329,9 @@ typedef union efx_oword_u {
 /* Format string for printing an efx_oword_t */
 #define	EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
 
+/* Format string for printing an efx_xword_t */
+#define	EFX_XWORD_FMT "0x%08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x"
+
 /* Parameters for printing an efx_byte_t */
 #define	EFX_BYTE_VAL(_byte)					\
 	((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
@@ -319,6 +356,17 @@ typedef union efx_oword_u {
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])),	\
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
 
+/* Parameters for printing an efx_xword_t */
+#define	EFX_XWORD_VAL(_xword)					\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[7])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[6])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[5])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[4])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[3])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[2])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[1])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[0]))
+
 /*
  * Stop lint complaining about some shifts.
  */
@@ -389,6 +437,34 @@ extern int fix_lint;
 #define	EFX_EXTRACT8(_element, _min, _max, _low, _high)			\
 	EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
 
+#define	EFX_EXTRACT_XWORD64(_xword, _low, _high)			\
+	(EFX_EXTRACT64((_xword).ex_u64[0], FIX_LINT(0), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[1], FIX_LINT(64), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[2], FIX_LINT(128), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[3], FIX_LINT(192), FIX_LINT(255),	\
+	    _low, _high))
+
+#define	EFX_EXTRACT_XWORD32(_oword, _low, _high)			\
+	(EFX_EXTRACT32((_xword).ex_u32[0], FIX_LINT(0), FIX_LINT(31),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[1], FIX_LINT(32), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[2], FIX_LINT(64), FIX_LINT(95),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[3], FIX_LINT(96), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[4], FIX_LINT(128), FIX_LINT(159),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[5], FIX_LINT(160), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[6], FIX_LINT(192), FIX_LINT(223),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[7], FIX_LINT(224), FIX_LINT(255),	\
+	    _low, _high))
+
 #define	EFX_EXTRACT_OWORD64(_oword, _low, _high)			\
 	(EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63),	\
 	    _low, _high) |						\
@@ -428,6 +504,14 @@ extern int fix_lint;
 	    _low, _high))
 
 
+#define	EFX_XWORD_FIELD64(_xword, _field)				\
+	((uint32_t)EFX_EXTRACT_XWORD64(_xword, EFX_LOW_BIT(_field),	\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
+#define	EFX_XWORD_FIELD32(_xword, _field)				\
+	(EFX_EXTRACT_XWORD32(_xword, EFX_LOW_BIT(_field),		\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
 #define	EFX_OWORD_FIELD64(_oword, _field)				\
 	((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field),	\
 	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
@@ -457,6 +541,22 @@ extern int fix_lint;
 	    EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
 
 
+#define	EFX_XWORD_IS_EQUAL64(_xword_a, _xword_b)			\
+	((_xword_a).ex_u64[0] == (_xword_b).ex_u64[0] &&		\
+	    (_xword_a).ex_u64[1] == (_xword_b).ex_u64[1] &&		\
+	    (_xword_a).ex_u64[2] == (_xword_b).ex_u64[2] &&		\
+	    (_xword_a).ex_u64[3] == (_xword_b).ex_u64[3])
+
+#define	EFX_XWORD_IS_EQUAL32(_xword_a, _xword_b)			\
+	((_xword_a).ex_u32[0] == (_xword_b).ex_u32[0] &&		\
+	    (_xword_a).ex_u32[1] == (_xword_b).ex_u32[1] &&		\
+	    (_xword_a).ex_u32[2] == (_xword_b).ex_u32[2] &&		\
+	    (_xword_a).ex_u32[3] == (_xword_b).ex_u32[3] &&		\
+	    (_xword_a).ex_u32[4] == (_xword_b).ex_u32[4] &&		\
+	    (_xword_a).ex_u32[5] == (_xword_b).ex_u32[5] &&		\
+	    (_xword_a).ex_u32[6] == (_xword_b).ex_u32[6] &&		\
+	    (_xword_a).ex_u32[7] == (_xword_b).ex_u32[7])
+
 #define	EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b)			\
 	((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] &&		\
 	    (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
@@ -484,6 +584,22 @@ extern int fix_lint;
 	((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
 
 
+#define	EFX_XWORD_IS_ZERO64(_xword)					\
+	(((_xword).ex_u64[0] |						\
+	    (_xword).ex_u64[1] |					\
+	    (_xword).ex_u64[2] |					\
+	    (_xword).ex_u64[3]) == 0)
+
+#define	EFX_XWORD_IS_ZERO32(_xword)					\
+	(((_xword).ex_u32[0] |						\
+	    (_xword).ex_u32[1] |					\
+	    (_xword).ex_u32[2] |					\
+	    (_xword).ex_u32[3] |					\
+	    (_xword).ex_u32[4] |					\
+	    (_xword).ex_u32[5] |					\
+	    (_xword).ex_u32[6] |					\
+	    (_xword).ex_u32[7]) == 0)
+
 #define	EFX_OWORD_IS_ZERO64(_oword)					\
 	(((_oword).eo_u64[0] |						\
 	    (_oword).eo_u64[1]) == 0)
@@ -511,6 +627,22 @@ extern int fix_lint;
 	(((_byte).eb_u8[0]) == 0)
 
 
+#define	EFX_XWORD_IS_SET64(_xword)					\
+	(((_xword).ex_u64[0] &						\
+	    (_xword).ex_u64[1] &					\
+	    (_xword).ex_u64[2] &					\
+	    (_xword).ex_u64[3]) == ~((uint64_t)0))
+
+#define	EFX_XWORD_IS_SET32(_xword)					\
+	(((_xword).ex_u32[0] &						\
+	    (_xword).ex_u32[1] &					\
+	    (_xword).ex_u32[2] &					\
+	    (_xword).ex_u32[3] &					\
+	    (_xword).ex_u32[4] &					\
+	    (_xword).ex_u32[5] &					\
+	    (_xword).ex_u32[6] &					\
+	    (_xword).ex_u32[7]) == ~((uint32_t)0))
+
 #define	EFX_OWORD_IS_SET64(_oword)					\
 	(((_oword).eo_u64[0] &						\
 	    (_oword).eo_u64[1]) == ~((uint64_t)0))
@@ -668,6 +800,108 @@ extern int fix_lint;
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) |	\
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
 
+#define	EFX_POPULATE_XWORD64(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = EFX_INSERT_FIELDS64(0, 63,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = EFX_INSERT_FIELDS64(64, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = EFX_INSERT_FIELDS64(128, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = EFX_INSERT_FIELDS64(192, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_POPULATE_XWORD32(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = EFX_INSERT_FIELDS32(32, 63,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = EFX_INSERT_FIELDS32(64, 95,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = EFX_INSERT_FIELDS32(96, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = EFX_INSERT_FIELDS32(128, 159,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = EFX_INSERT_FIELDS32(160, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = EFX_INSERT_FIELDS32(192, 223,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = EFX_INSERT_FIELDS32(224, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_POPULATE_OWORD64(_oword,					\
 	    _field1, _value1, _field2, _value2, _field3, _value3,	\
 	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
@@ -815,6 +1049,82 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/* Populate a hexaword field with various numbers of arguments */
+#define	EFX_POPULATE_XWORD_10 EFX_POPULATE_XWORD
+
+#define	EFX_POPULATE_XWORD_9(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
+	EFX_POPULATE_XWORD_10(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)
+
+#define	EFX_POPULATE_XWORD_8(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)				\
+	EFX_POPULATE_XWORD_9(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)
+
+#define	EFX_POPULATE_XWORD_7(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)						\
+	EFX_POPULATE_XWORD_8(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)
+
+#define	EFX_POPULATE_XWORD_6(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
+	EFX_POPULATE_XWORD_7(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)
+
+#define	EFX_POPULATE_XWORD_5(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)				\
+	EFX_POPULATE_XWORD_6(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)
+
+#define	EFX_POPULATE_XWORD_4(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)						\
+	EFX_POPULATE_XWORD_5(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)
+
+#define	EFX_POPULATE_XWORD_3(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3)	\
+	EFX_POPULATE_XWORD_4(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3)
+
+#define	EFX_POPULATE_XWORD_2(_xword,					\
+	    _field1, _value1, _field2, _value2)				\
+	EFX_POPULATE_XWORD_3(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2)
+
+#define	EFX_POPULATE_XWORD_1(_xword,					\
+	    _field1, _value1)						\
+	EFX_POPULATE_XWORD_2(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1)
+
+#define	EFX_ZERO_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_1(_xword, EFX_DUMMY_FIELD, 0)
+
+#define	EFX_SET_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_8(_xword,					\
+	    EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff,		\
+	    EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff,		\
+	    EFX_DWORD_4, 0xffffffff, EFX_DWORD_5, 0xffffffff,		\
+	    EFX_DWORD_6, 0xffffffff, EFX_DWORD_7, 0xffffffff)
+
 /* Populate an octword field with various numbers of arguments */
 #define	EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
 
@@ -1210,6 +1520,64 @@ extern int fix_lint;
 #define	EFX_INPLACE_MASK8(_min, _max, _field)				\
 	EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
 
+#define	EFX_SET_XWORD_FIELD64(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = (((_xword).ex_u64[0] &		\
+		    ~EFX_INPLACE_MASK64(0, 63, _field)) |		\
+		    EFX_INSERT_FIELD64(0, 63, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = (((_xword).ex_u64[1] &		\
+		    ~EFX_INPLACE_MASK64(64, 127, _field)) |		\
+		    EFX_INSERT_FIELD64(64, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = (((_xword).ex_u64[2] &		\
+		    ~EFX_INPLACE_MASK64(128, 191, _field)) |		\
+		    EFX_INSERT_FIELD64(128, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = (((_xword).ex_u64[3] &		\
+		    ~EFX_INPLACE_MASK64(192, 255, _field)) |		\
+		    EFX_INSERT_FIELD64(192, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_FIELD32(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = (((_xword).ex_u32[0] &		\
+		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
+		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = (((_xword).ex_u32[1] &		\
+		    ~EFX_INPLACE_MASK32(32, 63, _field)) |		\
+		    EFX_INSERT_FIELD32(32, 63, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = (((_xword).ex_u32[2] &		\
+		    ~EFX_INPLACE_MASK32(64, 95, _field)) |		\
+		    EFX_INSERT_FIELD32(64, 95, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = (((_xword).ex_u32[3] &		\
+		    ~EFX_INPLACE_MASK32(96, 127, _field)) |		\
+		    EFX_INSERT_FIELD32(96, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = (((_xword).ex_u32[4] &		\
+		    ~EFX_INPLACE_MASK32(128, 159, _field)) |		\
+		    EFX_INSERT_FIELD32(128, 159, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = (((_xword).ex_u32[5] &		\
+		    ~EFX_INPLACE_MASK32(160, 191, _field)) |		\
+		    EFX_INSERT_FIELD32(160, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = (((_xword).ex_u32[6] &		\
+		    ~EFX_INPLACE_MASK32(192, 223, _field)) |		\
+		    EFX_INSERT_FIELD32(192, 223, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = (((_xword).ex_u32[7] &		\
+		    ~EFX_INPLACE_MASK32(224, 255, _field)) |		\
+		    EFX_INSERT_FIELD32(224, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_SET_OWORD_FIELD64(_oword, _field, _value)			\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1317,6 +1685,107 @@ extern int fix_lint;
 		(uint8_t)(1 << EFX_SSUB((_bit), (_base))) :		\
 		0U)
 
+#define	EFX_SET_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_TEST_XWORD_BIT64(_xword, _bit)				\
+	(((_xword).ex_u64[0] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u64[1] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u64[2] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u64[3] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)))))
+
+#define	EFX_TEST_XWORD_BIT32(_xword, _bit)				\
+	(((_xword).ex_u32[0] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u32[1] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) ||	\
+	((_xword).ex_u32[2] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u32[3] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))) ||	\
+	((_xword).ex_u32[4] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u32[5] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)))) ||\
+	((_xword).ex_u32[6] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)))) ||\
+	((_xword).ex_u32[7] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)))))
+
+
 #define	EFX_SET_OWORD_BIT64(_oword, _bit)				\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1486,6 +1955,50 @@ extern int fix_lint;
 		    __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
 
 
+#define	EFX_OR_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] |= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] |= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] |= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] |= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_OR_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] |= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] |= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] |= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] |= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] |= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] |= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] |= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] |= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] &= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] &= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] &= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] &= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] &= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] &= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] &= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] &= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] &= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] &= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] &= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] &= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_OR_OWORD64(_oword1, _oword2)				\
 	do {								\
 		(_oword1).eo_u64[0] |= (_oword2).eo_u64[0];		\
@@ -1580,53 +2093,102 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+
 #if EFSYS_USE_UINT64
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD64
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD64
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD64
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL64
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL64
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL64
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO64
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO64
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO64
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET64
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET64
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET64
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD64
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD64
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD64
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD64
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD64
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD64
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT64
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT64
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT64
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT64
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT64
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT64
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT64
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT64
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT64
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD64
+#define	EFX_AND_XWORD		EFX_AND_XWORD64
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD64
 #define	EFX_AND_OWORD		EFX_AND_OWORD64
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD64
 #define	EFX_AND_QWORD		EFX_AND_QWORD64
-#else
+
+#else /* EFSYS_USE_UINT64 */
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD32
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD32
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD32
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL32
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL32
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL32
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO32
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO32
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO32
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET32
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET32
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET32
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD32
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD32
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD32
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD32
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD32
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD32
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT32
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT32
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT32
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT32
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT32
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT32
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT32
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT32
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT32
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD32
+#define	EFX_AND_XWORD		EFX_AND_XWORD32
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD32
 #define	EFX_AND_OWORD		EFX_AND_OWORD32
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD32
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
-#endif
+
+#endif /* EFSYS_USE_UINT64 */
 
 
 #ifdef	__cplusplus
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 56/60] common/sfc_efx/base: support creation of extended width EvQ
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (54 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
                     ` (4 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Add a flag to request an extended width event queue, and
check that the supplied buffer is large enough to hold the
event queue descriptors.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c    |  2 +
 drivers/common/sfc_efx/base/ef10_nic.c   | 18 +++++++-
 drivers/common/sfc_efx/base/efx.h        | 12 +++++-
 drivers/common/sfc_efx/base/efx_ev.c     | 53 ++++++++++++++++++++----
 drivers/common/sfc_efx/base/efx_mcdi.c   | 20 +++++++--
 drivers/common/sfc_efx/base/rhead_ev.c   | 19 ++++++++-
 drivers/common/sfc_efx/base/rhead_impl.h |  4 ++
 drivers/common/sfc_efx/base/rhead_nic.c  |  6 +++
 drivers/net/sfc/sfc_ev.c                 |  6 +--
 9 files changed, 120 insertions(+), 20 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index aec1c468a4..8e7cc27d63 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -127,6 +127,8 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 7a11930242..81cd436424 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1043,14 +1043,14 @@ ef10_get_datapath_caps(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_CAPABILITIES_IN_LEN,
-		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
+		MC_CMD_GET_CAPABILITIES_V7_OUT_LEN);
 	efx_rc_t rc;
 
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V5_OUT_LEN;
+	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V7_OUT_LEN;
 
 	efx_mcdi_execute_quiet(enp, &req);
 
@@ -1073,6 +1073,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
+#define	CAP_FLAGS3(_req, _flag)						\
+	(((_req).emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V7_OUT_LEN) && \
+	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V7_OUT_FLAGS3) &	\
+	    (1u << (MC_CMD_GET_CAPABILITIES_V7_OUT_ ## _flag ## _LBN))))
+
 	/* Check if RXDP firmware inserts 14 byte prefix */
 	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
 		encp->enc_rx_prefix_size = 14;
@@ -1202,6 +1207,15 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_init_evq_v2_supported = B_FALSE;
 
+	/*
+	 * Check if firmware supports extended width event queues, which have
+	 * a different event descriptor layout.
+	 */
+	if (CAP_FLAGS3(req, EXTENDED_WIDTH_EVQS_SUPPORTED))
+		encp->enc_init_evq_extended_width_supported = B_TRUE;
+	else
+		encp->enc_init_evq_extended_width_supported = B_FALSE;
+
 	/*
 	 * Check if the NO_CONT_EV mode for RX events is supported.
 	 */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 67438b59e6..eea2ce3594 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1456,6 +1456,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_evq_timer_quantum_ns;
 	uint32_t		enc_evq_timer_max_us;
 	uint32_t		enc_clk_mult;
+	uint32_t		enc_ev_ew_desc_size;
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
@@ -1557,6 +1558,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_allow_set_mac_with_installed_filters;
 	boolean_t		enc_enhanced_set_mac_supported;
 	boolean_t		enc_init_evq_v2_supported;
+	boolean_t		enc_init_evq_extended_width_supported;
 	boolean_t		enc_no_cont_ev_mode_supported;
 	boolean_t		enc_init_rxq_with_buffer_size;
 	boolean_t		enc_rx_packed_stream_supported;
@@ -2264,13 +2266,15 @@ LIBEFX_API
 extern	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 LIBEFX_API
 extern	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 #define	EFX_EVQ_FLAGS_TYPE_MASK		(0x3)
 #define	EFX_EVQ_FLAGS_TYPE_AUTO		(0x0)
@@ -2291,6 +2295,10 @@ efx_evq_nbufs(
  */
 #define	EFX_EVQ_FLAGS_NO_CONT_EV	(0x10)
 
+/* Configure EVQ for extended width events (EF100 only) */
+#define	EFX_EVQ_FLAGS_EXTENDED_WIDTH	(0x20)
+
+
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_ev_qcreate(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 99a7743edb..32e7fff3af 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -201,19 +201,35 @@ efx_ev_init(
 	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 
-	return (ndescs * encp->enc_ev_desc_size);
+	desc_size = encp->enc_ev_desc_size;
+
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#else
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+#endif
+
+	return (ndescs * desc_size);
 }
 
 	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
-	return (EFX_DIV_ROUND_UP(efx_evq_size(enp, ndescs), EFX_BUF_SIZE));
+	size_t size;
+
+	size = efx_evq_size(enp, ndescs, flags);
+
+	return (EFX_DIV_ROUND_UP(size, EFX_BUF_SIZE));
 }
 
 		void
@@ -282,6 +298,13 @@ efx_ev_qcreate(
 		goto fail4;
 	}
 
+	if ((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) &&
+	    (encp->enc_ev_ew_desc_size == 0)) {
+		/* Extended width event descriptors are not supported. */
+		rc = EINVAL;
+		goto fail5;
+	}
+
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
 	EFSYS_ASSERT(ISP2(encp->enc_evq_min_nevs));
 
@@ -289,14 +312,20 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail5;
+		goto fail6;
+	}
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * encp->enc_ev_desc_size)) {
+		/* Buffer too small for event queue descriptors. */
+		rc = EINVAL;
+		goto fail7;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail6;
+		goto fail8;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -319,16 +348,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail7;
+		goto fail9;
 
 	return (0);
 
-fail7:
-	EFSYS_PROBE(fail7);
+fail9:
+	EFSYS_PROBE(fail9);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
 fail6:
 	EFSYS_PROBE(fail6);
 fail5:
@@ -1255,6 +1288,8 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index b8e45b458d..ede052a26a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2475,6 +2475,7 @@ efx_mcdi_init_evq(
 		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
+	int ev_extended_width;
 	int ev_cut_through;
 	int ev_merge;
 	unsigned int evq_type;
@@ -2484,7 +2485,7 @@ efx_mcdi_init_evq(
 	int i;
 	efx_rc_t rc;
 
-	npages = efx_evq_nbufs(enp, nevs);
+	npages = efx_evq_nbufs(enp, nevs, flags);
 	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
@@ -2558,14 +2559,27 @@ efx_mcdi_init_evq(
 		}
 	}
 
-	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
+	/*
+	 * On EF100, extended width event queues have a different event
+	 * descriptor layout and are used to support descriptor proxy queues.
+	 */
+	ev_extended_width = 0;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (encp->enc_init_evq_extended_width_supported) {
+		if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+			ev_extended_width = 1;
+	}
+#endif
+
+	MCDI_IN_POPULATE_DWORD_8(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
 	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
 	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type,
+	    INIT_EVQ_V2_IN_FLAG_EXT_WIDTH, ev_extended_width);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 8392a2be5b..a83c6150d8 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -66,11 +66,26 @@ rhead_ev_qcreate(
 	__in		uint32_t flags,
 	__in		efx_evq_t *eep)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 	uint32_t irq;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	desc_size = encp->enc_ev_desc_size;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#endif
+	EFSYS_ASSERT(desc_size != 0);
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * desc_size)) {
+		/* Buffer too small for event queue descriptors */
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= rhead_ev_tx_completion;
@@ -98,10 +113,12 @@ rhead_ev_qcreate(
 	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 	    B_FALSE);
 	if (rc != 0)
-		goto fail1;
+		goto fail2;
 
 	return (0);
 
+fail2:
+	EFSYS_PROBE(fail2);
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 3383c47ec6..09a991f566 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -32,6 +32,10 @@ extern "C" {
 #define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
 #define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+#define	RHEAD_EVQ_EW_DESC_SIZE	(sizeof (efx_xword_t))
+#endif
+
 
 /* NIC */
 
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 9b8f09d12c..66db68b384 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -129,6 +129,12 @@ rhead_board_cfg(
 	encp->enc_evq_timer_quantum_ns = 0;
 	encp->enc_evq_timer_max_us = 0;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	encp->enc_ev_ew_desc_size = RHEAD_EVQ_EW_DESC_SIZE;
+#else
+	encp->enc_ev_ew_desc_size = 0;
+#endif
+
 	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
 	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
 	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 7e5676fa45..cc7d5d1179 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -600,7 +600,7 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 
 	/* Clear all events */
 	(void)memset((void *)esmp->esm_base, 0xff,
-		     efx_evq_size(sa->nic, evq->entries));
+		     efx_evq_size(sa->nic, evq->entries, evq_flags));
 
 	if ((sa->intr.lsc_intr && hw_index == sa->mgmt_evq_index) ||
 	    (sa->intr.rxq_intr && evq->dp_rxq != NULL))
@@ -833,8 +833,8 @@ sfc_ev_qinit(struct sfc_adapter *sa,
 
 	/* Allocate DMA space */
 	rc = sfc_dma_alloc(sa, sfc_evq_type2str(type), type_index,
-			   efx_evq_size(sa->nic, evq->entries), socket_id,
-			   &evq->mem);
+			   efx_evq_size(sa->nic, evq->entries, sa->evq_flags),
+			   socket_id, &evq->mem);
 	if (rc != 0)
 		goto fail_dma_alloc;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 57/60] common/sfc_efx/base: poll extended width event queues
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (55 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
                     ` (3 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Extended width queues use a different layout and so require
a different polling loop.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 155 ++++++++++++++++++++++++-
 1 file changed, 154 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index a83c6150d8..df5e3e26c6 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -30,7 +30,6 @@ rhead_ev_tx_completion(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
@@ -38,6 +37,22 @@ rhead_ev_mcdi(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 
 	__checkReturn	efx_rc_t
 rhead_ev_init(
@@ -200,6 +215,13 @@ rhead_ev_qpoll(
 	unsigned int index;
 	size_t offset;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) {
+		rhead_ev_ew_qpoll(eep, countp, eecp, arg);
+		return;
+	}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
 	EFSYS_ASSERT(countp != NULL);
 	EFSYS_ASSERT(eecp != NULL);
@@ -285,6 +307,137 @@ rhead_ev_qpoll(
 	*countp = count;
 }
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+
+	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
+	switch (code) {
+	default:
+		/* Omit currently unused reserved bits from the probe. */
+		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_7),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_4),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_3),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_2),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+	}
+
+	return (should_abort);
+}
+
+/*
+ * Poll extended width event queue. Size of the batch is equal to cache line
+ * size divided by event size.
+ */
+#define	EF100_EV_EW_BATCH	2
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_EW_PRESENT(_xword, _phase_bit)				\
+	(EFX_XWORD_FIELD((_xword), ESF_GZ_EV_256_EV32_PHASE) == (_phase_bit))
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_xword_t ev[EF100_EV_EW_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_EW_BATCH - (count & (EF100_EV_EW_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_xword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READX(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_EW_PRESENT(ev[total], phase_bit))
+				break;
+
+			/* Omit unused reserved bits from the probe. */
+			EFSYS_PROBE7(ew_event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_7),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_4),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_3),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_2),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_xword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			should_abort =
+			    rhead_ev_ew_dispatch(eep, &(ev[index]), eecp, arg);
+
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_EW_BATCH);
+				batch += (EF100_EV_EW_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_qmoderate(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 58/60] common/sfc_efx/base: handle normal events in extended width
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (56 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
                     ` (2 subsequent siblings)
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Process the encasulated events as for the normal event loop. The phase
bit in the encapsulated event should be ignored, as the polling loop
uses the phase bit from the extended-width event.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 79 +++++++++++++++++---------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index df5e3e26c6..5bda315171 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static			boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 static	__checkReturn	boolean_t
 rhead_ev_rx_packets(
 	__in		efx_evq_t *eep,
@@ -181,6 +188,41 @@ rhead_ev_qpost(
 	EFSYS_ASSERT(B_FALSE);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	code = EFX_QWORD_FIELD(*eventp, ESF_GZ_E_TYPE);
+	switch (code) {
+	case ESE_GZ_EF100_EV_RX_PKTS:
+		should_abort = eep->ee_rx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_TX_COMPLETION:
+		should_abort = eep->ee_tx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_MCDI:
+		should_abort = eep->ee_mcdi(eep, eventp, eecp, arg);
+		break;
+	default:
+		EFSYS_PROBE3(bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+		break;
+	}
+
+	return (should_abort);
+}
+
 /*
  * Poll event queue in batches. Size of the batch is equal to cache line
  * size divided by event size.
@@ -248,37 +290,12 @@ rhead_ev_qpoll(
 		/* Process the batch of events */
 		for (index = 0; index < total; ++index) {
 			boolean_t should_abort;
-			uint32_t code;
 
 			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
-			switch (code) {
-			case ESE_GZ_EF100_EV_RX_PKTS:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_TX_COMPLETION:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_MCDI:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
+			should_abort =
+			    rhead_ev_dispatch(eep, &(ev[index]), eecp, arg);
+
 			if (should_abort) {
 				/* Ignore subsequent events */
 				total = index + 1;
@@ -322,6 +339,12 @@ rhead_ev_ew_dispatch(
 
 	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
 	switch (code) {
+	case ESE_GZ_EF100_EVEW_64BIT:
+		/* NOTE: ignore phase bit in encapsulated 64bit event. */
+		should_abort =
+		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
+		break;
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 59/60] common/sfc_efx/base: add option for descriptor proxy queues
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (57 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
  2020-09-23 17:45   ` [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses descriptor proxy queues to support virtio-blk proxy.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 10 ++++++++++
 drivers/common/sfc_efx/efsys.h          |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 40ba57be6f..8f42d87a04 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -391,4 +391,14 @@
 # endif
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
+/* Support descriptor proxy queues */
+#if EFSYS_OPT_DESC_PROXY
+# if !EFSYS_OPT_RIVERHEAD
+#  error "DESC_PROXY requires RIVERHEAD"
+# endif
+# if !EFSYS_OPT_EV_EXTENDED_WIDTH
+#  error "DESC_PROXY requires EV_EXTENDED_WIDTH"
+# endif
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index f74b703cda..9ad7c82b86 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -165,6 +165,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_PCI 0
 
+#define EFSYS_OPT_DESC_PROXY 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v2 60/60] common/sfc_efx/base: handle descriptor proxy queue events
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (58 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
@ 2020-09-22  9:34   ` Andrew Rybchenko
  2020-09-23 17:45   ` [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
  60 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-22  9:34 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

The TXQ_DESC and VIRTQ_DESC events are used to pass host descriptors
over an extended width event queue to an application processor for
handling. See SF-122927-TC and SF-122966-SW for details.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx.h      | 32 +++++++++
 drivers/common/sfc_efx/base/efx_impl.h | 10 +++
 drivers/common/sfc_efx/base/rhead_ev.c | 95 ++++++++++++++++++++++++++
 3 files changed, 137 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index eea2ce3594..4278b4d66d 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2487,6 +2487,33 @@ typedef __checkReturn	boolean_t
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_DESC_PROXY
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_txq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		efx_oword_t txq_desc);
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_virtq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		uint16_t avail,
+	__in		efx_oword_t virtq_desc);
+
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
@@ -2511,6 +2538,11 @@ typedef struct efx_ev_callbacks_s {
 #if EFSYS_OPT_MAC_STATS
 	efx_mac_stats_ev_t		eec_mac_stats;
 #endif	/* EFSYS_OPT_MAC_STATS */
+#if EFSYS_OPT_DESC_PROXY
+	efx_desc_proxy_txq_desc_ev_t	eec_desc_proxy_txq_desc;
+	efx_desc_proxy_virtq_desc_ev_t	eec_desc_proxy_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 } efx_ev_callbacks_t;
 
 LIBEFX_API
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f58586bee0..196fd4a79c 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -902,6 +902,11 @@ struct efx_nic_s {
 typedef	boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *,
     const efx_ev_callbacks_t *, void *);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+typedef	boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *,
+    const efx_ev_callbacks_t *, void *);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 typedef struct efx_evq_rxq_state_s {
 	unsigned int			eers_rx_read_ptr;
 	unsigned int			eers_rx_mask;
@@ -934,6 +939,11 @@ struct efx_evq_s {
 	efx_ev_handler_t		ee_mcdi;
 #endif	/* EFSYS_OPT_MCDI */
 
+#if EFSYS_OPT_DESC_PROXY
+	efx_ev_ew_handler_t		ee_ew_txq_desc;
+	efx_ev_ew_handler_t		ee_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	efx_evq_rxq_state_t		ee_rxq_state[EFX_EV_RX_NLABELS];
 };
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 5bda315171..2b5635f1cd 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -58,6 +58,22 @@ rhead_ev_ew_qpoll(
 	__inout		unsigned int *countp,
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_DESC_PROXY */
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
 
@@ -115,6 +131,11 @@ rhead_ev_qcreate(
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
 
+#if EFSYS_OPT_DESC_PROXY
+	eep->ee_ew_txq_desc	= rhead_ev_ew_txq_desc;
+	eep->ee_ew_virtq_desc	= rhead_ev_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
 	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
@@ -345,6 +366,16 @@ rhead_ev_ew_dispatch(
 		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
 		break;
 
+#if EFSYS_OPT_DESC_PROXY
+	case ESE_GZ_EF100_EVEW_TXQ_DESC:
+		should_abort = eep->ee_ew_txq_desc(eep, eventp, eecp, arg);
+		break;
+
+	case ESE_GZ_EF100_EVEW_VIRTQ_DESC:
+		should_abort = eep->ee_ew_virtq_desc(eep, eventp, eecp, arg);
+		break;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
@@ -589,4 +620,68 @@ rhead_ev_mcdi(
 	return (ret);
 }
 
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t txq_desc;
+	uint16_t vi_id;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_TXQ_DP_VI_ID);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	txq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_txq_desc != NULL);
+	should_abort = eecp->eec_desc_proxy_txq_desc(arg, vi_id, txq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t virtq_desc;
+	uint16_t vi_id;
+	uint16_t avail;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_VI_ID);
+	avail = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_AVAIL_ENTRY);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	virtq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_virtq_desc != NULL);
+	should_abort =
+	    eecp->eec_desc_proxy_virtq_desc(arg, vi_id, avail, virtq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers
  2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
@ 2020-09-23 17:20     ` Ferruh Yigit
  2020-09-24 12:09       ` Andrew Rybchenko
  0 siblings, 1 reply; 192+ messages in thread
From: Ferruh Yigit @ 2020-09-23 17:20 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 9/22/2020 10:33 AM, Andrew Rybchenko wrote:
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>

<...>

>   
> +
> +/***********************************/
> +/* MC_CMD_VNIC_ENCAP_RULE_ADD
> + * Add a rule for detecting encapsulations in the VNIC stage. Currently this only affects checksum validation in VNIC RX - on TX the send descriptor explicitly specifies encapsulation. These rules are per-VNIC, i.e. only apply to the current driver. If a rule matches, then the packet is considered to have the corresponding encapsulation type, and the inner packet is parsed. It is up to the driver to ensure that overlapping rules are not inserted. (If a packet would match multiple rules, a random one of them will be used.) A rule with the exact same match criteria may not be inserted twice (EALREADY). Only a limited number MATCH_FLAGS values are supported, use MC_CMD_GET_PARSER_DISP_INFO with OP OP_GET_SUPPORTED_VNIC_ENCAP_RULE_MATCHES to get a list of supported combinations. Each driver may only have a limited set of active rules - returns ENOSPC if the caller's table is full.
 >

We are allowing base files to keep their original syntax (as long as it 
is consistent within), but whole above comment as single line looks a 
little excessive, can you please fix it?

> +
> +/***********************************/
> +/* MC_CMD_VNIC_ENCAP_RULE_REMOVE
> + * Remove a VNIC encapsulation rule. Packets which would have previously matched the rule will then be considered as unencapsulated. Returns EALREADY if the input HANDLE doesn't correspond to an existing rule.
> + */
ditto


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
                     ` (59 preceding siblings ...)
  2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
@ 2020-09-23 17:45   ` Ferruh Yigit
  2020-09-24  6:31     ` Andrew Rybchenko
  60 siblings, 1 reply; 192+ messages in thread
From: Ferruh Yigit @ 2020-09-23 17:45 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 9/22/2020 10:33 AM, Andrew Rybchenko wrote:
> Riverhead is a new NIC family, the first one with EF100 architecture.
> Control interface is an MCDI similar to EF10. Datapath interface is
> completely new.
> 
> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
> enabled.
> 
> EF10-based NICs are tested with the patch series applied with and
> without EFSYS_OPT_RIVERHEAD enabled.
> 
> net/sfc patches will follow.
> 
> v2:
>   - fix spelling in few patches
>   - use tabs to indent instead of spaces
> 
> Andrew Rybchenko (41):
>    common/sfc_efx/base: add EF100 registers definitions
>    common/sfc_efx/base: update MCDI headers
>    common/sfc_efx/base: add event queue operation to do polling
>    common/sfc_efx/base: add efsys option for Riverhead
>    common/sfc_efx/base: add Riverhead NIC family
>    common/sfc_efx/base: update registers check for Riverhead
>    common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>    common/sfc_efx/base: use EF10 PHY methods for Riverhead
>    common/sfc_efx/base: move 14b prefix check out of caps get
>    common/sfc_efx/base: remove PF count get from caps get
>    common/sfc_efx/base: factor out helper to get board config
>    common/sfc_efx/base: set NIC features in generic place
>    common/sfc_efx/base: factor out MCDI entity reset helper
>    common/sfc_efx/base: add Riverhead support to NIC module
>    common/sfc_efx/base: use dummy tunnel ops for Riverhead
>    common/sfc_efx/base: use EF10 filter methods for Riverhead
>    common/sfc_efx/base: use EF10 MAC methods for Riverhead
>    common/sfc_efx/base: add interrupts module for Riverhead
>    common/sfc_efx/base: move EvQ init/fini wrappers to generic
>    common/sfc_efx/base: move EvQ create generic checks
>    common/sfc_efx/base: prepare to merge EvQ init functions
>    common/sfc_efx/base: merge versions of init EvQ wrappers
>    common/sfc_efx/base: add event queue module for Riverhead
>    common/sfc_efx/base: handle MCDI events on Riverhead
>    common/sfc_efx/base: move RxQ init/fini wrappers to generic
>    common/sfc_efx/base: move TxQ init/fini wrappers to generic
>    common/sfc_efx/base: switch TxQ init to extended version
>    common/sfc_efx/base: maintain RxQ counter in generic code
>    common/sfc_efx/base: free Rx queue structure in generic code
>    common/sfc_efx/base: move Rx index check to generic code
>    common/sfc_efx/base: implement Rx control path for Riverhead
>    common/sfc_efx/base: implement Tx control path for Riverhead
>    common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>    common/sfc_efx/base: handle Rx events for Riverhead
>    common/sfc_efx/base: handle Tx complete on Riverhead
>    common/sfc_efx: do not include libefx headers from efsys.h
>    common/sfc_efx/base: add API to get Rx prefix information
>    common/sfc_efx/base: group RxQ parameters into a structure
>    common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>    common/sfc_efx/base: use EF10 EVB methods for Riverhead
>    common/sfc_efx/base: allocate vAdaptor on Riverhead
> 
> Andy Moreton (7):
>    common/sfc_efx/base: add option for extended width events
>    common/sfc_efx/base: add 256bit type
>    common/sfc_efx/base: support creation of extended width EvQ
>    common/sfc_efx/base: poll extended width event queues
>    common/sfc_efx/base: handle normal events in extended width
>    common/sfc_efx/base: add option for descriptor proxy queues
>    common/sfc_efx/base: handle descriptor proxy queue events
> 
> Igor Romanov (9):
>    common/sfc_efx/base: add function control window concept
>    common/sfc_efx/base: add function control window lookup API
>    common/sfc_efx/base: add efsys API to find a memory BAR
>    common/sfc_efx/base: add Xilinx capabilities table lookup
>    common/sfc_efx/base: add NIC magic check on BAR lookup
>    common/sfc_efx/base: introduce UDP tunnel destruct operation
>    common/sfc_efx/base: introduce states for UDP tunnel entries
>    common/sfc_efx/base: support UDP tunnel operations for EF100
>    common/sfc_efx/base: replace PCI efsys macros with functions
> 
> Ivan Malov (3):
>    common/sfc_efx/base: complete EvQ creation on Riverhead
>    common/sfc_efx/base: indicate support for TSO version 3
>    common/sfc_efx/base: report restrictions for TSO version 3
> 

Can you please check following checkpatch warnings, there are many 
warnings but most of them ignored because of base files, but below ones 
can be fixed I think:


WARNING:TYPO_SPELLING: 'inital' may be misspelled - perhaps 'initial'?
#7796: FILE: drivers/common/sfc_efx/base/efx_regs_mcdi.h:24607:
+/* The inital producer index for this queue's used ring. If this queue 
is being

WARNING:TYPO_SPELLING: 'inital' may be misspelled - perhaps 'initial'?
#7803: FILE: drivers/common/sfc_efx/base/efx_regs_mcdi.h:24614:
+/* The inital consumer index for this queue's available ring. If this 
queue is

WARNING:TYPO_SPELLING: 'endianess' may be misspelled - perhaps 'endianness'?
#199: FILE: drivers/common/sfc_efx/base/efx.h:2794:
+ * Location and endianess of a field in Rx prefix.

WARNING:TYPO_SPELLING: 'requries' may be misspelled - perhaps 'requires'?
#74: FILE: drivers/common/sfc_efx/base/efx_pci.c:328:
+                * Xilinx Capabilities Table requries 32bit aligned reads.






^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-23 17:45   ` [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
@ 2020-09-24  6:31     ` Andrew Rybchenko
  0 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24  6:31 UTC (permalink / raw)
  To: Ferruh Yigit, dev

Hi Ferruh,

On 9/23/20 8:45 PM, Ferruh Yigit wrote:
> On 9/22/2020 10:33 AM, Andrew Rybchenko wrote:
>> Riverhead is a new NIC family, the first one with EF100 architecture.
>> Control interface is an MCDI similar to EF10. Datapath interface is
>> completely new.
>>
>> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
>> enabled.
>>
>> EF10-based NICs are tested with the patch series applied with and
>> without EFSYS_OPT_RIVERHEAD enabled.
>>
>> net/sfc patches will follow.
>>
>> v2:
>>   - fix spelling in few patches
>>   - use tabs to indent instead of spaces
>>
>> Andrew Rybchenko (41):
>>    common/sfc_efx/base: add EF100 registers definitions
>>    common/sfc_efx/base: update MCDI headers
>>    common/sfc_efx/base: add event queue operation to do polling
>>    common/sfc_efx/base: add efsys option for Riverhead
>>    common/sfc_efx/base: add Riverhead NIC family
>>    common/sfc_efx/base: update registers check for Riverhead
>>    common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>>    common/sfc_efx/base: use EF10 PHY methods for Riverhead
>>    common/sfc_efx/base: move 14b prefix check out of caps get
>>    common/sfc_efx/base: remove PF count get from caps get
>>    common/sfc_efx/base: factor out helper to get board config
>>    common/sfc_efx/base: set NIC features in generic place
>>    common/sfc_efx/base: factor out MCDI entity reset helper
>>    common/sfc_efx/base: add Riverhead support to NIC module
>>    common/sfc_efx/base: use dummy tunnel ops for Riverhead
>>    common/sfc_efx/base: use EF10 filter methods for Riverhead
>>    common/sfc_efx/base: use EF10 MAC methods for Riverhead
>>    common/sfc_efx/base: add interrupts module for Riverhead
>>    common/sfc_efx/base: move EvQ init/fini wrappers to generic
>>    common/sfc_efx/base: move EvQ create generic checks
>>    common/sfc_efx/base: prepare to merge EvQ init functions
>>    common/sfc_efx/base: merge versions of init EvQ wrappers
>>    common/sfc_efx/base: add event queue module for Riverhead
>>    common/sfc_efx/base: handle MCDI events on Riverhead
>>    common/sfc_efx/base: move RxQ init/fini wrappers to generic
>>    common/sfc_efx/base: move TxQ init/fini wrappers to generic
>>    common/sfc_efx/base: switch TxQ init to extended version
>>    common/sfc_efx/base: maintain RxQ counter in generic code
>>    common/sfc_efx/base: free Rx queue structure in generic code
>>    common/sfc_efx/base: move Rx index check to generic code
>>    common/sfc_efx/base: implement Rx control path for Riverhead
>>    common/sfc_efx/base: implement Tx control path for Riverhead
>>    common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>>    common/sfc_efx/base: handle Rx events for Riverhead
>>    common/sfc_efx/base: handle Tx complete on Riverhead
>>    common/sfc_efx: do not include libefx headers from efsys.h
>>    common/sfc_efx/base: add API to get Rx prefix information
>>    common/sfc_efx/base: group RxQ parameters into a structure
>>    common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>>    common/sfc_efx/base: use EF10 EVB methods for Riverhead
>>    common/sfc_efx/base: allocate vAdaptor on Riverhead
>>
>> Andy Moreton (7):
>>    common/sfc_efx/base: add option for extended width events
>>    common/sfc_efx/base: add 256bit type
>>    common/sfc_efx/base: support creation of extended width EvQ
>>    common/sfc_efx/base: poll extended width event queues
>>    common/sfc_efx/base: handle normal events in extended width
>>    common/sfc_efx/base: add option for descriptor proxy queues
>>    common/sfc_efx/base: handle descriptor proxy queue events
>>
>> Igor Romanov (9):
>>    common/sfc_efx/base: add function control window concept
>>    common/sfc_efx/base: add function control window lookup API
>>    common/sfc_efx/base: add efsys API to find a memory BAR
>>    common/sfc_efx/base: add Xilinx capabilities table lookup
>>    common/sfc_efx/base: add NIC magic check on BAR lookup
>>    common/sfc_efx/base: introduce UDP tunnel destruct operation
>>    common/sfc_efx/base: introduce states for UDP tunnel entries
>>    common/sfc_efx/base: support UDP tunnel operations for EF100
>>    common/sfc_efx/base: replace PCI efsys macros with functions
>>
>> Ivan Malov (3):
>>    common/sfc_efx/base: complete EvQ creation on Riverhead
>>    common/sfc_efx/base: indicate support for TSO version 3
>>    common/sfc_efx/base: report restrictions for TSO version 3
>>
>
> Can you please check following checkpatch warnings, there are many
> warnings but most of them ignored because of base files, but below
> ones can be fixed I think:
>
>
> WARNING:TYPO_SPELLING: 'inital' may be misspelled - perhaps 'initial'?
> #7796: FILE: drivers/common/sfc_efx/base/efx_regs_mcdi.h:24607:
> +/* The inital producer index for this queue's used ring. If this
> queue is being
>
> WARNING:TYPO_SPELLING: 'inital' may be misspelled - perhaps 'initial'?
> #7803: FILE: drivers/common/sfc_efx/base/efx_regs_mcdi.h:24614:
> +/* The inital consumer index for this queue's available ring. If this
> queue is
>
> WARNING:TYPO_SPELLING: 'endianess' may be misspelled - perhaps
> 'endianness'?
> #199: FILE: drivers/common/sfc_efx/base/efx.h:2794:
> + * Location and endianess of a field in Rx prefix.
>
> WARNING:TYPO_SPELLING: 'requries' may be misspelled - perhaps 'requires'?
> #74: FILE: drivers/common/sfc_efx/base/efx_pci.c:328:
> +                * Xilinx Capabilities Table requries 32bit aligned
> reads.

Many thanks for the review. I'm sorry that I've overlooked it. Will
definitely fix.

Andrew.


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers
  2020-09-23 17:20     ` Ferruh Yigit
@ 2020-09-24 12:09       ` Andrew Rybchenko
  0 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:09 UTC (permalink / raw)
  To: Ferruh Yigit, dev

On 9/23/20 8:20 PM, Ferruh Yigit wrote:
> On 9/22/2020 10:33 AM, Andrew Rybchenko wrote:
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
>
> <...>
>
>>   +
>> +/***********************************/
>> +/* MC_CMD_VNIC_ENCAP_RULE_ADD
>> + * Add a rule for detecting encapsulations in the VNIC stage.
>> Currently this only affects checksum validation in VNIC RX - on TX
>> the send descriptor explicitly specifies encapsulation. These rules
>> are per-VNIC, i.e. only apply to the current driver. If a rule
>> matches, then the packet is considered to have the corresponding
>> encapsulation type, and the inner packet is parsed. It is up to the
>> driver to ensure that overlapping rules are not inserted. (If a
>> packet would match multiple rules, a random one of them will be
>> used.) A rule with the exact same match criteria may not be inserted
>> twice (EALREADY). Only a limited number MATCH_FLAGS values are
>> supported, use MC_CMD_GET_PARSER_DISP_INFO with OP
>> OP_GET_SUPPORTED_VNIC_ENCAP_RULE_MATCHES to get a list of supported
>> combinations. Each driver may only have a limited set of active rules
>> - returns ENOSPC if the caller's table is full.
> >
>
> We are allowing base files to keep their original syntax (as long as
> it is consistent within), but whole above comment as single line looks
> a little excessive, can you please fix it?
>
>> +
>> +/***********************************/
>> +/* MC_CMD_VNIC_ENCAP_RULE_REMOVE
>> + * Remove a VNIC encapsulation rule. Packets which would have
>> previously matched the rule will then be considered as
>> unencapsulated. Returns EALREADY if the input HANDLE doesn't
>> correspond to an existing rule.
>> + */
> ditto
>

Will be fixed in v3. Thanks.


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
                   ` (61 preceding siblings ...)
  2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
@ 2020-09-24 12:11 ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
                     ` (61 more replies)
  62 siblings, 62 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Riverhead is a new NIC family, the first one with EF100 architecture.
Control interface is an MCDI similar to EF10. Datapath interface is
completely new.

The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
enabled.

EF10-based NICs are tested with the patch series applied with and
without EFSYS_OPT_RIVERHEAD enabled.

net/sfc patches will follow.

v3:
 - more spelling fixes
 - fix extremely long lines in common/sfc_efx/base: update MCDI headers

v2:
 - fix spelling in few patches
 - use tabs to indent instead of spaces

Andrew Rybchenko (41):
  common/sfc_efx/base: add EF100 registers definitions
  common/sfc_efx/base: update MCDI headers
  common/sfc_efx/base: add event queue operation to do polling
  common/sfc_efx/base: add efsys option for Riverhead
  common/sfc_efx/base: add Riverhead NIC family
  common/sfc_efx/base: update registers check for Riverhead
  common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  common/sfc_efx/base: use EF10 PHY methods for Riverhead
  common/sfc_efx/base: move 14b prefix check out of caps get
  common/sfc_efx/base: remove PF count get from caps get
  common/sfc_efx/base: factor out helper to get board config
  common/sfc_efx/base: set NIC features in generic place
  common/sfc_efx/base: factor out MCDI entity reset helper
  common/sfc_efx/base: add Riverhead support to NIC module
  common/sfc_efx/base: use dummy tunnel ops for Riverhead
  common/sfc_efx/base: use EF10 filter methods for Riverhead
  common/sfc_efx/base: use EF10 MAC methods for Riverhead
  common/sfc_efx/base: add interrupts module for Riverhead
  common/sfc_efx/base: move EvQ init/fini wrappers to generic
  common/sfc_efx/base: move EvQ create generic checks
  common/sfc_efx/base: prepare to merge EvQ init functions
  common/sfc_efx/base: merge versions of init EvQ wrappers
  common/sfc_efx/base: add event queue module for Riverhead
  common/sfc_efx/base: handle MCDI events on Riverhead
  common/sfc_efx/base: move RxQ init/fini wrappers to generic
  common/sfc_efx/base: move TxQ init/fini wrappers to generic
  common/sfc_efx/base: switch TxQ init to extended version
  common/sfc_efx/base: maintain RxQ counter in generic code
  common/sfc_efx/base: free Rx queue structure in generic code
  common/sfc_efx/base: move Rx index check to generic code
  common/sfc_efx/base: implement Rx control path for Riverhead
  common/sfc_efx/base: implement Tx control path for Riverhead
  common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  common/sfc_efx/base: handle Rx events for Riverhead
  common/sfc_efx/base: handle Tx complete on Riverhead
  common/sfc_efx: do not include libefx headers from efsys.h
  common/sfc_efx/base: add API to get Rx prefix information
  common/sfc_efx/base: group RxQ parameters into a structure
  common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  common/sfc_efx/base: use EF10 EVB methods for Riverhead
  common/sfc_efx/base: allocate vAdaptor on Riverhead

Andy Moreton (7):
  common/sfc_efx/base: add option for extended width events
  common/sfc_efx/base: add 256bit type
  common/sfc_efx/base: support creation of extended width EvQ
  common/sfc_efx/base: poll extended width event queues
  common/sfc_efx/base: handle normal events in extended width
  common/sfc_efx/base: add option for descriptor proxy queues
  common/sfc_efx/base: handle descriptor proxy queue events

Igor Romanov (9):
  common/sfc_efx/base: add function control window concept
  common/sfc_efx/base: add function control window lookup API
  common/sfc_efx/base: add efsys API to find a memory BAR
  common/sfc_efx/base: add Xilinx capabilities table lookup
  common/sfc_efx/base: add NIC magic check on BAR lookup
  common/sfc_efx/base: introduce UDP tunnel destruct operation
  common/sfc_efx/base: introduce states for UDP tunnel entries
  common/sfc_efx/base: support UDP tunnel operations for EF100
  common/sfc_efx/base: replace PCI efsys macros with functions

Ivan Malov (3):
  common/sfc_efx/base: complete EvQ creation on Riverhead
  common/sfc_efx/base: indicate support for TSO version 3
  common/sfc_efx/base: report restrictions for TSO version 3

 drivers/common/sfc_efx/base/ef10_ev.c         |  391 +-
 drivers/common/sfc_efx/base/ef10_evb.c        |    8 +-
 drivers/common/sfc_efx/base/ef10_filter.c     |   24 +-
 drivers/common/sfc_efx/base/ef10_impl.h       |   38 +
 drivers/common/sfc_efx/base/ef10_mac.c        |    6 +-
 drivers/common/sfc_efx/base/ef10_mcdi.c       |   55 +-
 drivers/common/sfc_efx/base/ef10_nic.c        |  413 +-
 drivers/common/sfc_efx/base/ef10_phy.c        |    4 +-
 drivers/common/sfc_efx/base/ef10_rx.c         |  384 +-
 drivers/common/sfc_efx/base/ef10_tx.c         |  137 +-
 drivers/common/sfc_efx/base/efx.h             |  226 +-
 drivers/common/sfc_efx/base/efx_check.h       |   71 +-
 drivers/common/sfc_efx/base/efx_ev.c          |  456 +-
 drivers/common/sfc_efx/base/efx_evb.c         |   24 +
 drivers/common/sfc_efx/base/efx_filter.c      |   18 +
 drivers/common/sfc_efx/base/efx_impl.h        |  252 +-
 drivers/common/sfc_efx/base/efx_intr.c        |   20 +
 drivers/common/sfc_efx/base/efx_mac.c         |   32 +
 drivers/common/sfc_efx/base/efx_mcdi.c        |  588 +-
 drivers/common/sfc_efx/base/efx_mcdi.h        |   11 +
 drivers/common/sfc_efx/base/efx_nic.c         |  102 +
 drivers/common/sfc_efx/base/efx_pci.c         |  367 ++
 drivers/common/sfc_efx/base/efx_phy.c         |   26 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h  |  934 +++
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5483 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 drivers/common/sfc_efx/base/efx_rx.c          |  112 +-
 drivers/common/sfc_efx/base/efx_tunnel.c      |  342 +-
 drivers/common/sfc_efx/base/efx_tx.c          |   35 +-
 drivers/common/sfc_efx/base/efx_types.h       |  581 +-
 drivers/common/sfc_efx/base/hunt_nic.c        |    6 +
 drivers/common/sfc_efx/base/medford2_nic.c    |    6 +
 drivers/common/sfc_efx/base/medford_nic.c     |    6 +
 drivers/common/sfc_efx/base/meson.build       |   10 +-
 drivers/common/sfc_efx/base/rhead_ev.c        |  687 +++
 drivers/common/sfc_efx/base/rhead_impl.h      |  484 ++
 drivers/common/sfc_efx/base/rhead_intr.c      |  104 +
 drivers/common/sfc_efx/base/rhead_nic.c       |  633 ++
 drivers/common/sfc_efx/base/rhead_pci.c       |  146 +
 drivers/common/sfc_efx/base/rhead_rx.c        |  677 ++
 drivers/common/sfc_efx/base/rhead_tunnel.c    |  343 ++
 drivers/common/sfc_efx/base/rhead_tx.c        |  192 +
 drivers/common/sfc_efx/base/siena_nic.c       |   10 +-
 drivers/common/sfc_efx/efsys.h                |    9 +-
 .../sfc_efx/rte_common_sfc_efx_version.map    |    3 +
 drivers/net/sfc/sfc.c                         |    3 +-
 drivers/net/sfc/sfc_ev.c                      |   18 +-
 48 files changed, 13193 insertions(+), 1487 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 01/60] common/sfc_efx/base: add EF100 registers definitions
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
                     ` (60 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_impl.h       |   1 +
 drivers/common/sfc_efx/base/efx_regs_ef100.h | 934 +++++++++++++++++++
 2 files changed, 935 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_regs_ef100.h

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d6a31d298..87c7d5df52 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -10,6 +10,7 @@
 #include "efx.h"
 #include "efx_regs.h"
 #include "efx_regs_ef10.h"
+#include "efx_regs_ef100.h"
 #if EFSYS_OPT_MCDI
 #include "efx_mcdi.h"
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_regs_ef100.h b/drivers/common/sfc_efx/base/efx_regs_ef100.h
new file mode 100644
index 0000000000..1842150737
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_regs_ef100.h
@@ -0,0 +1,934 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_EFX_EF100_REGS_H
+#define	_SYS_EFX_EF100_REGS_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/**************************************************************************
+ * NOTE: the line below marks the start of the autogenerated section
+ * EF100 registers and descriptors
+ *
+ **************************************************************************
+ */
+
+/*
+ * HW_REV_ID_REG(32bit):
+ * Hardware revision info register
+ */
+
+#define	ER_GZ_HW_REV_ID_REG_OFST 0x00000000
+/* rhead=rhead_host_regs */
+#define	ER_GZ_HW_REV_ID_REG_RESET 0x0
+
+
+
+
+/*
+ * NIC_REV_ID(32bit):
+ * SoftNIC revision info register
+ */
+
+#define	ER_GZ_NIC_REV_ID_OFST 0x00000004
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_REV_ID_RESET 0x0
+
+
+
+
+/*
+ * NIC_MAGIC(32bit):
+ * Signature register that should contain a well-known value
+ */
+
+#define	ER_GZ_NIC_MAGIC_OFST 0x00000008
+/* rhead=rhead_host_regs */
+#define	ER_GZ_NIC_MAGIC_RESET 0x0
+
+
+#define	ERF_GZ_NIC_MAGIC_LBN 0
+#define	ERF_GZ_NIC_MAGIC_WIDTH 32
+#define	EFE_GZ_NIC_MAGIC_EXPECTED 0xEF100FCB
+
+
+/*
+ * MC_SFT_STATUS(32bit):
+ * MC soft status
+ */
+
+#define	ER_GZ_MC_SFT_STATUS_OFST 0x00000010
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_SFT_STATUS_STEP 4
+#define	ER_GZ_MC_SFT_STATUS_ROWS 2
+#define	ER_GZ_MC_SFT_STATUS_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_LWRD_REG(32bit):
+ * MC doorbell register, low word
+ */
+
+#define	ER_GZ_MC_DB_LWRD_REG_OFST 0x00000020
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_LWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * MC_DB_HWRD_REG(32bit):
+ * MC doorbell register, high word
+ */
+
+#define	ER_GZ_MC_DB_HWRD_REG_OFST 0x00000024
+/* rhead=rhead_host_regs */
+#define	ER_GZ_MC_DB_HWRD_REG_RESET 0x0
+
+
+
+
+/*
+ * EVQ_INT_PRIME(32bit):
+ * Prime EVQ
+ */
+
+#define	ER_GZ_EVQ_INT_PRIME_OFST 0x00000040
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_INT_PRIME_RESET 0x0
+
+
+#define	ERF_GZ_IDX_LBN 16
+#define	ERF_GZ_IDX_WIDTH 16
+#define	ERF_GZ_EVQ_ID_LBN 0
+#define	ERF_GZ_EVQ_ID_WIDTH 16
+
+
+/*
+ * INT_AGG_RING_PRIME(32bit):
+ * Prime interrupt aggregation ring.
+ */
+
+#define	ER_GZ_INT_AGG_RING_PRIME_OFST 0x00000048
+/* rhead=rhead_host_regs */
+#define	ER_GZ_INT_AGG_RING_PRIME_RESET 0x0
+
+
+/* defined as ERF_GZ_IDX_LBN 16; */
+/* defined as ERF_GZ_IDX_WIDTH 16 */
+#define	ERF_GZ_RING_ID_LBN 0
+#define	ERF_GZ_RING_ID_WIDTH 16
+
+
+/*
+ * EVQ_TMR(32bit):
+ * EVQ timer control
+ */
+
+#define	ER_GZ_EVQ_TMR_OFST 0x00000104
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_TMR_STEP 65536
+#define	ER_GZ_EVQ_TMR_ROWS 1024
+#define	ER_GZ_EVQ_TMR_RESET 0x0
+
+
+
+
+/*
+ * EVQ_UNSOL_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for unsolicited events.
+ */
+
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_OFST 0x00000108
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_UNSOL_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * EVQ_DESC_CREDIT_GRANT_SEQ(32bit):
+ * Grant credits for descriptor proxy events.
+ */
+
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_OFST 0x00000110
+/* rhead=rhead_host_regs */
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_STEP 65536
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_ROWS 1024
+#define	ER_GZ_EVQ_DESC_CREDIT_GRANT_SEQ_RESET 0x0
+
+
+
+
+/*
+ * RX_RING_DOORBELL(32bit):
+ * Ring Rx doorbell.
+ */
+
+#define	ER_GZ_RX_RING_DOORBELL_OFST 0x00000180
+/* rhead=rhead_host_regs */
+#define	ER_GZ_RX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_RX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_RX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_RX_RING_PIDX_LBN 16
+#define	ERF_GZ_RX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_RING_DOORBELL(32bit):
+ * Ring Tx doorbell.
+ */
+
+#define	ER_GZ_TX_RING_DOORBELL_OFST 0x00000200
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_RING_DOORBELL_STEP 65536
+#define	ER_GZ_TX_RING_DOORBELL_ROWS 1024
+#define	ER_GZ_TX_RING_DOORBELL_RESET 0x0
+
+
+#define	ERF_GZ_TX_RING_PIDX_LBN 16
+#define	ERF_GZ_TX_RING_PIDX_WIDTH 16
+
+
+/*
+ * TX_DESC_PUSH(128bit):
+ * Tx ring descriptor push. Reserved for future use.
+ */
+
+#define	ER_GZ_TX_DESC_PUSH_OFST 0x00000210
+/* rhead=rhead_host_regs */
+#define	ER_GZ_TX_DESC_PUSH_STEP 65536
+#define	ER_GZ_TX_DESC_PUSH_ROWS 1024
+#define	ER_GZ_TX_DESC_PUSH_RESET 0x0
+
+
+
+
+/*
+ * THE_TIME(64bit):
+ * NIC hardware time
+ */
+
+#define	ER_GZ_THE_TIME_OFST 0x00000280
+/* rhead=rhead_host_regs */
+#define	ER_GZ_THE_TIME_STEP 65536
+#define	ER_GZ_THE_TIME_ROWS 1024
+#define	ER_GZ_THE_TIME_RESET 0x0
+
+
+#define	ERF_GZ_THE_TIME_SECS_LBN 32
+#define	ERF_GZ_THE_TIME_SECS_WIDTH 32
+#define	ERF_GZ_THE_TIME_NANOS_LBN 2
+#define	ERF_GZ_THE_TIME_NANOS_WIDTH 30
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_LBN 1
+#define	ERF_GZ_THE_TIME_CLOCK_IN_SYNC_WIDTH 1
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_LBN 0
+#define	ERF_GZ_THE_TIME_CLOCK_IS_SET_WIDTH 1
+
+
+/*
+ * PARAMS_TLV_LEN(32bit):
+ * Size of design parameters area in bytes
+ */
+
+#define	ER_GZ_PARAMS_TLV_LEN_OFST 0x00000c00
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_LEN_STEP 65536
+#define	ER_GZ_PARAMS_TLV_LEN_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_LEN_RESET 0x0
+
+
+
+
+/*
+ * PARAMS_TLV(8160bit):
+ * Design parameters
+ */
+
+#define	ER_GZ_PARAMS_TLV_OFST 0x00000c04
+/* rhead=rhead_host_regs */
+#define	ER_GZ_PARAMS_TLV_STEP 65536
+#define	ER_GZ_PARAMS_TLV_ROWS 1024
+#define	ER_GZ_PARAMS_TLV_RESET 0x0
+
+
+
+
+/* ES_EW_EMBEDDED_EVENT */
+#define	ESF_GZ_EV_256_EVENT_DW0_LBN 0
+#define	ESF_GZ_EV_256_EVENT_DW0_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_DW1_LBN 32
+#define	ESF_GZ_EV_256_EVENT_DW1_WIDTH 32
+#define	ESF_GZ_EV_256_EVENT_LBN 0
+#define	ESF_GZ_EV_256_EVENT_WIDTH 64
+#define	ESE_GZ_EW_EMBEDDED_EVENT_STRUCT_SIZE 64
+
+
+/* ES_NMMU_PAGESZ_2M_ADDR */
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_LBN 59
+#define	ESF_GZ_NMMU_2M_PAGE_SIZE_ID_WIDTH 5
+#define	ESE_GZ_NMMU_PAGE_SIZE_2M 9
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW0_WIDTH 32
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_LBN 53
+#define	ESF_GZ_NMMU_2M_PAGE_ID_DW1_WIDTH 6
+#define	ESF_GZ_NMMU_2M_PAGE_ID_LBN 21
+#define	ESF_GZ_NMMU_2M_PAGE_ID_WIDTH 38
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_LBN 0
+#define	ESF_GZ_NMMU_2M_PAGE_OFFSET_WIDTH 21
+#define	ESE_GZ_NMMU_PAGESZ_2M_ADDR_STRUCT_SIZE 64
+
+
+/* ES_PARAM_TLV */
+#define	ESF_GZ_TLV_VALUE_LBN 16
+#define	ESF_GZ_TLV_VALUE_WIDTH 8
+#define	ESE_GZ_TLV_VALUE_LENMIN 8
+#define	ESE_GZ_TLV_VALUE_LENMAX 2040
+#define	ESF_GZ_TLV_LEN_LBN 8
+#define	ESF_GZ_TLV_LEN_WIDTH 8
+#define	ESF_GZ_TLV_TYPE_LBN 0
+#define	ESF_GZ_TLV_TYPE_WIDTH 8
+#define	ESE_GZ_DP_NMMU_GROUP_SIZE 5
+#define	ESE_GZ_DP_EVQ_UNSOL_CREDIT_SEQ_BITS 4
+#define	ESE_GZ_DP_TX_EV_NUM_DESCS_BITS 3
+#define	ESE_GZ_DP_RX_EV_NUM_PACKETS_BITS 2
+#define	ESE_GZ_DP_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_GZ_DP_PAD 0
+#define	ESE_GZ_PARAM_TLV_STRUCT_SIZE 24
+
+
+/* ES_PCI_EXPRESS_XCAP_HDR */
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_LBN 20
+#define	ESF_GZ_PCI_EXPRESS_XCAP_NEXT_WIDTH 12
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_LBN 16
+#define	ESF_GZ_PCI_EXPRESS_XCAP_VER_WIDTH 4
+#define	ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC 1
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_LBN 0
+#define	ESF_GZ_PCI_EXPRESS_XCAP_ID_WIDTH 16
+#define	ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR 0xb
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_STRUCT_SIZE 32
+
+
+/* ES_RHEAD_BASE_EVENT */
+#define	ESF_GZ_E_TYPE_LBN 60
+#define	ESF_GZ_E_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EV_DRIVER 5
+#define	ESE_GZ_EF100_EV_MCDI 4
+#define	ESE_GZ_EF100_EV_CONTROL 3
+#define	ESE_GZ_EF100_EV_TX_TIMESTAMP 2
+#define	ESE_GZ_EF100_EV_TX_COMPLETION 1
+#define	ESE_GZ_EF100_EV_RX_PKTS 0
+#define	ESF_GZ_EV_EVQ_PHASE_LBN 59
+#define	ESF_GZ_EV_EVQ_PHASE_WIDTH 1
+#define	ESE_GZ_RHEAD_BASE_EVENT_STRUCT_SIZE 64
+
+
+/* ES_RHEAD_EW_EVENT */
+#define	ESF_GZ_EV_256_EV32_PHASE_LBN 255
+#define	ESF_GZ_EV_256_EV32_PHASE_WIDTH 1
+#define	ESF_GZ_EV_256_EV32_TYPE_LBN 251
+#define	ESF_GZ_EV_256_EV32_TYPE_WIDTH 4
+#define	ESE_GZ_EF100_EVEW_VIRTQ_DESC 2
+#define	ESE_GZ_EF100_EVEW_TXQ_DESC 1
+#define	ESE_GZ_EF100_EVEW_64BIT 0
+#define	ESE_GZ_RHEAD_EW_EVENT_STRUCT_SIZE 256
+
+
+/* ES_RX_DESC */
+#define	ESF_GZ_RX_BUF_ADDR_DW0_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_LBN 32
+#define	ESF_GZ_RX_BUF_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_RX_BUF_ADDR_LBN 0
+#define	ESF_GZ_RX_BUF_ADDR_WIDTH 64
+#define	ESE_GZ_RX_DESC_STRUCT_SIZE 64
+
+
+/* ES_TXQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_TXQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_LBN 0
+#define	ESF_GZ_EV_TXQ_DP_TXQ_DESC_WIDTH 128
+#define	ESE_GZ_TXQ_DESC_PROXY_EVENT_STRUCT_SIZE 144
+
+
+/* ES_TX_DESC_TYPE */
+#define	ESF_GZ_TX_DESC_TYPE_LBN 124
+#define	ESF_GZ_TX_DESC_TYPE_WIDTH 4
+#define	ESE_GZ_TX_DESC_TYPE_DESC2CMPT 7
+#define	ESE_GZ_TX_DESC_TYPE_MEM2MEM 4
+#define	ESE_GZ_TX_DESC_TYPE_SEG 3
+#define	ESE_GZ_TX_DESC_TYPE_TSO 2
+#define	ESE_GZ_TX_DESC_TYPE_PREFIX 1
+#define	ESE_GZ_TX_DESC_TYPE_SEND 0
+#define	ESE_GZ_TX_DESC_TYPE_STRUCT_SIZE 128
+
+
+/* ES_VIRTQ_DESC_PROXY_EVENT */
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_LBN 144
+#define	ESF_GZ_EV_VQ_DP_AVAIL_ENTRY_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VI_ID_LBN 128
+#define	ESF_GZ_EV_VQ_DP_VI_ID_WIDTH 16
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW0_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_LBN 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW1_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_LBN 64
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW2_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_LBN 96
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_DW3_WIDTH 32
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_LBN 0
+#define	ESF_GZ_EV_VQ_DP_VIRTQ_DESC_WIDTH 128
+#define	ESE_GZ_VIRTQ_DESC_PROXY_EVENT_STRUCT_SIZE 160
+
+
+/* ES_XIL_CFGBAR_TBL_ENTRY */
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_LBN 96
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_HI_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW0_WIDTH 32
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_LBN 100
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_DW1_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFFSET_WIDTH 60
+#define	ESE_GZ_CONT_CAP_OFFSET_BYTES_SHIFT 4
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_LBN 67
+#define	ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF_WIDTH 29
+#define	ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT 4
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_LBN 68
+#define	ESF_GZ_CFGBAR_CONT_CAP_OFF_LO_WIDTH 28
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_LBN 67
+#define	ESF_GZ_CFGBAR_CONT_CAP_RSV_WIDTH 1
+#define	ESF_GZ_CFGBAR_EF100_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_EF100_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_EF100_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_LBN 64
+#define	ESF_GZ_CFGBAR_CONT_CAP_BAR_WIDTH 3
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_INVALID 7
+#define	ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_LBN 32
+#define	ESF_GZ_CFGBAR_ENTRY_SIZE_WIDTH 32
+#define	ESE_GZ_CFGBAR_ENTRY_SIZE_EF100 12
+#define	ESE_GZ_CFGBAR_ENTRY_HEADER_SIZE 8
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_LBN 28
+#define	ESF_GZ_CFGBAR_ENTRY_LAST_WIDTH 1
+#define	ESF_GZ_CFGBAR_ENTRY_REV_LBN 20
+#define	ESF_GZ_CFGBAR_ENTRY_REV_WIDTH 8
+#define	ESE_GZ_CFGBAR_ENTRY_REV_EF100 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_LBN 0
+#define	ESF_GZ_CFGBAR_ENTRY_FORMAT_WIDTH 20
+#define	ESE_GZ_CFGBAR_ENTRY_LAST 0xfffff
+#define	ESE_GZ_CFGBAR_ENTRY_CONT_CAP_ADDR 0xffffe
+#define	ESE_GZ_CFGBAR_ENTRY_EF100 0xef100
+#define	ESE_GZ_XIL_CFGBAR_TBL_ENTRY_STRUCT_SIZE 128
+
+
+/* ES_XIL_CFGBAR_VSEC */
+#define	ESF_GZ_VSEC_TBL_OFF_HI_LBN 64
+#define	ESF_GZ_VSEC_TBL_OFF_HI_WIDTH 32
+#define	ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT 32
+#define	ESF_GZ_VSEC_TBL_OFF_LO_LBN 36
+#define	ESF_GZ_VSEC_TBL_OFF_LO_WIDTH 28
+#define	ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT 4
+#define	ESF_GZ_VSEC_TBL_BAR_LBN 32
+#define	ESF_GZ_VSEC_TBL_BAR_WIDTH 4
+#define	ESE_GZ_VSEC_BAR_NUM_INVALID 7
+#define	ESE_GZ_VSEC_BAR_NUM_EXPANSION_ROM 6
+#define	ESF_GZ_VSEC_LEN_LBN 20
+#define	ESF_GZ_VSEC_LEN_WIDTH 12
+#define	ESE_GZ_VSEC_LEN_HIGH_OFFT 16
+#define	ESE_GZ_VSEC_LEN_MIN 12
+#define	ESF_GZ_VSEC_VER_LBN 16
+#define	ESF_GZ_VSEC_VER_WIDTH 4
+#define	ESE_GZ_VSEC_VER_XIL_CFGBAR 0
+#define	ESF_GZ_VSEC_ID_LBN 0
+#define	ESF_GZ_VSEC_ID_WIDTH 16
+#define	ESE_GZ_XILINX_VSEC_ID 0x20
+#define	ESE_GZ_XIL_CFGBAR_VSEC_STRUCT_SIZE 96
+
+
+/* ES_rh_egres_hclass */
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_LBN 15
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_LBN 13
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUN_OUTER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_LBN 12
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CSUM_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_LBN 10
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L4_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_LBN 8
+#define	ESF_GZ_RX_PREFIX_HCLASS_NT_OR_INNER_L3_CLASS_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_LBN 5
+#define	ESF_GZ_RX_PREFIX_HCLASS_TUNNEL_CLASS_WIDTH 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_LBN 3
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_N_VLAN_WIDTH 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_LBN 2
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_CLASS_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_LBN 0
+#define	ESF_GZ_RX_PREFIX_HCLASS_L2_STATUS_WIDTH 2
+#define	ESE_GZ_RH_EGRES_HCLASS_STRUCT_SIZE 16
+
+
+/* ES_sf_driver */
+#define	ESF_GZ_DRIVER_E_TYPE_LBN 60
+#define	ESF_GZ_DRIVER_E_TYPE_WIDTH 4
+#define	ESF_GZ_DRIVER_PHASE_LBN 59
+#define	ESF_GZ_DRIVER_PHASE_WIDTH 1
+#define	ESF_GZ_DRIVER_DATA_DW0_LBN 0
+#define	ESF_GZ_DRIVER_DATA_DW0_WIDTH 32
+#define	ESF_GZ_DRIVER_DATA_DW1_LBN 32
+#define	ESF_GZ_DRIVER_DATA_DW1_WIDTH 27
+#define	ESF_GZ_DRIVER_DATA_LBN 0
+#define	ESF_GZ_DRIVER_DATA_WIDTH 59
+#define	ESE_GZ_SF_DRIVER_STRUCT_SIZE 64
+
+
+/* ES_sf_ev_rsvd */
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_LBN 34
+#define	ESF_GZ_EV_RSVD_TBD_NEXT_WIDTH 3
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_LBN 30
+#define	ESF_GZ_EV_RSVD_EVENT_GEN_FLAGS_WIDTH 4
+#define	ESF_GZ_EV_RSVD_SRC_QID_LBN 18
+#define	ESF_GZ_EV_RSVD_SRC_QID_WIDTH 12
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_LBN 2
+#define	ESF_GZ_EV_RSVD_SEQ_NUM_WIDTH 16
+#define	ESF_GZ_EV_RSVD_TBD_LBN 0
+#define	ESF_GZ_EV_RSVD_TBD_WIDTH 2
+#define	ESE_GZ_SF_EV_RSVD_STRUCT_SIZE 37
+
+
+/* ES_sf_flush_evnt */
+#define	ESF_GZ_EV_FLSH_E_TYPE_LBN 60
+#define	ESF_GZ_EV_FLSH_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_FLSH_PHASE_LBN 59
+#define	ESF_GZ_EV_FLSH_PHASE_WIDTH 1
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_LBN 53
+#define	ESF_GZ_EV_FLSH_SUB_TYPE_WIDTH 6
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_LBN 42
+#define	ESF_GZ_EV_FLSH_RSVD_DW1_WIDTH 11
+#define	ESF_GZ_EV_FLSH_RSVD_LBN 10
+#define	ESF_GZ_EV_FLSH_RSVD_WIDTH 43
+#define	ESF_GZ_EV_FLSH_LABEL_LBN 4
+#define	ESF_GZ_EV_FLSH_LABEL_WIDTH 6
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_LBN 0
+#define	ESF_GZ_EV_FLSH_FLUSH_TYPE_WIDTH 4
+#define	ESE_GZ_SF_FLUSH_EVNT_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_pkts */
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_RXPKTS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_RXPKTS_PHASE_LBN 59
+#define	ESF_GZ_EV_RXPKTS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_RXPKTS_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RXPKTS_RSVD_LBN 22
+#define	ESF_GZ_EV_RXPKTS_RSVD_WIDTH 37
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_LBN 0
+#define	ESF_GZ_EV_RXPKTS_NUM_PKT_WIDTH 16
+#define	ESE_GZ_SF_RX_PKTS_STRUCT_SIZE 64
+
+
+/* ES_sf_rx_prefix */
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_LBN 160
+#define	ESF_GZ_RX_PREFIX_VLAN_STRIP_TCI_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_LBN 144
+#define	ESF_GZ_RX_PREFIX_CSUM_FRAME_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_LBN 128
+#define	ESF_GZ_RX_PREFIX_INGRESS_VPORT_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_MARK_LBN 96
+#define	ESF_GZ_RX_PREFIX_USER_MARK_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_LBN 64
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_LBN 32
+#define	ESF_GZ_RX_PREFIX_PARTIAL_TSTAMP_WIDTH 32
+#define	ESF_GZ_RX_PREFIX_CLASS_LBN 16
+#define	ESF_GZ_RX_PREFIX_CLASS_WIDTH 16
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_LBN 15
+#define	ESF_GZ_RX_PREFIX_USER_FLAG_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_LBN 14
+#define	ESF_GZ_RX_PREFIX_RSS_HASH_VALID_WIDTH 1
+#define	ESF_GZ_RX_PREFIX_LENGTH_LBN 0
+#define	ESF_GZ_RX_PREFIX_LENGTH_WIDTH 14
+#define	ESE_GZ_SF_RX_PREFIX_STRUCT_SIZE 176
+
+
+/* ES_sf_rxtx_generic */
+#define	ESF_GZ_EV_BARRIER_LBN 167
+#define	ESF_GZ_EV_BARRIER_WIDTH 1
+#define	ESF_GZ_EV_RSVD_DW0_LBN 130
+#define	ESF_GZ_EV_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_RSVD_DW1_LBN 162
+#define	ESF_GZ_EV_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_RSVD_LBN 130
+#define	ESF_GZ_EV_RSVD_WIDTH 37
+#define	ESF_GZ_EV_DPRXY_LBN 129
+#define	ESF_GZ_EV_DPRXY_WIDTH 1
+#define	ESF_GZ_EV_VIRTIO_LBN 128
+#define	ESF_GZ_EV_VIRTIO_WIDTH 1
+#define	ESF_GZ_EV_COUNT_DW0_LBN 0
+#define	ESF_GZ_EV_COUNT_DW0_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW1_LBN 32
+#define	ESF_GZ_EV_COUNT_DW1_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW2_LBN 64
+#define	ESF_GZ_EV_COUNT_DW2_WIDTH 32
+#define	ESF_GZ_EV_COUNT_DW3_LBN 96
+#define	ESF_GZ_EV_COUNT_DW3_WIDTH 32
+#define	ESF_GZ_EV_COUNT_LBN 0
+#define	ESF_GZ_EV_COUNT_WIDTH 128
+#define	ESE_GZ_SF_RXTX_GENERIC_STRUCT_SIZE 168
+
+
+/* ES_sf_ts_stamp */
+#define	ESF_GZ_EV_TS_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TS_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TS_PHASE_LBN 59
+#define	ESF_GZ_EV_TS_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TS_RSVD_LBN 56
+#define	ESF_GZ_EV_TS_RSVD_WIDTH 3
+#define	ESF_GZ_EV_TS_STATUS_LBN 54
+#define	ESF_GZ_EV_TS_STATUS_WIDTH 2
+#define	ESF_GZ_EV_TS_Q_LABEL_LBN 48
+#define	ESF_GZ_EV_TS_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TS_DESC_ID_LBN 32
+#define	ESF_GZ_EV_TS_DESC_ID_WIDTH 16
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_LBN 0
+#define	ESF_GZ_EV_TS_PARTIAL_STAMP_WIDTH 32
+#define	ESE_GZ_SF_TS_STAMP_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_cmplt */
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_LBN 60
+#define	ESF_GZ_EV_TXCMPL_E_TYPE_WIDTH 4
+#define	ESF_GZ_EV_TXCMPL_PHASE_LBN 59
+#define	ESF_GZ_EV_TXCMPL_PHASE_WIDTH 1
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_LBN 54
+#define	ESF_GZ_EV_TXCMPL_RSVD_DW1_WIDTH 5
+#define	ESF_GZ_EV_TXCMPL_RSVD_LBN 22
+#define	ESF_GZ_EV_TXCMPL_RSVD_WIDTH 37
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_LBN 16
+#define	ESF_GZ_EV_TXCMPL_Q_LABEL_WIDTH 6
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_LBN 0
+#define	ESF_GZ_EV_TXCMPL_NUM_DESC_WIDTH 16
+#define	ESE_GZ_SF_TX_CMPLT_STRUCT_SIZE 64
+
+
+/* ES_sf_tx_desc2cmpt_dsc_fmt */
+#define	ESF_GZ_D2C_TGT_VI_ID_LBN 108
+#define	ESF_GZ_D2C_TGT_VI_ID_WIDTH 16
+#define	ESF_GZ_D2C_CMPT2_LBN 107
+#define	ESF_GZ_D2C_CMPT2_WIDTH 1
+#define	ESF_GZ_D2C_ABS_VI_ID_LBN 106
+#define	ESF_GZ_D2C_ABS_VI_ID_WIDTH 1
+#define	ESF_GZ_D2C_ORDERED_LBN 105
+#define	ESF_GZ_D2C_ORDERED_WIDTH 1
+#define	ESF_GZ_D2C_SKIP_N_LBN 97
+#define	ESF_GZ_D2C_SKIP_N_WIDTH 8
+#define	ESF_GZ_D2C_RSVD_DW0_LBN 64
+#define	ESF_GZ_D2C_RSVD_DW0_WIDTH 32
+#define	ESF_GZ_D2C_RSVD_DW1_LBN 96
+#define	ESF_GZ_D2C_RSVD_DW1_WIDTH 1
+#define	ESF_GZ_D2C_RSVD_LBN 64
+#define	ESF_GZ_D2C_RSVD_WIDTH 33
+#define	ESF_GZ_D2C_COMPLETION_DW0_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_DW0_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_LBN 32
+#define	ESF_GZ_D2C_COMPLETION_DW1_WIDTH 32
+#define	ESF_GZ_D2C_COMPLETION_LBN 0
+#define	ESF_GZ_D2C_COMPLETION_WIDTH 64
+#define	ESE_GZ_SF_TX_DESC2CMPT_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_mem2mem_dsc_fmt */
+#define	ESF_GZ_M2M_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_M2M_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_M2M_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_M2M_RSVD_LBN 120
+#define	ESF_GZ_M2M_RSVD_WIDTH 2
+#define	ESF_GZ_M2M_ADDR_SPC_LBN 108
+#define	ESF_GZ_M2M_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_M2M_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_M2M_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_M2M_LEN_MINUS_1_LBN 64
+#define	ESF_GZ_M2M_LEN_MINUS_1_WIDTH 20
+#define	ESF_GZ_M2M_ADDR_DW0_LBN 0
+#define	ESF_GZ_M2M_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_DW1_LBN 32
+#define	ESF_GZ_M2M_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_M2M_ADDR_LBN 0
+#define	ESF_GZ_M2M_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_MEM2MEM_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_ovr_dsc_fmt */
+#define	ESF_GZ_TX_PREFIX_MARK_EN_LBN 123
+#define	ESF_GZ_TX_PREFIX_MARK_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_LBN 122
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_LBN 121
+#define	ESF_GZ_TX_PREFIX_INLINE_CAPSULE_META_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_LBN 120
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_EN_WIDTH 1
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW0_WIDTH 32
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_LBN 96
+#define	ESF_GZ_TX_PREFIX_RSRVD_DW1_WIDTH 24
+#define	ESF_GZ_TX_PREFIX_RSRVD_LBN 64
+#define	ESF_GZ_TX_PREFIX_RSRVD_WIDTH 56
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_LBN 48
+#define	ESF_GZ_TX_PREFIX_EGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_LBN 32
+#define	ESF_GZ_TX_PREFIX_INGRESS_MPORT_WIDTH 16
+#define	ESF_GZ_TX_PREFIX_MARK_LBN 0
+#define	ESF_GZ_TX_PREFIX_MARK_WIDTH 32
+#define	ESE_GZ_SF_TX_OVR_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_seg_dsc_fmt */
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_LBN 123
+#define	ESF_GZ_TX_SEG_ADDR_SPC_EN_WIDTH 1
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_LBN 122
+#define	ESF_GZ_TX_SEG_TRANSLATE_ADDR_WIDTH 1
+#define	ESF_GZ_TX_SEG_RSVD2_LBN 120
+#define	ESF_GZ_TX_SEG_RSVD2_WIDTH 2
+#define	ESF_GZ_TX_SEG_ADDR_SPC_LBN 108
+#define	ESF_GZ_TX_SEG_ADDR_SPC_WIDTH 12
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_LBN 86
+#define	ESF_GZ_TX_SEG_ADDR_SPC_PASID_WIDTH 22
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_LBN 84
+#define	ESF_GZ_TX_SEG_ADDR_SPC_MODE_WIDTH 2
+#define	ESF_GZ_TX_SEG_RSVD_LBN 80
+#define	ESF_GZ_TX_SEG_RSVD_WIDTH 4
+#define	ESF_GZ_TX_SEG_LEN_LBN 64
+#define	ESF_GZ_TX_SEG_LEN_WIDTH 16
+#define	ESF_GZ_TX_SEG_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEG_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEG_ADDR_LBN 0
+#define	ESF_GZ_TX_SEG_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_SEG_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_std_dsc_fmt */
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_SEND_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_SEND_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_SEND_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_SEND_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_SEND_RSVD_LBN 99
+#define	ESF_GZ_TX_SEND_RSVD_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_LBN 97
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_EN_WIDTH 2
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_LBN 92
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_CSUM_W_WIDTH 5
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_LBN 83
+#define	ESF_GZ_TX_SEND_CSO_PARTIAL_START_W_WIDTH 9
+#define	ESF_GZ_TX_SEND_NUM_SEGS_LBN 78
+#define	ESF_GZ_TX_SEND_NUM_SEGS_WIDTH 5
+#define	ESF_GZ_TX_SEND_LEN_LBN 64
+#define	ESF_GZ_TX_SEND_LEN_WIDTH 14
+#define	ESF_GZ_TX_SEND_ADDR_DW0_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_DW0_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_LBN 32
+#define	ESF_GZ_TX_SEND_ADDR_DW1_WIDTH 32
+#define	ESF_GZ_TX_SEND_ADDR_LBN 0
+#define	ESF_GZ_TX_SEND_ADDR_WIDTH 64
+#define	ESE_GZ_SF_TX_STD_DSC_FMT_STRUCT_SIZE 124
+
+
+/* ES_sf_tx_tso_dsc_fmt */
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_LBN 108
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_TCI_WIDTH 16
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_LBN 107
+#define	ESF_GZ_TX_TSO_VLAN_INSERT_EN_WIDTH 1
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_LBN 106
+#define	ESF_GZ_TX_TSO_TSTAMP_REQ_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_LBN 105
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_LBN 104
+#define	ESF_GZ_TX_TSO_CSO_OUTER_L3_WIDTH 1
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_LBN 101
+#define	ESF_GZ_TX_TSO_CSO_INNER_L3_WIDTH 3
+#define	ESF_GZ_TX_TSO_RSVD_LBN 94
+#define	ESF_GZ_TX_TSO_RSVD_WIDTH 7
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_LBN 93
+#define	ESF_GZ_TX_TSO_CSO_INNER_L4_WIDTH 1
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_LBN 85
+#define	ESF_GZ_TX_TSO_INNER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_LBN 77
+#define	ESF_GZ_TX_TSO_INNER_L3_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_LBN 69
+#define	ESF_GZ_TX_TSO_OUTER_L4_OFF_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_LBN 64
+#define	ESF_GZ_TX_TSO_OUTER_L3_OFF_W_WIDTH 5
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_LBN 42
+#define	ESF_GZ_TX_TSO_PAYLOAD_LEN_WIDTH 22
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_LBN 34
+#define	ESF_GZ_TX_TSO_HDR_LEN_W_WIDTH 8
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_LBN 33
+#define	ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_LBN 32
+#define	ESF_GZ_TX_TSO_ED_INNER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_LBN 31
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP_LEN_WIDTH 1
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_LBN 29
+#define	ESF_GZ_TX_TSO_ED_INNER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_LBN 27
+#define	ESF_GZ_TX_TSO_ED_OUTER_IP4_ID_WIDTH 2
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_LBN 17
+#define	ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS_WIDTH 10
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_LBN 14
+#define	ESF_GZ_TX_TSO_HDR_NUM_SEGS_WIDTH 3
+#define	ESF_GZ_TX_TSO_MSS_LBN 0
+#define	ESF_GZ_TX_TSO_MSS_WIDTH 14
+#define	ESE_GZ_SF_TX_TSO_DSC_FMT_STRUCT_SIZE 124
+
+
+
+/* Enum DESIGN_PARAMS */
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT 17
+#define	ESE_EF100_DP_GZ_VI_STRIDES 16
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES 15
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS 14
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN 13
+#define	ESE_EF100_DP_GZ_COMPAT 12
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES 11
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS 10
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN 9
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY 8
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS 6
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN 5
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS 4
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE 3
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS 2
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS 1
+#define	ESE_EF100_DP_GZ_PAD 0
+
+/* Enum DESIGN_PARAM_DEFAULTS */
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT 0x3fffff
+#define	ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_MEM2MEM_MAX_LEN_DEFAULT 8192
+#define	ESE_EF100_DP_GZ_RX_L4_CSUM_PROTOCOLS_DEFAULT 0x1106
+#define	ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT 0x3ff
+#define	ESE_EF100_DP_GZ_RX_MAX_RUNT_DEFAULT 640
+#define	ESE_EF100_DP_GZ_EVQ_TIMER_TICK_NANOS_DEFAULT 512
+#define	ESE_EF100_DP_GZ_NMMU_PAGE_SIZES_DEFAULT 512
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT 192
+#define	ESE_EF100_DP_GZ_RXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_TXQ_SIZE_GRANULARITY_DEFAULT 64
+#define	ESE_EF100_DP_GZ_NMMU_GROUP_SIZE_DEFAULT 32
+#define	ESE_EF100_DP_GZ_VI_STRIDES_DEFAULT 16
+#define	ESE_EF100_DP_GZ_EVQ_UNSOL_CREDIT_SEQ_BITS_DEFAULT 7
+#define	ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT 4
+#define	ESE_EF100_DP_GZ_PARTIAL_TSTAMP_SUB_NANO_BITS_DEFAULT 2
+#define	ESE_EF100_DP_GZ_COMPAT_DEFAULT 0
+
+/* Enum HOST_IF_CONSTANTS */
+#define	ESE_GZ_FCW_LEN 0x4C
+#define	ESE_GZ_RX_PKT_PREFIX_LEN 22
+
+/* Enum PCI_CONSTANTS */
+#define	ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE 256
+#define	ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE 4
+
+/* Enum RH_HCLASS_L2_CLASS */
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_E2_0123VLAN 1
+#define	ESE_GZ_RH_HCLASS_L2_CLASS_OTHER 0
+
+/* Enum RH_HCLASS_L2_STATUS */
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_RESERVED 3
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_FCS_ERR 2
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_LEN_ERR 1
+#define	ESE_GZ_RH_HCLASS_L2_STATUS_OK 0
+
+/* Enum RH_HCLASS_L3_CLASS */
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP6 2
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4BAD 1
+#define	ESE_GZ_RH_HCLASS_L3_CLASS_IP4GOOD 0
+
+/* Enum RH_HCLASS_L4_CLASS */
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_OTHER 3
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_FRAG 2
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_UDP 1
+#define	ESE_GZ_RH_HCLASS_L4_CLASS_TCP 0
+
+/* Enum RH_HCLASS_L4_CSUM */
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_GOOD 1
+#define	ESE_GZ_RH_HCLASS_L4_CSUM_BAD_OR_UNKNOWN 0
+
+/* Enum RH_HCLASS_TUNNEL_CLASS */
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_7 7
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_6 6
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_5 5
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_RESERVED_4 4
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_GENEVE 3
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NVGRE 2
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_VXLAN 1
+#define	ESE_GZ_RH_HCLASS_TUNNEL_CLASS_NONE 0
+
+/* Enum TX_DESC_CSO_PARTIAL_EN */
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_TCP 2
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_UDP 1
+#define	ESE_GZ_TX_DESC_CSO_PARTIAL_EN_OFF 0
+
+/* Enum TX_DESC_CS_INNER_L3 */
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_GENEVE 3
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_NVGRE 2
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_VXLAN 1
+#define	ESE_GZ_TX_DESC_CS_INNER_L3_OFF 0
+
+/* Enum TX_DESC_IP4_ID */
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD16 2
+#define	ESE_GZ_TX_DESC_IP4_ID_INC_MOD15 1
+#define	ESE_GZ_TX_DESC_IP4_ID_NO_OP 0
+/*************************************************************************
+ * NOTE: the comment line above marks the end of the autogenerated section
+ */
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _SYS_EFX_EF100_REGS_H */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 02/60] common/sfc_efx/base: update MCDI headers
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
                     ` (59 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_regs_mcdi.h   | 5483 ++++++++++++++++-
 .../common/sfc_efx/base/efx_regs_mcdi_aoe.h   |  201 +-
 .../common/sfc_efx/base/efx_regs_mcdi_strs.h  |    2 +-
 3 files changed, 5415 insertions(+), 271 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi.h b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
index ffb9a9b02a..f31a25e4ff 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_H
@@ -405,7 +405,23 @@
  */
 #define	MC_CMD_ERR_PIOBUFS_PRESENT 0x101b
 
-/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10
+/* MC_CMD_RESOURCE_SPECIFIER enum */
+/* enum: Any */
+#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
+#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe /* enum */
+
+/* MAE_MCDI_ENCAP_TYPE enum: Encapsulation type. Defines how the payload will
+ * be parsed to an inner frame. Other values are reserved. Unknown values
+ * should be treated same as NONE.
+ */
+#define	MAE_MCDI_ENCAP_TYPE_NONE 0x0 /* enum */
+/* enum: Don't assume enum aligns with support bitmask... */
+#define	MAE_MCDI_ENCAP_TYPE_VXLAN 0x1
+#define	MAE_MCDI_ENCAP_TYPE_NVGRE 0x2 /* enum */
+#define	MAE_MCDI_ENCAP_TYPE_GENEVE 0x3 /* enum */
+#define	MAE_MCDI_ENCAP_TYPE_L2GRE 0x4 /* enum */
+
+/* MCDI_EVENT structuredef: The structure of an MCDI_EVENT on Siena/EF10/EF100
  * platforms
  */
 #define	MCDI_EVENT_LEN 8
@@ -423,14 +439,19 @@
 #define	MCDI_EVENT_LEVEL_FATAL 0x3
 #define	MCDI_EVENT_DATA_OFST 0
 #define	MCDI_EVENT_DATA_LEN 4
+#define	MCDI_EVENT_CMDDONE_SEQ_OFST 0
 #define	MCDI_EVENT_CMDDONE_SEQ_LBN 0
 #define	MCDI_EVENT_CMDDONE_SEQ_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_DATALEN_OFST 0
 #define	MCDI_EVENT_CMDDONE_DATALEN_LBN 8
 #define	MCDI_EVENT_CMDDONE_DATALEN_WIDTH 8
+#define	MCDI_EVENT_CMDDONE_ERRNO_OFST 0
 #define	MCDI_EVENT_CMDDONE_ERRNO_LBN 16
 #define	MCDI_EVENT_CMDDONE_ERRNO_WIDTH 8
+#define	MCDI_EVENT_LINKCHANGE_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_LP_CAP_WIDTH 16
+#define	MCDI_EVENT_LINKCHANGE_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_SPEED_LBN 16
 #define	MCDI_EVENT_LINKCHANGE_SPEED_WIDTH 4
 /* enum: Link is down or link speed could not be determined */
@@ -449,26 +470,36 @@
 #define	MCDI_EVENT_LINKCHANGE_SPEED_50G 0x6
 /* enum: 100Gbs */
 #define	MCDI_EVENT_LINKCHANGE_SPEED_100G 0x7
+#define	MCDI_EVENT_LINKCHANGE_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_LBN 20
 #define	MCDI_EVENT_LINKCHANGE_FCNTL_WIDTH 4
+#define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_MONITOR_OFST 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
 #define	MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_STATE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_STATE_LBN 8
 #define	MCDI_EVENT_SENSOREVT_STATE_WIDTH 8
+#define	MCDI_EVENT_SENSOREVT_VALUE_OFST 0
 #define	MCDI_EVENT_SENSOREVT_VALUE_LBN 16
 #define	MCDI_EVENT_SENSOREVT_VALUE_WIDTH 16
+#define	MCDI_EVENT_FWALERT_DATA_OFST 0
 #define	MCDI_EVENT_FWALERT_DATA_LBN 8
 #define	MCDI_EVENT_FWALERT_DATA_WIDTH 24
+#define	MCDI_EVENT_FWALERT_REASON_OFST 0
 #define	MCDI_EVENT_FWALERT_REASON_LBN 0
 #define	MCDI_EVENT_FWALERT_REASON_WIDTH 8
 /* enum: SRAM Access. */
 #define	MCDI_EVENT_FWALERT_REASON_SRAM_ACCESS 0x1
+#define	MCDI_EVENT_FLR_VF_OFST 0
 #define	MCDI_EVENT_FLR_VF_LBN 0
 #define	MCDI_EVENT_FLR_VF_WIDTH 8
+#define	MCDI_EVENT_TX_ERR_TXQ_OFST 0
 #define	MCDI_EVENT_TX_ERR_TXQ_LBN 0
 #define	MCDI_EVENT_TX_ERR_TXQ_WIDTH 12
+#define	MCDI_EVENT_TX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_TX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_TX_ERR_TYPE_WIDTH 4
 /* enum: Descriptor loader reported failure */
@@ -483,12 +514,16 @@
 #define	MCDI_EVENT_TX_OPT_IN_PKT 0x8
 /* enum: DMA or PIO data access error */
 #define	MCDI_EVENT_TX_ERR_BAD_DMA_OR_PIO 0x9
+#define	MCDI_EVENT_TX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_TX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_TX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_TX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_TX_FLUSH_TXQ_OFST 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_LBN 0
 #define	MCDI_EVENT_TX_FLUSH_TXQ_WIDTH 12
+#define	MCDI_EVENT_PTP_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_PTP_ERR_TYPE_WIDTH 8
 /* enum: PLL lost lock */
@@ -499,6 +534,7 @@
 #define	MCDI_EVENT_PTP_ERR_FIFO 0x3
 /* enum: Merge queue overflow */
 #define	MCDI_EVENT_PTP_ERR_QUEUE 0x4
+#define	MCDI_EVENT_AOE_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_AOE_ERR_TYPE_WIDTH 8
 /* enum: AOE failed to load - no valid image? */
@@ -545,8 +581,10 @@
 #define	MCDI_EVENT_AOE_FPGA_CLOCKS_PROGRAM_FAILED 0x13
 /* enum: Notify that FPGA Controller is alive to serve MCDI requests */
 #define	MCDI_EVENT_AOE_FC_RUNNING 0x14
+#define	MCDI_EVENT_AOE_ERR_DATA_OFST 0
 #define	MCDI_EVENT_AOE_ERR_DATA_LBN 8
 #define	MCDI_EVENT_AOE_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_INFO_WIDTH 8
 /* enum: FC Assert happened, but the register information is not available */
@@ -554,6 +592,7 @@
 /* enum: The register information for FC Assert is ready for readinng by driver
  */
 #define	MCDI_EVENT_AOE_ERR_FC_ASSERT_DATA_READY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_HEADER_VERIFY_FAILED_WIDTH 8
 /* enum: Reading from NV failed */
@@ -574,28 +613,38 @@
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_SIZE 0x7
 /* enum: Unsupported DDR rank */
 #define	MCDI_EVENT_AOE_ERR_FPGA_HEADER_DDR_RANK 0x8
+#define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_INVALID_FPGA_FLASH_TYPE_INFO_WIDTH 8
 /* enum: Primary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_PRIMARY 0x0
 /* enum: Secondary boot flash */
 #define	MCDI_EVENT_AOE_FLASH_TYPE_BOOT_SECONDARY 0x1
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_POWER_OFF_WIDTH 8
+#define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_OFST 0
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_LBN 8
 #define	MCDI_EVENT_AOE_ERR_CODE_FPGA_LOAD_FAILED_WIDTH 8
+#define	MCDI_EVENT_RX_ERR_RXQ_OFST 0
 #define	MCDI_EVENT_RX_ERR_RXQ_LBN 0
 #define	MCDI_EVENT_RX_ERR_RXQ_WIDTH 12
+#define	MCDI_EVENT_RX_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_RX_ERR_TYPE_LBN 12
 #define	MCDI_EVENT_RX_ERR_TYPE_WIDTH 4
+#define	MCDI_EVENT_RX_ERR_INFO_OFST 0
 #define	MCDI_EVENT_RX_ERR_INFO_LBN 16
 #define	MCDI_EVENT_RX_ERR_INFO_WIDTH 16
+#define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_LBN 12
 #define	MCDI_EVENT_RX_FLUSH_TO_DRIVER_WIDTH 1
+#define	MCDI_EVENT_RX_FLUSH_RXQ_OFST 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_LBN 0
 #define	MCDI_EVENT_RX_FLUSH_RXQ_WIDTH 12
+#define	MCDI_EVENT_MC_REBOOT_COUNT_OFST 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_LBN 0
 #define	MCDI_EVENT_MC_REBOOT_COUNT_WIDTH 16
+#define	MCDI_EVENT_MUM_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_MUM_ERR_TYPE_WIDTH 8
 /* enum: MUM failed to load - no valid image? */
@@ -604,10 +653,13 @@
 #define	MCDI_EVENT_MUM_ASSERT 0x2
 /* enum: MUM not kicking watchdog */
 #define	MCDI_EVENT_MUM_WATCHDOG 0x3
+#define	MCDI_EVENT_MUM_ERR_DATA_OFST 0
 #define	MCDI_EVENT_MUM_ERR_DATA_LBN 8
 #define	MCDI_EVENT_MUM_ERR_DATA_WIDTH 8
+#define	MCDI_EVENT_DBRET_SEQ_OFST 0
 #define	MCDI_EVENT_DBRET_SEQ_LBN 0
 #define	MCDI_EVENT_DBRET_SEQ_WIDTH 8
+#define	MCDI_EVENT_SUC_ERR_TYPE_OFST 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_LBN 0
 #define	MCDI_EVENT_SUC_ERR_TYPE_WIDTH 8
 /* enum: Corrupted or bad SUC application. */
@@ -618,30 +670,48 @@
 #define	MCDI_EVENT_SUC_EXCEPTION 0x3
 /* enum: SUC watchdog timer expired. */
 #define	MCDI_EVENT_SUC_WATCHDOG 0x4
+#define	MCDI_EVENT_SUC_ERR_ADDRESS_OFST 0
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_LBN 8
 #define	MCDI_EVENT_SUC_ERR_ADDRESS_WIDTH 24
+#define	MCDI_EVENT_SUC_ERR_DATA_OFST 0
 #define	MCDI_EVENT_SUC_ERR_DATA_LBN 8
 #define	MCDI_EVENT_SUC_ERR_DATA_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_LBN 0
 #define	MCDI_EVENT_LINKCHANGE_V2_LP_CAP_WIDTH 24
+#define	MCDI_EVENT_LINKCHANGE_V2_SPEED_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_LBN 24
 #define	MCDI_EVENT_LINKCHANGE_V2_SPEED_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MCDI_EVENT/LINKCHANGE_SPEED */
+#define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_LBN 28
 #define	MCDI_EVENT_LINKCHANGE_V2_FLAGS_LINK_UP_WIDTH 1
+#define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_OFST 0
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_LBN 29
 #define	MCDI_EVENT_LINKCHANGE_V2_FCNTL_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
+#define	MCDI_EVENT_MODULECHANGE_LD_CAP_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_LBN 0
 #define	MCDI_EVENT_MODULECHANGE_LD_CAP_WIDTH 30
+#define	MCDI_EVENT_MODULECHANGE_SEQ_OFST 0
 #define	MCDI_EVENT_MODULECHANGE_SEQ_LBN 30
 #define	MCDI_EVENT_MODULECHANGE_SEQ_WIDTH 2
 #define	MCDI_EVENT_DATA_LBN 0
 #define	MCDI_EVENT_DATA_WIDTH 32
+/* Alias for PTP_DATA. */
 #define	MCDI_EVENT_SRC_LBN 36
 #define	MCDI_EVENT_SRC_WIDTH 8
+/* Data associated with PTP events which doesn't fit into the main DATA field
+ */
+#define	MCDI_EVENT_PTP_DATA_LBN 36
+#define	MCDI_EVENT_PTP_DATA_WIDTH 8
+/* EF100 specific. Defined by QDMA. The phase bit, changes each time round the
+ * event ring
+ */
+#define	MCDI_EVENT_EV_EVQ_PHASE_LBN 59
+#define	MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
 #define	MCDI_EVENT_EV_CODE_LBN 60
 #define	MCDI_EVENT_EV_CODE_WIDTH 4
 #define	MCDI_EVENT_CODE_LBN 44
@@ -737,6 +807,27 @@
  * contains the value.
  */
 #define	MCDI_EVENT_CODE_DYNAMIC_SENSORS_STATE_CHANGE 0x23
+/* enum: Notification that a descriptor proxy function configuration has been
+ * pushed to "live" status (visible to host). SRC field contains the handle of
+ * the affected descriptor proxy function. DATA field contains the generation
+ * count of configuration set applied. See MC_CMD_DESC_PROXY_FUNC_CONFIG_SET /
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_COMMIT and SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_CONFIG_COMMITTED 0x24
+/* enum: Notification that a descriptor proxy function has been reset. SRC
+ * field contains the handle of the affected descriptor proxy function. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_RESET 0x25
+/* enum: Notification that a driver attached to a descriptor proxy function.
+ * SRC field contains the handle of the affected descriptor proxy function. For
+ * Virtio proxy functions this message consists of two MCDI events, where the
+ * first event's (CONT=1) DATA field carries negotiated virtio feature bits 0
+ * to 31 and the second (CONT=0) carries bits 32 to 63. For EF100 proxy
+ * functions event length and meaning of DATA field is not yet defined. See
+ * SF-122927-TC for details.
+ */
+#define	MCDI_EVENT_CODE_DESC_PROXY_FUNC_DRIVER_ATTACH 0x26
 /* enum: Artificial event generated by host and posted via MC for test
  * purposes.
  */
@@ -888,6 +979,22 @@
 /* The current state of a sensor. */
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_LBN 36
 #define	MCDI_EVENT_DYNAMIC_SENSORS_STATE_WIDTH 8
+#define	MCDI_EVENT_DESC_PROXY_DATA_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_DATA_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_DATA_WIDTH 32
+/* Generation count of applied configuration set */
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_GENERATION_WIDTH 32
+/* Virtio features negotiated with the host driver. First event (CONT=1)
+ * carries bits 0 to 31. Second event (CONT=0) carries bits 32 to 63.
+ */
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_OFST 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LEN 4
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_LBN 0
+#define	MCDI_EVENT_DESC_PROXY_VIRTIO_FEATURES_WIDTH 32
 
 /* FCDI_EVENT structuredef */
 #define	FCDI_EVENT_LEN 8
@@ -905,6 +1012,7 @@
 #define	FCDI_EVENT_LEVEL_FATAL 0x3
 #define	FCDI_EVENT_DATA_OFST 0
 #define	FCDI_EVENT_DATA_LEN 4
+#define	FCDI_EVENT_LINK_STATE_STATUS_OFST 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_LBN 0
 #define	FCDI_EVENT_LINK_STATE_STATUS_WIDTH 1
 #define	FCDI_EVENT_LINK_DOWN 0x0 /* enum */
@@ -1040,24 +1148,33 @@
 #define	MUM_EVENT_LEVEL_FATAL 0x3
 #define	MUM_EVENT_DATA_OFST 0
 #define	MUM_EVENT_DATA_LEN 4
+#define	MUM_EVENT_SENSOR_ID_OFST 0
 #define	MUM_EVENT_SENSOR_ID_LBN 0
 #define	MUM_EVENT_SENSOR_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_SENSOR_INFO/MC_CMD_SENSOR_INFO_OUT/MASK */
+#define	MUM_EVENT_SENSOR_STATE_OFST 0
 #define	MUM_EVENT_SENSOR_STATE_LBN 8
 #define	MUM_EVENT_SENSOR_STATE_WIDTH 8
+#define	MUM_EVENT_PORT_PHY_READY_OFST 0
 #define	MUM_EVENT_PORT_PHY_READY_LBN 0
 #define	MUM_EVENT_PORT_PHY_READY_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_LINK_UP_OFST 0
 #define	MUM_EVENT_PORT_PHY_LINK_UP_LBN 1
 #define	MUM_EVENT_PORT_PHY_LINK_UP_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOL_LBN 2
 #define	MUM_EVENT_PORT_PHY_TX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOL_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOL_LBN 3
 #define	MUM_EVENT_PORT_PHY_RX_LOL_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_LOS_LBN 4
 #define	MUM_EVENT_PORT_PHY_TX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_RX_LOS_OFST 0
 #define	MUM_EVENT_PORT_PHY_RX_LOS_LBN 5
 #define	MUM_EVENT_PORT_PHY_RX_LOS_WIDTH 1
+#define	MUM_EVENT_PORT_PHY_TX_FAULT_OFST 0
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_LBN 6
 #define	MUM_EVENT_PORT_PHY_TX_FAULT_WIDTH 1
 #define	MUM_EVENT_DATA_LBN 0
@@ -1205,16 +1322,22 @@
  * below)
  */
 #define	MC_CMD_COPYCODE_HUNT_IGNORE_CONFIG_MAGIC_ADDR 0x1badc
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_LBN 17
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_PRESENT_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_LBN 2
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SATELLITE_CPUS_NOT_LOADED_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_LBN 3
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_IGNORE_CONFIG_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_LBN 4
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_SKIP_BOOT_ICORE_SYNC_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_LBN 5
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_FORCE_STANDALONE_WIDTH 1
+#define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_OFST 0
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_LBN 6
 #define	MC_CMD_COPYCODE_IN_BOOT_MAGIC_DISABLE_XIP_WIDTH 1
 /* Destination address */
@@ -1272,10 +1395,13 @@
 #define	MC_CMD_GET_BOOT_STATUS_OUT_BOOT_OFFSET_NULL 0xdeadbeef
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_LBN 0
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_LBN 1
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_WIDTH 1
+#define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_OFST 4
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_LBN 2
 #define	MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_WIDTH 1
 
@@ -1547,14 +1673,19 @@
 /* Flags indicating which extended fields are valid */
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_LBN 0
 #define	MC_CMD_GET_VERSION_V2_OUT_MCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_LBN 1
 #define	MC_CMD_GET_VERSION_V2_OUT_SUCFW_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_LBN 2
 #define	MC_CMD_GET_VERSION_V2_OUT_CMC_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_LBN 3
 #define	MC_CMD_GET_VERSION_V2_OUT_FPGA_EXT_INFO_PRESENT_WIDTH 1
+#define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_OFST 48
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_LBN 4
 #define	MC_CMD_GET_VERSION_V2_OUT_BOARD_EXT_INFO_PRESENT_WIDTH 1
 /* MC firmware unique build ID (as binary SHA-1 value) */
@@ -2088,8 +2219,10 @@
 /* Original field containing queue ID. Now extended to include flags. */
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_LEN 4
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_LBN 0
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE_ID_WIDTH 16
+#define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_LBN 31
 #define	MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_REPORT_SYNC_STATUS_WIDTH 1
 
@@ -2395,12 +2528,16 @@
 /* Various PTP capabilities */
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_CAPABILITIES_LEN 4
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_LBN 0
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_REPORT_SYNC_STATUS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_LBN 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RX_TSTAMP_OOB_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_LBN 2
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_64BIT_SECONDS_WIDTH 1
+#define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_OFST 8
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_LBN 3
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_WIDTH 1
 #define	MC_CMD_PTP_OUT_GET_ATTRIBUTES_RESERVED0_OFST 12
@@ -2728,10 +2865,13 @@
 #define	MC_CMD_DBIWROP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIWROP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIWROP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIWROP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIWROP_TYPEDEF_PARMS_LBN 32
@@ -2980,10 +3120,13 @@
 #define	MC_CMD_DBIRDOP_TYPEDEF_ADDRESS_WIDTH 32
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LEN 4
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_LBN 16
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_NUM_WIDTH 16
+#define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_LBN 15
 #define	MC_CMD_DBIRDOP_TYPEDEF_VF_ACTIVE_WIDTH 1
+#define	MC_CMD_DBIRDOP_TYPEDEF_CS2_OFST 4
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_LBN 14
 #define	MC_CMD_DBIRDOP_TYPEDEF_CS2_WIDTH 1
 #define	MC_CMD_DBIRDOP_TYPEDEF_PARMS_LBN 32
@@ -3051,22 +3194,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_NEW_STATE_LEN 4
+#define	MC_CMD_DRV_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_ATTACH_WIDTH 1
+#define	MC_CMD_DRV_PREBOOT_OFST 0
 #define	MC_CMD_DRV_PREBOOT_LBN 1
 #define	MC_CMD_DRV_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3113,22 +3265,31 @@
 /* new state to set if UPDATE=1 */
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_NEW_STATE_LEN 4
+/*             MC_CMD_DRV_ATTACH_OFST 0 */
 /*             MC_CMD_DRV_ATTACH_LBN 0 */
 /*             MC_CMD_DRV_ATTACH_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_LBN 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_ATTACH_WIDTH 1
+/*             MC_CMD_DRV_PREBOOT_OFST 0 */
 /*             MC_CMD_DRV_PREBOOT_LBN 1 */
 /*             MC_CMD_DRV_PREBOOT_WIDTH 1 */
+#define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_LBN 1
 #define	MC_CMD_DRV_ATTACH_IN_V2_PREBOOT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_LBN 2
 #define	MC_CMD_DRV_ATTACH_IN_V2_SUBVARIANT_AWARE_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_LBN 3
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_LBN 4
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_V2_LINKCHANGES_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_RX_VI_SPREADING_INHIBIT_WIDTH 1
+#define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_OFST 0
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_LBN 5
 #define	MC_CMD_DRV_ATTACH_IN_V2_WANT_TX_ONLY_SPREADING_WIDTH 1
 /* 1 to set new state, or 0 to just report the existing state */
@@ -3263,6 +3424,7 @@
  */
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FLAG_LEN 4
+#define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_OFST 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_LBN 0
 #define	MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_WIDTH 1
 
@@ -3381,8 +3543,10 @@
 #define	MC_CMD_PUTS_IN_STRING_NUM(len) (((len)-12)/1)
 #define	MC_CMD_PUTS_IN_DEST_OFST 0
 #define	MC_CMD_PUTS_IN_DEST_LEN 4
+#define	MC_CMD_PUTS_IN_UART_OFST 0
 #define	MC_CMD_PUTS_IN_UART_LBN 0
 #define	MC_CMD_PUTS_IN_UART_WIDTH 1
+#define	MC_CMD_PUTS_IN_PORT_OFST 0
 #define	MC_CMD_PUTS_IN_PORT_LBN 1
 #define	MC_CMD_PUTS_IN_PORT_WIDTH 1
 #define	MC_CMD_PUTS_IN_DHOST_OFST 4
@@ -3415,18 +3579,25 @@
 /* flags */
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_LBN 0
 #define	MC_CMD_GET_PHY_CFG_OUT_PRESENT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN 1
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN 2
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_LBN 3
 #define	MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_LBN 4
 #define	MC_CMD_GET_PHY_CFG_OUT_POWEROFF_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_LBN 5
 #define	MC_CMD_GET_PHY_CFG_OUT_TXDIS_WIDTH 1
+#define	MC_CMD_GET_PHY_CFG_OUT_BIST_OFST 0
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_LBN 6
 #define	MC_CMD_GET_PHY_CFG_OUT_BIST_WIDTH 1
 /* ?? */
@@ -3435,46 +3606,67 @@
 /* Bitmask of supported capabilities */
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_OFST 8
 #define	MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_LEN 4
+#define	MC_CMD_PHY_CAP_10HDX_OFST 8
 #define	MC_CMD_PHY_CAP_10HDX_LBN 1
 #define	MC_CMD_PHY_CAP_10HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10FDX_LBN 2
 #define	MC_CMD_PHY_CAP_10FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100HDX_OFST 8
 #define	MC_CMD_PHY_CAP_100HDX_LBN 3
 #define	MC_CMD_PHY_CAP_100HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_100FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100FDX_LBN 4
 #define	MC_CMD_PHY_CAP_100FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000HDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000HDX_LBN 5
 #define	MC_CMD_PHY_CAP_1000HDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_1000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_1000FDX_LBN 6
 #define	MC_CMD_PHY_CAP_1000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_10000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_10000FDX_LBN 7
 #define	MC_CMD_PHY_CAP_10000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_PAUSE_OFST 8
 #define	MC_CMD_PHY_CAP_PAUSE_LBN 8
 #define	MC_CMD_PHY_CAP_PAUSE_WIDTH 1
+#define	MC_CMD_PHY_CAP_ASYM_OFST 8
 #define	MC_CMD_PHY_CAP_ASYM_LBN 9
 #define	MC_CMD_PHY_CAP_ASYM_WIDTH 1
+#define	MC_CMD_PHY_CAP_AN_OFST 8
 #define	MC_CMD_PHY_CAP_AN_LBN 10
 #define	MC_CMD_PHY_CAP_AN_WIDTH 1
+#define	MC_CMD_PHY_CAP_40000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_40000FDX_LBN 11
 #define	MC_CMD_PHY_CAP_40000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_DDM_OFST 8
 #define	MC_CMD_PHY_CAP_DDM_LBN 12
 #define	MC_CMD_PHY_CAP_DDM_WIDTH 1
+#define	MC_CMD_PHY_CAP_100000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_100000FDX_LBN 13
 #define	MC_CMD_PHY_CAP_100000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_25000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_25000FDX_LBN 14
 #define	MC_CMD_PHY_CAP_25000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_50000FDX_OFST 8
 #define	MC_CMD_PHY_CAP_50000FDX_LBN 15
 #define	MC_CMD_PHY_CAP_50000FDX_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_LBN 16
 #define	MC_CMD_PHY_CAP_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_LBN 17
 #define	MC_CMD_PHY_CAP_BASER_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_LBN 18
 #define	MC_CMD_PHY_CAP_RS_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_LBN 19
 #define	MC_CMD_PHY_CAP_RS_FEC_REQUESTED_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_LBN 20
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_WIDTH 1
+#define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_OFST 8
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_LBN 21
 #define	MC_CMD_PHY_CAP_25G_BASER_FEC_REQUESTED_WIDTH 1
 /* ?? */
@@ -4089,20 +4281,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4112,12 +4312,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_MAC_FAULT_LEN 4
+#define	MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0
 #define	MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1
+#define	MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1
 #define	MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2
 #define	MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1
+#define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3
 #define	MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1
 
@@ -4145,20 +4349,28 @@
 /*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_FULL_DUPLEX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_BPX_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PHY_LINK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_RX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_LINK_FAULT_TX_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_VALID_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_OFST 16
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_LBN 9
 #define	MC_CMD_GET_LINK_OUT_V2_MODULE_UP_WIDTH 1
 /* This returns the negotiated flow control value. */
@@ -4168,12 +4380,16 @@
 /*               MC_CMD_SET_MAC/MC_CMD_SET_MAC_IN/FCNTL */
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_OFST 24
 #define	MC_CMD_GET_LINK_OUT_V2_MAC_FAULT_LEN 4
+/*             MC_CMD_MAC_FAULT_XGMII_LOCAL_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0 */
 /*             MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_XGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1 */
 /*             MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_SGMII_REMOTE_OFST 24 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2 */
 /*             MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1 */
+/*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_OFST 24 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3 */
 /*             MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1 */
 /* True local device capabilities (taking into account currently used PMD/MDI,
@@ -4197,24 +4413,36 @@
 /*               FEC_TYPE/TYPE */
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_EXT_FLAGS_LEN 4
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_LBN 0
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_MDI_CONNECTED_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_LBN 1
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_READY_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_LBN 2
 #define	MC_CMD_GET_LINK_OUT_V2_PMD_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_LBN 3
 #define	MC_CMD_GET_LINK_OUT_V2_PMA_LINK_UP_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_LBN 4
 #define	MC_CMD_GET_LINK_OUT_V2_PCS_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_LBN 5
 #define	MC_CMD_GET_LINK_OUT_V2_ALIGN_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_HI_BER_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_LBN 6
 #define	MC_CMD_GET_LINK_OUT_V2_HI_BER_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_LBN 7
 #define	MC_CMD_GET_LINK_OUT_V2_FEC_LOCK_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_OFST 40
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_LBN 8
 #define	MC_CMD_GET_LINK_OUT_V2_AN_DONE_WIDTH 1
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_OFST 40
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_LBN 9
+#define	MC_CMD_GET_LINK_OUT_V2_PORT_SHUTDOWN_WIDTH 1
 
 
 /***********************************/
@@ -4237,12 +4465,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_LOOPBACK_MODE_LEN 4
@@ -4267,12 +4501,18 @@
 /* Flags */
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_LOWPOWER_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_POWEROFF_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_LBN 1
 #define	MC_CMD_SET_LINK_IN_V2_POWEROFF_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_TXDIS_OFST 4
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_LBN 2
 #define	MC_CMD_SET_LINK_IN_V2_TXDIS_WIDTH 1
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_OFST 4
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_LBN 3
+#define	MC_CMD_SET_LINK_IN_V2_LINKDOWN_WIDTH 1
 /* Loopback mode. */
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_OFST 8
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_MODE_LEN 4
@@ -4285,8 +4525,10 @@
 #define	MC_CMD_SET_LINK_IN_V2_LOOPBACK_SPEED_LEN 4
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_LEN 1
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_LBN 0
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_NUMBER_WIDTH 7
+#define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_OFST 16
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_LBN 7
 #define	MC_CMD_SET_LINK_IN_V2_MODULE_SEQ_IGNORE_WIDTH 1
 
@@ -4340,8 +4582,10 @@
 #define	MC_CMD_SET_MAC_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_IN_FCNTL_OFST 20
@@ -4360,6 +4604,7 @@
 #define	MC_CMD_FCNTL_GENERATE 0x5
 #define	MC_CMD_SET_MAC_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_IN_FLAG_INCLUDE_FCS_WIDTH 1
 
@@ -4378,8 +4623,10 @@
 #define	MC_CMD_SET_MAC_EXT_IN_ADDR_HI_OFST 12
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_UNCST_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_OFST 16
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_REJECT_BRDCST_WIDTH 1
 #define	MC_CMD_SET_MAC_EXT_IN_FCNTL_OFST 20
@@ -4398,6 +4645,7 @@
 /*               MC_CMD_FCNTL_GENERATE 0x5 */
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_OFST 24
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_FLAG_INCLUDE_FCS_WIDTH 1
 /* Select which parameters to configure. A parameter will only be modified if
@@ -4407,14 +4655,19 @@
  */
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CONTROL_LEN 4
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_LBN 0
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_MTU_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_LBN 1
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_DRAIN_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_LBN 2
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_REJECT_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_LBN 3
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCNTL_WIDTH 1
+#define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_OFST 28
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_LBN 4
 #define	MC_CMD_SET_MAC_EXT_IN_CFG_FCS_WIDTH 1
 
@@ -4536,18 +4789,25 @@
 #define	MC_CMD_MAC_STATS_IN_DMA_ADDR_HI_OFST 4
 #define	MC_CMD_MAC_STATS_IN_CMD_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CMD_LEN 4
+#define	MC_CMD_MAC_STATS_IN_DMA_OFST 8
 #define	MC_CMD_MAC_STATS_IN_DMA_LBN 0
 #define	MC_CMD_MAC_STATS_IN_DMA_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_CLEAR_LBN 1
 #define	MC_CMD_MAC_STATS_IN_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_MAC_STATS_IN_PERIOD_MS_OFST 8
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_LBN 16
 #define	MC_CMD_MAC_STATS_IN_PERIOD_MS_WIDTH 16
 /* DMA length. Should be set to MAC_STATS_NUM_STATS * sizeof(uint64_t), as
@@ -5053,8 +5313,10 @@
 /*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_LEN 4 */
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_LEN 4
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_LBN 0
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_UP_WIDTH 1
+#define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_OFST 8
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_LBN 1
 #define	MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_WIDTH 1
 
@@ -5211,18 +5473,25 @@
 #define	MC_CMD_NVRAM_INFO_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CRC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_LBN 3
 #define	MC_CMD_NVRAM_INFO_OUT_CRC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_CMAC_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_LBN 6
 #define	MC_CMD_NVRAM_INFO_OUT_CMAC_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_OUT_PHYSDEV_OFST 16
@@ -5242,14 +5511,19 @@
 #define	MC_CMD_NVRAM_INFO_V2_OUT_ERASESIZE_LEN 4
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_LBN 0
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PROTECTED_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_LBN 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_TLV_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_LBN 2
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_IF_TSA_BOUND_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_LBN 5
 #define	MC_CMD_NVRAM_INFO_V2_OUT_READ_ONLY_WIDTH 1
+#define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_OFST 12
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_LBN 7
 #define	MC_CMD_NVRAM_INFO_V2_OUT_A_B_WIDTH 1
 #define	MC_CMD_NVRAM_INFO_V2_OUT_PHYSDEV_OFST 16
@@ -5298,6 +5572,7 @@
 /*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 4
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
 
@@ -5477,10 +5752,13 @@
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_REBOOT_LEN 4
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_LBN 0
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_LBN 1
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND_WIDTH 1
+#define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_OFST 8
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_LBN 2
 #define	MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT_WIDTH 1
 
@@ -5676,6 +5954,7 @@
 #define	MC_CMD_REBOOT_MODE_SNAPPER 0x3
 /* enum: snapper fake POR */
 #define	MC_CMD_REBOOT_MODE_SNAPPER_POR 0x4
+#define	MC_CMD_REBOOT_MODE_IN_FAKE_OFST 0
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_LBN 7
 #define	MC_CMD_REBOOT_MODE_IN_FAKE_WIDTH 1
 
@@ -5748,6 +6027,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_OFST 4
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_SENSOR_INFO_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -5970,6 +6250,7 @@
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_MASK_LEN 4
 /*            Enum values, see field(s): */
 /*               MC_CMD_SENSOR_INFO_OUT */
+#define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_OFST 0
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_LBN 31
 #define	MC_CMD_SENSOR_INFO_EXT_OUT_NEXT_PAGE_WIDTH 1
 /* MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF */
@@ -6025,7 +6306,11 @@
 
 /* MC_CMD_READ_SENSORS_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_IN_LEN 8
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_IN_DMA_ADDR_LO_OFST 0
@@ -6033,7 +6318,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_LEN 12
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_DMA_ADDR_LO_OFST 0
@@ -6044,7 +6333,11 @@
 
 /* MC_CMD_READ_SENSORS_EXT_IN_V2 msgrequest */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_LEN 16
-/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned). */
+/* DMA address of host buffer for sensor readings (must be 4Kbyte aligned).
+ *
+ * If the address is 0xffffffffffffffff send the readings in the response (used
+ * by cmdclient).
+ */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_OFST 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LEN 8
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_DMA_ADDR_LO_OFST 0
@@ -6055,6 +6348,7 @@
 /* Flags controlling information retrieved */
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_FLAGS_LEN 4
+#define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_OFST 12
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_LBN 0
 #define	MC_CMD_READ_SENSORS_EXT_IN_V2_ENGINEERING_WIDTH 1
 
@@ -6336,6 +6630,7 @@
 #define	MC_CMD_WORKAROUND_EXT_OUT_LEN 4
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLAGS_LEN 4
+#define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_OFST 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN 0
 #define	MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_WIDTH 1
 
@@ -6558,10 +6853,13 @@
 #define	MC_CMD_NVRAM_METADATA_OUT_TYPE_LEN 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_FLAGS_LEN 4
+#define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_LBN 0
 #define	MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_LBN 1
 #define	MC_CMD_NVRAM_METADATA_OUT_VERSION_VALID_WIDTH 1
+#define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_OFST 4
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_LBN 2
 #define	MC_CMD_NVRAM_METADATA_OUT_DESCRIPTION_VALID_WIDTH 1
 /* Subtype ID code for content of this partition */
@@ -6686,6 +6984,7 @@
 #define	MC_CMD_CLP_IN_SET_MAC_V2_RESERVED_LEN 2
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_OFST 12
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_LBN 0
 #define	MC_CMD_CLP_IN_SET_MAC_V2_VIRTUAL_WIDTH 1
 
@@ -6700,6 +6999,7 @@
 /*            MC_CMD_CLP_IN_OP_LEN 4 */
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_FLAGS_LEN 4
+#define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_OFST 4
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_LBN 0
 #define	MC_CMD_CLP_IN_GET_MAC_V2_PERMANENT_WIDTH 1
 
@@ -6751,6 +7051,7 @@
 #define	MC_CMD_MUM_IN_LEN 4
 #define	MC_CMD_MUM_IN_OP_HDR_OFST 0
 #define	MC_CMD_MUM_IN_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_OP_OFST 0
 #define	MC_CMD_MUM_IN_OP_LBN 0
 #define	MC_CMD_MUM_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to MUM */
@@ -6892,6 +7193,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_GPIO_OPCODE_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_IN_READ 0x0 /* enum */
@@ -6954,12 +7256,14 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_LBN 8
 #define	MC_CMD_MUM_IN_GPIO_OP_BITWISE_OP_WIDTH 8
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_READ 0x0 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE 0x1 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG 0x2 /* enum */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE 0x3 /* enum */
+#define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_LBN 16
 #define	MC_CMD_MUM_IN_GPIO_OP_GPIO_NUMBER_WIDTH 8
 
@@ -6976,6 +7280,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_WRITE_WRITEBIT_WIDTH 8
 
@@ -6985,6 +7290,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_CONFIG_CFG_WIDTH 8
 
@@ -6994,6 +7300,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_HDR_LEN 4
+#define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_OFST 4
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_LBN 24
 #define	MC_CMD_MUM_IN_GPIO_OP_OUT_ENABLE_ENABLEBIT_WIDTH 8
 
@@ -7004,8 +7311,10 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_PARAMS_LEN 4
+#define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_LBN 0
 #define	MC_CMD_MUM_IN_READ_SENSORS_SENSOR_ID_WIDTH 8
+#define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_OFST 4
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_LBN 8
 #define	MC_CMD_MUM_IN_READ_SENSORS_NUM_SENSORS_WIDTH 8
 
@@ -7023,10 +7332,13 @@
 /* Control flags for clock programming */
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_FLAGS_LEN 4
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_LBN 0
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_OVERCLOCK_110_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_LBN 1
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_NIC_FROM_FPGA_WIDTH 1
+#define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_OFST 8
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_LBN 2
 #define	MC_CMD_MUM_IN_PROGRAM_CLOCKS_CLOCK_REF_FROM_XO_WIDTH 1
 
@@ -7052,6 +7364,7 @@
 /*            MC_CMD_MUM_IN_CMD_LEN 4 */
 #define	MC_CMD_MUM_IN_QSFP_HDR_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_HDR_LEN 4
+#define	MC_CMD_MUM_IN_QSFP_OPCODE_OFST 4
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_LBN 0
 #define	MC_CMD_MUM_IN_QSFP_OPCODE_WIDTH 4
 #define	MC_CMD_MUM_IN_QSFP_INIT 0x0 /* enum */
@@ -7238,10 +7551,13 @@
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MINNUM 1
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM 63
 #define	MC_CMD_MUM_OUT_READ_SENSORS_DATA_MAXNUM_MCDI2 255
+#define	MC_CMD_MUM_OUT_READ_SENSORS_READING_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_LBN 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_READING_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_LBN 16
 #define	MC_CMD_MUM_OUT_READ_SENSORS_STATE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_OFST 0
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_SENSORS_TYPE_WIDTH 8
 
@@ -7267,8 +7583,10 @@
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LP_CAP_LEN 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_FLAGS_LEN 4
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_LBN 0
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_READY_WIDTH 1
+#define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_OFST 4
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_LBN 1
 #define	MC_CMD_MUM_OUT_QSFP_RECONFIGURE_PORT_PHY_LINK_UP_WIDTH 1
 
@@ -7313,8 +7631,10 @@
 /* Discrete (soldered) DDR resistor strap info */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_DISCRETE_DDR_INFO_LEN 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VRATIO_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_OFST 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED1_WIDTH 16
 /* Number of SODIMM info records */
@@ -7328,6 +7648,7 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MINNUM 2
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM 30
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SODIMM_INFO_RECORD_MAXNUM_MCDI2 126
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_LBN 0
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK_ID_WIDTH 8
 /* enum: SODIMM bank 1 (Top SODIMM for Sorrento) */
@@ -7336,10 +7657,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_BANK2 0x1
 /* enum: Total number of SODIMM banks */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NUM_BANKS 0x2
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_LBN 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_TYPE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_LBN 16
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RANK_WIDTH 4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_LBN 20
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_VOLTAGE_WIDTH 4
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_POWERED 0x0 /* enum */
@@ -7348,10 +7672,13 @@
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V5 0x3 /* enum */
 /* enum: Values 5-15 are reserved for future usage */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_1V8 0x4
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_LBN 24
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SIZE_WIDTH 8
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_LBN 32
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_SPEED_WIDTH 16
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_LBN 48
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_STATE_WIDTH 4
 /* enum: No module present */
@@ -7369,6 +7696,7 @@
 /* enum: Modules may or may not be present, but cannot establish contact by I2C
  */
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_NOT_REACHABLE 0x6
+#define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_OFST 8
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_LBN 52
 #define	MC_CMD_MUM_OUT_READ_DDR_INFO_RESERVED2_WIDTH 12
 
@@ -7677,12 +8005,6 @@
 /* MC_CMD_EVENT_CTRL_OUT msgrequest */
 #define	MC_CMD_EVENT_CTRL_OUT_LEN 0
 
-/* MC_CMD_RESOURCE_SPECIFIER enum */
-/* enum: Any */
-#define	MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff
-/* enum: None */
-#define	MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe
-
 /* EVB_PORT_ID structuredef */
 #define	EVB_PORT_ID_LEN 4
 #define	EVB_PORT_ID_PORT_ID_OFST 0
@@ -7902,24 +8224,34 @@
 #define	LICENSED_FEATURES_MASK_LEN 8
 #define	LICENSED_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_FEATURES_PIO_OFST 0
 #define	LICENSED_FEATURES_PIO_LBN 1
 #define	LICENSED_FEATURES_PIO_WIDTH 1
+#define	LICENSED_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_FEATURES_CLOCK_OFST 0
 #define	LICENSED_FEATURES_CLOCK_LBN 3
 #define	LICENSED_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_FEATURES_MASK_LBN 0
@@ -7932,36 +8264,52 @@
 #define	LICENSED_V3_APPS_MASK_LEN 8
 #define	LICENSED_V3_APPS_MASK_LO_OFST 0
 #define	LICENSED_V3_APPS_MASK_HI_OFST 4
+#define	LICENSED_V3_APPS_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_ONLOAD_LBN 0
 #define	LICENSED_V3_APPS_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_PTP_OFST 0
 #define	LICENSED_V3_APPS_PTP_LBN 1
 #define	LICENSED_V3_APPS_PTP_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_LBN 2
 #define	LICENSED_V3_APPS_SOLARCAPTURE_PRO_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARSECURE_OFST 0
 #define	LICENSED_V3_APPS_SOLARSECURE_LBN 3
 #define	LICENSED_V3_APPS_SOLARSECURE_WIDTH 1
+#define	LICENSED_V3_APPS_PERF_MONITOR_OFST 0
 #define	LICENSED_V3_APPS_PERF_MONITOR_LBN 4
 #define	LICENSED_V3_APPS_PERF_MONITOR_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_LBN 5
 #define	LICENSED_V3_APPS_SOLARCAPTURE_LIVE_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_LBN 6
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_WIDTH 1
+#define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_OFST 0
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_LBN 7
 #define	LICENSED_V3_APPS_NETWORK_ACCESS_CONTROL_WIDTH 1
+#define	LICENSED_V3_APPS_TCP_DIRECT_OFST 0
 #define	LICENSED_V3_APPS_TCP_DIRECT_LBN 8
 #define	LICENSED_V3_APPS_TCP_DIRECT_WIDTH 1
+#define	LICENSED_V3_APPS_LOW_LATENCY_OFST 0
 #define	LICENSED_V3_APPS_LOW_LATENCY_LBN 9
 #define	LICENSED_V3_APPS_LOW_LATENCY_WIDTH 1
+#define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_OFST 0
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_LBN 10
 #define	LICENSED_V3_APPS_SOLARCAPTURE_TAP_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_LBN 11
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_40G_WIDTH 1
+#define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_OFST 0
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_LBN 12
 #define	LICENSED_V3_APPS_CAPTURE_SOLARSYSTEM_1G_WIDTH 1
+#define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_OFST 0
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_LBN 13
 #define	LICENSED_V3_APPS_SCALEOUT_ONLOAD_WIDTH 1
+#define	LICENSED_V3_APPS_DSHBRD_OFST 0
 #define	LICENSED_V3_APPS_DSHBRD_LBN 14
 #define	LICENSED_V3_APPS_DSHBRD_WIDTH 1
+#define	LICENSED_V3_APPS_SCATRD_OFST 0
 #define	LICENSED_V3_APPS_SCATRD_LBN 15
 #define	LICENSED_V3_APPS_SCATRD_WIDTH 1
 #define	LICENSED_V3_APPS_MASK_LBN 0
@@ -7974,24 +8322,34 @@
 #define	LICENSED_V3_FEATURES_MASK_LEN 8
 #define	LICENSED_V3_FEATURES_MASK_LO_OFST 0
 #define	LICENSED_V3_FEATURES_MASK_HI_OFST 4
+#define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_LBN 0
 #define	LICENSED_V3_FEATURES_RX_CUT_THROUGH_WIDTH 1
+#define	LICENSED_V3_FEATURES_PIO_OFST 0
 #define	LICENSED_V3_FEATURES_PIO_LBN 1
 #define	LICENSED_V3_FEATURES_PIO_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVQ_TIMER_OFST 0
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_LBN 2
 #define	LICENSED_V3_FEATURES_EVQ_TIMER_WIDTH 1
+#define	LICENSED_V3_FEATURES_CLOCK_OFST 0
 #define	LICENSED_V3_FEATURES_CLOCK_LBN 3
 #define	LICENSED_V3_FEATURES_CLOCK_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_LBN 4
 #define	LICENSED_V3_FEATURES_RX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_OFST 0
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_LBN 5
 #define	LICENSED_V3_FEATURES_TX_TIMESTAMPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_RX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_RX_SNIFF_LBN 6
 #define	LICENSED_V3_FEATURES_RX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_TX_SNIFF_OFST 0
 #define	LICENSED_V3_FEATURES_TX_SNIFF_LBN 7
 #define	LICENSED_V3_FEATURES_TX_SNIFF_WIDTH 1
+#define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_OFST 0
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_LBN 8
 #define	LICENSED_V3_FEATURES_PROXY_FILTER_OPS_WIDTH 1
+#define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_OFST 0
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_LBN 9
 #define	LICENSED_V3_FEATURES_EVENT_CUT_THROUGH_WIDTH 1
 #define	LICENSED_V3_FEATURES_MASK_LBN 0
@@ -8044,12 +8402,16 @@
  */
 #define	RSS_MODE_HASH_SELECTOR_OFST 0
 #define	RSS_MODE_HASH_SELECTOR_LEN 1
+#define	RSS_MODE_HASH_SRC_ADDR_OFST 0
 #define	RSS_MODE_HASH_SRC_ADDR_LBN 0
 #define	RSS_MODE_HASH_SRC_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_DST_ADDR_OFST 0
 #define	RSS_MODE_HASH_DST_ADDR_LBN 1
 #define	RSS_MODE_HASH_DST_ADDR_WIDTH 1
+#define	RSS_MODE_HASH_SRC_PORT_OFST 0
 #define	RSS_MODE_HASH_SRC_PORT_LBN 2
 #define	RSS_MODE_HASH_SRC_PORT_WIDTH 1
+#define	RSS_MODE_HASH_DST_PORT_OFST 0
 #define	RSS_MODE_HASH_DST_PORT_LBN 3
 #define	RSS_MODE_HASH_DST_PORT_WIDTH 1
 #define	RSS_MODE_HASH_SELECTOR_LBN 0
@@ -8164,18 +8526,25 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_IN_FLAG_USE_TIMER_WIDTH 1
 #define	MC_CMD_INIT_EVQ_IN_TMR_MODE_OFST 20
@@ -8250,20 +8619,28 @@
 /* tbd */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INTERRUPTING_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RPTR_DOS_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_INT_ARMD_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_LBN 4
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_LBN 5
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_LBN 6
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_USE_TIMER_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_OFST 16
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LBN 7
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_WIDTH 4
 /* enum: All initialisation flags specified by host. */
@@ -8285,6 +8662,9 @@
  * MC_CMD_INIT_EVQ_V2/MC_CMD_INIT_EVQ_V2_OUT/FLAGS for list of affected flags.
  */
 #define	MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO 0x3
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_OFST 16
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_LBN 11
+#define	MC_CMD_INIT_EVQ_V2_IN_FLAG_EXT_WIDTH_WIDTH 1
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_OFST 20
 #define	MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_LEN 4
 /* enum: Disabled */
@@ -8335,12 +8715,16 @@
 /* Actual configuration applied on the card */
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAGS_LEN 4
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_LBN 0
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_CUT_THRU_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_LBN 1
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_LBN 2
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_TX_MERGE_WIDTH 1
+#define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_OFST 4
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_LBN 3
 #define	MC_CMD_INIT_EVQ_V2_OUT_FLAG_RXQ_FORCE_EV_MERGING_WIDTH 1
 
@@ -8401,20 +8785,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_IN_UNUSED_OFST 16
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_LBN 10
 #define	MC_CMD_INIT_RXQ_IN_UNUSED_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8458,20 +8850,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_EXT_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8487,8 +8887,10 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_EXT_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8496,10 +8898,13 @@
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8542,20 +8947,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V3_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V3_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8571,8 +8984,10 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V3_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8580,10 +8995,13 @@
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V3_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V3_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8655,20 +9073,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V4_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V4_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8684,8 +9110,10 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V4_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V4_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8693,10 +9121,13 @@
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V4_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V4_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8781,20 +9212,28 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_LBN 1
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_HDR_SPLIT_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_LBN 2
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_LBN 3
 #define	MC_CMD_INIT_RXQ_V5_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_LBN 7
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_CHAIN_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_LBN 8
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_PREFIX_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_LBN 9
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_LBN 10
 #define	MC_CMD_INIT_RXQ_V5_IN_DMA_MODE_WIDTH 4
 /* enum: One packet per descriptor (for normal networking) */
@@ -8810,8 +9249,10 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_SUPER_BUFFER 0x2
 /* enum: Deprecated name for EQUAL_STRIDE_SUPER_BUFFER. */
 #define	MC_CMD_INIT_RXQ_V5_IN_EQUAL_STRIDE_PACKED_STREAM 0x2
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_LBN 14
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_SNAPSHOT_MODE_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_LBN 15
 #define	MC_CMD_INIT_RXQ_V5_IN_PACKED_STREAM_BUFF_SIZE_WIDTH 3
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_1M 0x0 /* enum */
@@ -8819,10 +9260,13 @@
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_256K 0x2 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_128K 0x3 /* enum */
 #define	MC_CMD_INIT_RXQ_V5_IN_PS_BUFF_64K 0x4 /* enum */
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_LBN 18
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_WANT_OUTER_CLASSES_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_LBN 19
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_FORCE_EV_MERGING_WIDTH 1
+#define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_OFST 16
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_LBN 20
 #define	MC_CMD_INIT_RXQ_V5_IN_FLAG_NO_CONT_EV_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8939,22 +9383,31 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
@@ -8995,30 +9448,51 @@
 /* There will be more flags here. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_BUFF_MODE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_IP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_LBN 2
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_CSUM_DIS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_LBN 3
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TCP_UDP_ONLY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_LBN 4
 #define	MC_CMD_INIT_TXQ_EXT_IN_CRC_MODE_WIDTH 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_LBN 8
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TIMESTAMP_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_LBN 9
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_PACER_BYPASS_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_LBN 10
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_LBN 11
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_LBN 12
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_TSOV2_EN_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_LBN 13
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_OFST 16
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_LBN 14
 #define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_CTPIO_UTHRESH_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_LBN 15
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_M2M_D2C_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_LBN 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_DESC_PROXY_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_OFST 16
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_LBN 17
+#define	MC_CMD_INIT_TXQ_EXT_IN_FLAG_ABS_TARGET_EVQ_WIDTH 1
 /* Owner ID to use if in buffer mode (zero if physical) */
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_OFST 20
 #define	MC_CMD_INIT_TXQ_EXT_IN_OWNER_ID_LEN 4
@@ -9036,8 +9510,10 @@
 /* Flags related to Qbb flow control mode. */
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_FLAGS_LEN 4
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_LBN 0
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_ENABLE_WIDTH 1
+#define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_OFST 540
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_LBN 1
 #define	MC_CMD_INIT_TXQ_EXT_IN_QBB_PRIORITY_WIDTH 3
 
@@ -9148,8 +9624,10 @@
 /* The handle of the target function. */
 #define	MC_CMD_PROXY_CMD_IN_TARGET_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_LEN 4
+#define	MC_CMD_PROXY_CMD_IN_TARGET_PF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_LBN 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_PF_WIDTH 16
+#define	MC_CMD_PROXY_CMD_IN_TARGET_VF_OFST 0
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_LBN 16
 #define	MC_CMD_PROXY_CMD_IN_TARGET_VF_WIDTH 16
 #define	MC_CMD_PROXY_CMD_IN_VF_NULL 0xffff /* enum */
@@ -9213,6 +9691,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_IN_LEN 108
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9257,6 +9736,7 @@
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_LEN 112
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_FLAGS_LEN 4
+#define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_OFST 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_LBN 0
 #define	MC_CMD_PROXY_CONFIGURE_EXT_IN_ENABLE_WIDTH 1
 /* Host provides a contiguous memory buffer that contains at least NUM_BLOCKS
@@ -9466,32 +9946,46 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_LBN 11
 #define	MC_CMD_FILTER_OP_IN_MATCH_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9539,8 +10033,10 @@
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9606,60 +10102,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9707,8 +10231,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_EXT_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9744,8 +10270,10 @@
  */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9754,8 +10282,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -9827,9 +10357,10 @@
 #define	MC_CMD_FILTER_OP_EXT_IN_IFRM_DST_IP_LEN 16
 
 /* MC_CMD_FILTER_OP_V3_IN msgrequest: FILTER_OP extension to support additional
- * filter actions for Intel's DPDK (Data Plane Development Kit, dpdk.org) via
- * its rte_flow API. This extension is only useful with the sfc_efx driver
- * included as part of DPDK, used in conjunction with the dpdk datapath
+ * filter actions for EF100. Some of these actions are also supported on EF10,
+ * for Intel's DPDK (Data Plane Development Kit, dpdk.org) via its rte_flow
+ * API. In the latter case, this extension is only useful with the sfc_efx
+ * driver included as part of DPDK, used in conjunction with the dpdk datapath
  * firmware variant.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_LEN 180
@@ -9850,60 +10381,88 @@
 /* fields to include in match criteria */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_LBN 2
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_LBN 3
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_LBN 4
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_LBN 5
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_LBN 10
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_LBN 11
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_VNI_OR_VSID_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_LBN 12
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_LBN 13
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_IP_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_LBN 14
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_LBN 15
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_SRC_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_LBN 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_LBN 17
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_DST_PORT_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_LBN 18
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_LBN 19
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_INNER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_LBN 20
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_LBN 21
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_IP_PROTO_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_LBN 22
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF0_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_LBN 23
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_FWDEF1_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_LBN 25
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_IFRM_UNKNOWN_UCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_LBN 30
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_MCAST_DST_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_OFST 16
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_LBN 31
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_UNKNOWN_UCAST_DST_WIDTH 1
 /* receive destination */
@@ -9951,8 +10510,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_LEN 4
 /* enum: request default behaviour (based on filter type) */
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_DEFAULT 0xffffffff
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_MAC_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_OFST 40
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_LBN 1
 #define	MC_CMD_FILTER_OP_V3_IN_TX_DEST_PM_WIDTH 1
 /* source MAC address to match (as bytes in network order) */
@@ -9988,8 +10549,10 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_OR_VSID_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_WIDTH 8
 /* enum: Match VXLAN traffic with this VNI */
@@ -9998,8 +10561,10 @@
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_GENEVE 0x1
 /* enum: Reserved for experimental development use */
 #define	MC_CMD_FILTER_OP_V3_IN_VNI_TYPE_EXPERIMENTAL 0xfe
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_LBN 0
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_VALUE_WIDTH 24
+#define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_OFST 72
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_LBN 24
 #define	MC_CMD_FILTER_OP_V3_IN_VSID_TYPE_WIDTH 8
 /* enum: Match NVGRE traffic with this VSID */
@@ -10069,11 +10634,39 @@
  */
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_OFST 156
 #define	MC_CMD_FILTER_OP_V3_IN_IFRM_DST_IP_LEN 16
-/* Set an action for all packets matching this filter. The DPDK driver and dpdk
- * f/w variant use their own specific delivery structures, which are documented
- * in the DPDK Firmware Driver Interface (SF-119419-TC). Requesting anything
- * other than MATCH_ACTION_NONE when the NIC is running another f/w variant
- * will cause the filter insertion to fail with ENOTSUP.
+/* Flags controlling mutations of the user_mark and user_flag fields of
+ * matching packets, with logic as follows: if (req.MATCH_BITOR_FLAG == 1)
+ * user_flag = req.MATCH_SET_FLAG bit_or user_flag; else user_flag =
+ * req.MATCH_SET_FLAG; if (req.MATCH_SET_MARK == 0) user_mark = 0; else if
+ * (req.MATCH_BITOR_MARK == 1) user_mark = req.MATCH_SET_MARK bit_or user_mark;
+ * else user_mark = req.MATCH_SET_MARK; N.B. These flags overlap with the
+ * MATCH_ACTION field, which is deprecated in favour of this field. For the
+ * cases where these flags induce a valid encoding of the MATCH_ACTION field,
+ * the semantics agree.
+ */
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAGS_LEN 4
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_LBN 0
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_LBN 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_SET_MARK_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_LBN 2
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_FLAG_WIDTH 1
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_OFST 172
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_LBN 3
+#define	MC_CMD_FILTER_OP_V3_IN_MATCH_BITOR_MARK_WIDTH 1
+/* Deprecated: the overlapping MATCH_ACTION_FLAGS field exposes all of the
+ * functionality of this field in an ABI-backwards-compatible manner, and
+ * should be used instead. Any future extensions should be made to the
+ * MATCH_ACTION_FLAGS field, and not to this field. Set an action for all
+ * packets matching this filter. The DPDK driver and (on EF10) dpdk f/w variant
+ * use their own specific delivery structures, which are documented in the DPDK
+ * Firmware Driver Interface (SF-119419-TC). Requesting anything other than
+ * MATCH_ACTION_NONE on an EF10 NIC running another f/w variant will cause the
+ * filter insertion to fail with ENOTSUP.
  */
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_OFST 172
 #define	MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_LEN 4
@@ -10164,6 +10757,10 @@
  * frames (Medford only)
  */
 #define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_ENCAP_RX_MATCHES 0x4
+/* enum: read the list of supported matches for the encapsulation detection
+ * rules inserted by MC_CMD_VNIC_ENCAP_RULE_ADD. (ef100 and later)
+ */
+#define	MC_CMD_GET_PARSER_DISP_INFO_IN_OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES 0x5
 
 /* MC_CMD_GET_PARSER_DISP_INFO_OUT msgresponse */
 #define	MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMIN 8
@@ -10198,6 +10795,7 @@
 /* bitfield of filter insertion restrictions */
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_RESTRICTION_FLAGS_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_OFST 4
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_LBN 0
 #define	MC_CMD_GET_PARSER_DISP_RESTRICTIONS_OUT_DST_IP_MCAST_ONLY_WIDTH 1
 
@@ -10243,6 +10841,34 @@
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_OFST 32
 #define	MC_CMD_GET_PARSER_DISP_SECURITY_RULE_INFO_OUT_PORTRANGE_ID_MAX_LEN 4
 
+/* MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT msgresponse: This response is
+ * returned if a MC_CMD_GET_PARSER_DISP_INFO_IN request is sent with OP value
+ * OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES. It contains information about the
+ * supported match types that can be used in the encapsulation detection rules
+ * inserted by MC_CMD_VNIC_ENCAP_RULE_ADD.
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMIN 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX 252
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_LEN(num) (8+4*(num))
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_NUM(len) (((len)-8)/4)
+/* The op code OP_GET_SUPPORTED_VNIC_ENCAP_MATCHES is returned. */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_OFST 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_OP_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_PARSER_DISP_INFO_IN/OP */
+/* number of supported match types */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_OFST 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_NUM_SUPPORTED_MATCHES_LEN 4
+/* array of supported match types (valid MATCH_FLAGS values for
+ * MC_CMD_VNIC_ENCAP_RULE_ADD) sorted in decreasing priority order
+ */
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_OFST 8
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_LEN 4
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MINNUM 0
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM 61
+#define	MC_CMD_GET_PARSER_DISP_VNIC_ENCAP_MATCHES_OUT_SUPPORTED_MATCHES_MAXNUM_MCDI2 253
+
 
 /***********************************/
 /* MC_CMD_PARSER_DISP_RW
@@ -10388,9 +11014,15 @@
 
 /* MC_CMD_GET_PORT_ASSIGNMENT_OUT msgresponse */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN 4
-/* Identifies the port assignment for this function. */
+/* Identifies the port assignment for this function. On EF100, it is possible
+ * for the function to have no network port assigned (either because it is not
+ * yet configured, or assigning a port to a given function personality makes no
+ * sense - e.g. virtio-blk), in which case the return value is NULL_PORT.
+ */
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_OFST 0
 #define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_PORT_LEN 4
+/* enum: Special value to indicate no port is assigned to a function. */
+#define	MC_CMD_GET_PORT_ASSIGNMENT_OUT_NULL_PORT 0xffffffff
 
 
 /***********************************/
@@ -10497,6 +11129,7 @@
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_MAX_LEN 4
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_OFST 8
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_LBN 0
 #define	MC_CMD_GET_SRIOV_CFG_OUT_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF. */
@@ -10526,6 +11159,7 @@
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_MAX_LEN 4
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_OFST 8
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_LBN 0
 #define	MC_CMD_SET_SRIOV_CFG_IN_VF_ENABLED_WIDTH 1
 /* RID offset of first VF from PF, or 0 for no change, or
@@ -10619,10 +11253,13 @@
 /* Combined metadata field. */
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_LEN 4
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_OFST 28
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_EV_META_WKUP_REF_WIDTH 8
 /* TXDPCPU raw table data for queue. */
@@ -10645,14 +11282,19 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_LO_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_HI_OFST 60
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_TX_META_WAITCOUNT_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_OFST 56
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_LBN 40
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_PADDING_WIDTH 24
 /* RXDPCPU raw table data for queue. */
@@ -10675,12 +11317,16 @@
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LEN 8
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_LO_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_HI_OFST 92
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_LBN 0
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_BASE_WIDTH 16
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_LBN 16
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_BUFS_NPAGES_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_LBN 24
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_QSTATE_WIDTH 8
+#define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_OFST 88
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_LBN 32
 #define	MC_CMD_DUMP_VI_STATE_OUT_VI_RX_META_WAITCOUNT_WIDTH 8
 
@@ -10832,38 +11478,55 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_MISC_SPARE_WIDTH 31
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_IDO_SPARE_WIDTH 28
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_LBN 3
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_RO_SPARE_WIDTH 29
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_OFST 4
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_LBN 9
 #define	MC_CMD_GET_TLP_PROCESSING_GLOBALS_OUT_TLP_INFO_TLP_TYPE_SPARE_WIDTH 23
 
@@ -10886,32 +11549,46 @@
 /* Amalgamated TLP info word. */
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_WORD_LEN 4
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_MISC_WTAG_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_TX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_EV_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_LBN 3
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_IDO_RX_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_RXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_LBN 1
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_TXDMA_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_RO_DL_EN_WIDTH 1
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_LBN 0
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_MSIX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_LBN 2
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_DL_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_LBN 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_TX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_LBN 6
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_EV_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_LBN 8
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_TPH_TYPE_RX_WIDTH 2
+#define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_OFST 4
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_LBN 10
 #define	MC_CMD_SET_TLP_PROCESSING_GLOBALS_IN_TLP_INFO_SPARE_WIDTH 22
 
@@ -11063,62 +11740,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11179,8 +11885,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11228,8 +11936,10 @@
 #define	MC_CMD_GET_CAPABILITIES_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11283,62 +11993,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11399,8 +12138,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11448,8 +12189,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11497,70 +12240,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V2_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11624,62 +12403,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -11740,8 +12548,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11789,8 +12599,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -11838,70 +12650,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V3_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -11990,62 +12838,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12106,8 +12983,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12155,8 +13034,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12204,70 +13085,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V4_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12364,62 +13281,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12480,8 +13426,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12529,8 +13477,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12578,70 +13528,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V5_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -12743,62 +13729,91 @@
 /* First word of flags. */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_OFST 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VXLAN_NVGRE_WIDTH 1
 /* RxDPCPU firmware id. */
@@ -12859,8 +13874,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXDP_TEST_FW_CSR 0x103
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_OFST 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12908,8 +13925,10 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_OFST 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
 /* enum: reserved value - do not use (may indicate alternative interpretation
@@ -12957,70 +13976,106 @@
 /* Second word of flags. Not present on older firmware (check the length). */
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_LBN 0
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_LBN 1
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_LBN 2
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_LBN 3
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_LBN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_LBN 5
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_LBN 7
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_LBN 8
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_LBN 9
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_LBN 10
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_LBN 11
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_LBN 13
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_LBN 14
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_LBN 15
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_LBN 16
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_LBN 17
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_LBN 19
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_LBN 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_LBN 22
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_LBN 24
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_LBN 25
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_LBN 28
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_LBN 29
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_LBN 30
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
 /* Number of FATSOv2 contexts per datapath supported by this NIC (when
@@ -13128,190 +14183,2248 @@
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
 #define	MC_CMD_GET_CAPABILITIES_V6_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
 
-
-/***********************************/
-/* MC_CMD_V2_EXTN
- * Encapsulation for a v2 extended command
+/* MC_CMD_GET_CAPABILITIES_V7_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LEN 152
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_V2_EXTN 0x7f
-
-/* MC_CMD_V2_EXTN_IN msgrequest */
-#define	MC_CMD_V2_EXTN_IN_LEN 4
-/* the extended command number */
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
-#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
-#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
-/* the actual length of the encapsulated command (which is not in the v1
- * header)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
-#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
-#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
-/* Type of command/response */
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
-#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
-/* enum: MCDI command directed to or response originating from the MC. */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
-/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
- * are not defined.
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_ALLOC
- * Allocate a pacer bucket (for qau rp or a snapper test)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
-#undef	MC_CMD_0xb2_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
-
-/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_FREE
- * Free a pacer bucket
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_BUCKET_FREE 0xb3
-#undef	MC_CMD_0xb3_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
-
-/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_BUCKET_INIT
- * Initialise pacer bucket with a given rate
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
  */
-#define	MC_CMD_TCM_BUCKET_INIT 0xb4
-#undef	MC_CMD_0xb4_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
-/* the bucket id */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
-/* the rate in mbps */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
-/* the desired maximum fill level */
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
-#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
-
-/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
-#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
-
-
-/***********************************/
-/* MC_CMD_TCM_TXQ_INIT
- * Initialise txq in pacer with given options or set options
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT 0xb5
-#undef	MC_CMD_0xb5_PRIVILEGE_CTG
-
-#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
-
-/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
-
-/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
-/* the txq id */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
-/* bitmask of the priority queues this txq is inserted into when inserted. */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
-/* the reaction point (RP) bucket */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
-/* an already reserved bucket (typically set to bucket associated with outer
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
-/* an already reserved bucket (typically set to bucket associated with inner
- * vswitch)
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
  */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
-/* the min bucket (typically for ETS/minimum bandwidth) */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
-/* the static priority associated with the txq */
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
-#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
-
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V7_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V7_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+
+/* MC_CMD_GET_CAPABILITIES_V8_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LEN 160
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V8_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V8_OUT_TEST_RESERVED_HI_OFST 156
+
+/* MC_CMD_GET_CAPABILITIES_V9_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LEN 184
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V9_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V9_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+
+/* MC_CMD_GET_CAPABILITIES_V10_OUT msgresponse */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LEN 192
+/* First word of flags. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS1_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VPORT_RECONFIGURE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_STRIPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_QUERY_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_PORT_VLAN_RESTRICT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DRV_ATTACH_PREBOOT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_FORCE_EVENT_MERGING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SET_MAC_ENHANCED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNKNOWN_UCAST_DST_FILTER_ALWAYS_MULTI_RECIPIENT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VADAPTOR_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_SECURITY_FILTERING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ADDITIONAL_RSS_MODES_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_QBB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_VAR_BUFFERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_RSS_LIMITED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_INCLUDE_FCS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VLAN_INSERTION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_0_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_PREFIX_LEN_14_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_BATCHING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCAST_FILTER_CHAINING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PM_AND_RXDP_COUNTERS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DISABLE_SCATTER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MCAST_UDP_LOOPBACK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVB_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_OFST 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VXLAN_NVGRE_WIDTH 1
+/* RxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_OFST 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DPCPU_FW_ID_LEN 2
+/* enum: Standard RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP 0x0
+/* enum: Low latency RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_LOW_LATENCY 0x1
+/* enum: Packed stream RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_PACKED_STREAM 0x2
+/* enum: Rules engine RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_RULES_ENGINE 0x5
+/* enum: DPDK RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_DPDK 0x6
+/* enum: BIST RXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_BIST 0x10a
+/* enum: RXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_CUT_THROUGH 0x101
+/* enum: RXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD 0x102
+/* enum: RXDP Test firmware image 3 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_TO_MC_STORE_FORWARD_FIRST 0x103
+/* enum: RXDP Test firmware image 4 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_EVERY_EVENT_BATCHABLE 0x104
+/* enum: RXDP Test firmware image 5 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_BACKPRESSURE 0x105
+/* enum: RXDP Test firmware image 6 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_PACKET_EDITS 0x106
+/* enum: RXDP Test firmware image 7 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_RX_HDR_SPLIT 0x107
+/* enum: RXDP Test firmware image 8 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DISABLE_DL 0x108
+/* enum: RXDP Test firmware image 9 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_DOORBELL_DELAY 0x10b
+/* enum: RXDP Test firmware image 10 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_TEST_FW_SLOW 0x10c
+/* TxDPCPU firmware id. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_OFST 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DPCPU_FW_ID_LEN 2
+/* enum: Standard TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP 0x0
+/* enum: Low latency TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_LOW_LATENCY 0x1
+/* enum: High packet rate TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_HIGH_PACKET_RATE 0x3
+/* enum: Rules engine TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_RULES_ENGINE 0x5
+/* enum: DPDK TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_DPDK 0x6
+/* enum: BIST TXDP firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_BIST 0x12d
+/* enum: TXDP Test firmware image 1 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_TSO_EDIT 0x101
+/* enum: TXDP Test firmware image 2 */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_PACKET_EDITS 0x102
+/* enum: TXDP CSR bus test firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXDP_TEST_FW_CSR 0x103
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_OFST 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial RX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: RX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: RX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant RX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+/* enum: Low latency RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LOW_LATENCY 0x5
+/* enum: Packed stream RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_PACKED_STREAM 0x6
+/* enum: RX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK RX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* enum: RX PD firmware parsing but not filtering network overlay tunnel
+ * encapsulations (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXPD_FW_TYPE_TESTFW_ENCAP_PARSING_ONLY 0xf
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_REV_WIDTH 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_OFST 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_VERSION_TYPE_WIDTH 4
+/* enum: reserved value - do not use (may indicate alternative interpretation
+ * of REV field in future)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RESERVED 0x0
+/* enum: Trivial TX PD firmware for early Huntington development (Huntington
+ * development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FIRST_PKT 0x1
+/* enum: TX PD firmware for telemetry prototyping (Medford2 development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_TELEMETRY 0x1
+/* enum: TX PD firmware with approximately Siena-compatible behaviour
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT 0x2
+/* enum: Full featured TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_FULL_FEATURED 0x3
+/* enum: (deprecated original name for the FULL_FEATURED variant) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_VSWITCH 0x3
+/* enum: siena_compat variant TX PD firmware using PM rather than MAC
+ * (Huntington development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_SIENA_COMPAT_PM 0x4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LOW_LATENCY 0x5 /* enum */
+/* enum: TX PD firmware handling layer 2 only for high packet rate performance
+ * tests (Medford development only)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_LAYER2_PERF 0x7
+/* enum: Rules engine TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_RULES_ENGINE 0x8
+/* enum: Custom firmware variant (see SF-119495-PD and bug69716) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_L3XUDP 0x9
+/* enum: DPDK TX PD production firmware */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_DPDK 0xa
+/* enum: RX PD firmware for GUE parsing prototype (Medford development only) */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TXPD_FW_TYPE_TESTFW_GUE_PROTOTYPE 0xe
+/* Hardware capabilities of NIC */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_OFST 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_HW_CAPABILITIES_LEN 4
+/* Licensed capabilities */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_OFST 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_LICENSE_CAPABILITIES_LEN 4
+/* Second word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS2_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_ENCAP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVQ_TIMER_CTRL_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EVENT_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_CUT_THROUGH_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_VFIFO_ULL_MODE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_40G_TX_SIZE_BINS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_TYPE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_EVQ_V2_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_LBN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_MAC_TIMESTAMPING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_LBN 9
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TIMESTAMP_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_LBN 10
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_LBN 11
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_SNIFF_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_LBN 12
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_REPORT_VERIFY_RESULT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_LBN 13
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_BACKGROUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_LBN 14
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MCDI_DB_RETURN_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_LBN 15
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_CTPIO_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_LBN 16
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_LBN 17
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TSA_BOUND_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_LBN 18
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SF_ADAPTER_AUTHENTICATION_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_LBN 19
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_FLAG_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_LBN 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_SUPER_BUFFER_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_LBN 21
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EQUAL_STRIDE_PACKED_STREAM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_LBN 22
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_L3XUDP_SUPPORT_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_LBN 23
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FW_SUBVARIANT_NO_TX_CSUM_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_LBN 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_LBN 25
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RXDP_HLB_IDLE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_LBN 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_NO_CONT_EV_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_LBN 27
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INIT_RXQ_WITH_BUFFER_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_LBN 28
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_BUNDLE_UPDATE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_LBN 29
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V3_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_LBN 30
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_DYNAMIC_SENSORS_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_OFST 20
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_LBN 31
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NVRAM_UPDATE_POLL_VERIFY_RESULT_WIDTH 1
+/* Number of FATSOv2 contexts per datapath supported by this NIC (when
+ * TX_TSO_V2 == 1). Not present on older firmware (check the length).
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_OFST 24
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_TSO_V2_N_CONTEXTS_LEN 2
+/* One byte per PF containing the number of the external port assigned to this
+ * PF, indexed by PF number. Special values indicate that a PF is either not
+ * present or not assigned.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_OFST 26
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PFS_TO_PORTS_ASSIGNMENT_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff
+/* enum: PF does not exist. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe
+/* enum: PF does exist but is not assigned to any external port. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_ASSIGNED 0xfd
+/* enum: This value indicates that PF is assigned, but it cannot be expressed
+ * in this field. It is intended for a possible future situation where a more
+ * complex scheme of PFs to ports mapping is being used. The future driver
+ * should look for a new field supporting the new scheme. The current/old
+ * driver should treat this value as PF_NOT_ASSIGNED.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_INCOMPATIBLE_ASSIGNMENT 0xfc
+/* One byte per PF containing the number of its VFs, indexed by PF number. A
+ * special value indicates that a PF is not present.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_OFST 42
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_LEN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VFS_PER_PF_NUM 16
+/* enum: The caller is not permitted to access information on this PF. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_ACCESS_NOT_PERMITTED 0xff */
+/* enum: PF does not exist. */
+/*               MC_CMD_GET_CAPABILITIES_V10_OUT_PF_NOT_PRESENT 0xfe */
+/* Number of VIs available for each external port */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_OFST 58
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_LEN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_VIS_PER_PORT_NUM 4
+/* Size of RX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ RX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_OFST 66
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_DESC_CACHE_SIZE_LEN 1
+/* Size of TX descriptor cache expressed as binary logarithm The actual size
+ * equals (2 ^ TX_DESC_CACHE_SIZE)
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_OFST 67
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TX_DESC_CACHE_SIZE_LEN 1
+/* Total number of available PIO buffers */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_OFST 68
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_NUM_PIO_BUFFS_LEN 2
+/* Size of a single PIO buffer */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_OFST 70
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SIZE_PIO_BUFF_LEN 2
+/* On chips later than Medford the amount of address space assigned to each VI
+ * is configurable. This is a global setting that the driver must query to
+ * discover the VI to address mapping. Cut-through PIO (CTPIO) is not available
+ * with 8k VI windows.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_OFST 72
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_LEN 1
+/* enum: Each VI occupies 8k as on Huntington and Medford. PIO is at offset 4k.
+ * CTPIO is not mapped.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_8K 0x0
+/* enum: Each VI occupies 16k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_16K 0x1
+/* enum: Each VI occupies 64k. PIO is at offset 4k. CTPIO is at offset 12k. */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VI_WINDOW_MODE_64K 0x2
+/* Number of vFIFOs per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_OFST 73
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_VFIFOS_LEN 1
+/* Number of buffers per adapter that can be used for VFIFO Stuffing
+ * (SF-115995-SW) in the present configuration of firmware and port mode.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_OFST 74
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VFIFO_STUFFING_NUM_CP_BUFFERS_LEN 2
+/* Entry count in the MAC stats array, including the final GENERATION_END
+ * entry. For MAC stats DMA, drivers should allocate a buffer large enough to
+ * hold at least this many 64-bit stats values, if they wish to receive all
+ * available stats. If the buffer is shorter than MAC_STATS_NUM_STATS * 8, the
+ * stats array returned will be truncated.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_OFST 76
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAC_STATS_NUM_STATS_LEN 2
+/* Maximum supported value for MC_CMD_FILTER_OP_V3/MATCH_MARK_VALUE. This field
+ * will only be non-zero if MC_CMD_GET_CAPABILITIES/FILTER_ACTION_MARK is set.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_OFST 80
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FILTER_ACTION_MARK_MAX_LEN 4
+/* On devices where the INIT_RXQ_WITH_BUFFER_SIZE flag (in
+ * GET_CAPABILITIES_OUT_V2) is set, drivers have to specify a buffer size when
+ * they create an RX queue. Due to hardware limitations, only a small number of
+ * different buffer sizes may be available concurrently. Nonzero entries in
+ * this array are the sizes of buffers which the system guarantees will be
+ * available for use. If the list is empty, there are no limitations on
+ * concurrent buffer sizes.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_OFST 84
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_RX_BUFFER_SIZES_NUM 16
+/* Third word of flags. Not present on older firmware (check the length). */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_FLAGS3_LEN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_LBN 0
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_WOL_ETHERWAKE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_LBN 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_EVEN_SPREADING_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_LBN 2
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_SELECTABLE_TABLE_SIZE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_LBN 3
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_MAE_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_LBN 4
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_VDPA_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_LBN 5
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RX_VLAN_STRIPPING_PER_ENCAP_RULE_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_LBN 6
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_EXTENDED_WIDTH_EVQS_SUPPORTED_WIDTH 1
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_OFST 148
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_LBN 7
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_UNSOL_EV_CREDIT_SUPPORTED_WIDTH 1
+/* These bits are reserved for communicating test-specific capabilities to
+ * host-side test software. All production drivers should treat this field as
+ * opaque.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LEN 8
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_LO_OFST 152
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_TEST_RESERVED_HI_OFST 156
+/* The minimum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_OFST 160
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MIN_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum size (in table entries) of indirection table to be allocated
+ * from the pool for an RSS context. Note that the table size used must be a
+ * power of 2.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_OFST 164
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE_LEN 4
+/* The maximum number of queues that can be used by an RSS context in exclusive
+ * mode. In exclusive mode the context has a configurable indirection table and
+ * a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_OFST 168
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_INDIRECTION_QUEUES_LEN 4
+/* The maximum number of queues that can be used by an RSS context in even-
+ * spreading mode. In even-spreading mode the context has no indirection table
+ * but it does have a configurable RSS key.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_OFST 172
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_MAX_EVEN_SPREADING_QUEUES_LEN 4
+/* The total number of RSS contexts supported. Note that the number of
+ * available contexts using indirection tables is also limited by the
+ * availability of indirection table space allocated from a common pool.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_OFST 176
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_NUM_CONTEXTS_LEN 4
+/* The total amount of indirection table space that can be shared between RSS
+ * contexts.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_OFST 180
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_RSS_TABLE_POOL_SIZE_LEN 4
+/* A bitmap of the queue sizes the device can provide, where bit N being set
+ * indicates that 2**N is a valid size. The device may be limited in the number
+ * of different queue sizes that can exist simultaneously, so a bit being set
+ * here does not guarantee that an attempt to create a queue of that size will
+ * succeed.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_OFST 184
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_SUPPORTED_QUEUE_SIZES_LEN 4
+/* A bitmap of queue sizes that are always available, in the same format as
+ * SUPPORTED_QUEUE_SIZES. Attempting to create a queue with one of these sizes
+ * will never fail due to unavailability of the requested size.
+ */
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_OFST 188
+#define	MC_CMD_GET_CAPABILITIES_V10_OUT_GUARANTEED_QUEUE_SIZES_LEN 4
+
+
+/***********************************/
+/* MC_CMD_V2_EXTN
+ * Encapsulation for a v2 extended command
+ */
+#define	MC_CMD_V2_EXTN 0x7f
+
+/* MC_CMD_V2_EXTN_IN msgrequest */
+#define	MC_CMD_V2_EXTN_IN_LEN 4
+/* the extended command number */
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_LBN 0
+#define	MC_CMD_V2_EXTN_IN_EXTENDED_CMD_WIDTH 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_LBN 15
+#define	MC_CMD_V2_EXTN_IN_UNUSED_WIDTH 1
+/* the actual length of the encapsulated command (which is not in the v1
+ * header)
+ */
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_LBN 16
+#define	MC_CMD_V2_EXTN_IN_ACTUAL_LEN_WIDTH 10
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_LBN 26
+#define	MC_CMD_V2_EXTN_IN_UNUSED2_WIDTH 2
+/* Type of command/response */
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_LBN 28
+#define	MC_CMD_V2_EXTN_IN_MESSAGE_TYPE_WIDTH 4
+/* enum: MCDI command directed to or response originating from the MC. */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_MC 0x0
+/* enum: MCDI command directed to a TSA controller. MCDI responses of this type
+ * are not defined.
+ */
+#define	MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_TSA 0x1
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_ALLOC
+ * Allocate a pacer bucket (for qau rp or a snapper test)
+ */
+#define	MC_CMD_TCM_BUCKET_ALLOC 0xb2
+#undef	MC_CMD_0xb2_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb2_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_ALLOC_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_ALLOC_IN_LEN 0
+
+/* MC_CMD_TCM_BUCKET_ALLOC_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_ALLOC_OUT_BUCKET_LEN 4
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_FREE
+ * Free a pacer bucket
+ */
+#define	MC_CMD_TCM_BUCKET_FREE 0xb3
+#undef	MC_CMD_0xb3_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb3_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_FREE_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_LEN 4
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_FREE_IN_BUCKET_LEN 4
+
+/* MC_CMD_TCM_BUCKET_FREE_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_FREE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_BUCKET_INIT
+ * Initialise pacer bucket with a given rate
+ */
+#define	MC_CMD_TCM_BUCKET_INIT 0xb4
+#undef	MC_CMD_0xb4_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb4_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_BUCKET_INIT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_LEN 8
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_IN_RATE_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_LEN 12
+/* the bucket id */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_OFST 0
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_BUCKET_LEN 4
+/* the rate in mbps */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_OFST 4
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_RATE_LEN 4
+/* the desired maximum fill level */
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_OFST 8
+#define	MC_CMD_TCM_BUCKET_INIT_EXT_IN_MAX_FILL_LEN 4
+
+/* MC_CMD_TCM_BUCKET_INIT_OUT msgresponse */
+#define	MC_CMD_TCM_BUCKET_INIT_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_TCM_TXQ_INIT
+ * Initialise txq in pacer with given options or set options
+ */
+#define	MC_CMD_TCM_TXQ_INIT 0xb5
+#undef	MC_CMD_0xb5_PRIVILEGE_CTG
+
+#define	MC_CMD_0xb5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_TCM_TXQ_INIT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LEN 28
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_LABEL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_IN_MIN_BKT_LEN 4
+
+/* MC_CMD_TCM_TXQ_INIT_EXT_IN msgrequest */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LEN 32
+/* the txq id */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_OFST 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_QID_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_OFST 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_NORMAL_LEN 4
+/* bitmask of the priority queues this txq is inserted into when inserted. */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAGS_LEN 4
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_LBN 0
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_GUARANTEED_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_LBN 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_NORMAL_WIDTH 1
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_OFST 8
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_LBN 2
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_PQ_FLAG_LOW_WIDTH 1
+/* the reaction point (RP) bucket */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_OFST 12
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_RP_BKT_LEN 4
+/* an already reserved bucket (typically set to bucket associated with outer
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_OFST 16
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT1_LEN 4
+/* an already reserved bucket (typically set to bucket associated with inner
+ * vswitch)
+ */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_OFST 20
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MAX_BKT2_LEN 4
+/* the min bucket (typically for ETS/minimum bandwidth) */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_OFST 24
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_MIN_BKT_LEN 4
+/* the static priority associated with the txq */
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_OFST 28
+#define	MC_CMD_TCM_TXQ_INIT_EXT_IN_LABEL_GUARANTEED_LEN 4
+
 /* MC_CMD_TCM_TXQ_INIT_OUT msgresponse */
 #define	MC_CMD_TCM_TXQ_INIT_OUT_LEN 0
 
@@ -13387,6 +16500,7 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VSWITCH_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
 /* The number of VLAN tags to allow for attached v-ports. For VLAN aggregators,
@@ -13481,8 +16595,10 @@
 /* Flags controlling v-port creation */
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_AUTO_PORT_WIDTH 1
+#define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_OFST 8
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_LBN 1
 #define	MC_CMD_VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -13494,8 +16610,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_OFST 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 
@@ -13542,8 +16660,10 @@
 /* Flags controlling v-adaptor creation */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_AUTO_VADAPTOR_WIDTH 1
+#define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_OFST 8
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_LBN 1
 #define	MC_CMD_VADAPTOR_ALLOC_IN_FLAG_PERMIT_SET_MAC_WHEN_FILTERS_INSTALLED_WIDTH 1
 /* The number of VLAN tags to strip on receive */
@@ -13555,8 +16675,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_OFST 20
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VADAPTOR_ALLOC_IN_VLAN_TAG_1_WIDTH 16
 /* The MAC address to assign to this v-adaptor */
@@ -13677,8 +16799,10 @@
 /* The target function to modify. */
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_FUNCTION_LEN 4
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_LBN 0
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_PF_WIDTH 16
+#define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_OFST 4
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_LBN 16
 #define	MC_CMD_EVB_PORT_ASSIGN_IN_VF_WIDTH 16
 
@@ -13792,12 +16916,68 @@
  * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_SHARED 0x1
-/* Number of queues spanned by this context, in the range 1-64; valid offsets
- * in the indirection table will be in the range 0 to NUM_QUEUES-1.
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
  */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_OFST 8
 #define	MC_CMD_RSS_CONTEXT_ALLOC_IN_NUM_QUEUES_LEN 4
 
+/* MC_CMD_RSS_CONTEXT_ALLOC_V2_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_LEN 16
+/* The handle of the owning upstream port */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_UPSTREAM_PORT_ID_LEN 4
+/* The type of context to allocate */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_OFST 4
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_LEN 4
+/* enum: Allocate a context for exclusive use. The key and indirection table
+ * must be explicitly configured.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EXCLUSIVE 0x0
+/* enum: Allocate a context for shared use; this will spread across a range of
+ * queues, but the key and indirection table are pre-configured and may not be
+ * changed. For this mode, NUM_QUEUES must 2, 4, 8, 16, 32 or 64.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_SHARED 0x1
+/* enum: Allocate a context to spread evenly across an arbitrary number of
+ * queues. No indirection table space is allocated for this context. (EF100 and
+ * later)
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_TYPE_EVEN_SPREADING 0x2
+/* Number of queues spanned by this context. For exclusive contexts this must
+ * be in the range 1 to RSS_MAX_INDIRECTION_QUEUES, where
+ * RSS_MAX_INDIRECTION_QUEUES is queried from MC_CMD_GET_CAPABILITIES_V9 or if
+ * V9 is not supported then RSS_MAX_INDIRECTION_QUEUES is 64. Valid entries in
+ * the indirection table will be in the range 0 to NUM_QUEUES-1. For even-
+ * spreading contexts this must be in the range 1 to
+ * RSS_MAX_EVEN_SPREADING_QUEUES as queried from MC_CMD_GET_CAPABILITIES. Note
+ * that specifying NUM_QUEUES = 1 will not perform any spreading but may still
+ * be useful as a way of obtaining the Toeplitz hash.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_OFST 8
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_NUM_QUEUES_LEN 4
+/* Size of indirection table to be allocated to this context from the pool.
+ * Must be a power of 2. The minimum and maximum table size can be queried
+ * using MC_CMD_GET_CAPABILITIES_V9. If there is not enough space remaining in
+ * the common pool to allocate the requested table size, due to allocating
+ * table space to other RSS contexts, then the command will fail with
+ * MC_CMD_ERR_ENOSPC.
+ */
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_OFST 12
+#define	MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_INDIRECTION_TABLE_SIZE_LEN 4
+
 /* MC_CMD_RSS_CONTEXT_ALLOC_OUT msgresponse */
 #define	MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN 4
 /* The handle of the new RSS context. This should be considered opaque to the
@@ -13875,7 +17055,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_TABLE
- * Set the indirection table for an RSS context.
+ * Set the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_SET_TABLE 0xa2
 #undef	MC_CMD_0xa2_PRIVILEGE_CTG
@@ -13897,7 +17079,9 @@
 
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_GET_TABLE
- * Get the indirection table for an RSS context.
+ * Get the indirection table for an RSS context. This command should only be
+ * used with indirection tables containing 128 entries, which is the default
+ * when the RSS context is allocated without specifying a table size.
  */
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE 0xa3
 #undef	MC_CMD_0xa3_PRIVILEGE_CTG
@@ -13917,6 +17101,93 @@
 #define	MC_CMD_RSS_CONTEXT_GET_TABLE_OUT_INDIRECTION_TABLE_LEN 128
 
 
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE
+ * Write a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_SET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE 0x13e
+#undef	MC_CMD_0x13e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMIN 8
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_LEN(num) (4+4*(num))
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_NUM(len) (((len)-4)/4)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array of index-value pairs to be written to the table. Structure is
+ * MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY.
+ */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_LEN 4
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM 62
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_IN_ENTRIES_MAXNUM_MCDI2 254
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_OUT_LEN 0
+
+/* MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY structuredef */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_LEN 4
+/* The index of the table entry to be written. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_OFST 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_LBN 0
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_INDEX_WIDTH 16
+/* The value to write into the table entry. */
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_OFST 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LEN 2
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_LBN 16
+#define	MC_CMD_RSS_CONTEXT_WRITE_TABLE_ENTRY_VALUE_WIDTH 16
+
+
+/***********************************/
+/* MC_CMD_RSS_CONTEXT_READ_TABLE
+ * Read a portion of a selectable-size indirection table for an RSS context.
+ * This command must be used instead of MC_CMD_RSS_CONTEXT_GET_TABLE if the
+ * RSS_SELECTABLE_TABLE_SIZE bit is set in MC_CMD_GET_CAPABILITIES.
+ */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE 0x13f
+#undef	MC_CMD_0x13f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x13f_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_IN msgrequest */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMIN 6
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_LEN(num) (4+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_NUM(len) (((len)-4)/2)
+/* The handle of the RSS context */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_RSS_CONTEXT_ID_LEN 4
+/* An array containing the indices of the entries to be read. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_OFST 4
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM 124
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_IN_INDICES_MAXNUM_MCDI2 508
+
+/* MC_CMD_RSS_CONTEXT_READ_TABLE_OUT msgresponse */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMIN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX 252
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_LEN(num) (0+2*(num))
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_NUM(len) (((len)-0)/2)
+/* A buffer containing the requested entries read from the table. */
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_OFST 0
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_LEN 2
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MINNUM 1
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM 126
+#define	MC_CMD_RSS_CONTEXT_READ_TABLE_OUT_DATA_MAXNUM_MCDI2 510
+
+
 /***********************************/
 /* MC_CMD_RSS_CONTEXT_SET_FLAGS
  * Set various control flags for an RSS context.
@@ -13945,26 +17216,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14004,26 +17286,37 @@
  */
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_FLAGS_LEN 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_LBN 0
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_LBN 1
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV4_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_LBN 2
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_IPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_LBN 3
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TOEPLITZ_TCPV6_EN_WIDTH 1
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_LBN 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_LBN 8
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_LBN 12
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_LBN 16
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV4_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_LBN 20
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_TCP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_LBN 24
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_UDP_IPV6_RSS_MODE_WIDTH 4
+#define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_OFST 4
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_LBN 28
 #define	MC_CMD_RSS_CONTEXT_GET_FLAGS_OUT_OTHER_IPV6_RSS_MODE_WIDTH 4
 
@@ -14275,8 +17568,10 @@
 /* Flags requesting what should be changed. */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS_WIDTH 1
+#define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_OFST 4
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_LBN 1
 #define	MC_CMD_VPORT_RECONFIGURE_IN_REPLACE_MACADDRS_WIDTH 1
 /* The number of VLAN tags to insert/remove. An error will be returned if
@@ -14288,8 +17583,10 @@
 /* The actual VLAN tags to insert/remove */
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_0_WIDTH 16
+#define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_OFST 12
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_LBN 16
 #define	MC_CMD_VPORT_RECONFIGURE_IN_VLAN_TAG_1_WIDTH 16
 /* The number of MAC addresses to add */
@@ -14304,6 +17601,7 @@
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_LEN 4
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_FLAGS_LEN 4
+#define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_OFST 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_LBN 0
 #define	MC_CMD_VPORT_RECONFIGURE_OUT_RESET_DONE_WIDTH 1
 
@@ -14383,8 +17681,10 @@
 #define	MC_CMD_SET_RXDP_CONFIG_IN_LEN 4
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_DATA_LEN 4
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_SET_RXDP_CONFIG_IN_PAD_HOST_LEN_WIDTH 2
 /* enum: pad to 64 bytes */
@@ -14414,8 +17714,10 @@
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_LEN 4
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_DATA_LEN 4
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_LBN 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_DMA_WIDTH 1
+#define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_OFST 0
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_LBN 1
 #define	MC_CMD_GET_RXDP_CONFIG_OUT_PAD_HOST_LEN_WIDTH 2
 /*             Enum values, see field(s): */
@@ -14564,6 +17866,7 @@
  */
 #define	MC_CMD_DPCPU_RPC_IN_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_LBN 8
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_CMDNUM_WIDTH 8
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_TXDPCPU_READ 0x6 /* enum */
@@ -14575,14 +17878,19 @@
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SELF_TEST 0x4a /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_CSR_ACCESS 0x4c /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CMDNUM_RXDPCPU_SET_MC_REPLAY_CNTXT 0x4d /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_OBJID_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_ADDR_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_HDR_CMD_REQ_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_INFO_WIDTH 240
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_STOP_RETURN_RESULT 0x0 /* enum */
@@ -14590,17 +17898,22 @@
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_WRITE_READ 0x3 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_CMD_START_PIPELINED_READ 0x4 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_LBN 48
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_START_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_RPT_COUNT_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_LBN 80
 #define	MC_CMD_DPCPU_RPC_IN_CSR_ACCESS_GAP_DELAY_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_LBN 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_CUT_THROUGH 0x1 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD 0x2 /* enum */
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_MODE_STORE_FORWARD_FIRST 0x3 /* enum */
+#define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_OFST 4
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_LBN 64
 #define	MC_CMD_DPCPU_RPC_IN_MC_REPLAY_CNTXT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_IN_WDATA_OFST 12
@@ -14619,8 +17932,10 @@
 /* DATA */
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_DATA_LEN 32
+#define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_LBN 32
 #define	MC_CMD_DPCPU_RPC_OUT_HDR_CMD_RESP_ERRCODE_WIDTH 16
+#define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_OFST 4
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_LBN 48
 #define	MC_CMD_DPCPU_RPC_OUT_CSR_ACCESS_READ_COUNT_WIDTH 16
 #define	MC_CMD_DPCPU_RPC_OUT_RDATA_OFST 12
@@ -15122,6 +18437,7 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15, Huntington) */
@@ -15248,6 +18564,7 @@
 /* enum: DFE Tap5 - retimer hostside (Medford2 with DS250x retimer (-15 - 15))
  */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_DFE_TAP5_RT_HS 0x2d
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15255,12 +18572,16 @@
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15282,20 +18603,26 @@
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 11
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_LBN 12
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 4
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15323,6 +18650,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TX Amplitude (Huntington, Medford, Medford2) */
@@ -15363,6 +18691,7 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_ADV_RT_HS 0x11
 /* enum: Post-cursor Tap (Retimer Hostside) */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_TAP_DLY_RT_HS 0x12
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 3
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15370,10 +18699,13 @@
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_2 0x2 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_3 0x3 /* enum */
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_LANE_ALL 0x4 /* enum */
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_OFST 0
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_GET_OUT_RESERVED2_WIDTH 8
 
@@ -15395,18 +18727,23 @@
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_LANE_WIDTH 3
 /*             Enum values, see field(s): */
 /*                MC_CMD_KR_TUNE_TXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_LBN 11
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED_WIDTH 5
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_KR_TUNE_TXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15447,8 +18784,10 @@
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_START_EYE_PLOT_V2_IN_LANE_ABS_REL_WIDTH 1
 /* Scan duration / cycle count */
@@ -15489,8 +18828,10 @@
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_KR_TUNE_RSVD_LEN 3
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_LEN 4
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_LBN 0
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_NUM_WIDTH 8
+#define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_OFST 4
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_LBN 31
 #define	MC_CMD_KR_TUNE_READ_FOM_IN_LANE_ABS_REL_WIDTH 1
 
@@ -15644,6 +18985,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: Attenuation (0-15) */
@@ -15668,6 +19010,7 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQC 0x9
 /* enum: CTLE EQ Resistor (DC Gain) */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_CTLE_EQRES 0xa
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_LANE_WIDTH 5
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_0 0x0 /* enum */
@@ -15687,10 +19030,13 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_14 0xe /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_15 0xf /* enum */
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_LANE_ALL 0x10 /* enum */
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_RESERVED_WIDTH 10
+#define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -15712,20 +19058,26 @@
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM 62
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_MAXNUM_MCDI2 254
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_ID_WIDTH 8
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_ID */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_LANE_WIDTH 5
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_LBN 13
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_AUTOCAL_WIDTH 1
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_LBN 14
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED_WIDTH 2
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_LBN 16
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_PARAM_INITIAL_WIDTH 8
+#define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_OFST 4
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_LBN 24
 #define	MC_CMD_PCIE_TUNE_RXEQ_SET_IN_RESERVED2_WIDTH 8
 
@@ -15753,6 +19105,7 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MINNUM 1
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM 63
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_MAXNUM_MCDI2 255
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_LBN 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_ID_WIDTH 8
 /* enum: TxMargin (PIPE) */
@@ -15765,12 +19118,15 @@
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_C0 0x3
 /* enum: De-emphasis coefficient C(+1) (PIPE) */
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_CP1 0x4
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_LBN 8
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_LANE_WIDTH 4
 /*             Enum values, see field(s): */
 /*                MC_CMD_PCIE_TUNE_RXEQ_GET_OUT/PARAM_LANE */
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_LBN 12
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_RESERVED_WIDTH 12
+#define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_OFST 0
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_LBN 24
 #define	MC_CMD_PCIE_TUNE_TXEQ_GET_OUT_PARAM_CURRENT_WIDTH 8
 
@@ -16335,8 +19691,10 @@
 /* configuration flags */
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
+#define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_OFST 0
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_LBN 1
 #define	MC_CMD_SET_PORT_SNIFF_CONFIG_IN_PROMISCUOUS_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16379,8 +19737,10 @@
 /* configuration flags */
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_OFST 0
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_LBN 1
 #define	MC_CMD_GET_PORT_SNIFF_CONFIG_OUT_PROMISCUOUS_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16501,6 +19861,7 @@
 /* configuration flags */
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_OFST 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_LBN 0
 #define	MC_CMD_SET_TX_PORT_SNIFF_CONFIG_IN_ENABLE_WIDTH 1
 /* receive queue handle (for RSS mode, this is the base queue) */
@@ -16543,6 +19904,7 @@
 /* configuration flags */
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_FLAGS_LEN 4
+#define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_OFST 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_LBN 0
 #define	MC_CMD_GET_TX_PORT_SNIFF_CONFIG_OUT_ENABLE_WIDTH 1
 /* receiving queue handle (for RSS mode, this is the base queue) */
@@ -16576,6 +19938,7 @@
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RX_QUEUE_LEN 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_FLAGS_LEN 4
+#define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_OFST 4
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_LBN 0
 #define	MC_CMD_RMON_STATS_RX_ERRORS_IN_RST_WIDTH 1
 
@@ -16699,6 +20062,7 @@
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_LEN 8
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_FLAGS_LEN 4
+#define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_OFST 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_LBN 0
 #define	MC_CMD_OVERRIDE_PORT_MODE_IN_ENABLE_WIDTH 1
 /* New mode (TLV_PORT_MODE_*) to set, if override enabled */
@@ -16792,8 +20156,10 @@
  */
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_FUNCTION_VF_WIDTH 16
 #define	MC_CMD_PRIVILEGE_MASK_IN_VF_NULL 0xffff /* enum */
@@ -16866,8 +20232,10 @@
  */
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_LEN 4
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_OFST 0
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_LINK_STATE_MODE_IN_FUNCTION_VF_WIDTH 16
 /* New link state mode to be set */
@@ -16986,8 +20354,10 @@
 /* For VFS_OF_PF specify the PF, for ONE specify the target function */
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_LEN 4
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_LBN 0
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_PF_WIDTH 16
+#define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_OFST 4
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_LBN 16
 #define	MC_CMD_PRIVILEGE_MODIFY_IN_FUNCTION_VF_WIDTH 16
 /* Privileges to be added to the target functions. For privilege definitions
@@ -17342,34 +20712,49 @@
 /* fields to include in match criteria */
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_FIELDS_LEN 4
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_LBN 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_LBN 1
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_IP_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_LBN 2
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_LBN 3
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_LBN 4
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_MAC_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_LBN 5
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_LBN 6
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_LBN 7
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_INNER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_LBN 8
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_LBN 9
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_LBN 10
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_PHYSICAL_PORT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_LBN 11
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_RESERVED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_LBN 12
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_SUBNET_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_LBN 13
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_REMOTE_PORTRANGE_ID_WIDTH 1
+#define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_OFST 0
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_LBN 14
 #define	MC_CMD_SET_SECURITY_RULE_IN_MATCH_LOCAL_PORTRANGE_ID_WIDTH 1
 /* remote MAC address to match (as bytes in network order) */
@@ -17792,6 +21177,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING_WIDTH 1
 /* The number of entries in the ENTRIES array */
@@ -17811,6 +21197,7 @@
 /* Flags */
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS_LEN 2
+#define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_OFST 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_LBN 0
 #define	MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_WIDTH 1
 
@@ -18871,10 +22258,13 @@
 /* Flags specifying what type of security features are being set */
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_FLAGS_LEN 4
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_LBN 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SECURE_BOOT_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_LBN 1
 #define	MC_CMD_SET_SECURITY_FUSES_IN_REJECT_TEST_SIGNED_WIDTH 1
+#define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_OFST 0
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_LBN 31
 #define	MC_CMD_SET_SECURITY_FUSES_IN_SOFT_CONFIG_WIDTH 1
 
@@ -18909,6 +22299,7 @@
 #define	MC_CMD_TSA_INFO_IN_LEN 4
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_OP_WIDTH 16
 /* enum: Information about recently discovered local IP address of the adapter
@@ -18946,10 +22337,13 @@
  */
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_LBN 8
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_LBN 16
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_REASON_WIDTH 8
 /* enum: ARP reply sent out of the physical port */
@@ -18960,8 +22354,10 @@
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_GRATUITOUS_ARP 0x2
 /* enum: DHCP ACK packet received on the physical port */
 #define	MC_CMD_TSA_INFO_IP_REASON_RX_DHCP_ACK 0x3
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_LBN 24
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_META_IPV4_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_OFST 4
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_LBN 25
 #define	MC_CMD_TSA_INFO_IN_LOCAL_IP_RESERVED1_WIDTH 7
 /* IPV4 address retrieved from the sampled packets. This field is relevant only
@@ -19001,18 +22397,25 @@
 /* Additional metadata describing the sampled packet */
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_LEN 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_LBN 0
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_PORT_INDEX_WIDTH 8
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_LBN 8
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_DIRECTION_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_LBN 9
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_RESERVED_WIDTH 7
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_MASK_WIDTH 4
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_LBN 16
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_ALLOW_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_LBN 17
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_DENY_WIDTH 1
+#define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_OFST 4
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_LBN 18
 #define	MC_CMD_TSA_INFO_IN_PKT_SAMPLE_META_ACTION_COUNT_WIDTH 1
 /* 128-byte raw prefix of the sampled packet which includes the ethernet
@@ -19034,6 +22437,7 @@
 #define	MC_CMD_TSA_INFO_IN_UNBIND_LEN 12
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_HDR_LEN 4
+#define	MC_CMD_TSA_INFO_IN_UNBIND_OP_OFST 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_LBN 0
 #define	MC_CMD_TSA_INFO_IN_UNBIND_OP_WIDTH 16
 /* Type of the unbind attempt. */
@@ -19072,6 +22476,7 @@
 /* sub-operation code info */
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_HOST_INFO_IN_OP_OFST 0
 #define	MC_CMD_HOST_INFO_IN_OP_LBN 0
 #define	MC_CMD_HOST_INFO_IN_OP_WIDTH 16
 /* enum: Read a 16-byte unique host identifier from the adapter. This UUID
@@ -19138,6 +22543,7 @@
 /* sub-operation code info */
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSAN_INFO_IN_OP_OFST 0
 #define	MC_CMD_TSAN_INFO_IN_OP_LBN 0
 #define	MC_CMD_TSAN_INFO_IN_OP_WIDTH 16
 /* enum: Read configuration parameters and IDs that uniquely identify an
@@ -19157,10 +22563,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19181,10 +22590,13 @@
 /* Information about the configuration parameters returned in this response. */
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CONFIG_WORD_LEN 4
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_CAP_FLAGS_WIDTH 16
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_LBN 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_FLAG_HOST_UUID_VALID_WIDTH 1
+#define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_OFST 0
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_LBN 16
 #define	MC_CMD_TSAN_INFO_OUT_GET_CFG_V2_NUM_PORTS_WIDTH 8
 /* 16-byte host UUID read out of the adapter. See MC_CMD_HOST_INFO_OP_GET_UUID
@@ -19270,8 +22682,10 @@
 /* Parameters describing the statistics operation */
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_FLAGS_LEN 4
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_LBN 0
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_READ_WIDTH 1
+#define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_OFST 4
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_LBN 1
 #define	MC_CMD_TSA_STATISTICS_IN_READ_CLEAR_CLEAR_WIDTH 1
 /* Counter ID list specification type */
@@ -19458,6 +22872,7 @@
  */
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_OFST 0
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LEN 4
+#define	MC_TSA_IPV4_ITEM_PORT_IDX_OFST 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_LBN 0
 #define	MC_TSA_IPV4_ITEM_PORT_IDX_WIDTH 8
 #define	MC_TSA_IPV4_ITEM_IPV4_ADDR_META_LBN 0
@@ -19488,6 +22903,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_OP_WIDTH 16
 /* enum: Request that the adapter verifies that the IPv4 addresses supplied are
@@ -19516,6 +22932,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_VALIDATE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to validate. */
@@ -19545,6 +22962,7 @@
  */
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_HDR_LEN 4
+#define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_OFST 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_LBN 0
 #define	MC_CMD_TSA_IPADDR_IN_REMOVE_IPV4_OP_WIDTH 16
 /* Number of IPv4 addresses to remove. */
@@ -19579,6 +22997,7 @@
 /* sub-operation code info */
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_HDR_LEN 4
+#define	MC_CMD_SECURE_NIC_INFO_IN_OP_OFST 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_LBN 0
 #define	MC_CMD_SECURE_NIC_INFO_IN_OP_WIDTH 16
 /* enum: Get the status of various security settings, all signed along with a
@@ -19811,6 +23230,12 @@
  * FRU_INFORMATION partition. Attempts to write to read-only FRUs are rejected.
  */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE 0x7
+/* enum: Read UDID Vendor Specific ID from SUC persistent storage. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ 0x8
+/* enum: Write UDID Vendor Specific ID to SUC persistent storage for use in
+ * SMBus ARP.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE 0x9
 
 /* MC_CMD_SUC_MANFTEST_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_OUT_LEN 0
@@ -19867,12 +23292,16 @@
 /* The combined status of the calibration operation. */
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FLAGS_LEN 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_LBN 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_CALIBRATING_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_LBN 1
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_FAILED_WIDTH 1
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_LBN 2
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_RESULT_WIDTH 4
+#define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_OFST 0
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_LBN 6
 #define	MC_CMD_SUC_MANFTEST_ADC_CALIBRATE_STATUS_OUT_INDEX_WIDTH 2
 
@@ -19936,6 +23365,34 @@
 /* MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT msgresponse */
 #define	MC_CMD_SUC_MANFTEST_FRU_WRITE_OUT_LEN 0
 
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_LEN 4
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_READ.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_IN_OP_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_READ_OUT_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN msgrequest */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_LEN 8
+/* The manftest operation to be performed. This must be
+ * MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE.
+ */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_OFST 0
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_OP_LEN 4
+/* The SMBus ID. */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_OFST 4
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_IN_SMBUS_ID_LEN 4
+
+/* MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT msgresponse */
+#define	MC_CMD_SUC_MANFTEST_SMBUS_ID_WRITE_OUT_LEN 0
+
 
 /***********************************/
 /* MC_CMD_GET_CERTIFICATE
@@ -20112,10 +23569,13 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_NUM(len) (((len)-8)/8)
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FLAGS_LEN 4
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_HW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_LBN 1
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_FW_BUFFER_OVERFLOW_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_OFST 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_LBN 31
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_CONTINUES_WIDTH 1
 /* The number of rows present in this response. */
@@ -20128,12 +23588,16 @@
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MINNUM 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM 30
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_ROWS_MAXNUM_MCDI2 126
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_LBN 0
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_LTSSM_STATE_WIDTH 6
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_LBN 6
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_RDLH_LINK_UP_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_LBN 7
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_WAKE_N_WIDTH 1
+#define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_OFST 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_LBN 8
 #define	MC_CMD_LTSSM_TRACE_POLL_OUT_TIMESTAMP_PS_WIDTH 24
 /* The time of the LTSSM transition. Times are reported as fractional
@@ -20184,14 +23648,19 @@
  */
 #define	TELEMETRY_CONFIG_FLAGS_OFST 0
 #define	TELEMETRY_CONFIG_FLAGS_LEN 4
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_LBN 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_IP_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_LBN 1
 #define	TELEMETRY_CONFIG_METRICS_COLLECTOR_PORT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_LBN 2
 #define	TELEMETRY_CONFIG_MONITOR_TIMEOUT_MS_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_OFST 0
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_LBN 3
 #define	TELEMETRY_CONFIG_MAX_METRICS_COUNT_VALID_WIDTH 1
+#define	TELEMETRY_CONFIG_RESERVED1_OFST 0
 #define	TELEMETRY_CONFIG_RESERVED1_LBN 4
 #define	TELEMETRY_CONFIG_RESERVED1_WIDTH 28
 #define	TELEMETRY_CONFIG_FLAGS_LBN 0
@@ -20320,24 +23789,34 @@
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LEN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_LO_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_FIELDS_HI_OFST 4
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_LBN 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_LBN 1
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_LBN 2
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_LBN 3
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CLASS_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_LBN 4
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_LBN 5
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_LBN 6
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_LBN 7
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_LBN 8
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME_WIDTH 1
+#define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_OFST 0
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_LBN 9
 #define	MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI_WIDTH 1
 
@@ -20534,36 +24013,24 @@
 
 /* MC_CMD_GET_VPD_IN msgresponse */
 #define	MC_CMD_GET_VPD_IN_LEN 4
-/* To request only VPD tags from a certain origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_OFST 0
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LEN 2
-/* enum: Return all VPD regardless of origin. */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_ALL 0x0
-/* enum: Return only VPD tags generated by MCFW (not stored in NVRAM) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_LIVE 0x1
-/* enum: Return only VPD tags stored in NVRAM (not generated by MCFW) */
-#define	MC_CMD_GET_VPD_IN_STORAGE_TYPE_NVRAM 0x2
 /* VPD address to start from. In case VPD is longer than MCDI buffer
  * (unlikely), user can make multiple calls with different starting addresses.
  */
-#define	MC_CMD_GET_VPD_IN_ADDR_OFST 2
-#define	MC_CMD_GET_VPD_IN_ADDR_LEN 2
+#define	MC_CMD_GET_VPD_IN_ADDR_OFST 0
+#define	MC_CMD_GET_VPD_IN_ADDR_LEN 4
 
 /* MC_CMD_GET_VPD_OUT msgresponse */
-#define	MC_CMD_GET_VPD_OUT_LENMIN 5
+#define	MC_CMD_GET_VPD_OUT_LENMIN 0
 #define	MC_CMD_GET_VPD_OUT_LENMAX 252
 #define	MC_CMD_GET_VPD_OUT_LENMAX_MCDI2 1020
-#define	MC_CMD_GET_VPD_OUT_LEN(num) (4+1*(num))
-#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-4)/1)
-/* Length of VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATALEN_OFST 0
-#define	MC_CMD_GET_VPD_OUT_DATALEN_LEN 4
+#define	MC_CMD_GET_VPD_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_GET_VPD_OUT_DATA_NUM(len) (((len)-0)/1)
 /* VPD data returned. */
-#define	MC_CMD_GET_VPD_OUT_DATA_OFST 4
+#define	MC_CMD_GET_VPD_OUT_DATA_OFST 0
 #define	MC_CMD_GET_VPD_OUT_DATA_LEN 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 1
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 248
-#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1016
+#define	MC_CMD_GET_VPD_OUT_DATA_MINNUM 0
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM 252
+#define	MC_CMD_GET_VPD_OUT_DATA_MAXNUM_MCDI2 1020
 
 
 /***********************************/
@@ -20599,12 +24066,16 @@
 /* General status */
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATUS_LEN 4
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_LBN 0
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_STATE_WIDTH 2
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_LBN 2
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ENABLE_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_LBN 3
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_NETWORK_TX_WIDTH 1
+#define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_OFST 8
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_LBN 4
 #define	MC_CMD_GET_NCSI_INFO_LINK_OUT_ATTACHED_WIDTH 1
 
@@ -20632,59 +24103,55 @@
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_OFST 24
 #define	MC_CMD_GET_NCSI_INFO_STATISTICS_OUT_AENS_SENT_LEN 4
 
-/* EF100_MCDI_EVENT structuredef: The structure of an MCDI_EVENT on EF100
- * platforms
+
+/***********************************/
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN
+ * System lockdown, when enabled firmware updates are blocked.
  */
-#define	EF100_MCDI_EVENT_LEN 8
-/* Defined by QMDA. Will be 1 for all SFC events */
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_LBN 0
-#define	EF100_MCDI_EVENT_EV_DATA_FORMAT_WIDTH 1
-/* Defined by QMDA. The phase bit, changes each time round the event ring */
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_LBN 1
-#define	EF100_MCDI_EVENT_EV_EVQ_PHASE_WIDTH 1
-/* Defined by QDMA. Meaning unclear. */
-#define	EF100_MCDI_EVENT_EV_ERROR_LBN 2
-#define	EF100_MCDI_EVENT_EV_ERROR_WIDTH 1
-/* Defined by QMDA. Indicates a descriptor was consumed. */
-#define	EF100_MCDI_EVENT_EV_DESC_USED_LBN 3
-#define	EF100_MCDI_EVENT_EV_DESC_USED_WIDTH 1
-/* Indicates the top-level type of the event. Event types are as documented in
- * SF-119689-TC and defined in events.yml. For MCDI events it's always
- * EF100_EV_MCDI. HW can generate other event type for its events.
- */
-#define	EF100_MCDI_EVENT_EV_TYPE_LBN 4
-#define	EF100_MCDI_EVENT_EV_TYPE_WIDTH 4
-#define	EF100_MCDI_EVENT_CODE_OFST 1
-#define	EF100_MCDI_EVENT_CODE_LEN 1
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/CODE */
-#define	EF100_MCDI_EVENT_CODE_LBN 8
-#define	EF100_MCDI_EVENT_CODE_WIDTH 8
-/* Data associated with PTP events which doesn't fit into the main DATA field
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN 0x16f
+#undef	MC_CMD_0x16f_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16f_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_IN msgrequest: This MCDI command is to enable
+ * only because lockdown can only be disabled by a PMCI command or a cold reset
+ * of the system.
  */
-#define	EF100_MCDI_EVENT_PTP_DATA_OFST 2
-#define	EF100_MCDI_EVENT_PTP_DATA_LEN 1
-#define	EF100_MCDI_EVENT_PTP_DATA_LBN 16
-#define	EF100_MCDI_EVENT_PTP_DATA_WIDTH 8
-/* Alias for PTP_DATA. Nobody uses SRC to mean the source of anything, but
- * there's code that uses it to refer to ptp data
- */
-#define	EF100_MCDI_EVENT_SRC_OFST 2
-#define	EF100_MCDI_EVENT_SRC_LEN 1
-#define	EF100_MCDI_EVENT_SRC_LBN 16
-#define	EF100_MCDI_EVENT_SRC_WIDTH 8
-/* Set if this message continues into another event */
-#define	EF100_MCDI_EVENT_CONT_LBN 24
-#define	EF100_MCDI_EVENT_CONT_WIDTH 1
-#define	EF100_MCDI_EVENT_LEVEL_LBN 25
-#define	EF100_MCDI_EVENT_LEVEL_WIDTH 3
-/*            Enum values, see field(s): */
-/*               MCDI_EVENT/LEVEL */
-/* Data associated with this event. Format depends on the event code. */
-#define	EF100_MCDI_EVENT_DATA_OFST 4
-#define	EF100_MCDI_EVENT_DATA_LEN 4
-#define	EF100_MCDI_EVENT_DATA_LBN 32
-#define	EF100_MCDI_EVENT_DATA_WIDTH 32
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_IN_LEN 0
+
+/* MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT msgresponse */
+#define	MC_CMD_FIRMWARE_SET_LOCKDOWN_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_TEST_FEATURES
+ * This command returns device details knowledge of which may be required by
+ * test infrastructure. Although safe, it is not intended to be used by
+ * production drivers, and the structure returned intentionally has no public
+ * documentation.
+ */
+#define	MC_CMD_GET_TEST_FEATURES 0x1ac
+#undef	MC_CMD_0x1ac_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1ac_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_GET_TEST_FEATURES_IN msgrequest: Request test features. */
+#define	MC_CMD_GET_TEST_FEATURES_IN_LEN 0
+
+/* MC_CMD_GET_TEST_FEATURE_OUT msgresponse */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMIN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX 252
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_GET_TEST_FEATURE_OUT_LEN(num) (0+4*(num))
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_NUM(len) (((len)-0)/4)
+/* Test-specific NIC information. Production drivers must treat this as opaque.
+ * The layout is defined in the private TEST_FEATURES_LAYOUT structure.
+ */
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_OFST 0
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_LEN 4
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MINNUM 1
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM 63
+#define	MC_CMD_GET_TEST_FEATURE_OUT_TEST_FEATURES_MAXNUM_MCDI2 255
 
 /* CLOCK_INFO structuredef: Information about a single hardware clock */
 #define	CLOCK_INFO_LEN 28
@@ -20710,6 +24177,7 @@
 /* Assorted flags */
 #define	CLOCK_INFO_FLAGS_OFST 2
 #define	CLOCK_INFO_FLAGS_LEN 2
+#define	CLOCK_INFO_SETTABLE_OFST 2
 #define	CLOCK_INFO_SETTABLE_LBN 0
 #define	CLOCK_INFO_SETTABLE_WIDTH 1
 #define	CLOCK_INFO_FLAGS_LBN 16
@@ -20754,4 +24222,1481 @@
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM 9
 #define	MC_CMD_GET_CLOCKS_INFO_OUT_INFOS_MAXNUM_MCDI2 36
 
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_ADD
+ * Add a rule for detecting encapsulations in the VNIC stage. Currently this
+ * only affects checksum validation in VNIC RX - on TX the send descriptor
+ * explicitly specifies encapsulation. These rules are per-VNIC, i.e. only
+ * apply to the current driver. If a rule matches, then the packet is
+ * considered to have the corresponding encapsulation type, and the inner
+ * packet is parsed. It is up to the driver to ensure that overlapping rules
+ * are not inserted. (If a packet would match multiple rules, a random one of
+ * them will be used.) A rule with the exact same match criteria may not be
+ * inserted twice (EALREADY). Only a limited number MATCH_FLAGS values are
+ * supported, use MC_CMD_GET_PARSER_DISP_INFO with OP
+ * OP_GET_SUPPORTED_VNIC_ENCAP_RULE_MATCHES to get a list of supported
+ * combinations. Each driver may only have a limited set of active rules -
+ * returns ENOSPC if the caller's table is full.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD 0x16d
+#undef	MC_CMD_0x16d_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16d_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN 36
+/* Set to MAE_MPORT_SELECTOR_ASSIGNED. In the future this may be relaxed. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR_LEN 4
+/* Any non-zero bits other than the ones named below or an unsupported
+ * combination will cause the NIC to return EOPNOTSUPP. In the future more
+ * flags may be added.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS_LEN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN 3
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_WIDTH 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_OFST 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN 4
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_WIDTH 1
+/* Only if MATCH_ETHER_TYPE is set. Ethertype value as bytes in network order.
+ * Currently only IPv4 (0x0800) and IPv6 (0x86DD) ethertypes may be used.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_OFST 8
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE_LEN 2
+/* Only if MATCH_OUTER_VLAN is set. VID value as bytes in network order.
+ * (Deprecated)
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_LBN 80
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WIDTH 12
+/* Only if MATCH_OUTER_VLAN is set. Aligned wrapper for OUTER_VLAN_VID. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD_LEN 2
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_OFST 10
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_VID_WIDTH 12
+/* Only if MATCH_DST_IP is set. IP address as bytes in network order. In the
+ * case of IPv4, the IP should be in the first 4 bytes and all other bytes
+ * should be zero.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_OFST 12
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN 16
+/* Only if MATCH_IP_PROTO is set. Currently only UDP proto (17) may be used. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_OFST 28
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_IP_PROTO_LEN 1
+/* Actions that should be applied to packets match the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ACTION_FLAGS_LEN 1
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_OFST 29
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_LBN 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_STRIP_OUTER_VLAN_WIDTH 1
+/* Only if MATCH_DST_PORT is set. Port number as bytes in network order. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_OFST 30
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_PORT_LEN 2
+/* Resulting encapsulation type, as per MAE_MCDI_ENCAP_TYPE enumeration. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_OFST 32
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_ADD_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN 4
+/* Handle to inserted rule. Used for removing the rule. */
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_HANDLE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE
+ * Remove a VNIC encapsulation rule. Packets which would have previously
+ * matched the rule will then be considered as unencapsulated. Returns EALREADY
+ * if the input HANDLE doesn't correspond to an existing rule.
+ */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE 0x16e
+#undef	MC_CMD_0x16e_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16e_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN msgrequest */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN 4
+/* Handle which was returned by MC_CMD_VNIC_ENCAP_RULE_ADD. */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_OFST 0
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_HANDLE_LEN 4
+
+/* MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT msgresponse */
+#define	MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN 0
+
+/* UUID structuredef: An RFC4122 standard UUID. The values here are stored in
+ * the endianness specified by the RFC; users should ignore the broken-out
+ * fields and instead do straight memory copies to ensure correct ordering.
+ */
+#define	UUID_LEN 16
+#define	UUID_TIME_LOW_OFST 0
+#define	UUID_TIME_LOW_LEN 4
+#define	UUID_TIME_LOW_LBN 0
+#define	UUID_TIME_LOW_WIDTH 32
+#define	UUID_TIME_MID_OFST 4
+#define	UUID_TIME_MID_LEN 2
+#define	UUID_TIME_MID_LBN 32
+#define	UUID_TIME_MID_WIDTH 16
+#define	UUID_TIME_HI_LBN 52
+#define	UUID_TIME_HI_WIDTH 12
+#define	UUID_VERSION_LBN 48
+#define	UUID_VERSION_WIDTH 4
+#define	UUID_RESERVED_LBN 64
+#define	UUID_RESERVED_WIDTH 2
+#define	UUID_CLK_SEQ_LBN 66
+#define	UUID_CLK_SEQ_WIDTH 14
+#define	UUID_NODE_OFST 10
+#define	UUID_NODE_LEN 6
+#define	UUID_NODE_LBN 80
+#define	UUID_NODE_WIDTH 48
+
+/* MC_CMD_DEVEL_DUMP_VI_ENTRY structuredef */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_LEN 28
+/* Type of entry */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_C2H 0x0 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_SW_H2C 0x1 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_C2H 0x2 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_HW_H2C 0x3 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_C2H 0x4 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_CR_H2C 0x5 /* enum */
+/* enum: First QDMA writeback/completion queue. Used for ef100, C2H VDPA and
+ * plain virtio.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_WRB 0x6
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QDMA_PFTCH 0x7 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_QTBL 0x100 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_C2H_QTBL 0x101 /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_DMAC_H2C_VIO 0x10a /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_TYPE_WIDTH 32
+/* Internal QDMA/dmac queue number for this entry */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QUEUE_NUMBER_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QUEUE_NUMBER_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QUEUE_NUMBER_LBN 32
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_QUEUE_NUMBER_WIDTH 32
+/* Size of entry data */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_OFST 8
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_LBN 64
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_SIZE_WIDTH 32
+/* Offset of entry data from start of MCDI message response payload */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_OFST 12
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_LBN 96
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_OFFSET_WIDTH 32
+/* Absolute VI of the entry, or 0xffffffff if not available/applicable */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_ABS_VI_OFST 16
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_ABS_VI_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_NO_ABS_VI 0xffffffff /* enum */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_ABS_VI_LBN 128
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_ABS_VI_WIDTH 32
+/* Reserved */
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_OFST 20
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LEN 8
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LO_OFST 20
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_HI_OFST 24
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_LBN 160
+#define	MC_CMD_DEVEL_DUMP_VI_ENTRY_RESERVED_WIDTH 64
+
+
+/***********************************/
+/* MC_CMD_DEVEL_DUMP_VI
+ * Dump various parts of the hardware's state for a VI.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI 0x1b5
+#undef	MC_CMD_0x1b5_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1b5_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_DEVEL_DUMP_VI_IN msgrequest */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_LEN 4
+/* Absolute queue id of queue to dump state for */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_IN_QID_LEN 4
+
+/* MC_CMD_DEVEL_DUMP_VI_IN_V2 msgrequest */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_LEN 20
+/* Which queue to dump. The meaning of this field dependes on ADDRESS_MODE. */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_ID_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_ID_LEN 4
+/* Method of referring to the queue to dump */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_ADDRESS_MODE_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_ADDRESS_MODE_LEN 4
+/* enum: First field refers to queue number as understood by QDMA/DMAC hardware
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_QUEUE_NUMBER 0x0
+/* enum: First field refers to absolute VI number */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_ABS_VI 0x1
+/* enum: First field refers to function-relative VI number on the command's
+ * function
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_REL_VI 0x2
+/* enum: First field refers to function-relative VI number on a specified
+ * function
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_REL_VI_PROXY 0x3
+/* Type of VI. Not needed if ADDRESS_MODE is QUEUE_NUMBER. */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VI_TYPE_OFST 8
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VI_TYPE_LEN 4
+/* enum: Return only entries used for ef100 queues (a single hardware queue) */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_EF100 0x0
+/* enum: Return entries used for virtio (Potentially two hardware queues,
+ * depending on hardware implementation)
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VIRTIO 0x1
+/* Only if ADDRESS_MODE is REL_VI_PROXY. Interface of function the queue is on.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_PCIE_INTERFACE_OFST 12
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_PCIE_INTERFACE_LEN 4
+/*            Enum values, see field(s): */
+/*               DEVEL_PCIE_INTERFACE */
+/* Only if ADDRESS_MODE is REL_VI_PROXY. PF number of the function the queue is
+ * on.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_PF_OFST 16
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_PF_LEN 2
+/* Only if ADDRESS_MODE is REL_VI_PROXY. VF number of the function the queue is
+ * on.
+ */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VF_OFST 18
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VF_LEN 2
+/* enum: The function is on a PF, not a VF. */
+#define	MC_CMD_DEVEL_DUMP_VI_IN_V2_VF_NULL 0xffff
+
+/* MC_CMD_DEVEL_DUMP_VI_OUT msgresponse */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMIN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LENMAX_MCDI2 1012
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_LEN(num) (0+1*(num))
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_NUM(len) (((len)-0)/1)
+/* Number of dump entries returned */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_NUM_ENTRIES_LEN 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_OFST 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_LBN 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_WIDTH 8
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM 252
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_DATA_MAXNUM_MCDI2 1020
+/* Array of MC_CMD_DEVEL_DUMP_VI_ENTRY structures of length NUM_ENTRIES */
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_OFST 4
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_LEN 28
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM 8
+#define	MC_CMD_DEVEL_DUMP_VI_OUT_ENTRIES_MAXNUM_MCDI2 36
+
+/* MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY structuredef */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_LEN 16
+/* What register this is */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_REG_OFST 0
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_REG_LEN 4
+/* enum: Catchall for registers that aren't in this enum. Nothing should be in
+ * this long-term
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_UNKNOWN 0xffffffff
+/* enum: S2IC Converter Debug Packet Counter register. Informs number of
+ * packets passed through Converter.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_H2C_S2IC_DBG_PKT_CNT 0x0
+/* enum: IC2S Converter Debug Packet Counter register. Informs number of
+ * packets passed through Converter.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_C2H_IC2S_DBG_PKT_CNT 0x1
+/* enum: Event Controller Tx path Debug register. Count of Moderator Tx events,
+ * not incl D2C, VirtIO, Dproxy.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_DEBUG 0x2
+/* enum: Event Controller Rx path Debug register. Count of Moderator Rx events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_RX_DEBUG 0x3
+/* enum: Event Controller Debug register. Count of Total EVC events. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TOTAL_DEBUG 0x4
+/* enum: Same info as EVC_RX_DEBUG; collected at different location in design
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_RX_EF100_DEBUG 0x5
+/* enum: Same info as EVC_TX_DEBUG; collected at different location in design
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_EF100_DEBUG 0x6
+/* enum: Event Controller Debug register. Count of Tx VirtIO events. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_VIRTIO_DEBUG 0x7
+/* enum: Event Controller Debug register. Count of Tx Descriptor Proxy events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_DPRXY_DEBUG 0x8
+/* enum: Event Controller Debug register. Count of Tx VirtQ Descriptor Proxy
+ * events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_VIRTQ_DPRXY_DEBUG 0x9
+/* enum: Event Controller Debug register. Count of Tx Descriptor-to-Completion
+ * events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_D2C_DEBUG 0xa
+/* enum: Event Controller Debug register. Count of Tx VirtIO Descriptor-to-
+ * Completion events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_VIRTQ_D2C_DEBUG 0xb
+/* enum: Event Controller Debug register. Count of Tx Timestamp events. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_TX_TSTAMP_DEBUG 0xc
+/* enum: Event Controller Debug register. Count of Rx EvQ Timeout events. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_RX_EVQ_TIMEOUT_DEBUG 0xd
+/* enum: Event Controller Debug register. Count of MC events. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_MC_DEBUG 0xe
+/* enum: Event Controller Debug register. Count of EQDMA VirtIO Control events.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_EVC_EQDMA_VIO_CTL_DEBUG 0xf
+/* enum: Counter of QDMA Dropped C2H packets. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_DMAC_C2H_DROP_CTR_REG 0x10
+/* enum: Number of packets received by c host fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_C_H_PACKETS_IN_TBL 0x11
+/* enum: Number of packets sent by c host fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_C_H_PACKETS_OUT_TBL 0x12
+/* enum: Number of packets received by c plugin fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_C_P_PACKETS_IN_TBL 0x13
+/* enum: Number of packets received by b host fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_B_H_PACKETS_IN_TBL 0x14
+/* enum: Number of packets received by b net fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_B_N_PACKETS_IN_TBL 0x15
+/* enum: Number of packets received by b host fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_B_PH_PACKETS_IN_TBL 0x16
+/* enum: Number of packets received by b net fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_B_PN_PACKETS_IN_TBL 0x17
+/* enum: Number of packets sent by b net fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_B_PACKETS_OUT_TBL 0x18
+/* enum: Number of packets received by c net fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_C_N_PACKETS_IN_TBL 0x19
+/* enum: Number of packets sent by c net fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_C_N_PACKETS_OUT_TBL 0x1a
+/* enum: Number of packets received by ha fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_HA_PACKETS_IN_TBL 0x1b
+/* enum: Number of packets received by ha host shadow fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_HA_PH_PACKETS_IN_TBL 0x1c
+/* enum: Number of packets received by ha fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_HA_PACKETS_OUT_TBL 0x1d
+/* enum: Number of packets received by d hub fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_D_PACKETS_IN_TBL 0x1e
+/* enum: Number of packets received by d hub plugin fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_D_P_PACKETS_IN_TBL 0x1f
+/* enum: Number of packets received by d hub plugin fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_D_O_PACKETS_IN_TBL 0x20
+/* enum: Number of packets sent to dmac. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_D_PACKETS_OUT_TBL 0x21
+/* enum: Number of packets received by na fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_NA_PACKETS_IN_TBL 0x22
+/* enum: Number of packets dropped by na fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_NA_PACKETS_DROPPED_TBL 0x23
+/* enum: Number of packets sent by na fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_NA_PACKETS_OUT_TBL 0x24
+/* enum: Number of packets received by rp hub fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_RP_PACKETS_IN_TBL 0x25
+/* enum: Number of packets removed from fifo. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_SSS_RP_PACKETS_OUT_TBL 0x26
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_REG_LBN 0
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_REG_WIDTH 32
+/* If REG is a table, the table row. */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ROW_OFST 4
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ROW_LEN 4
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ROW_LBN 32
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ROW_WIDTH 32
+/* Address of the register (as seen by the MC) */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ADDRESS_OFST 8
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ADDRESS_LEN 4
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ADDRESS_LBN 64
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_ADDRESS_WIDTH 32
+/* Value of the register */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_VALUE_OFST 12
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_VALUE_LEN 4
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_VALUE_LBN 96
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY_VALUE_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DEVEL_DUMP_RHEAD_REGS
+ * Dump an assortment of hopefully useful riverhead debug registers
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS 0x1b6
+#undef	MC_CMD_0x1b6_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1b6_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_DEVEL_DUMP_RHEAD_REGS_IN msgrequest */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_IN_LEN 4
+/* Which page of registers to retrieve. Page 0 always exists, later pages may
+ * also exist if there are too many registers to fit in a single mcdi response.
+ * NUM_PAGES in the response will tell you how many there are.
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_IN_PAGE_OFST 0
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_IN_PAGE_LEN 4
+
+/* MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT msgresponse */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_LENMIN 8
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_LENMAX 248
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_LENMAX_MCDI2 1016
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_LEN(num) (8+16*(num))
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_NUM(len) (((len)-8)/16)
+/* Number of registers dumped in this response */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_NUM_REGS_OFST 0
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_NUM_REGS_LEN 4
+/* How many pages of registers are available to extract */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_NUM_PAGES_OFST 4
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_NUM_PAGES_LEN 4
+/* Array of MC_CMD_DEVEL_DUMP_RHEAD_REGS_ENTRY structs, one for each register
+ */
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_OFST 8
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_LEN 16
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_MINNUM 0
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_MAXNUM 15
+#define	MC_CMD_DEVEL_DUMP_RHEAD_REGS_OUT_REGS_MAXNUM_MCDI2 63
+
+/* FUNCTION_PERSONALITY structuredef: The meanings of the personalities are
+ * defined in SF-120734-TC with more information in SF-122717-TC.
+ */
+#define	FUNCTION_PERSONALITY_LEN 4
+#define	FUNCTION_PERSONALITY_ID_OFST 0
+#define	FUNCTION_PERSONALITY_ID_LEN 4
+/* enum: Function has no assigned personality */
+#define	FUNCTION_PERSONALITY_NULL 0x0
+/* enum: Function has an EF100-style function control window and VI windows
+ * with both EF100 and vDPA doorbells.
+ */
+#define	FUNCTION_PERSONALITY_EF100 0x1
+/* enum: Function has virtio net device configuration registers and doorbells
+ * for virtio queue pairs.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_NET 0x2
+/* enum: Function has virtio block device configuration registers and a
+ * doorbell for a single virtqueue.
+ */
+#define	FUNCTION_PERSONALITY_VIRTIO_BLK 0x3
+/* enum: Function is a Xilinx acceleration device - management function */
+#define	FUNCTION_PERSONALITY_ACCEL_MGMT 0x4
+/* enum: Function is a Xilinx acceleration device - user function */
+#define	FUNCTION_PERSONALITY_ACCEL_USR 0x5
+#define	FUNCTION_PERSONALITY_ID_LBN 0
+#define	FUNCTION_PERSONALITY_ID_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_FEATURES
+ * Get a list of the virtio features supported by the device.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES 0x168
+#undef	MC_CMD_0x168_PRIVILEGE_CTG
+
+#define	MC_CMD_0x168_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_LEN 4
+/* Type of device to get features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_DEVICE_ID_LEN 4
+/* enum: Reserved. Do not use. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_RESERVED 0x0
+/* enum: Net device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_NET 0x1
+/* enum: Block device. */
+#define	MC_CMD_VIRTIO_GET_FEATURES_IN_BLOCK 0x2
+
+/* MC_CMD_VIRTIO_GET_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_LEN 8
+/* Features supported by the device. The result is a bitfield in the format of
+ * the feature bits of the specified device type as defined in the virtIO 1.1
+ * specification ( https://docs.oasis-
+ * open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.pdf )
+ */
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_LO_OFST 0
+#define	MC_CMD_VIRTIO_GET_FEATURES_OUT_FEATURES_HI_OFST 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_TEST_FEATURES
+ * Query whether a given set of features is supported. Fails with ENOSUP if the
+ * driver requests a feature the device doesn't support. Fails with EINVAL if
+ * the driver fails to request a feature which the device requires.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES 0x169
+#undef	MC_CMD_0x169_PRIVILEGE_CTG
+
+#define	MC_CMD_0x169_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_IN msgrequest */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_LEN 16
+/* Type of device to test features for. Matches the device id as defined by the
+ * virtio spec.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_DEVICE_ID_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_OFST 4
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_RESERVED_LEN 4
+/* Features requested. Same format as the returned value from
+ * MC_CMD_VIRTIO_GET_FEATURES.
+ */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_LO_OFST 8
+#define	MC_CMD_VIRTIO_TEST_FEATURES_IN_FEATURES_HI_OFST 12
+
+/* MC_CMD_VIRTIO_TEST_FEATURES_OUT msgresponse */
+#define	MC_CMD_VIRTIO_TEST_FEATURES_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_INIT_QUEUE
+ * Create a virtio virtqueue. Fails with EALREADY if the queue already exists.
+ * Fails with ENOSUP if a feature is requested that isn't supported. Fails with
+ * EINVAL if a required feature isn't requested, or any other parameter is
+ * invalid.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE 0x16a
+#undef	MC_CMD_0x16a_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16a_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_LEN 68
+/* Type of virtqueue to create. A network rxq and a txq can exist at the same
+ * time on a single VI.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/* enum: A network device receive queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_RXQ 0x0
+/* enum: A network device transmit queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NET_TXQ 0x1
+/* enum: A block device request queue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_BLOCK 0x2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, create the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, create queue on the PF. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_VF_NULL 0xffff
+/* Desired instance. This is the function-local index of the associated VI, not
+ * the virtqueue number as counted by the virtqueue spec.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INSTANCE_LEN 4
+/* Queue size, in entries. Must be a power of two. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_OFST 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_SIZE_LEN 4
+/* Flags */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FLAGS_LEN 4
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_OFST 12
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_LBN 0
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USE_PASID_WIDTH 1
+/* Address of the descriptor table in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_LO_OFST 16
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_DESC_TBL_ADDR_HI_OFST 20
+/* Address of the available ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_LO_OFST 24
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_AVAIL_RING_ADDR_HI_OFST 28
+/* Address of the used ring in the virtqueue. */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_LO_OFST 32
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_USED_RING_ADDR_HI_OFST 36
+/* PASID to use on PCIe transactions involving this queue. Ignored if the
+ * USE_PASID flag is not set.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_OFST 40
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_PASID_LEN 4
+/* Which MSIX vector to use for this virtqueue, or NO_VECTOR if MSIX should not
+ * be used.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_OFST 44
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MSIX_VECTOR_LEN 2
+/* enum: Do not enable interrupts for this virtqueue */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_NO_VECTOR 0xffff
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_OFST 46
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_RESERVED2_LEN 2
+/* Virtio features to apply to this queue. Same format as the in the virtio
+ * spec and in the return from MC_CMD_VIRTIO_GET_FEATURES. Must be a subset of
+ * the features returned from MC_CMD_VIRTIO_GET_FEATURES. Features are per-
+ * queue because with vDPA multiple queues on the same function can be passed
+ * through to different virtual hosts as independent devices.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LEN 8
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_LO_OFST 48
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_HI_OFST 52
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_OUT/FEATURES */
+/* The initial producer index for this queue's used ring. If this queue is
+ * being created to be migrated into, this should be the FINAL_PIDX value
+ * returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
+ * Otherwise, it should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_OFST 56
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_LEN 4
+/* The initial consumer index for this queue's available ring. If this queue is
+ * being created to be migrated into, this should be the FINAL_CIDX value
+ * returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
+ * Otherwise, it should be zero.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_OFST 60
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_LEN 4
+/* A MAE_MPORT_SELECTOR defining which mport this queue should be associated
+ * with. Use MAE_MPORT_SELECTOR_ASSIGNED to request the default mport for the
+ * function this queue is being created on.
+ */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_OFST 64
+#define	MC_CMD_VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR_LEN 4
+
+/* MC_CMD_VIRTIO_INIT_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_INIT_QUEUE_RESP_LEN 0
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_FINI_QUEUE
+ * Destroy a virtio virtqueue
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE 0x16b
+#undef	MC_CMD_0x16b_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16b_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_REQ msgrequest */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_LEN 8
+/* Type of virtqueue to destroy. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_QUEUE_TYPE_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_INIT_QUEUE/MC_CMD_VIRTIO_INIT_QUEUE_REQ/QUEUE_TYPE */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, destroy the
+ * queue on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_TARGET_VF_LEN 2
+/* enum: No VF, destroy the queue on the PF. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_VF_NULL 0xffff
+/* Instance to destroy */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_FINI_QUEUE_RESP msgresponse */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_LEN 8
+/* The producer index of the used ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_OFST 0
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_LEN 4
+/* The consumer index of the available ring when the queue was stopped. */
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_OFST 4
+#define	MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_LEN 4
+
+
+/***********************************/
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET
+ * Get the offset in the BAR of the doorbells for a VI. Doesn't require the
+ * queue(s) to be allocated.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET 0x16c
+#undef	MC_CMD_0x16c_PRIVILEGE_CTG
+
+#define	MC_CMD_0x16c_PRIVILEGE_CTG SRIOV_CTG_GENERAL
+
+/* MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ msgrequest */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_LEN 8
+/* Type of device to get information for. Matches the device id as defined by
+ * the virtio spec.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_OFST 0
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_DEVICE_ID_LEN 1
+/*            Enum values, see field(s): */
+/*               MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_IN/DEVICE_ID */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_OFST 1
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_RESERVED_LEN 1
+/* If the calling function is a PF and this field is not VF_NULL, query the VI
+ * on the specified child VF instead of on the PF.
+ */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_OFST 2
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_TARGET_VF_LEN 2
+/* enum: No VF, query the PF. */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_VF_NULL 0xffff
+/* VI instance to query */
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_OFST 4
+#define	MC_CMD_VIRTIO_GET_DOORBELL_OFFSET_REQ_INSTANCE_LEN 4
+
+/* MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_LEN 8
+/* Offset of RX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_RX_DBL_OFFSET_LEN 4
+/* Offset of TX doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_OFST 4
+#define	MC_CMD_VIRTIO_GET_NET_DOORBELL_OFFSET_RESP_TX_DBL_OFFSET_LEN 4
+
+/* MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP msgresponse */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_LEN 4
+/* Offset of request doorbell in BAR */
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_OFST 0
+#define	MC_CMD_VIRTIO_GET_BLOCK_DOORBELL_OFFSET_RESP_DBL_OFFSET_LEN 4
+
+/* PCIE_FUNCTION structuredef: Structure representing a PCIe function ID
+ * (interface/PF/VF tuple)
+ */
+#define	PCIE_FUNCTION_LEN 8
+/* PCIe PF function number */
+#define	PCIE_FUNCTION_PF_OFST 0
+#define	PCIE_FUNCTION_PF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_PF_ANY 0xfffe
+/* enum: Value representing invalid (null) function */
+#define	PCIE_FUNCTION_PF_NULL 0xffff
+#define	PCIE_FUNCTION_PF_LBN 0
+#define	PCIE_FUNCTION_PF_WIDTH 16
+/* PCIe VF Function number (PF relative) */
+#define	PCIE_FUNCTION_VF_OFST 2
+#define	PCIE_FUNCTION_VF_LEN 2
+/* enum: Wildcard value representing any available function (e.g in resource
+ * allocation requests)
+ */
+#define	PCIE_FUNCTION_VF_ANY 0xfffe
+/* enum: Function is a PF (when PF != PF_NULL) or invalid function (when PF ==
+ * PF_NULL)
+ */
+#define	PCIE_FUNCTION_VF_NULL 0xffff
+#define	PCIE_FUNCTION_VF_LBN 16
+#define	PCIE_FUNCTION_VF_WIDTH 16
+/* PCIe interface of the function */
+#define	PCIE_FUNCTION_INTF_OFST 4
+#define	PCIE_FUNCTION_INTF_LEN 4
+/* enum: Host PCIe interface */
+#define	PCIE_FUNCTION_INTF_HOST 0x0
+/* enum: Application Processor interface */
+#define	PCIE_FUNCTION_INTF_AP 0x1
+#define	PCIE_FUNCTION_INTF_LBN 32
+#define	PCIE_FUNCTION_INTF_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CREATE
+ * Descriptor proxy functions are abstract devices that forward all request
+ * submitted to the host PCIe function (descriptors submitted to Virtio or
+ * EF100 queues) to be handled on another function (most commonly on the
+ * embedded Application Processor), via EF100 descriptor proxy, memory-to-
+ * memory and descriptor-to-completion mechanisms. Primary user is Virtio-blk
+ * subsystem, see SF-122927-TC. This function allocates a new descriptor proxy
+ * function on the host and assigns a user-defined label. The actual function
+ * configuration is not persisted until the caller configures it with
+ * MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN and commits with
+ * MC_CMD_DESC_PROXY_FUNC_COMMIT_IN.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE 0x172
+#undef	MC_CMD_0x172_PRIVILEGE_CTG
+
+#define	MC_CMD_0x172_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LEN 52
+/* PCIe Function ID to allocate (as struct PCIE_FUNCTION). Set to
+ * {PF_ANY,VF_ANY,interface} for "any available function" Set to
+ * {PF_ANY,VF_NULL,interface} for "any available PF"
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_LO_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_FUNC_HI_OFST 4
+/* The personality to set. The meanings of the personalities are defined in
+ * SF-120734-TC with more information in SF-122717-TC. At present, we only
+ * support proxying for VIRTIO_BLK
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_OFST 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_CREATE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_LEN 12
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_HANDLE_LEN 4
+/* Allocated function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CREATE_OUT_FUNC_HI_OFST 8
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY
+ * Remove an existing descriptor proxy function. Underlying function
+ * personality and configuration reverts back to factory default. Function
+ * configuration is committed immediately to specified store and any function
+ * ownership is released.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY 0x173
+#undef	MC_CMD_0x173_PRIVILEGE_CTG
+
+#define	MC_CMD_0x173_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LEN 44
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_LABEL_LEN 40
+/* Store from which to remove function configuration */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_IN_STORE_LEN 4
+/*            Enum values, see field(s): */
+/*               MC_CMD_DESC_PROXY_FUNC_COMMIT/MC_CMD_DESC_PROXY_FUNC_COMMIT_IN/STORE */
+
+/* MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DESTROY_OUT_LEN 0
+
+/* VIRTIO_BLK_CONFIG structuredef: Virtio block device configuration. See
+ * Virtio specification v1.1, Sections 5.2.3 and 6 for definition of feature
+ * bits. See Virtio specification v1.1, Section 5.2.4 (struct
+ * virtio_blk_config) for definition of remaining configuration fields
+ */
+#define	VIRTIO_BLK_CONFIG_LEN 68
+/* Virtio block device features to advertise, per Virtio 1.1, 5.2.3 and 6 */
+#define	VIRTIO_BLK_CONFIG_FEATURES_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_LEN 8
+#define	VIRTIO_BLK_CONFIG_FEATURES_LO_OFST 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_HI_OFST 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_LBN 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BARRIER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_LBN 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SIZE_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_LBN 2
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SEG_MAX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_LBN 4
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_GEOMETRY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_LBN 5
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_RO_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_LBN 6
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_BLK_SIZE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_LBN 7
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_SCSI_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_LBN 9
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_FLUSH_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_LBN 10
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_TOPOLOGY_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_LBN 11
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_CONFIG_WCE_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_LBN 12
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_MQ_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_LBN 13
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_DISCARD_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_LBN 14
+#define	VIRTIO_BLK_CONFIG_VIRTIO_BLK_F_WRITE_ZEROES_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_LBN 28
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_INDIRECT_DESC_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_LBN 29
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_EVENT_IDX_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_LBN 32
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_VERSION_1_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_LBN 33
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ACCESS_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_LBN 34
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_RING_PACKED_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_LBN 35
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_IN_ORDER_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_LBN 36
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_ORDER_PLATFORM_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_LBN 37
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_SR_IOV_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_OFST 0
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_LBN 38
+#define	VIRTIO_BLK_CONFIG_VIRTIO_F_NOTIFICATION_DATA_WIDTH 1
+#define	VIRTIO_BLK_CONFIG_FEATURES_LBN 0
+#define	VIRTIO_BLK_CONFIG_FEATURES_WIDTH 64
+/* The capacity of the device (expressed in 512-byte sectors) */
+#define	VIRTIO_BLK_CONFIG_CAPACITY_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LEN 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LO_OFST 8
+#define	VIRTIO_BLK_CONFIG_CAPACITY_HI_OFST 12
+#define	VIRTIO_BLK_CONFIG_CAPACITY_LBN 64
+#define	VIRTIO_BLK_CONFIG_CAPACITY_WIDTH 64
+/* Maximum size of any single segment. Only valid when VIRTIO_BLK_F_SIZE_MAX is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_OFST 16
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_LBN 128
+#define	VIRTIO_BLK_CONFIG_SIZE_MAX_WIDTH 32
+/* Maximum number of segments in a request. Only valid when
+ * VIRTIO_BLK_F_SEG_MAX is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_OFST 20
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LEN 4
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_LBN 160
+#define	VIRTIO_BLK_CONFIG_SEG_MAX_WIDTH 32
+/* Disk-style geometry - cylinders. Only valid when VIRTIO_BLK_F_GEOMETRY is
+ * set.
+ */
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_OFST 24
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LEN 2
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_LBN 192
+#define	VIRTIO_BLK_CONFIG_CYLINDERS_WIDTH 16
+/* Disk-style geometry - heads. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_HEADS_OFST 26
+#define	VIRTIO_BLK_CONFIG_HEADS_LEN 1
+#define	VIRTIO_BLK_CONFIG_HEADS_LBN 208
+#define	VIRTIO_BLK_CONFIG_HEADS_WIDTH 8
+/* Disk-style geometry - sectors. Only valid when VIRTIO_BLK_F_GEOMETRY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_SECTORS_OFST 27
+#define	VIRTIO_BLK_CONFIG_SECTORS_LEN 1
+#define	VIRTIO_BLK_CONFIG_SECTORS_LBN 216
+#define	VIRTIO_BLK_CONFIG_SECTORS_WIDTH 8
+/* Block size of disk. Only valid when VIRTIO_BLK_F_BLK_SIZE is set. */
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_OFST 28
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_LBN 224
+#define	VIRTIO_BLK_CONFIG_BLK_SIZE_WIDTH 32
+/* Block topology - number of logical blocks per physical block (log2). Only
+ * valid when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_OFST 32
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LEN 1
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_LBN 256
+#define	VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP_WIDTH 8
+/* Block topology - offset of first aligned logical block. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_OFST 33
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LEN 1
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_LBN 264
+#define	VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET_WIDTH 8
+/* Block topology - suggested minimum I/O size in blocks. Only valid when
+ * VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_OFST 34
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LEN 2
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_LBN 272
+#define	VIRTIO_BLK_CONFIG_MIN_IO_SIZE_WIDTH 16
+/* Block topology - optimal (suggested maximum) I/O size in blocks. Only valid
+ * when VIRTIO_BLK_F_TOPOLOGY is set.
+ */
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_OFST 36
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LEN 4
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_LBN 288
+#define	VIRTIO_BLK_CONFIG_OPT_IO_SIZE_WIDTH 32
+/* Unused, set to zero. Note that virtio_blk_config.writeback is volatile and
+ * not carried in config data.
+ */
+#define	VIRTIO_BLK_CONFIG_UNUSED0_OFST 40
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LEN 2
+#define	VIRTIO_BLK_CONFIG_UNUSED0_LBN 320
+#define	VIRTIO_BLK_CONFIG_UNUSED0_WIDTH 16
+/* Number of queues. Only valid if the VIRTIO_BLK_F_MQ feature is negotiated.
+ */
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_OFST 42
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LEN 2
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_LBN 336
+#define	VIRTIO_BLK_CONFIG_NUM_QUEUES_WIDTH 16
+/* Maximum discard sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_OFST 44
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_LBN 352
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS_WIDTH 32
+/* Maximum discard segment number. Only valid if VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_OFST 48
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_LBN 384
+#define	VIRTIO_BLK_CONFIG_MAX_DISCARD_SEG_WIDTH 32
+/* Discard sector alignment, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_DISCARD is set.
+ */
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_OFST 52
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LEN 4
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_LBN 416
+#define	VIRTIO_BLK_CONFIG_DISCARD_SECTOR_ALIGNMENT_WIDTH 32
+/* Maximum write zeroes sectors size, in 512-byte units. Only valid if
+ * VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_OFST 56
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_LBN 448
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SECTORS_WIDTH 32
+/* Maximum write zeroes segment number. Only valid if VIRTIO_BLK_F_WRITE_ZEROES
+ * is set.
+ */
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_OFST 60
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LEN 4
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_LBN 480
+#define	VIRTIO_BLK_CONFIG_MAX_WRITE_ZEROES_SEG_WIDTH 32
+/* Write zeroes request can result in deallocating one or more sectors. Only
+ * valid if VIRTIO_BLK_F_WRITE_ZEROES is set.
+ */
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_OFST 64
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LEN 1
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_LBN 512
+#define	VIRTIO_BLK_CONFIG_WRITE_ZEROES_MAY_UNMAP_WIDTH 8
+/* Unused, set to zero. */
+#define	VIRTIO_BLK_CONFIG_UNUSED1_OFST 65
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LEN 3
+#define	VIRTIO_BLK_CONFIG_UNUSED1_LBN 520
+#define	VIRTIO_BLK_CONFIG_UNUSED1_WIDTH 24
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET
+ * Set configuration for an existing descriptor proxy function. Configuration
+ * data must match function personality. The actual function configuration is
+ * not persisted until the caller commits with MC_CMD_DESC_PROXY_FUNC_COMMIT_IN
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET 0x174
+#undef	MC_CMD_0x174_PRIVILEGE_CTG
+
+#define	MC_CMD_0x174_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMIN 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_LEN(num) (20+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_NUM(len) (((len)-20)/1)
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_HANDLE_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_RESERVED_LEN 16
+/* Configuration data. Format of configuration data is determined implicitly
+ * from function personality referred to by HANDLE. Currently, only supported
+ * format is VIRTIO_BLK_CONFIG.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM 232
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_IN_CONFIG_MAXNUM_MCDI2 1000
+
+/* MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CONFIG_SET_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT
+ * Commit function configuration to non-volatile or volatile store. Once
+ * configuration is applied to hardware (which may happen immediately or on
+ * next function/device reset) a DESC_PROXY_FUNC_CONFIG_SET MCDI event will be
+ * delivered to callers MCDI event queue.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT 0x175
+#undef	MC_CMD_0x175_PRIVILEGE_CTG
+
+#define	MC_CMD_0x175_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_HANDLE_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_STORE_LEN 4
+/* enum: Store into non-volatile (dynamic) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_NON_VOLATILE 0x0
+/* enum: Store into volatile (ephemeral) config */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_IN_VOLATILE 0x1
+
+/* MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_LEN 4
+/* Generation count to be delivered in an event once configuration becomes live
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_COMMIT_OUT_CONFIG_GENERATION_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_OPEN
+ * Retrieve a handle for an existing descriptor proxy function. Returns an
+ * integer handle, valid until function is deallocated, MC rebooted or power-
+ * cycle. Returns ENODEV if no function with given label exists.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN 0x176
+#undef	MC_CMD_0x176_PRIVILEGE_CTG
+
+#define	MC_CMD_0x176_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LEN 40
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_IN_LABEL_LEN 40
+
+/* MC_CMD_DESC_PROXY_FUNC_OPEN_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMIN 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX 252
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LENMAX_MCDI2 1020
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LEN(num) (40+1*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_NUM(len) (((len)-40)/1)
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_HANDLE_LEN 4
+/* PCIe Function ID (as struct PCIE_FUNCTION) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LEN 8
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_LO_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_FUNC_HI_OFST 8
+/* Function personality */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_OFST 12
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+/* Function configuration state */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_OFST 16
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_STATUS_LEN 4
+/* enum: Function configuration is visible to the host (live) */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_LIVE 0x0
+/* enum: Function configuration is pending reset */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_PENDING 0x1
+/* enum: Function configuration is missing (created, but no configuration
+ * committed)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_UNCONFIGURED 0x2
+/* Generation count to be delivered in an event once the configuration becomes
+ * live (if status is "pending")
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_OFST 20
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_GENERATION_LEN 4
+/* Reserved for future extension, set to zero. */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_OFST 24
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_RESERVED_LEN 16
+/* Configuration data corresponding to function personality. Currently, only
+ * supported format is VIRTIO_BLK_CONFIG. Not valid if status is UNCONFIGURED.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_OFST 40
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_LEN 1
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM 212
+#define	MC_CMD_DESC_PROXY_FUNC_OPEN_OUT_CONFIG_MAXNUM_MCDI2 980
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE
+ * Releases a handle for an open descriptor proxy function. If proxying was
+ * enabled on the device, the caller is expected to gracefully stop it using
+ * MC_CMD_DESC_PROXY_FUNC_DISABLE prior to calling this function. Closing an
+ * active device without disabling proxying will result in forced close, which
+ * will put the device into a failed state and signal the host driver of the
+ * error (for virtio, DEVICE_NEEDS_RESET flag would be set on the host side)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE 0x1a1
+#undef	MC_CMD_0x1a1_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a1_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_LEN 4
+/* Handle to the descriptor proxy function */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_CLOSE_OUT_LEN 0
+
+/* DESC_PROXY_FUNC_MAP structuredef */
+#define	DESC_PROXY_FUNC_MAP_LEN 52
+/* PCIe function ID (as struct PCIE_FUNCTION) */
+#define	DESC_PROXY_FUNC_MAP_FUNC_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_LEN 8
+#define	DESC_PROXY_FUNC_MAP_FUNC_LO_OFST 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_HI_OFST 4
+#define	DESC_PROXY_FUNC_MAP_FUNC_LBN 0
+#define	DESC_PROXY_FUNC_MAP_FUNC_WIDTH 64
+/* Function personality */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_OFST 8
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LEN 4
+/*            Enum values, see field(s): */
+/*               FUNCTION_PERSONALITY/ID */
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_LBN 64
+#define	DESC_PROXY_FUNC_MAP_PERSONALITY_WIDTH 32
+/* User-defined label (zero-terminated ASCII string) to uniquely identify the
+ * function
+ */
+#define	DESC_PROXY_FUNC_MAP_LABEL_OFST 12
+#define	DESC_PROXY_FUNC_MAP_LABEL_LEN 40
+#define	DESC_PROXY_FUNC_MAP_LABEL_LBN 96
+#define	DESC_PROXY_FUNC_MAP_LABEL_WIDTH 320
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENUM
+ * Enumerate existing descriptor proxy functions
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM 0x177
+#undef	MC_CMD_0x177_PRIVILEGE_CTG
+
+#define	MC_CMD_0x177_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_LEN 4
+/* Starting index, set to 0 on first request. See
+ * MC_CMD_DESC_PROXY_FUNC_ENUM_OUT/FLAGS.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_IN_START_IDX_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENUM_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMIN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX 212
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LENMAX_MCDI2 992
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_LEN(num) (4+52*(num))
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_NUM(len) (((len)-4)/52)
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FLAGS_LEN 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_LBN 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_MORE_DATA_WIDTH 1
+/* Function map, as array of DESC_PROXY_FUNC_MAP */
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_LEN 52
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MINNUM 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENUM_OUT_FUNC_MAP_MAXNUM_MCDI2 19
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE
+ * Enable descriptor proxying for function into target event queue. Returns VI
+ * allocation info for the proxy source function, so that the caller can map
+ * absolute VI IDs from descriptor proxy events back to the originating
+ * function.
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE 0x178
+#undef	MC_CMD_0x178_PRIVILEGE_CTG
+
+#define	MC_CMD_0x178_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_LEN 8
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_HANDLE_LEN 4
+/* Descriptor proxy sink queue (caller function relative). Must be extended
+ * width event queue
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_IN_TARGET_EVQ_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_LEN 8
+/* The number of VIs allocated on the function */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_COUNT_LEN 4
+/* The base absolute VI number allocated to the function. */
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_OFST 4
+#define	MC_CMD_DESC_PROXY_FUNC_ENABLE_OUT_VI_BASE_LEN 4
+
+
+/***********************************/
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE
+ * Disable descriptor proxying for function
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE 0x179
+#undef	MC_CMD_0x179_PRIVILEGE_CTG
+
+#define	MC_CMD_0x179_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_IN msgrequest */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_LEN 4
+/* Handle to descriptor proxy function (as returned by
+ * MC_CMD_DESC_PROXY_FUNC_OPEN)
+ */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_OFST 0
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_IN_HANDLE_LEN 4
+
+/* MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT msgresponse */
+#define	MC_CMD_DESC_PROXY_FUNC_DISABLE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_ADDR_SPC_ID
+ * Get Address space identifier for use in mem2mem descriptors for a given
+ * target. See SF-120734-TC for details on ADDR_SPC_IDs and mem2mem
+ * descriptors.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID 0x1a0
+#undef	MC_CMD_0x1a0_PRIVILEGE_CTG
+
+#define	MC_CMD_0x1a0_PRIVILEGE_CTG SRIOV_CTG_ADMIN
+
+/* MC_CMD_GET_ADDR_SPC_ID_IN msgrequest */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_LEN 16
+/* Resource type to get ADDR_SPC_ID for */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_TYPE_LEN 4
+/* enum: Address space ID for host/AP memory DMA over the same interface this
+ * MCDI was called on
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_SELF 0x0
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC 0x1
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value specified by PASID
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PCI_FUNC_PASID 0x2
+/* enum: Address space ID for host/AP memory DMA via PCI interface and function
+ * specified by FUNC with PASID value of relative VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_REL_VI 0x3
+/* enum: Address space ID for host/AP memory DMA via PCI interface, function
+ * and PASID value of absolute VI specified by VI
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_ABS_VI 0x4
+/* enum: Address space ID for host memory DMA via PCI interface and function of
+ * descriptor proxy function specified by HANDLE
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_DESC_PROXY_HANDLE 0x5
+/* enum: Address space ID for DMA to/from MC memory */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_MC_MEM 0x6
+/* enum: Address space ID for DMA to/from other SmartNIC memory (on-chip, DDR)
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_NIC_MEM 0x7
+/* PCIe Function ID (as struct PCIE_FUNCTION). Only valid if TYPE is PCI_FUNC,
+ * PCI_FUNC_PASID or REL_VI.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_LO_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_FUNC_HI_OFST 8
+/* PASID value. Only valid if TYPE is PCI_FUNC_PASID. */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_PASID_LEN 4
+/* Relative or absolute VI number. Only valid if TYPE is REL_VI or ABS_VI */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_OFST 12
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_VI_LEN 4
+/* Descriptor proxy function handle. Only valid if TYPE is DESC_PROXY_HANDLE.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_OFST 4
+#define	MC_CMD_GET_ADDR_SPC_ID_IN_HANDLE_LEN 4
+
+/* MC_CMD_GET_ADDR_SPC_ID_OUT msgresponse */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_LEN 8
+/* Address Space ID for the requested target. Only the lower 36 bits are valid
+ * in the current SmartNIC implementation.
+ */
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LEN 8
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_LO_OFST 0
+#define	MC_CMD_GET_ADDR_SPC_ID_OUT_ADDR_SPC_ID_HI_OFST 4
+
+/* MAE_MPORT_SELECTOR structuredef: MPORTS are identified by an opaque unsigned
+ * integer value (mport_id) that is guaranteed to be representable within
+ * 32-bits or within any NIC interface field that needs store the value
+ * (whichever is narrowers). This selector structure provides a stable way to
+ * refer to m-ports.
+ */
+#define	MAE_MPORT_SELECTOR_LEN 4
+/* Used to force the tools to output bitfield-style defines for this structure.
+ */
+#define	MAE_MPORT_SELECTOR_FLAT_OFST 0
+#define	MAE_MPORT_SELECTOR_FLAT_LEN 4
+/* enum: An m-port selector value that is guaranteed never to represent a real
+ * mport
+ */
+#define	MAE_MPORT_SELECTOR_NULL 0x0
+/* enum: The m-port assigned to the calling client. */
+#define	MAE_MPORT_SELECTOR_ASSIGNED 0x1000000
+#define	MAE_MPORT_SELECTOR_TYPE_OFST 0
+#define	MAE_MPORT_SELECTOR_TYPE_LBN 24
+#define	MAE_MPORT_SELECTOR_TYPE_WIDTH 8
+/* enum: The MPORT connected to a given physical port */
+#define	MAE_MPORT_SELECTOR_TYPE_PPORT 0x2
+/* enum: The MPORT assigned to a given PCIe function */
+#define	MAE_MPORT_SELECTOR_TYPE_FUNC 0x3
+/* enum: An mport_id */
+#define	MAE_MPORT_SELECTOR_TYPE_MPORT_ID 0x4
+#define	MAE_MPORT_SELECTOR_MPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_MPORT_ID_WIDTH 24
+#define	MAE_MPORT_SELECTOR_PPORT_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_PPORT_ID_WIDTH 4
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_LBN 16
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_WIDTH 8
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_OFST 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_LBN 0
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_WIDTH 16
+/* enum: Used for VF_ID to indicate a physical function. */
+#define	MAE_MPORT_SELECTOR_FUNC_VF_ID_NULL 0xffff
+/* enum: Used for PF_ID to indicate the physical function of the calling
+ * client. - When used by a PF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the calling function. (For clarity, it is recommended that
+ * clients use ASSIGNED to achieve this behaviour). - When used by a PF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a VF child of the calling
+ * function. - When used by a VF with VF_ID == VF_ID_NULL, the mport selector
+ * relates to the PF owning the calling function. - When used by a VF with
+ * VF_ID != VF_ID_NULL, the mport selector relates to a sibling VF of the
+ * calling function. - Not meaningful used by a client that is not a PCIe
+ * function.
+ */
+#define	MAE_MPORT_SELECTOR_FUNC_PF_ID_CALLER 0xff
+#define	MAE_MPORT_SELECTOR_FLAT_LBN 0
+#define	MAE_MPORT_SELECTOR_FLAT_WIDTH 32
+
 #endif /* _SIENA_MC_DRIVER_PCOL_H */
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
index f15c7b2064..aa03e8015a 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_aoe.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  */
 
 #ifndef _SIENA_MC_DRIVER_PCOL_AOE_H
@@ -25,6 +25,7 @@
 #define	MC_CMD_FC_IN_LEN 4
 #define	MC_CMD_FC_IN_OP_HDR_OFST 0
 #define	MC_CMD_FC_IN_OP_HDR_LEN 4
+#define	MC_CMD_FC_IN_OP_OFST 0
 #define	MC_CMD_FC_IN_OP_LBN 0
 #define	MC_CMD_FC_IN_OP_WIDTH 8
 /* enum: NULL MCDI command to FC. */
@@ -152,6 +153,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_MAC_HEADER_OFST 4
 #define	MC_CMD_FC_IN_MAC_HEADER_LEN 4
+#define	MC_CMD_FC_IN_MAC_OP_OFST 4
 #define	MC_CMD_FC_IN_MAC_OP_LBN 0
 #define	MC_CMD_FC_IN_MAC_OP_WIDTH 8
 /* enum: MAC reconfigure handler */
@@ -166,14 +168,17 @@
 #define	MC_CMD_FC_OP_MAC_OP_GET_TX_STATS 0x7
 /* enum: MAC Read status */
 #define	MC_CMD_FC_OP_MAC_OP_READ_STATUS 0x8
+#define	MC_CMD_FC_IN_MAC_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_MAC_PORT_TYPE_WIDTH 8
 /* enum: External FPGA port. */
 #define	MC_CMD_FC_PORT_EXT 0x0
 /* enum: Internal Siena-facing FPGA ports. */
 #define	MC_CMD_FC_PORT_INT 0x1
+#define	MC_CMD_FC_IN_MAC_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_MAC_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_MAC_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_MAC_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -210,8 +215,10 @@
 #define	MC_CMD_FC_IN_MAC_SET_LINK_ADDR_HI_OFST 20
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_LEN 4
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_LBN 0
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_UNICAST_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_OFST 24
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_LBN 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_REJECT_BRDCAST_WIDTH 1
 #define	MC_CMD_FC_IN_MAC_SET_LINK_FCNTL_OFST 28
@@ -249,10 +256,13 @@
 #define	MC_CMD_FC_IN_MAC_GET_STATS_STATS_INDEX_LEN 4
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_LBN 0
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_ALL_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_LBN 1
 #define	MC_CMD_FC_IN_MAC_GET_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_OFST 12
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_LBN 2
 #define	MC_CMD_FC_IN_MAC_GET_STATS_UPDATE_WIDTH 1
 /* Number of statistics to read */
@@ -370,6 +380,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_OP_OFST 4
 #define	MC_CMD_FC_IN_DDR_TEST_OP_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_OP_WIDTH 8
 /* enum: DRAM Test Start */
@@ -385,12 +396,16 @@
 /*            MC_CMD_FC_IN_DDR_TEST_HEADER_LEN 4 */
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_MASK_LEN 4
+#define	MC_CMD_FC_IN_DDR_TEST_START_T0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_LBN 0
 #define	MC_CMD_FC_IN_DDR_TEST_START_T0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_T1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_LBN 1
 #define	MC_CMD_FC_IN_DDR_TEST_START_T1_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B0_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_LBN 2
 #define	MC_CMD_FC_IN_DDR_TEST_START_B0_WIDTH 1
+#define	MC_CMD_FC_IN_DDR_TEST_START_B1_OFST 8
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_LBN 3
 #define	MC_CMD_FC_IN_DDR_TEST_START_B1_WIDTH 1
 
@@ -433,6 +448,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_HEADER_LEN 4
+#define	MC_CMD_FC_IN_READ_MAP_OP_OFST 4
 #define	MC_CMD_FC_IN_READ_MAP_OP_LBN 0
 #define	MC_CMD_FC_IN_READ_MAP_OP_WIDTH 8
 /* enum: Get the number of map regions */
@@ -467,16 +483,22 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_LBN 0
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_CABLE_PLUGGED_IN_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_LBN 1
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_RX_TUNING_LINK_MONITORING_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_LBN 2
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_DFE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_LBN 3
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_EYE_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_LBN 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_1D_TUNING_ENABLE_WIDTH 1
+#define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_OFST 4
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_LBN 5
 #define	MC_CMD_FC_IN_GLOBAL_FLAGS_OFFCAL_ENABLE_WIDTH 1
 
@@ -486,6 +508,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_IO_REL_HEADER_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_HEADER_LEN 4
+#define	MC_CMD_FC_IN_IO_REL_OP_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_OP_LBN 0
 #define	MC_CMD_FC_IN_IO_REL_OP_WIDTH 8
 /* enum: Get the base address that the FC applies to relative commands */
@@ -494,6 +517,7 @@
 #define	MC_CMD_FC_IN_IO_REL_READ32 0x2
 /* enum: Write data */
 #define	MC_CMD_FC_IN_IO_REL_WRITE32 0x3
+#define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_OFST 4
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_LBN 8
 #define	MC_CMD_FC_IN_IO_REL_COMP_TYPE_WIDTH 8
 /* enum: Application address space */
@@ -547,6 +571,7 @@
 /*            MC_CMD_FC_IN_CMD_LEN 4 */
 #define	MC_CMD_FC_IN_UHLINK_HEADER_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_HEADER_LEN 4
+#define	MC_CMD_FC_IN_UHLINK_OP_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_OP_LBN 0
 #define	MC_CMD_FC_IN_UHLINK_OP_WIDTH 8
 /* enum: Get PHY configuration info */
@@ -565,10 +590,13 @@
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_SET 0x7
 /* enum: Get loopback mode config state on fpga port */
 #define	MC_CMD_FC_OP_UHLINK_LOOPBACK_GET 0x8
+#define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_LBN 8
 #define	MC_CMD_FC_IN_UHLINK_PORT_TYPE_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_PORT_IDX_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_LBN 16
 #define	MC_CMD_FC_IN_UHLINK_PORT_IDX_WIDTH 8
+#define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_OFST 4
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_LBN 24
 #define	MC_CMD_FC_IN_UHLINK_CMD_FORMAT_WIDTH 8
 /* enum: Default FC command format; the fields PORT_TYPE and PORT_IDX are
@@ -668,10 +696,13 @@
 #define	MC_CMD_FC_IN_SET_LINK_SPEED_LEN 4
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_LBN 0
 #define	MC_CMD_FC_IN_SET_LINK_LOWPOWER_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_POWEROFF_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_LBN 1
 #define	MC_CMD_FC_IN_SET_LINK_POWEROFF_WIDTH 1
+#define	MC_CMD_FC_IN_SET_LINK_TXDIS_OFST 12
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_LBN 2
 #define	MC_CMD_FC_IN_SET_LINK_TXDIS_WIDTH 1
 
@@ -773,12 +804,16 @@
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DATA_LEN 4
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_FLAGS_LEN 4
+#define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_LBN 0
 #define	MC_CMD_FC_IN_TIMED_READ_SET_INDIRECT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_LBN 1
 #define	MC_CMD_FC_IN_TIMED_READ_SET_DOUBLE_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_LBN 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_EVENT_WIDTH 1
+#define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_OFST 44
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_LBN 3
 #define	MC_CMD_FC_IN_TIMED_READ_SET_PREREAD_WIDTH 2
 #define	MC_CMD_FC_IN_TIMED_READ_SET_NONE 0x0 /* enum */
@@ -1396,6 +1431,7 @@
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_LEN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_CODE_WIDTH 8
 /* enum: Test not yet initiated */
@@ -1406,31 +1442,43 @@
 #define	MC_CMD_FC_OP_DDR_TEST_SUCCESS 0x2
 /* enum: Test did not complete in specified time */
 #define	MC_CMD_FC_OP_DDR_TEST_TIMER_EXPIRED 0x3
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_LBN 11
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_LBN 9
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_OFST 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_LBN 8
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_PRESENT_B1_WIDTH 1
 /* Test result from FPGA */
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_RESULT_LEN 4
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_LBN 31
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_LBN 30
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_T1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_LBN 29
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B0_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_LBN 28
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_FPGA_SUPPORTS_B1_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_LBN 15
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_LBN 10
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_T1_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_LBN 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B0_WIDTH 5
+#define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_OFST 4
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_LBN 0
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_B1_WIDTH 5
 #define	MC_CMD_FC_OUT_DDR_TEST_POLL_TEST_COMPLETE 0x0 /* enum */
@@ -1447,6 +1495,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_GET_ASSERT_STATE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_LBN 8
 #define	MC_CMD_FC_OUT_GET_ASSERT_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -1455,6 +1504,7 @@
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1
 /* enum: Crash data has been sent */
 #define	MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2
+#define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_OFST 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_GET_ASSERT_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -1484,16 +1534,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1501,58 +1557,80 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_FPGA_TYPE_WIDTH 8
 #define	MC_CMD_FC_FPGA_TYPE_A7 0xa7 /* enum */
 #define	MC_CMD_FC_FPGA_TYPE_A5 0xa5 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED1_WIDTH 10
+#define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM3_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM4_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_B1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_SODIMM_T1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED2_WIDTH 2
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CRC_APPEND_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 /* enum */
 #define	MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED3_WIDTH 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_RESERVED4_OFST 16
@@ -1563,6 +1641,7 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_REVISION_HIGH_WIDTH 16
 
@@ -1570,16 +1649,22 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1587,66 +1672,94 @@
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_PMA_PASSTHROUGH_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_QDR_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DDR3_ECC_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_LBN 26
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_LBN 25
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_LBN 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_TO_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_LBN 23
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_T0_DDR3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_LBN 22
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_LBN 21
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DISCRETE1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_LBN 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM2_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_LBN 19
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SODIMM1_RLDRAM_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_LBN 18
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_LBN 17
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_7_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_10G 0x0 /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_3_SPEED_40G 0x1 /* enum */
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_LBN 15
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP7_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_LBN 14
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP6_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_LBN 13
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP5_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP4_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_LBN 11
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_LBN 10
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_LBN 9
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_LBN 7
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC3_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_LBN 6
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC2_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_LBN 5
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_FPGA_TYPE_WIDTH 4
 #define	MC_CMD_FC_FPGA_V2_TYPE_A3 0x0 /* enum */
@@ -1659,28 +1772,35 @@
 #define	MC_CMD_FC_FPGA_V2_TYPE_D7 0xb /* enum */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_RELEASE 0x1 */
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MINOR_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MAJOR_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_VERSION_LO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_BUILD_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_DEPLOYMENT_VERSION_MICRO_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_BUILD_V2_REVISION_HIGH_WIDTH 16
 
@@ -1688,16 +1808,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1705,40 +1831,53 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_FC_FLASH_BOOTED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_LBN 27
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_LBN 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_NIC1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_LBN 29
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP0_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_SFP1_DEF_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_RESERVED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_BUILD_FLAG_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_OFST 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_MEMORY_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_OFST 20
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_INSTANCE_SIZE_COUNT_WIDTH 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_OFST 24
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_REVISION_HIGH_WIDTH 16
 
@@ -1746,16 +1885,22 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_LEN 32
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_INFO_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_LBN 31
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_APPLICATION_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_LBN 30
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IS_LICENSED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_COMPONENT_ID_WIDTH 14
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_NUM_WIDTH 4
 /* Build timestamp (seconds since epoch) */
@@ -1763,14 +1908,18 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_TIMESTAMP_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PARAMETERS_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_PTP_ENABLED_WIDTH 1
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_OFST 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_LBN 8
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_FC_FLASH_BOOTED_WIDTH 1
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_IDENTIFIER_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_CHANGESET_WIDTH 16
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_OFST 12
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_LBN 16
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_BUILD_FLAG_WIDTH 1
 /*               MC_CMD_FC_FPGA_BUILD_FLAG_INTERNAL 0x0 */
@@ -1779,6 +1928,7 @@
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_LO_LEN 4
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HI_LEN 4
+#define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_OFST 28
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_LBN 0
 #define	MC_CMD_FC_OUT_FPGA_SERVICES_V2_REVISION_HIGH_WIDTH 16
 
@@ -1787,10 +1937,13 @@
 /* Qsys system ID */
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_SYSID_LEN 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_LBN 12
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MAJOR_WIDTH 4
+#define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_LBN 4
 #define	MC_CMD_FC_OUT_BSP_VERSION_VERSION_MINOR_WIDTH 8
+#define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_OFST 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_LBN 0
 #define	MC_CMD_FC_OUT_BSP_VERSION_BUILD_NUM_WIDTH 4
 
@@ -1888,29 +2041,37 @@
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LEN 48
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_0_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_VOD_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_OFST 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_1STPOSTTAP_WIDTH 16
 /* Transceiver Transmit settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_SETTINGS_1_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_PRETAP_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_OFST 4
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_TX_PREEMP_2NDPOSTTAP_WIDTH 16
 /* Transceiver Receive settings */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_SETTINGS_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_DC_GAIN_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_OFST 8
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_TRC_RX_EQ_CONTROL_WIDTH 16
 /* Rx eye opening */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_WIDTH_WIDTH 16
+#define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_OFST 12
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_LBN 16
 #define	MC_CMD_FC_OUT_UHLINK_PHY_RX_EYE_HEIGHT_WIDTH 16
 /* PCS status word */
@@ -1919,8 +2080,10 @@
 /* Link status word */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WORD_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_STATE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_OFST 20
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_LINK_CONFIGURED_WIDTH 1
 /* Current SFp parameters applied */
@@ -1944,10 +2107,13 @@
 /* PHY config flags */
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_LEN 4
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_LBN 0
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_DFE_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_LBN 1
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_AEQ_WIDTH 1
+#define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_OFST 44
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_LBN 2
 #define	MC_CMD_FC_OUT_UHLINK_PHY_PHY_CFG_RX_TUNING_WIDTH 1
 
@@ -2024,6 +2190,7 @@
 /* Capabilities of the FPGA/FC */
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAPABILITIES_LEN 4
+#define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_OFST 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_LBN 0
 #define	MC_CMD_FC_OUT_STARTUP_CAN_ACCESS_FLASH_WIDTH 1
 
@@ -2117,8 +2284,10 @@
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_LEN 4
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_FLAGS_LEN 4
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_LBN 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_READY_WIDTH 1
+#define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_OFST 0
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_LBN 1
 #define	MC_CMD_FC_OUT_DDR_GET_STATUS_CALIBRATED_WIDTH 1
 
@@ -2185,14 +2354,19 @@
 /* DDR soak test status word; bits [4:0] are relevant. */
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_STATUS_LEN 4
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_LBN 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PASSED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_LBN 1
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_FAILED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_LBN 2
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_COMPLETED_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_LBN 3
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_TIMEOUT_WIDTH 1
+#define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_OFST 0
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_LBN 4
 #define	MC_CMD_FC_OUT_DIAG_DDR_SOAK_RESULT_PNF_WIDTH 1
 /* DDR soak test error count */
@@ -2222,6 +2396,7 @@
 #define	MC_CMD_AOE_IN_LEN 4
 #define	MC_CMD_AOE_IN_OP_HDR_OFST 0
 #define	MC_CMD_AOE_IN_OP_HDR_LEN 4
+#define	MC_CMD_AOE_IN_OP_OFST 0
 #define	MC_CMD_AOE_IN_OP_LBN 0
 #define	MC_CMD_AOE_IN_OP_WIDTH 8
 /* enum: FPGA and CPLD information */
@@ -2408,18 +2583,25 @@
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_ADDR_HI_OFST 12
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CMD_LEN 4
+#define	MC_CMD_AOE_IN_MAC_STATS_DMA_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_LBN 0
 #define	MC_CMD_AOE_IN_MAC_STATS_DMA_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_LBN 1
 #define	MC_CMD_AOE_IN_MAC_STATS_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_LBN 2
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CHANGE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_LBN 3
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_ENABLE_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_LBN 4
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_CLEAR_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_LBN 5
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIODIC_NOEVENT_WIDTH 1
+#define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_OFST 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_LBN 16
 #define	MC_CMD_AOE_IN_MAC_STATS_PERIOD_MS_WIDTH 16
 /* Length of DMA data (optional) */
@@ -2485,6 +2667,7 @@
 /*            MC_CMD_AOE_IN_CMD_LEN 4 */
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_MODE_LEN 4
+#define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_LBN 0
 #define	MC_CMD_AOE_IN_LINK_STATE_CONFIG_MODE_WIDTH 8
 /* enum: AOE and associated external port */
@@ -2495,6 +2678,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_DIAGNOSTIC 0x2
 /* enum: Configure link state mode on given AOE port */
 #define	MC_CMD_AOE_IN_LINK_STATE_CUSTOM 0x3
+#define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_LBN 8
 #define	MC_CMD_AOE_IN_LINK_STATE_OPERATION_WIDTH 8
 /* enum: No-op */
@@ -2503,6 +2687,7 @@
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_OR 0x1
 /* enum: logical AND of all SFP ports link status */
 #define	MC_CMD_AOE_IN_LINK_STATE_OP_AND 0x2
+#define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_OFST 4
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_LBN 16
 #define	MC_CMD_AOE_IN_LINK_STATE_SFP_MASK_WIDTH 16
 
@@ -2605,6 +2790,7 @@
 /* FC boot control flags */
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_LEN 4
+#define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_OFST 4
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_LBN 0
 #define	MC_CMD_AOE_IN_FC_BOOT_CONTROL_BOOT_ENABLE_WIDTH 1
 
@@ -2624,6 +2810,7 @@
 /* Assertion status flag. */
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_GLOBAL_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_LBN 8
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_STATE_WIDTH 8
 /* enum: No crash data available */
@@ -2632,6 +2819,7 @@
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NEW 0x1 */
 /* enum: Crash data has been sent */
 /*               MC_CMD_FC_GET_ASSERT_FLAGS_STATE_NOTIFIED 0x2 */
+#define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_OFST 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_LBN 0
 #define	MC_CMD_AOE_OUT_GET_FC_ASSERT_INFO_TYPE_WIDTH 8
 /* enum: No crash has been recorded. */
@@ -2884,12 +3072,16 @@
 /* Information on the module. */
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_PRESENT_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_PRESENT_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_POWERED_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_POWERED_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_POWERED_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_OPERATIONAL_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_LBN 3
 #define	MC_CMD_AOE_OUT_DDR_NOT_REACHABLE_WIDTH 1
 /* Memory size, in MB. */
@@ -2934,21 +3126,28 @@
 /* Flags describing status info on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_FLAGS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_OFST 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_VALID_WIDTH 1
 /* DDR ECC status on the module. */
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_STATUS_LEN 4
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_LBN 0
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_LBN 1
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_LBN 2
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_WIDTH 1
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_LBN 8
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_SBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_LBN 16
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_DBE_COUNT_WIDTH 8
+#define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_OFST 4
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_LBN 24
 #define	MC_CMD_AOE_OUT_DDR_ECC_STATUS_CORDROP_COUNT_WIDTH 8
 
diff --git a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
index 5209b43ace..8276cfcdb6 100644
--- a/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
+++ b/drivers/common/sfc_efx/base/efx_regs_mcdi_strs.h
@@ -7,7 +7,7 @@
 /*
  * This file is automatically generated. DO NOT EDIT IT.
  * To make changes, edit the .yml files in sfregistry under doc/mcdi/ and
- * rebuild this file with "make -C doc mcdiheaders".
+ * rebuild this file with "make mcdi_headers_v5".
  *
  * The version of this file has MCDI strings really used in the libefx.
  */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 03/60] common/sfc_efx/base: add event queue operation to do polling
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
                     ` (58 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Event queue host interface differ on Riverhead and implementation
will be different.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c   | 325 ++++++++++++++-----------
 drivers/common/sfc_efx/base/efx_impl.h |   2 +
 2 files changed, 182 insertions(+), 145 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index e6a8d4ca1a..21fddfb64d 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -66,6 +66,17 @@ siena_ev_qstats_update(
 
 #endif /* EFSYS_OPT_SIENA */
 
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
+
 #if EFSYS_OPT_SIENA
 static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_init,				/* eevo_init */
@@ -74,6 +85,7 @@ static const efx_ev_ops_t	__efx_ev_siena_ops = {
 	siena_ev_qdestroy,			/* eevo_qdestroy */
 	siena_ev_qprime,			/* eevo_qprime */
 	siena_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	siena_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	siena_ev_qstats_update,			/* eevo_qstats_update */
@@ -89,6 +101,7 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 	ef10_ev_qdestroy,			/* eevo_qdestroy */
 	ef10_ev_qprime,				/* eevo_qprime */
 	ef10_ev_qpost,				/* eevo_qpost */
+	siena_ef10_ev_qpoll,			/* eevo_qpoll */
 	ef10_ev_qmoderate,			/* eevo_qmoderate */
 #if EFSYS_OPT_QSTATS
 	ef10_ev_qstats_update,			/* eevo_qstats_update */
@@ -374,8 +387,6 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
-#define	EFX_EV_BATCH	8
-
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
@@ -383,153 +394,15 @@ efx_ev_qpoll(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg)
 {
-	efx_qword_t ev[EFX_EV_BATCH];
-	unsigned int batch;
-	unsigned int total;
-	unsigned int count;
-	unsigned int index;
-	size_t offset;
-
-	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
-	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
-
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
-	    FSE_AZ_EV_CODE_DRV_GEN_EV);
-#if EFSYS_OPT_MCDI
-	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
-	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
-#endif
+	efx_nic_t *enp = eep->ee_enp;
+	const efx_ev_ops_t *eevop = enp->en_eevop;
 
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
-	EFSYS_ASSERT(countp != NULL);
-	EFSYS_ASSERT(eecp != NULL);
-
-	count = *countp;
-	do {
-		/* Read up until the end of the batch period */
-		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (total = 0; total < batch; ++total) {
-			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
-
-			if (!EFX_EV_PRESENT(ev[total]))
-				break;
-
-			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
-			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
-
-			offset += sizeof (efx_qword_t);
-		}
-
-#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
-		/*
-		 * Prefetch the next batch when we get within PREFETCH_PERIOD
-		 * of a completed batch. If the batch is smaller, then prefetch
-		 * immediately.
-		 */
-		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
-			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-		/* Process the batch of events */
-		for (index = 0; index < total; ++index) {
-			boolean_t should_abort;
-			uint32_t code;
-
-#if EFSYS_OPT_EV_PREFETCH
-			/* Prefetch if we've now reached the batch period */
-			if (total == batch &&
-			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
-				offset = (count + batch) & eep->ee_mask;
-				offset *= sizeof (efx_qword_t);
-
-				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
-			}
-#endif	/* EFSYS_OPT_EV_PREFETCH */
-
-			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
-			switch (code) {
-			case FSE_AZ_EV_CODE_RX_EV:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_TX_EV:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRIVER_EV:
-				should_abort = eep->ee_driver(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case FSE_AZ_EV_CODE_DRV_GEN_EV:
-				should_abort = eep->ee_drv_gen(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#if EFSYS_OPT_MCDI
-			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-#endif
-			case FSE_AZ_EV_CODE_GLOBAL_EV:
-				if (eep->ee_global) {
-					should_abort = eep->ee_global(eep,
-					    &(ev[index]), eecp, arg);
-					break;
-				}
-				/* else fallthrough */
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
-			if (should_abort) {
-				/* Ignore subsequent events */
-				total = index + 1;
-
-				/*
-				 * Poison batch to ensure the outer
-				 * loop is broken out of.
-				 */
-				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
-				batch += (EFX_EV_BATCH << 1);
-				EFSYS_ASSERT(total != batch);
-				break;
-			}
-		}
-
-		/*
-		 * Now that the hardware has most likely moved onto dma'ing
-		 * into the next cache line, clear the processed events. Take
-		 * care to only clear out events that we've processed
-		 */
-		EFX_SET_QWORD(ev[0]);
-		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
-		for (index = 0; index < total; ++index) {
-			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
-			offset += sizeof (efx_qword_t);
-		}
-
-		count += total;
-
-	} while (total == batch);
+	EFSYS_ASSERT(eevop != NULL &&
+	    eevop->eevo_qpoll != NULL);
 
-	*countp = count;
+	eevop->eevo_qpoll(eep, countp, eecp, arg);
 }
 
 			void
@@ -1484,3 +1357,165 @@ siena_ev_fini(
 }
 
 #endif /* EFSYS_OPT_SIENA */
+
+#if EFX_OPTS_EF10() || EFSYS_OPT_SIENA
+
+#define	EFX_EV_BATCH	8
+
+static			void
+siena_ef10_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EFX_EV_BATCH];
+	unsigned int batch;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	/* Ensure events codes match for EF10 (Huntington/Medford) and Siena */
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_LBN == FSF_AZ_EV_CODE_LBN);
+	EFX_STATIC_ASSERT(ESF_DZ_EV_CODE_WIDTH == FSF_AZ_EV_CODE_WIDTH);
+
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_RX_EV == FSE_AZ_EV_CODE_RX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_TX_EV == FSE_AZ_EV_CODE_TX_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRIVER_EV == FSE_AZ_EV_CODE_DRIVER_EV);
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_DRV_GEN_EV ==
+	    FSE_AZ_EV_CODE_DRV_GEN_EV);
+#if EFSYS_OPT_MCDI
+	EFX_STATIC_ASSERT(ESE_DZ_EV_CODE_MCDI_EV ==
+	    FSE_AZ_EV_CODE_MCDI_EVRESPONSE);
+#endif
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EFX_EV_BATCH - (count & (EFX_EV_BATCH - 1));
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EFX_EV_PRESENT(ev[total]))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+#if EFSYS_OPT_EV_PREFETCH && (EFSYS_OPT_EV_PREFETCH_PERIOD > 1)
+		/*
+		 * Prefetch the next batch when we get within PREFETCH_PERIOD
+		 * of a completed batch. If the batch is smaller, then prefetch
+		 * immediately.
+		 */
+		if (total == batch && total < EFSYS_OPT_EV_PREFETCH_PERIOD)
+			EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+#if EFSYS_OPT_EV_PREFETCH
+			/* Prefetch if we've now reached the batch period */
+			if (total == batch &&
+			    index + EFSYS_OPT_EV_PREFETCH_PERIOD == total) {
+				offset = (count + batch) & eep->ee_mask;
+				offset *= sizeof (efx_qword_t);
+
+				EFSYS_MEM_PREFETCH(eep->ee_esmp, offset);
+			}
+#endif	/* EFSYS_OPT_EV_PREFETCH */
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], FSF_AZ_EV_CODE);
+			switch (code) {
+			case FSE_AZ_EV_CODE_RX_EV:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_TX_EV:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRIVER_EV:
+				should_abort = eep->ee_driver(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+			case FSE_AZ_EV_CODE_DRV_GEN_EV:
+				should_abort = eep->ee_drv_gen(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#if EFSYS_OPT_MCDI
+			case FSE_AZ_EV_CODE_MCDI_EVRESPONSE:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
+#endif
+			case FSE_AZ_EV_CODE_GLOBAL_EV:
+				if (eep->ee_global) {
+					should_abort = eep->ee_global(eep,
+					    &(ev[index]), eecp, arg);
+					break;
+				}
+				/* else fallthrough */
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EFX_EV_BATCH);
+				batch += (EFX_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * Now that the hardware has most likely moved onto dma'ing
+		 * into the next cache line, clear the processed events. Take
+		 * care to only clear out events that we've processed
+		 */
+		EFX_SET_QWORD(ev[0]);
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (index = 0; index < total; ++index) {
+			EFSYS_MEM_WRITEQ(eep->ee_esmp, offset, &(ev[0]));
+			offset += sizeof (efx_qword_t);
+		}
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+#endif	/* EFX_OPTS_EF10() || EFSYS_OPT_SIENA */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 87c7d5df52..1ef68e2d3a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -85,6 +85,8 @@ typedef struct efx_ev_ops_s {
 	void		(*eevo_qdestroy)(efx_evq_t *);
 	efx_rc_t	(*eevo_qprime)(efx_evq_t *, unsigned int);
 	void		(*eevo_qpost)(efx_evq_t *, uint16_t);
+	void		(*eevo_qpoll)(efx_evq_t *, unsigned int *,
+					const efx_ev_callbacks_t *, void *);
 	efx_rc_t	(*eevo_qmoderate)(efx_evq_t *, unsigned int);
 #if EFSYS_OPT_QSTATS
 	void		(*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 04/60] common/sfc_efx/base: add efsys option for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (2 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
                     ` (57 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 44 ++++++++++++-------------
 drivers/common/sfc_efx/efsys.h          |  3 ++
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 5a04a69e5f..978321cf67 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -47,8 +47,8 @@
 
 #if EFSYS_OPT_CHECK_REG
 /* Verify chip implements accessed registers */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "CHECK_REG requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "CHECK_REG requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_CHECK_REG */
 
@@ -79,21 +79,21 @@
 
 #if EFSYS_OPT_FILTER
 /* Support hardware packet filters */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "FILTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "FILTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_FILTER */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 # if !EFSYS_OPT_FILTER
-#  error "EF10 arch requires FILTER"
+#  error "RIVERHEAD or EF10 arch requires FILTER"
 # endif
 #endif /* EFX_OPTS_EF10() */
 
 #if EFSYS_OPT_LOOPBACK
 /* Support hardware loopback modes */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "LOOPBACK requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "LOOPBACK requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_LOOPBACK */
 
@@ -107,21 +107,21 @@
 
 #if EFSYS_OPT_MAC_STATS
 /* Support MAC statistics */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MAC_STATS requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MAC_STATS requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MAC_STATS */
 
 #if EFSYS_OPT_MCDI
 /* Support management controller messages */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "MCDI requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "MCDI requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_MCDI */
 
-#if (EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#if (EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
 # if !EFSYS_OPT_MCDI
-#  error "EF10 arch or SIENA requires MCDI"
+#  error "RIVERHEAD or EF10 arch or SIENA requires MCDI"
 # endif
 #endif
 
@@ -288,15 +288,15 @@
 
 #if EFSYS_OPT_RX_SCALE
 /* Support receive scaling (RSS) */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCALE requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCALE requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCALE */
 
 #if EFSYS_OPT_RX_SCATTER
 /* Support receive scatter DMA */
-# if !(EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
-#  error "RX_SCATTER requires EF10 arch or SIENA"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() || EFSYS_OPT_SIENA)
+#  error "RX_SCATTER requires RIVERHEAD or EF10 arch or SIENA"
 # endif
 #endif /* EFSYS_OPT_RX_SCATTER */
 
@@ -338,8 +338,8 @@
 
 #if EFSYS_OPT_ALLOW_UNCONFIGURED_NIC
 /* Support adapters with missing static config (for factory use only) */
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "ALLOW_UNCONFIGURED_NIC requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "ALLOW_UNCONFIGURED_NIC requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_ALLOW_UNCONFIGURED_NIC */
 
@@ -359,8 +359,8 @@
 
 /* Support hardware assistance for tunnels */
 #if EFSYS_OPT_TUNNEL
-# if !(EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
-#  error "TUNNEL requires MEDFORD or MEDFORD2"
+# if !(EFSYS_OPT_RIVERHEAD || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2)
+#  error "TUNNEL requires RIVERHEAD or MEDFORD or MEDFORD2"
 # endif
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 46b08f9789..1567d91588 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -105,6 +105,9 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_MEDFORD 1
 /* Enable SFN2xxx support */
 #define EFSYS_OPT_MEDFORD2 1
+/* Disable Riverhead support */
+#define EFSYS_OPT_RIVERHEAD 0
+
 #ifdef RTE_LIBRTE_SFC_EFX_DEBUG
 #define EFSYS_OPT_CHECK_REG 1
 #else
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 05/60] common/sfc_efx/base: add Riverhead NIC family
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (3 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
                     ` (56 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Riverhead is the first NIC family of the EF100 architecture.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 +++++++
 drivers/common/sfc_efx/base/efx_impl.h |  3 +++
 drivers/common/sfc_efx/base/efx_nic.c  | 14 ++++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c1b4876314..2082efe023 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -55,6 +55,7 @@ typedef enum efx_family_e {
 	EFX_FAMILY_HUNTINGTON,
 	EFX_FAMILY_MEDFORD,
 	EFX_FAMILY_MEDFORD2,
+	EFX_FAMILY_RIVERHEAD,
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
@@ -68,6 +69,7 @@ efx_family(
 
 
 #define	EFX_PCI_VENID_SFC			0x1924
+#define	EFX_PCI_VENID_XILINX			0x10EE
 
 #define	EFX_PCI_DEVID_FALCON			0x0710	/* SFC4000 */
 
@@ -90,6 +92,8 @@ efx_family(
 #define	EFX_PCI_DEVID_MEDFORD2			0x0B03	/* SFC9250 PF */
 #define	EFX_PCI_DEVID_MEDFORD2_VF		0x1B03	/* SFC9250 VF */
 
+#define	EFX_PCI_DEVID_RIVERHEAD			0x0100
+#define	EFX_PCI_DEVID_RIVERHEAD_VF		0x1100
 
 #define	EFX_MEM_BAR_SIENA			2
 
@@ -101,6 +105,9 @@ efx_family(
 
 #define	EFX_MEM_BAR_MEDFORD2			0
 
+/* FIXME Fix it when memory bar is fixed in FPGA image. It must be 0. */
+#define	EFX_MEM_BAR_RIVERHEAD			2
+
 
 /* Error codes */
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ef68e2d3a..898770c1cb 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -871,6 +871,9 @@ struct efx_nic_s {
 	 (_enp)->en_family == EFX_FAMILY_MEDFORD || \
 	 (_enp)->en_family == EFX_FAMILY_HUNTINGTON)
 
+#define	EFX_FAMILY_IS_EF100(_enp) \
+	((_enp)->en_family == EFX_FAMILY_RIVERHEAD)
+
 
 #define	EFX_NIC_MAGIC	0x02121996
 
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 267d010524..b5e36661c9 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -85,6 +85,20 @@ efx_family(
 		}
 	}
 
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			*efp = EFX_FAMILY_RIVERHEAD;
+			*membarp = EFX_MEM_BAR_RIVERHEAD;
+			return (0);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
 	*efp = EFX_FAMILY_INVALID;
 	return (ENOTSUP);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 06/60] common/sfc_efx/base: update registers check for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (4 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
                     ` (55 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Riverhead family got letter 'G' for registers definition.
Registers used for Riverhead should have the letter in the
specification range.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 898770c1cb..f891172086 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1008,6 +1008,10 @@ struct efx_txq_s {
 			rev = 'F';					\
 			break;						\
 									\
+		case EFX_FAMILY_RIVERHEAD:				\
+			rev = 'G';					\
+			break;						\
+									\
 		default:						\
 			rev = '?';					\
 			break;						\
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 07/60] common/sfc_efx/base: use EF10 MCDI methods for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (5 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
                     ` (54 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

MCDI on Riverhead is very close to the EF10 and there is no
point to duplicate the code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 46 ++++++++++++++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  8 ++---
 drivers/common/sfc_efx/base/efx_impl.h  |  4 +--
 drivers/common/sfc_efx/base/efx_mcdi.c  | 21 +++++++++++
 4 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 9e8a0c1f69..727f14826e 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_MCDI
 
@@ -27,7 +27,7 @@ ef10_mcdi_init(
 	efx_dword_t dword;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 	EFSYS_ASSERT(enp->en_features & EFX_FEATURE_MCDI_DMA);
 
 	/*
@@ -53,7 +53,16 @@ ef10_mcdi_init(
 		goto fail2;
 	}
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0, 1);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	/* Save initial MC reboot status */
 	(void) ef10_mcdi_poll_reboot(enp);
@@ -133,7 +142,7 @@ ef10_mcdi_send_request(
 	efx_dword_t dword;
 	unsigned int pos;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/* Write the header */
 	for (pos = 0; pos < hdr_len; pos += sizeof (efx_dword_t)) {
@@ -154,11 +163,29 @@ ef10_mcdi_send_request(
 	/* Ring the doorbell to post the command DMA address to the MC */
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) >> 32);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		break;
+	}
 
 	EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
 	    EFSYS_MEM_ADDR(esmp) & 0xffffffff);
-	EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		break;
+	}
 }
 
 	__checkReturn	boolean_t
@@ -210,6 +237,9 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
+	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
+	    ER_GZ_MC_SFT_STATUS_OFST);
+
 	/* Update MC reboot status word */
 	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
 	new_status = dword.ed_u32[0];
@@ -255,7 +285,7 @@ ef10_mcdi_feature_supported(
 	uint32_t privilege_mask = encp->enc_privilege_mask;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	/*
 	 * Use privilege mask state at MCDI attach.
@@ -316,4 +346,4 @@ ef10_mcdi_feature_supported(
 
 #endif	/* EFSYS_OPT_MCDI */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2082efe023..c7fe814ca0 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -243,8 +243,8 @@ efx_nic_check_pcie_link_speed(
 
 #if EFSYS_OPT_MCDI
 
-#if EFX_OPTS_EF10()
-/* EF10 architecture NICs require MCDIv2 commands */
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+/* EF10 architecture and Riverhead NICs require MCDIv2 commands */
 #define	WITH_MCDI_V2 1
 #endif
 
@@ -1438,11 +1438,11 @@ typedef struct efx_nic_cfg_s {
 #if EFSYS_OPT_BIST
 	uint32_t		enc_bist_mask;
 #endif	/* EFSYS_OPT_BIST */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	uint32_t		enc_pf;
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f891172086..c7edeaa000 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -37,9 +37,9 @@
 #include "medford2_impl.h"
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 #include "ef10_impl.h"
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #ifdef	__cplusplus
 extern "C" {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8cd651f529..dec3a170a7 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -60,6 +60,21 @@ static const efx_mcdi_ops_t	__efx_mcdi_ef10_ops = {
 
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_mcdi_ops_t	__efx_mcdi_rhead_ops = {
+	ef10_mcdi_init,			/* emco_init */
+	ef10_mcdi_send_request,		/* emco_send_request */
+	ef10_mcdi_poll_reboot,		/* emco_poll_reboot */
+	ef10_mcdi_poll_response,	/* emco_poll_response */
+	ef10_mcdi_read_response,	/* emco_read_response */
+	ef10_mcdi_fini,			/* emco_fini */
+	ef10_mcdi_feature_supported,	/* emco_feature_supported */
+	ef10_mcdi_get_timeout,		/* emco_get_timeout */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 
 	__checkReturn	efx_rc_t
@@ -98,6 +113,12 @@ efx_mcdi_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emcop = &__efx_mcdi_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 08/60] common/sfc_efx/base: use EF10 PHY methods for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (6 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
                     ` (53 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

There is no difference yet in PHY support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_phy.c |  4 ++--
 drivers/common/sfc_efx/base/efx_phy.c  | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_phy.c b/drivers/common/sfc_efx/base/ef10_phy.c
index 622374f7b6..b9822e4d42 100644
--- a/drivers/common/sfc_efx/base/ef10_phy.c
+++ b/drivers/common/sfc_efx/base/ef10_phy.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 static			void
 mcdi_phy_decode_cap(
@@ -755,4 +755,4 @@ ef10_bist_stop(
 
 #endif	/* EFSYS_OPT_BIST */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_phy.c b/drivers/common/sfc_efx/base/efx_phy.c
index 841d148852..8df868d80c 100644
--- a/drivers/common/sfc_efx/base/efx_phy.c
+++ b/drivers/common/sfc_efx/base/efx_phy.c
@@ -48,6 +48,26 @@ static const efx_phy_ops_t	__efx_phy_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_phy_ops_t	__efx_phy_rhead_ops = {
+	ef10_phy_power,			/* epo_power */
+	NULL,				/* epo_reset */
+	ef10_phy_reconfigure,		/* epo_reconfigure */
+	ef10_phy_verify,		/* epo_verify */
+	ef10_phy_oui_get,		/* epo_oui_get */
+	ef10_phy_link_state_get,	/* epo_link_state_get */
+#if EFSYS_OPT_PHY_STATS
+	ef10_phy_stats_update,		/* epo_stats_update */
+#endif	/* EFSYS_OPT_PHY_STATS */
+#if EFSYS_OPT_BIST
+	ef10_bist_enable_offline,	/* epo_bist_enable_offline */
+	ef10_bist_start,		/* epo_bist_start */
+	ef10_bist_poll,			/* epo_bist_poll */
+	ef10_bist_stop,			/* epo_bist_stop */
+#endif	/* EFSYS_OPT_BIST */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_phy_probe(
 	__in		efx_nic_t *enp)
@@ -88,6 +108,12 @@ efx_phy_probe(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		epop = &__efx_phy_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_MEDFORD2 */
+
 	default:
 		rc = ENOTSUP;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 09/60] common/sfc_efx/base: move 14b prefix check out of caps get
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (7 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
                     ` (52 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

The function which gets capabilities from MC should simply fill in
NIC configuration. Caller should decide if the configuration is
supported or not.

The change is required to prepare the function to be reused on
Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 33 ++++++++++++++------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 34fa45e8c1..bb5fd50eab 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1062,15 +1062,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
-	/*
-	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
-	 * We only support the 14 byte prefix here.
-	 */
-	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14) == 0) {
-		rc = ENOTSUP;
-		goto fail4;
-	}
-	encp->enc_rx_prefix_size = 14;
+	/* Check if RXDP firmware inserts 14 byte prefix */
+	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
+		encp->enc_rx_prefix_size = 14;
+	else
+		encp->enc_rx_prefix_size = 0;
 
 #if EFSYS_OPT_RX_SCALE
 	/* Check if the firmware supports additional RSS modes */
@@ -1348,7 +1344,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1397,11 +1393,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail5:
-	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
@@ -1932,6 +1926,15 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail8;
 
+	/*
+	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
+	 * We only support the 14 byte prefix here.
+	 */
+	if (encp->enc_rx_prefix_size != 14) {
+		rc = ENOTSUP;
+		goto fail9;
+	}
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1960,7 +1963,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail9;
+			goto fail10;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1976,7 +1979,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail10;
+		goto fail11;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 10/60] common/sfc_efx/base: remove PF count get from caps get
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (8 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
                     ` (51 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

ef10_get_datapath_caps() should simply fill in NIC configuration
based MC_CMD_GET_CAPABILITIES output.

Number of PFs is a part of board configuration should be obtained
in corresponding function.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 37 +++++++++++++-------------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index bb5fd50eab..f7c4601819 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1031,10 +1031,6 @@ ef10_get_datapath_caps(
 		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
 	efx_rc_t rc;
 
-	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
-		goto fail1;
-
-
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
@@ -1045,12 +1041,12 @@ ef10_get_datapath_caps(
 
 	if (req.emr_rc != 0) {
 		rc = req.emr_rc;
-		goto fail2;
+		goto fail1;
 	}
 
 	if (req.emr_out_length_used < MC_CMD_GET_CAPABILITIES_OUT_LEN) {
 		rc = EMSGSIZE;
-		goto fail3;
+		goto fail2;
 	}
 
 #define	CAP_FLAGS1(_req, _flag)						\
@@ -1344,7 +1340,7 @@ ef10_get_datapath_caps(
 
 		default:
 			rc = EINVAL;
-			goto fail4;
+			goto fail3;
 		}
 
 		/* Port numbers cannot contribute to the hash value */
@@ -1393,11 +1389,9 @@ ef10_get_datapath_caps(
 	return (0);
 
 #if EFSYS_OPT_RX_SCALE
-fail4:
-	EFSYS_PROBE(fail4);
-#endif /* EFSYS_OPT_RX_SCALE */
 fail3:
 	EFSYS_PROBE(fail3);
+#endif /* EFSYS_OPT_RX_SCALE */
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1856,6 +1850,9 @@ ef10_nic_board_cfg(
 	encp->enc_pf = pf;
 	encp->enc_vf = vf;
 
+	if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0)
+		goto fail4;
+
 	/* MAC address for this function */
 	if (EFX_PCI_FUNCTION_IS_PF(encp)) {
 		rc = efx_mcdi_get_mac_address_pf(enp, mac_addr);
@@ -1880,7 +1877,7 @@ ef10_nic_board_cfg(
 		rc = efx_mcdi_get_mac_address_vf(enp, mac_addr);
 	}
 	if (rc != 0)
-		goto fail4;
+		goto fail5;
 
 	EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
 
@@ -1891,7 +1888,7 @@ ef10_nic_board_cfg(
 		if (rc == EACCES)
 			board_type = 0;
 		else
-			goto fail5;
+			goto fail6;
 	}
 
 	encp->enc_board_type = board_type;
@@ -1899,7 +1896,7 @@ ef10_nic_board_cfg(
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
-		goto fail6;
+		goto fail7;
 
 	/*
 	 * Firmware with support for *_FEC capability bits does not
@@ -1918,13 +1915,13 @@ ef10_nic_board_cfg(
 
 	/* Obtain the default PHY advertised capabilities */
 	if ((rc = ef10_phy_get_link(enp, &els)) != 0)
-		goto fail7;
+		goto fail8;
 	epp->ep_default_adv_cap_mask = els.epls.epls_adv_cap_mask;
 	epp->ep_adv_cap_mask = els.epls.epls_adv_cap_mask;
 
 	/* Check capabilities of running datapath firmware */
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
-		goto fail8;
+		goto fail9;
 
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
@@ -1932,7 +1929,7 @@ ef10_nic_board_cfg(
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail9;
+		goto fail10;
 	}
 
 	/* Alignment for WPTR updates */
@@ -1963,7 +1960,7 @@ ef10_nic_board_cfg(
 	/* Get interrupt vector limits */
 	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
 		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail10;
+			goto fail11;
 
 		/* Ignore error (cannot query vector limits from a VF). */
 		base = 0;
@@ -1979,7 +1976,7 @@ ef10_nic_board_cfg(
 	 * can result in time-of-check/time-of-use bugs.
 	 */
 	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail11;
+		goto fail12;
 	encp->enc_privilege_mask = mask;
 
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
@@ -1988,10 +1985,12 @@ ef10_nic_board_cfg(
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail12;
+			goto fail13;
 
 	return (0);
 
+fail13:
+	EFSYS_PROBE(fail13);
 fail12:
 	EFSYS_PROBE(fail12);
 fail11:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 11/60] common/sfc_efx/base: factor out helper to get board config
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (9 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
                     ` (50 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

The helper will be used on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 213 ++++++++++++++-----------
 1 file changed, 117 insertions(+), 96 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index f7c4601819..47329ff8dc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1758,60 +1758,9 @@ ef10_external_port_mapping(
 }
 
 static	__checkReturn	efx_rc_t
-ef10_set_workaround_bug26807(
-	__in		efx_nic_t *enp)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	uint32_t flags;
-	efx_rc_t rc;
-
-	/*
-	 * If the bug26807 workaround is enabled, then firmware has enabled
-	 * support for chained multicast filters. Firmware will reset (FLR)
-	 * functions which have filters in the hardware filter table when the
-	 * workaround is enabled/disabled.
-	 *
-	 * We must recheck if the workaround is enabled after inserting the
-	 * first hardware filter, in case it has been changed since this check.
-	 */
-	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
-	    B_TRUE, &flags);
-	if (rc == 0) {
-		encp->enc_bug26807_workaround = B_TRUE;
-		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
-			/*
-			 * Other functions had installed filters before the
-			 * workaround was enabled, and they have been reset
-			 * by firmware.
-			 */
-			EFSYS_PROBE(bug26807_workaround_flr_done);
-			/* FIXME: bump MC warm boot count ? */
-		}
-	} else if (rc == EACCES) {
-		/*
-		 * Unprivileged functions cannot enable the workaround in older
-		 * firmware.
-		 */
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
-		encp->enc_bug26807_workaround = B_FALSE;
-	} else {
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-ef10_nic_board_cfg(
+efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
-	const efx_nic_ops_t *enop = enp->en_enop;
 	efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	ef10_link_state_t els;
@@ -1892,7 +1841,6 @@ ef10_nic_board_cfg(
 	}
 
 	encp->enc_board_type = board_type;
-	encp->enc_clk_mult = 1; /* not used for EF10 */
 
 	/* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
 	if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
@@ -1923,15 +1871,128 @@ ef10_nic_board_cfg(
 	if ((rc = ef10_get_datapath_caps(enp)) != 0)
 		goto fail9;
 
+	/* Get interrupt vector limits */
+	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
+		if (EFX_PCI_FUNCTION_IS_PF(encp))
+			goto fail10;
+
+		/* Ignore error (cannot query vector limits from a VF). */
+		base = 0;
+		nvec = 1024;
+	}
+	encp->enc_intr_vec_base = base;
+	encp->enc_intr_limit = nvec;
+
+	/*
+	 * Get the current privilege mask. Note that this may be modified
+	 * dynamically, so this value is informational only. DO NOT use
+	 * the privilege mask to check for sufficient privileges, as that
+	 * can result in time-of-check/time-of-use bugs.
+	 */
+	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
+		goto fail11;
+	encp->enc_privilege_mask = mask;
+
+	return (0);
+
+fail11:
+	EFSYS_PROBE(fail11);
+fail10:
+	EFSYS_PROBE(fail10);
+fail9:
+	EFSYS_PROBE(fail9);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_set_workaround_bug26807(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t flags;
+	efx_rc_t rc;
+
+	/*
+	 * If the bug26807 workaround is enabled, then firmware has enabled
+	 * support for chained multicast filters. Firmware will reset (FLR)
+	 * functions which have filters in the hardware filter table when the
+	 * workaround is enabled/disabled.
+	 *
+	 * We must recheck if the workaround is enabled after inserting the
+	 * first hardware filter, in case it has been changed since this check.
+	 */
+	rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
+	    B_TRUE, &flags);
+	if (rc == 0) {
+		encp->enc_bug26807_workaround = B_TRUE;
+		if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
+			/*
+			 * Other functions had installed filters before the
+			 * workaround was enabled, and they have been reset
+			 * by firmware.
+			 */
+			EFSYS_PROBE(bug26807_workaround_flr_done);
+			/* FIXME: bump MC warm boot count ? */
+		}
+	} else if (rc == EACCES) {
+		/*
+		 * Unprivileged functions cannot enable the workaround in older
+		 * firmware.
+		 */
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
+		encp->enc_bug26807_workaround = B_FALSE;
+	} else {
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+ef10_nic_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
 	/*
 	 * Huntington RXDP firmware inserts a 0 or 14 byte prefix.
 	 * We only support the 14 byte prefix here.
 	 */
 	if (encp->enc_rx_prefix_size != 14) {
 		rc = ENOTSUP;
-		goto fail10;
+		goto fail2;
 	}
 
+	encp->enc_clk_mult = 1; /* not used for EF10 */
+
 	/* Alignment for WPTR updates */
 	encp->enc_rx_push_align = EF10_RX_WPTR_ALIGN;
 
@@ -1957,56 +2018,16 @@ ef10_nic_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
-	/* Get interrupt vector limits */
-	if ((rc = efx_mcdi_get_vector_cfg(enp, &base, &nvec, NULL)) != 0) {
-		if (EFX_PCI_FUNCTION_IS_PF(encp))
-			goto fail11;
-
-		/* Ignore error (cannot query vector limits from a VF). */
-		base = 0;
-		nvec = 1024;
-	}
-	encp->enc_intr_vec_base = base;
-	encp->enc_intr_limit = nvec;
-
-	/*
-	 * Get the current privilege mask. Note that this may be modified
-	 * dynamically, so this value is informational only. DO NOT use
-	 * the privilege mask to check for sufficient privileges, as that
-	 * can result in time-of-check/time-of-use bugs.
-	 */
-	if ((rc = ef10_get_privilege_mask(enp, &mask)) != 0)
-		goto fail12;
-	encp->enc_privilege_mask = mask;
-
 	if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
-		goto fail11;
+		goto fail3;
 
 	/* Get remaining controller-specific board config */
 	if ((rc = enop->eno_board_cfg(enp)) != 0)
 		if (rc != EACCES)
-			goto fail13;
+			goto fail4;
 
 	return (0);
 
-fail13:
-	EFSYS_PROBE(fail13);
-fail12:
-	EFSYS_PROBE(fail12);
-fail11:
-	EFSYS_PROBE(fail11);
-fail10:
-	EFSYS_PROBE(fail10);
-fail9:
-	EFSYS_PROBE(fail9);
-fail8:
-	EFSYS_PROBE(fail8);
-fail7:
-	EFSYS_PROBE(fail7);
-fail6:
-	EFSYS_PROBE(fail6);
-fail5:
-	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 12/60] common/sfc_efx/base: set NIC features in generic place
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (10 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
                     ` (49 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

There is no point to duplicate it NIC family specific probe handlers.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 2 --
 drivers/common/sfc_efx/base/efx_nic.c   | 3 +++
 drivers/common/sfc_efx/base/siena_nic.c | 3 ---
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 47329ff8dc..4796dd6b59 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2098,8 +2098,6 @@ ef10_nic_probe(
 	}
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index b5e36661c9..9d6961e2ff 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -318,6 +318,7 @@ efx_nic_probe(
 	__in		efx_nic_t *enp,
 	__in		efx_fw_variant_t efv)
 {
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	const efx_nic_ops_t *enop;
 	efx_rc_t rc;
 
@@ -351,6 +352,8 @@ efx_nic_probe(
 	if ((rc = enop->eno_probe(enp)) != 0)
 		goto fail1;
 
+	encp->enc_features = enp->en_features;
+
 	if ((rc = efx_phy_probe(enp)) != 0)
 		goto fail2;
 
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index bd5e8ceb8a..b9b6d1951c 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -301,7 +301,6 @@ siena_nic_probe(
 	__in		efx_nic_t *enp)
 {
 	efx_port_t *epp = &(enp->en_port);
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	siena_link_state_t sls;
 	unsigned int mask;
 	efx_oword_t oword;
@@ -369,8 +368,6 @@ siena_nic_probe(
 		goto fail12;
 #endif
 
-	encp->enc_features = enp->en_features;
-
 	return (0);
 
 #if EFSYS_OPT_MON_STATS
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 13/60] common/sfc_efx/base: factor out MCDI entity reset helper
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (11 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
                     ` (48 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

The helper will be reused on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c | 51 +++++++++++++++++---------
 1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 4796dd6b59..c5990f16cc 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1921,6 +1921,39 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
+		MC_CMD_ENTITY_RESET_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_ENTITY_RESET;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
+
+	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
+	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
@@ -2203,9 +2236,6 @@ ef10_nic_set_drv_limits(
 ef10_nic_reset(
 	__in		efx_nic_t *enp)
 {
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_ENTITY_RESET_IN_LEN,
-		MC_CMD_ENTITY_RESET_OUT_LEN);
 	efx_rc_t rc;
 
 	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
@@ -2214,21 +2244,8 @@ ef10_nic_reset(
 	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
 		goto fail2;
 
-	req.emr_cmd = MC_CMD_ENTITY_RESET;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_ENTITY_RESET_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_ENTITY_RESET_OUT_LEN;
-
-	MCDI_IN_POPULATE_DWORD_1(req, ENTITY_RESET_IN_FLAG,
-	    ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
 		goto fail3;
-	}
 
 	/* Clear RX/TX DMA queue errors */
 	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 14/60] common/sfc_efx/base: add Riverhead support to NIC module
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (12 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
                     ` (47 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Define basic NIC features and limitations.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h  |  25 ++
 drivers/common/sfc_efx/base/ef10_nic.c   |  52 ++-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   4 +-
 drivers/common/sfc_efx/base/efx_nic.c    |  34 ++
 drivers/common/sfc_efx/base/meson.build  |   3 +-
 drivers/common/sfc_efx/base/rhead_impl.h | 105 +++++
 drivers/common/sfc_efx/base/rhead_nic.c  | 500 +++++++++++++++++++++++
 8 files changed, 716 insertions(+), 15 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_impl.h
 create mode 100644 drivers/common/sfc_efx/base/rhead_nic.c

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index da0ec7fab5..e933d88135 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -1422,12 +1422,37 @@ efx_mcdi_get_vector_cfg(
 	__out_opt	uint32_t *pf_nvecp,
 	__out_opt	uint32_t *vf_nvecp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_alloc_vis(
+	__in		efx_nic_t *enp,
+	__in		uint32_t min_vi_count,
+	__in		uint32_t max_vi_count,
+	__out		uint32_t *vi_basep,
+	__out		uint32_t *vi_countp,
+	__out		uint32_t *vi_shiftp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_free_vis(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn		efx_rc_t
 ef10_get_privilege_mask(
 	__in			efx_nic_t *enp,
 	__out			uint32_t *maskp);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_nic_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_entity_reset(
+	__in		efx_nic_t *enp);
+
 #if EFSYS_OPT_FW_SUBVARIANT_AWARE
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index c5990f16cc..80dc99aed5 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -10,7 +10,7 @@
 #include "mcdi_mon.h"
 #endif
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #include "ef10_tlv_layout.h"
 
@@ -24,7 +24,7 @@ efx_mcdi_get_port_assignment(
 		MC_CMD_GET_PORT_ASSIGNMENT_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_ASSIGNMENT;
 	req.emr_in_buf = payload;
@@ -68,7 +68,7 @@ efx_mcdi_get_port_modes(
 		MC_CMD_GET_PORT_MODES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_PORT_MODES;
 	req.emr_in_buf = payload;
@@ -223,6 +223,10 @@ ef10_nic_get_port_mode_bandwidth(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn		efx_rc_t
 efx_mcdi_vadaptor_alloc(
 	__in			efx_nic_t *enp,
@@ -292,6 +296,10 @@ efx_mcdi_vadaptor_free(
 	return (rc);
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_get_mac_address_pf(
 	__in			efx_nic_t *enp,
@@ -302,7 +310,7 @@ efx_mcdi_get_mac_address_pf(
 		MC_CMD_GET_MAC_ADDRESSES_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -358,7 +366,7 @@ efx_mcdi_get_mac_address_vf(
 		MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_VPORT_GET_MAC_ADDRESSES;
 	req.emr_in_buf = payload;
@@ -420,7 +428,7 @@ efx_mcdi_get_clock(
 		MC_CMD_GET_CLOCK_OUT_LEN);
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	req.emr_cmd = MC_CMD_GET_CLOCK;
 	req.emr_in_buf = payload;
@@ -569,7 +577,7 @@ efx_mcdi_get_vector_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_alloc_vis(
 	__in		efx_nic_t *enp,
 	__in		uint32_t min_vi_count,
@@ -631,7 +639,7 @@ efx_mcdi_alloc_vis(
 }
 
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_free_vis(
 	__in		efx_nic_t *enp)
 {
@@ -663,6 +671,9 @@ efx_mcdi_free_vis(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_alloc_piobuf(
@@ -978,6 +989,10 @@ ef10_nic_pio_unlink(
 	return (efx_mcdi_unlink_piobuf(enp, vi_index));
 }
 
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_mcdi_get_pf_count(
 	__in		efx_nic_t *enp,
@@ -1667,6 +1682,19 @@ static struct ef10_external_port_map_s {
 		(1U << TLV_PORT_MODE_NA_2x2),			/* mode 14 */
 		{ EFX_EXT_PORT_NA, 0, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
 	},
+	/*
+	 * Modes that on Riverhead allocate each port number to a separate
+	 * cage.
+	 *	port 0 -> cage 1
+	 *	port 1 -> cage 2
+	 */
+	{
+		EFX_FAMILY_RIVERHEAD,
+		(1U << TLV_PORT_MODE_1x1_NA) |			/* mode 0 */
+		(1U << TLV_PORT_MODE_1x4_NA) |			/* mode 1 */
+		(1U << TLV_PORT_MODE_1x1_1x1),			/* mode 2 */
+		{ 0, 1, EFX_EXT_PORT_NA, EFX_EXT_PORT_NA }
+	},
 };
 
 static	__checkReturn	efx_rc_t
@@ -1757,7 +1785,7 @@ ef10_external_port_mapping(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_nic_board_cfg(
 	__in		efx_nic_t *enp)
 {
@@ -1921,7 +1949,7 @@ efx_mcdi_nic_board_cfg(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+	__checkReturn	efx_rc_t
 efx_mcdi_entity_reset(
 	__in		efx_nic_t *enp)
 {
@@ -1954,6 +1982,10 @@ efx_mcdi_entity_reset(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 static	__checkReturn	efx_rc_t
 ef10_set_workaround_bug26807(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c7edeaa000..b41b0e5dea 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -41,6 +41,10 @@
 #include "ef10_impl.h"
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+#include "rhead_impl.h"
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -835,7 +839,7 @@ struct efx_nic_s {
 #endif	/* EFSYS_OPT_SIENA */
 		int	enu_unused;
 	} en_u;
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	union en_arch {
 		struct {
 			int			ena_vi_base;
@@ -856,7 +860,7 @@ struct efx_nic_s {
 			size_t			ena_wc_mem_map_size;
 		} ef10;
 	} en_arch;
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #if EFSYS_OPT_EVB
 	const efx_evb_ops_t	*en_eeop;
 	struct efx_vswitch_s    *en_vswitchp;
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index dec3a170a7..ade7f7fed4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2032,7 +2032,7 @@ efx_mcdi_mac_stats_periodic(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 /*
  * This function returns the pf and vf number of a function.  If it is a pf the
@@ -2129,7 +2129,7 @@ efx_mcdi_privilege_mask(
 	return (rc);
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 	__checkReturn		efx_rc_t
 efx_mcdi_set_workaround(
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 9d6961e2ff..465e2c7a36 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -188,6 +188,27 @@ static const efx_nic_ops_t	__efx_nic_medford2_ops = {
 
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_nic_ops_t	__efx_nic_riverhead_ops = {
+	rhead_nic_probe,		/* eno_probe */
+	rhead_board_cfg,		/* eno_board_cfg */
+	rhead_nic_set_drv_limits,	/* eno_set_drv_limits */
+	rhead_nic_reset,		/* eno_reset */
+	rhead_nic_init,			/* eno_init */
+	rhead_nic_get_vi_pool,		/* eno_get_vi_pool */
+	rhead_nic_get_bar_region,	/* eno_get_bar_region */
+	rhead_nic_hw_unavailable,	/* eno_hw_unavailable */
+	rhead_nic_set_hw_unavailable,	/* eno_set_hw_unavailable */
+#if EFSYS_OPT_DIAG
+	rhead_nic_register_test,	/* eno_register_test */
+#endif	/* EFSYS_OPT_DIAG */
+	rhead_nic_fini,			/* eno_fini */
+	rhead_nic_unprobe,		/* eno_unprobe */
+};
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_nic_create(
@@ -285,6 +306,19 @@ efx_nic_create(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		enp->en_enop = &__efx_nic_riverhead_ops;
+		enp->en_features =
+		    EFX_FEATURE_IPV6 |
+		    EFX_FEATURE_LINK_EVENTS |
+		    EFX_FEATURE_PERIODIC_MAC_STATS |
+		    EFX_FEATURE_MCDI |
+		    EFX_FEATURE_MAC_HEADER_FILTERS |
+		    EFX_FEATURE_MCDI_DMA;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = ENOTSUP;
 		goto fail2;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8909525c34..6ca5b57023 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -51,7 +51,8 @@ sources = [
 	'ef10_vpd.c',
 	'hunt_nic.c',
 	'medford_nic.c',
-	'medford2_nic.c'
+	'medford2_nic.c',
+	'rhead_nic.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
new file mode 100644
index 0000000000..e25a871cb3
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#ifndef	_SYS_RHEAD_IMPL_H
+#define	_SYS_RHEAD_IMPL_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+#define	RHEAD_EVQ_MAXNEVS	16384
+#define	RHEAD_EVQ_MINNEVS	256
+
+#define	RHEAD_RXQ_MAXNDESCS	16384
+#define	RHEAD_RXQ_MINNDESCS	256
+
+#define	RHEAD_TXQ_MAXNDESCS	16384
+#define	RHEAD_TXQ_MINNDESCS	256
+
+#define	RHEAD_EVQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
+#define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
+
+
+/* NIC */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_DIAG
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp);
+
+#endif	/* EFSYS_OPT_DIAG */
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp);
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_RHEAD_IMPL_H */
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
new file mode 100644
index 0000000000..c83d18e6ab
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -0,0 +1,500 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_board_cfg(
+	__in		efx_nic_t *enp)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	uint32_t end_padding;
+	uint32_t bandwidth;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
+		goto fail1;
+
+	encp->enc_clk_mult = 1; /* not used for Riverhead */
+
+	/*
+	 * FIXME There are TxSend and TxSeg descriptors on Riverhead.
+	 * TxSeg is bigger than TxSend.
+	 */
+	encp->enc_tx_dma_desc_size_max = EFX_MASK32(ESF_GZ_TX_SEND_LEN);
+	/* No boundary crossing limits */
+	encp->enc_tx_dma_desc_boundary = 0;
+
+	/*
+	 * Maximum number of bytes into the frame the TCP header can start for
+	 * firmware assisted TSO to work.
+	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+
+	/*
+	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
+	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
+	 * resources (allocated to this PCIe function), which is zero until
+	 * after we have allocated VIs.
+	 */
+	encp->enc_evq_limit = 1024;
+	encp->enc_rxq_limit = EFX_RXQ_LIMIT_TARGET;
+	encp->enc_txq_limit = EFX_TXQ_LIMIT_TARGET;
+
+	encp->enc_buftbl_limit = UINT32_MAX;
+
+	/*
+	 * Enable firmware workarounds for hardware errata.
+	 * Expected responses are:
+	 *  - 0 (zero):
+	 *	Success: workaround enabled or disabled as requested.
+	 *  - MC_CMD_ERR_ENOSYS (reported as ENOTSUP):
+	 *	Firmware does not support the MC_CMD_WORKAROUND request.
+	 *	(assume that the workaround is not supported).
+	 *  - MC_CMD_ERR_ENOENT (reported as ENOENT):
+	 *	Firmware does not support the requested workaround.
+	 *  - MC_CMD_ERR_EPERM  (reported as EACCES):
+	 *	Unprivileged function cannot enable/disable workarounds.
+	 *
+	 * See efx_mcdi_request_errcode() for MCDI error translations.
+	 */
+
+	/*
+	 * Replay engine on Riverhead should suppress duplicate packets
+	 * (e.g. because of exact multicast and all-multicast filters
+	 * match) to the same RxQ.
+	 */
+	encp->enc_bug26807_workaround = B_FALSE;
+
+	/*
+	 * Checksums for TSO sends should always be correct on Riverhead.
+	 * FIXME: revisit when TSO support is implemented.
+	 */
+	encp->enc_bug61297_workaround = B_FALSE;
+
+	encp->enc_evq_max_nevs = RHEAD_EVQ_MAXNEVS;
+	encp->enc_evq_min_nevs = RHEAD_EVQ_MINNEVS;
+	encp->enc_rxq_max_ndescs = RHEAD_RXQ_MAXNDESCS;
+	encp->enc_rxq_min_ndescs = RHEAD_RXQ_MINNDESCS;
+	encp->enc_txq_max_ndescs = RHEAD_TXQ_MAXNDESCS;
+	encp->enc_txq_min_ndescs = RHEAD_TXQ_MINNDESCS;
+
+	/* Riverhead FW does not support event queue timers yet. */
+	encp->enc_evq_timer_quantum_ns = 0;
+	encp->enc_evq_timer_max_us = 0;
+
+	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
+	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
+	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
+
+	/* No required alignment for WPTR updates */
+	encp->enc_rx_push_align = 1;
+
+	/* Riverhead supports a single Rx prefix size. */
+	encp->enc_rx_prefix_size = ESE_GZ_RX_PKT_PREFIX_LEN;
+
+	/* Alignment for receive packet DMA buffers. */
+	encp->enc_rx_buf_align_start = 1;
+
+	/* Get the RX DMA end padding alignment configuration. */
+	if ((rc = efx_mcdi_get_rxdp_config(enp, &end_padding)) != 0) {
+		if (rc != EACCES)
+			goto fail2;
+
+		/* Assume largest tail padding size supported by hardware. */
+		end_padding = 128;
+	}
+	encp->enc_rx_buf_align_end = end_padding;
+
+	/*
+	 * Riverhead stores a single global copy of VPD, not per-PF as on
+	 * Huntington.
+	 */
+	encp->enc_vpd_is_global = B_TRUE;
+
+	rc = ef10_nic_get_port_mode_bandwidth(enp, &bandwidth);
+	if (rc != 0)
+		goto fail3;
+	encp->enc_required_pcie_bandwidth_mbps = bandwidth;
+	encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN3;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_probe(
+	__in		efx_nic_t *enp)
+{
+	const efx_nic_ops_t *enop = enp->en_enop;
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/* Read and clear any assertion state */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+
+	/* Exit the assertion handler */
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		if (rc != EACCES)
+			goto fail2;
+
+	if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
+		goto fail3;
+
+	/* Get remaining controller-specific board config */
+	if ((rc = enop->eno_board_cfg(enp)) != 0)
+		goto fail4;
+
+	/*
+	 * Set default driver config limits (based on board config).
+	 *
+	 * FIXME: For now allocate a fixed number of VIs which is likely to be
+	 * sufficient and small enough to allow multiple functions on the same
+	 * port.
+	 */
+	edcp->edc_min_vi_count = edcp->edc_max_vi_count =
+	    MIN(128, MAX(encp->enc_rxq_limit, encp->enc_txq_limit));
+
+	/*
+	 * The client driver must configure and enable PIO buffer support,
+	 * but there is no PIO support on Riverhead anyway.
+	 */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+#if EFSYS_OPT_MAC_STATS
+	/* Wipe the MAC statistics */
+	if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
+		goto fail5;
+#endif
+
+#if EFSYS_OPT_LOOPBACK
+	if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
+		goto fail6;
+#endif
+
+	return (0);
+
+#if EFSYS_OPT_LOOPBACK
+fail6:
+	EFSYS_PROBE(fail6);
+#endif
+#if EFSYS_OPT_MAC_STATS
+fail5:
+	EFSYS_PROBE(fail5);
+#endif
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_set_drv_limits(
+	__inout		efx_nic_t *enp,
+	__in		efx_drv_limits_t *edlp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_evq_count, max_evq_count;
+	uint32_t min_rxq_count, max_rxq_count;
+	uint32_t min_txq_count, max_txq_count;
+	efx_rc_t rc;
+
+	if (edlp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	/* Get minimum required and maximum usable VI limits */
+	min_evq_count = MIN(edlp->edl_min_evq_count, encp->enc_evq_limit);
+	min_rxq_count = MIN(edlp->edl_min_rxq_count, encp->enc_rxq_limit);
+	min_txq_count = MIN(edlp->edl_min_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_min_vi_count =
+	    MAX(min_evq_count, MAX(min_rxq_count, min_txq_count));
+
+	max_evq_count = MIN(edlp->edl_max_evq_count, encp->enc_evq_limit);
+	max_rxq_count = MIN(edlp->edl_max_rxq_count, encp->enc_rxq_limit);
+	max_txq_count = MIN(edlp->edl_max_txq_count, encp->enc_txq_limit);
+
+	edcp->edc_max_vi_count =
+	    MAX(max_evq_count, MAX(max_rxq_count, max_txq_count));
+
+	/* There is no PIO support on Riverhead */
+	edcp->edc_max_piobuf_count = 0;
+	edcp->edc_pio_alloc_size = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_reset(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* ef10_nic_reset() is called to recover from BADASSERT failures. */
+	if ((rc = efx_mcdi_read_assertion(enp)) != 0)
+		goto fail1;
+	if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
+		goto fail2;
+
+	if ((rc = efx_mcdi_entity_reset(enp)) != 0)
+		goto fail3;
+
+	/* Clear RX/TX DMA queue errors */
+	enp->en_reset_flags &= ~(EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_init(
+	__in		efx_nic_t *enp)
+{
+	const efx_drv_cfg_t *edcp = &(enp->en_drv_cfg);
+	uint32_t min_vi_count, max_vi_count;
+	uint32_t vi_count, vi_base, vi_shift;
+	uint32_t vi_window_size;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
+
+	/* Enable reporting of some events (e.g. link change) */
+	if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
+		goto fail1;
+
+	min_vi_count = edcp->edc_min_vi_count;
+	max_vi_count = edcp->edc_max_vi_count;
+
+	/* Ensure that the previously attached driver's VIs are freed */
+	if ((rc = efx_mcdi_free_vis(enp)) != 0)
+		goto fail2;
+
+	/*
+	 * Reserve VI resources (EVQ+RXQ+TXQ) for this PCIe function. If this
+	 * fails then retrying the request for fewer VI resources may succeed.
+	 */
+	vi_count = 0;
+	if ((rc = efx_mcdi_alloc_vis(enp, min_vi_count, max_vi_count,
+		    &vi_base, &vi_count, &vi_shift)) != 0)
+		goto fail3;
+
+	EFSYS_PROBE2(vi_alloc, uint32_t, vi_base, uint32_t, vi_count);
+
+	if (vi_count < min_vi_count) {
+		rc = ENOMEM;
+		goto fail4;
+	}
+
+	enp->en_arch.ef10.ena_vi_base = vi_base;
+	enp->en_arch.ef10.ena_vi_count = vi_count;
+	enp->en_arch.ef10.ena_vi_shift = vi_shift;
+
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, !=,
+	    EFX_VI_WINDOW_SHIFT_INVALID);
+	EFSYS_ASSERT3U(enp->en_nic_cfg.enc_vi_window_shift, <=,
+	    EFX_VI_WINDOW_SHIFT_64K);
+	vi_window_size = 1U << enp->en_nic_cfg.enc_vi_window_shift;
+
+	/* Save UC memory mapping details */
+	enp->en_arch.ef10.ena_uc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_uc_mem_map_size =
+	    vi_window_size * enp->en_arch.ef10.ena_vi_count;
+
+	/* No WC memory mapping since PIO is not supported */
+	enp->en_arch.ef10.ena_pio_write_vi_base = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
+	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
+
+	enp->en_vport_id = EVB_PORT_ID_NULL;
+
+	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
+
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+
+	(void) efx_mcdi_free_vis(enp);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_vi_pool(
+	__in		efx_nic_t *enp,
+	__out		uint32_t *vi_countp)
+{
+	/*
+	 * Report VIs that the client driver can use.
+	 * Do not include VIs used for PIO buffer writes.
+	 */
+	*vi_countp = enp->en_arch.ef10.ena_vi_count;
+
+	return (0);
+}
+
+	__checkReturn	efx_rc_t
+rhead_nic_get_bar_region(
+	__in		efx_nic_t *enp,
+	__in		efx_nic_region_t region,
+	__out		uint32_t *offsetp,
+	__out		size_t *sizep)
+{
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
+
+	/*
+	 * TODO: Specify host memory mapping alignment and granularity
+	 * in efx_drv_limits_t so that they can be taken into account
+	 * when allocating extra VIs for PIO writes.
+	 */
+	switch (region) {
+	case EFX_REGION_VI:
+		/* UC mapped memory BAR region for VI registers */
+		*offsetp = enp->en_arch.ef10.ena_uc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_uc_mem_map_size;
+		break;
+
+	case EFX_REGION_PIO_WRITE_VI:
+		/* WC mapped memory BAR region for piobuf writes */
+		*offsetp = enp->en_arch.ef10.ena_wc_mem_map_offset;
+		*sizep = enp->en_arch.ef10.ena_wc_mem_map_size;
+		break;
+
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	boolean_t
+rhead_nic_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	efx_dword_t dword;
+
+	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
+		return (B_TRUE);
+
+	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
+		goto unavail;
+
+	return (B_FALSE);
+
+unavail:
+	rhead_nic_set_hw_unavailable(enp);
+
+	return (B_TRUE);
+}
+
+			void
+rhead_nic_set_hw_unavailable(
+	__in		efx_nic_t *enp)
+{
+	EFSYS_PROBE(hw_unavail);
+	enp->en_reset_flags |= EFX_RESET_HW_UNAVAIL;
+}
+
+			void
+rhead_nic_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_free_vis(enp);
+	enp->en_arch.ef10.ena_vi_count = 0;
+}
+
+			void
+rhead_nic_unprobe(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_mcdi_drv_attach(enp, B_FALSE);
+}
+
+#if EFSYS_OPT_DIAG
+
+	__checkReturn	efx_rc_t
+rhead_nic_register_test(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	/* FIXME */
+	_NOTE(ARGUNUSED(enp))
+	_NOTE(CONSTANTCONDITION)
+	if (B_FALSE) {
+		rc = ENOTSUP;
+		goto fail1;
+	}
+	/* FIXME */
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFSYS_OPT_DIAG */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (13 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
                     ` (46 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Riverhead does not support tunnels yet.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_tunnel.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 1cc072f0d9..b1d1407bd2 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -10,12 +10,12 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
 	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
 };
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
@@ -171,6 +171,12 @@ efx_tunnel_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etop = &__efx_tunnel_dummy_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 16/60] common/sfc_efx/base: use EF10 filter methods for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (14 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
                     ` (45 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Filtering MCDI on Riverhead are the same as on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c | 14 +++++++-------
 drivers/common/sfc_efx/base/efx_filter.c  | 18 ++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h    |  4 ++--
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 12c84a5640..51e6f1a210 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -7,7 +7,7 @@
 #include "efx.h"
 #include "efx_impl.h"
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_FILTER
 
@@ -94,7 +94,7 @@ ef10_filter_init(
 	efx_rc_t rc;
 	ef10_filter_table_t *eftp;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 #define	MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match))
 	EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_HOST ==
@@ -152,7 +152,7 @@ ef10_filter_init(
 ef10_filter_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if (enp->en_filter.ef_ef10_filter_table != NULL) {
 		EFSYS_KMEM_FREE(enp->en_esip, sizeof (ef10_filter_table_t),
@@ -540,7 +540,7 @@ ef10_filter_restore(
 	efsys_lock_state_t state;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	for (tbl_id = 0; tbl_id < EFX_EF10_FILTER_TBL_ROWS; tbl_id++) {
 
@@ -839,7 +839,7 @@ ef10_filter_add_internal(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	EFSYS_ASSERT(spec->efs_overridden_spec == NULL);
 
@@ -1149,7 +1149,7 @@ ef10_filter_delete(
 	efsys_lock_state_t state;
 	boolean_t locked = B_FALSE;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	hash = ef10_filter_hash(spec);
 
@@ -2138,4 +2138,4 @@ ef10_filter_default_rxq_clear(
 
 #endif /* EFSYS_OPT_FILTER */
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_filter.c b/drivers/common/sfc_efx/base/efx_filter.c
index 3310b738e2..9b4cd08bb8 100644
--- a/drivers/common/sfc_efx/base/efx_filter.c
+++ b/drivers/common/sfc_efx/base/efx_filter.c
@@ -68,6 +68,18 @@ static const efx_filter_ops_t	__efx_filter_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_filter_ops_t	__efx_filter_rhead_ops = {
+	ef10_filter_init,		/* efo_init */
+	ef10_filter_fini,		/* efo_fini */
+	ef10_filter_restore,		/* efo_restore */
+	ef10_filter_add,		/* efo_add */
+	ef10_filter_delete,		/* efo_delete */
+	ef10_filter_supported_filters,	/* efo_supported_filters */
+	ef10_filter_reconfigure,	/* efo_reconfigure */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_filter_insert(
 	__in		efx_nic_t *enp,
@@ -180,6 +192,12 @@ efx_filter_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		efop = &__efx_filter_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b41b0e5dea..cc34a05f95 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -465,9 +465,9 @@ typedef struct efx_filter_s {
 #if EFSYS_OPT_SIENA
 	siena_filter_t		*ef_siena_filter;
 #endif /* EFSYS_OPT_SIENA */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 	ef10_filter_table_t	*ef_ef10_filter_table;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 } efx_filter_t;
 
 #if EFSYS_OPT_SIENA
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 17/60] common/sfc_efx/base: use EF10 MAC methods for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (15 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
                     ` (44 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

There is no difference yet in MAC support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mac.c |  6 ++---
 drivers/common/sfc_efx/base/efx_impl.h |  1 +
 drivers/common/sfc_efx/base/efx_mac.c  | 32 ++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mac.c b/drivers/common/sfc_efx/base/ef10_mac.c
index 7e89f34a69..6fe44f13e2 100644
--- a/drivers/common/sfc_efx/base/ef10_mac.c
+++ b/drivers/common/sfc_efx/base/ef10_mac.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_mac_poll(
@@ -351,7 +351,7 @@ ef10_mac_multicast_list_set(
 	const efx_mac_ops_t *emop = epp->ep_emop;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	if ((rc = emop->emo_reconfigure(enp)) != 0)
 		goto fail1;
@@ -1039,4 +1039,4 @@ ef10_mac_stats_update(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index cc34a05f95..f2ea08bbf6 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -77,6 +77,7 @@ typedef enum efx_mac_type_e {
 	EFX_MAC_HUNTINGTON,
 	EFX_MAC_MEDFORD,
 	EFX_MAC_MEDFORD2,
+	EFX_MAC_RIVERHEAD,
 	EFX_MAC_NTYPES
 } efx_mac_type_t;
 
diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c
index ae23aad4b2..36aca6787c 100644
--- a/drivers/common/sfc_efx/base/efx_mac.c
+++ b/drivers/common/sfc_efx/base/efx_mac.c
@@ -64,6 +64,31 @@ static const efx_mac_ops_t	__efx_mac_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_mac_ops_t	__efx_mac_rhead_ops = {
+	ef10_mac_poll,				/* emo_poll */
+	ef10_mac_up,				/* emo_up */
+	ef10_mac_addr_set,			/* emo_addr_set */
+	ef10_mac_pdu_set,			/* emo_pdu_set */
+	ef10_mac_pdu_get,			/* emo_pdu_get */
+	ef10_mac_reconfigure,			/* emo_reconfigure */
+	ef10_mac_multicast_list_set,		/* emo_multicast_list_set */
+	ef10_mac_filter_default_rxq_set,	/* emo_filter_default_rxq_set */
+	ef10_mac_filter_default_rxq_clear,
+					/* emo_filter_default_rxq_clear */
+#if EFSYS_OPT_LOOPBACK
+	ef10_mac_loopback_set,			/* emo_loopback_set */
+#endif	/* EFSYS_OPT_LOOPBACK */
+#if EFSYS_OPT_MAC_STATS
+	ef10_mac_stats_get_mask,		/* emo_stats_get_mask */
+	efx_mcdi_mac_stats_clear,		/* emo_stats_clear */
+	efx_mcdi_mac_stats_upload,		/* emo_stats_upload */
+	efx_mcdi_mac_stats_periodic,		/* emo_stats_periodic */
+	ef10_mac_stats_update			/* emo_stats_update */
+#endif	/* EFSYS_OPT_MAC_STATS */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn			efx_rc_t
 efx_mac_pdu_set(
 	__in				efx_nic_t *enp,
@@ -873,6 +898,13 @@ efx_mac_select(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		emop = &__efx_mac_rhead_ops;
+		type = EFX_MAC_RIVERHEAD;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		rc = EINVAL;
 		goto fail1;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 18/60] common/sfc_efx/base: add interrupts module for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (16 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
                     ` (43 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Riverhead supports interrupt aggregation rings. Right now there
are no plans to support it in libefx, but it is better to have
own set of callbacks to easier handle EF10 and Riverhead
differences in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_intr.c   |  20 +++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  55 ++++++++++++
 drivers/common/sfc_efx/base/rhead_intr.c | 104 +++++++++++++++++++++++
 4 files changed, 180 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/rhead_intr.c

diff --git a/drivers/common/sfc_efx/base/efx_intr.c b/drivers/common/sfc_efx/base/efx_intr.c
index 7e3cc3c6a0..1dfa19df2e 100644
--- a/drivers/common/sfc_efx/base/efx_intr.c
+++ b/drivers/common/sfc_efx/base/efx_intr.c
@@ -89,6 +89,20 @@ static const efx_intr_ops_t	__efx_intr_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_intr_ops_t	__efx_intr_rhead_ops = {
+	rhead_intr_init,		/* eio_init */
+	rhead_intr_enable,		/* eio_enable */
+	rhead_intr_disable,		/* eio_disable */
+	rhead_intr_disable_unlocked,	/* eio_disable_unlocked */
+	rhead_intr_trigger,		/* eio_trigger */
+	rhead_intr_status_line,		/* eio_status_line */
+	rhead_intr_status_message,	/* eio_status_message */
+	rhead_intr_fatal,		/* eio_fatal */
+	rhead_intr_fini,		/* eio_fini */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_intr_init(
 	__in		efx_nic_t *enp,
@@ -138,6 +152,12 @@ efx_intr_init(
 		break;
 #endif	/* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eiop = &__efx_intr_rhead_ops;
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(B_FALSE);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 6ca5b57023..ea2517ba26 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_intr.c',
 	'rhead_nic.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index e25a871cb3..b95302a13f 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -98,6 +98,61 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* INTR */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_intr.c b/drivers/common/sfc_efx/base/rhead_intr.c
new file mode 100644
index 0000000000..08c770529f
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_intr.c
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_intr_init(
+	__in		efx_nic_t *enp,
+	__in		efx_intr_type_t type,
+	__in		efsys_mem_t *esmp)
+{
+	_NOTE(ARGUNUSED(enp, type, esmp))
+
+	return (0);
+}
+
+
+			void
+rhead_intr_enable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+
+			void
+rhead_intr_disable_unlocked(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_intr_trigger(
+	__in		efx_nic_t *enp,
+	__in		unsigned int level)
+{
+	_NOTE(ARGUNUSED(enp, level))
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_intr_status_line(
+	__in		efx_nic_t *enp,
+	__out		boolean_t *fatalp,
+	__out		uint32_t *qmaskp)
+{
+	_NOTE(ARGUNUSED(enp, qmaskp))
+
+	/*
+	 * Riverhead does not support line interrupts,
+	 * so this function should never be called.
+	 */
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_status_message(
+	__in		efx_nic_t *enp,
+	__in		unsigned int message,
+	__out		boolean_t *fatalp)
+{
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	_NOTE(ARGUNUSED(enp, message))
+
+	/* Fatal errors are reported via events */
+	*fatalp = B_FALSE;
+}
+
+			void
+rhead_intr_fatal(
+	__in		efx_nic_t *enp)
+{
+	/* Fatal errors are reported via events */
+	_NOTE(ARGUNUSED(enp))
+}
+
+			void
+rhead_intr_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (17 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
                     ` (42 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

EvQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement EvQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  | 304 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  33 +++
 drivers/common/sfc_efx/base/efx_mcdi.c | 306 +++++++++++++++++++++++++
 3 files changed, 339 insertions(+), 304 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index f0a135ed57..08729cf71e 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -100,310 +100,6 @@ efx_mcdi_set_evq_tmr(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags,
-	__in		boolean_t low_latency)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	boolean_t interrupting;
-	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
-	unsigned int evq_type;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_evq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
-		MC_CMD_FINI_EVQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the EVQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-
 
 	__checkReturn	efx_rc_t
 ef10_ev_init(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f2ea08bbf6..bf1cfc49ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,6 +1408,39 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index ade7f7fed4..5b733bb88c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,4 +2443,310 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		boolean_t low_latency)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	boolean_t interrupting;
+	int ev_cut_through;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	/*
+	 * On Huntington RX and TX event batching can only be requested together
+	 * (even if the datapath firmware doesn't actually support RX
+	 * batching). If event cut through is enabled no RX batching will occur.
+	 *
+	 * So always enable RX and TX event batching, and enable event cut
+	 * through if we want low latency operation.
+	 */
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		ev_cut_through = low_latency ? 1 : 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		ev_cut_through = 0;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		ev_cut_through = 1;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
+	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_evq_v2(
+	__in		efx_nic_t *enp,
+	__in		unsigned int instance,
+	__in		efsys_mem_t *esmp,
+	__in		size_t nevs,
+	__in		uint32_t irq,
+	__in		uint32_t us,
+	__in		uint32_t flags)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
+	boolean_t interrupting;
+	unsigned int evq_type;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	npages = efx_evq_nbufs(enp, nevs);
+	if (npages > EF10_EVQ_MAXNBUFS) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
+
+	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
+
+	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+	case EFX_EVQ_FLAGS_TYPE_AUTO:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+		break;
+	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail2;
+	}
+	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+
+	/* If the value is zero then disable the timer */
+	if (us == 0) {
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
+	} else {
+		unsigned int ticks;
+
+		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
+			goto fail3;
+
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
+	}
+
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail4;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
+
+	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_evq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_EVQ_IN_LEN,
+		MC_CMD_FINI_EVQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_EVQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_EVQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_EVQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_EVQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the EVQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 20/60] common/sfc_efx/base: move EvQ create generic checks
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (18 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
                     ` (41 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

There is no point to duplicate these generic checks in NIC family
specific handlers.

As the side effect it fixes bug with incorrect interrupt moderation
settings silently ignored on event queue create on Siena.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c | 20 ++-----------
 drivers/common/sfc_efx/base/efx_ev.c  | 42 ++++++++++++++++-----------
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 08729cf71e..18f19e816d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -133,16 +133,6 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	if (us > encp->enc_evq_timer_max_us) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
@@ -156,7 +146,7 @@ ef10_ev_qcreate(
 	if (flags & EFX_EVQ_FLAGS_NO_CONT_EV) {
 		if (enp->en_nic_cfg.enc_no_cont_ev_mode_supported == B_FALSE) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail1;
 		}
 	}
 
@@ -197,7 +187,7 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
 		    flags);
 		if (rc != 0)
-			goto fail4;
+			goto fail2;
 	} else {
 		/*
 		 * On Huntington we need to specify the settings to use.
@@ -214,15 +204,11 @@ ef10_ev_qcreate(
 		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 		    low_latency);
 		if (rc != 0)
-			goto fail5;
+			goto fail3;
 	}
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 21fddfb64d..4d11c531ce 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -236,18 +236,28 @@ efx_ev_qcreate(
 	EFSYS_ASSERT3U(enp->en_ev_qcount + 1, <,
 	    enp->en_nic_cfg.enc_evq_limit);
 
+	if (index >= encp->enc_evq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (us > encp->enc_evq_timer_max_us) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
 	switch (flags & EFX_EVQ_FLAGS_NOTIFY_MASK) {
 	case EFX_EVQ_FLAGS_NOTIFY_INTERRUPT:
 		break;
 	case EFX_EVQ_FLAGS_NOTIFY_DISABLED:
 		if (us != 0) {
 			rc = EINVAL;
-			goto fail1;
+			goto fail3;
 		}
 		break;
 	default:
 		rc = EINVAL;
-		goto fail2;
+		goto fail4;
 	}
 
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
@@ -257,14 +267,14 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail5;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail4;
+		goto fail6;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -287,16 +297,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail5;
+		goto fail7;
 
 	return (0);
 
-fail5:
-	EFSYS_PROBE(fail5);
+fail7:
+	EFSYS_PROBE(fail7);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
@@ -1189,15 +1203,11 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
-	if (index >= encp->enc_evq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 #endif
 	for (size = 0;
@@ -1207,7 +1217,7 @@ siena_ev_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	/* Set up the handler table */
@@ -1239,13 +1249,11 @@ siena_ev_qcreate(
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
-#if EFSYS_OPT_RX_SCALE
 fail2:
 	EFSYS_PROBE(fail2);
-#endif
+#if EFSYS_OPT_RX_SCALE
 fail1:
+#endif
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
 	return (rc);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 21/60] common/sfc_efx/base: prepare to merge EvQ init functions
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (19 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
                     ` (40 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

v1 and v2 defines are the same except output length.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 52 +++++++++++++-------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 5b733bb88c..50d723ecb4 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2458,8 +2458,8 @@ efx_mcdi_init_evq(
 {
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_OUT_LEN);
+		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
 	int npages;
@@ -2476,13 +2476,13 @@ efx_mcdi_init_evq(
 
 	req.emr_cmd = MC_CMD_INIT_EVQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_IN_LEN(npages);
+	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_IRQ_NUM, irq);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
 
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
@@ -2509,37 +2509,37 @@ efx_mcdi_init_evq(
 		rc = EINVAL;
 		goto fail2;
 	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_IN_FLAGS,
-	    INIT_EVQ_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_IN_FLAG_TX_MERGE, 1);
+	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
+	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
+	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
+	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
 	} else {
 		unsigned int ticks;
 
 		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
 			goto fail3;
 
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
+		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
+		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
 	}
 
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_THRSHLD, 0);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
+	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
+	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
 
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_IN_DMA_ADDR);
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
 	for (i = 0; i < npages; i++) {
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (20 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
                     ` (39 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

The decision on which version of the INIT_EVQ command to use may
be done inside the function itself. Caller should just provide
enough information sufficient in both cases. It avoids code
duplication and simplifies maintenance.

If v2 is not supported, keep decision about low-latency hint outside
the MCDI helper function since it will differ on Riverhead (there is
no EVB yet, but still want merging for better throughput).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c  |  54 +++---
 drivers/common/sfc_efx/base/efx_impl.h |  11 --
 drivers/common/sfc_efx/base/efx_mcdi.c | 228 ++++++++-----------------
 3 files changed, 95 insertions(+), 198 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index 18f19e816d..e2b5c62d5d 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -130,6 +130,7 @@ ef10_ev_qcreate(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	uint32_t irq;
 	efx_rc_t rc;
+	boolean_t low_latency;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
@@ -175,42 +176,29 @@ ef10_ev_qcreate(
 	 * created. See bug58606.
 	 */
 
-	if (encp->enc_init_evq_v2_supported) {
-		/*
-		 * On Medford the low latency license is required to enable RX
-		 * and event cut through and to disable RX batching.  If event
-		 * queue type in flags is auto, we let the firmware decide the
-		 * settings to use. If the adapter has a low latency license,
-		 * it will choose the best settings for low latency, otherwise
-		 * it will choose the best settings for throughput.
-		 */
-		rc = efx_mcdi_init_evq_v2(enp, index, esmp, ndescs, irq, us,
-		    flags);
-		if (rc != 0)
-			goto fail2;
-	} else {
-		/*
-		 * On Huntington we need to specify the settings to use.
-		 * If event queue type in flags is auto, we favour throughput
-		 * if the adapter is running virtualization supporting firmware
-		 * (i.e. the full featured firmware variant)
-		 * and latency otherwise. The Ethernet Virtual Bridging
-		 * capability is used to make this decision. (Note though that
-		 * the low latency firmware variant is also best for
-		 * throughput and corresponding type should be specified
-		 * to choose it.)
-		 */
-		boolean_t low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
-		rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
-		    low_latency);
-		if (rc != 0)
-			goto fail3;
-	}
+	/*
+	 * On Huntington we need to specify the settings to use.
+	 * If event queue type in flags is auto, we favour throughput
+	 * if the adapter is running virtualization supporting firmware
+	 * (i.e. the full featured firmware variant)
+	 * and latency otherwise. The Ethernet Virtual Bridging
+	 * capability is used to make this decision. (Note though that
+	 * the low latency firmware variant is also best for
+	 * throughput and corresponding type should be specified
+	 * to choose it.)
+	 *
+	 * If FW supports EvQ types (e.g. on Medford and Medford2) the
+	 * type which is specified in flags is passed to FW to make the
+	 * decision and low_latency hint is ignored.
+	 */
+	low_latency = encp->enc_datapath_cap_evb ? 0 : 1;
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    low_latency);
+	if (rc != 0)
+		goto fail2;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index bf1cfc49ca..47e4dcb01f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1422,17 +1422,6 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency);
 
-LIBEFX_INTERNAL
-extern	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags);
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_fini_evq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 50d723ecb4..69d2327839 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2456,146 +2456,14 @@ efx_mcdi_init_evq(
 	__in		uint32_t flags,
 	__in		boolean_t low_latency)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
 		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
 	boolean_t interrupting;
 	int ev_cut_through;
-	efx_rc_t rc;
-
-	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_EVQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_EVQ_V2_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_EVQ_V2_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_SIZE, nevs);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_INSTANCE, instance);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_IRQ_NUM, irq);
-
-	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
-	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
-
-	/*
-	 * On Huntington RX and TX event batching can only be requested together
-	 * (even if the datapath firmware doesn't actually support RX
-	 * batching). If event cut through is enabled no RX batching will occur.
-	 *
-	 * So always enable RX and TX event batching, and enable event cut
-	 * through if we want low latency operation.
-	 */
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		ev_cut_through = low_latency ? 1 : 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		ev_cut_through = 0;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		ev_cut_through = 1;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
-	}
-	MCDI_IN_POPULATE_DWORD_6(req, INIT_EVQ_V2_IN_FLAGS,
-	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
-	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
-	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
-	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
-	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, 1,
-	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, 1);
-
-	/* If the value is zero then disable the timer */
-	if (us == 0) {
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_MODE_DIS);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, 0);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, 0);
-	} else {
-		unsigned int ticks;
-
-		if ((rc = efx_ev_usecs_to_ticks(enp, us, &ticks)) != 0)
-			goto fail3;
-
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_MODE,
-		    MC_CMD_INIT_EVQ_V2_IN_TMR_INT_HLDOFF);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_LOAD, ticks);
-		MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_TMR_RELOAD, ticks);
-	}
-
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_MODE,
-	    MC_CMD_INIT_EVQ_V2_IN_COUNT_MODE_DIS);
-	MCDI_IN_SET_DWORD(req, INIT_EVQ_V2_IN_COUNT_THRSHLD, 0);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_EVQ_V2_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail4;
-	}
-
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
-	}
-
-	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
-
-	return (0);
-
-fail5:
-	EFSYS_PROBE(fail5);
-fail4:
-	EFSYS_PROBE(fail4);
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-	__checkReturn	efx_rc_t
-efx_mcdi_init_evq_v2(
-	__in		efx_nic_t *enp,
-	__in		unsigned int instance,
-	__in		efsys_mem_t *esmp,
-	__in		size_t nevs,
-	__in		uint32_t irq,
-	__in		uint32_t us,
-	__in		uint32_t flags)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
-		MC_CMD_INIT_EVQ_V2_OUT_LEN);
-	boolean_t interrupting;
+	int ev_merge;
 	unsigned int evq_type;
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2622,24 +2490,68 @@ efx_mcdi_init_evq_v2(
 	interrupting = ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
 	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT);
 
-	switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
-	case EFX_EVQ_FLAGS_TYPE_AUTO:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
-		break;
-	case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
-		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
-		break;
-	default:
-		rc = EINVAL;
-		goto fail2;
+	if (encp->enc_init_evq_v2_supported) {
+		/*
+		 * On Medford the low latency license is required to enable RX
+		 * and event cut through and to disable RX batching.  If event
+		 * queue type in flags is auto, we let the firmware decide the
+		 * settings to use. If the adapter has a low latency license,
+		 * it will choose the best settings for low latency, otherwise
+		 * it will choose the best settings for throughput.
+		 */
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_AUTO;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_THROUGHPUT;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_LOW_LATENCY;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
+		/* EvQ type controls merging, no manual settings */
+		ev_merge = 0;
+		ev_cut_through = 0;
+	} else {
+		/* EvQ types other than manual are not supported */
+		evq_type = MC_CMD_INIT_EVQ_V2_IN_FLAG_TYPE_MANUAL;
+		/*
+		 * On Huntington RX and TX event batching can only be requested
+		 * together (even if the datapath firmware doesn't actually
+		 * support RX batching). If event cut through is enabled no RX
+		 * batching will occur.
+		 *
+		 * So always enable RX and TX event batching, and enable event
+		 * cut through if we want low latency operation.
+		 */
+		ev_merge = 1;
+		switch (flags & EFX_EVQ_FLAGS_TYPE_MASK) {
+		case EFX_EVQ_FLAGS_TYPE_AUTO:
+			ev_cut_through = low_latency ? 1 : 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_THROUGHPUT:
+			ev_cut_through = 0;
+			break;
+		case EFX_EVQ_FLAGS_TYPE_LOW_LATENCY:
+			ev_cut_through = 1;
+			break;
+		default:
+			rc = EINVAL;
+			goto fail2;
+		}
 	}
-	MCDI_IN_POPULATE_DWORD_4(req, INIT_EVQ_V2_IN_FLAGS,
+
+	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
+	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
+	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
+	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
 
 	/* If the value is zero then disable the timer */
@@ -2683,18 +2595,26 @@ efx_mcdi_init_evq_v2(
 		goto fail4;
 	}
 
-	if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
-		rc = EMSGSIZE;
-		goto fail5;
+	if (encp->enc_init_evq_v2_supported) {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_V2_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail5;
+		}
+		EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
+			    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
+	} else {
+		if (req.emr_out_length_used < MC_CMD_INIT_EVQ_OUT_LEN) {
+			rc = EMSGSIZE;
+			goto fail6;
+		}
 	}
 
 	/* NOTE: ignore the returned IRQ param as firmware does not set it. */
 
-	EFSYS_PROBE1(mcdi_evq_flags, uint32_t,
-		    MCDI_OUT_DWORD(req, INIT_EVQ_V2_OUT_FLAGS));
-
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
 fail5:
 	EFSYS_PROBE(fail5);
 fail4:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 23/60] common/sfc_efx/base: add event queue module for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (21 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
                     ` (38 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev

Events are significantly reworked on Riverhead, so it is better
to implement own set of callbacks to simplify future development
and avoid inheritance of legacy code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_ev.c     |  22 ++
 drivers/common/sfc_efx/base/efx_impl.h   |   4 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |  19 +-
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_ev.c   | 265 +++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  73 +++++++
 6 files changed, 379 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_ev.c

diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 4d11c531ce..edc1b182c9 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -109,6 +109,22 @@ static const efx_ev_ops_t	__efx_ev_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_ev_ops_t	__efx_ev_rhead_ops = {
+	rhead_ev_init,				/* eevo_init */
+	rhead_ev_fini,				/* eevo_fini */
+	rhead_ev_qcreate,			/* eevo_qcreate */
+	rhead_ev_qdestroy,			/* eevo_qdestroy */
+	rhead_ev_qprime,			/* eevo_qprime */
+	rhead_ev_qpost,				/* eevo_qpost */
+	rhead_ev_qpoll,				/* eevo_qpoll */
+	rhead_ev_qmoderate,			/* eevo_qmoderate */
+#if EFSYS_OPT_QSTATS
+	rhead_ev_qstats_update,			/* eevo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_ev_init(
@@ -150,6 +166,12 @@ efx_ev_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eevop = &__efx_ev_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 47e4dcb01f..f6b0850a65 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1408,7 +1408,7 @@ efx_mcdi_get_workarounds(
 	__out_opt		uint32_t *implementedp,
 	__out_opt		uint32_t *enabledp);
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
@@ -1428,7 +1428,7 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 69d2327839..841dacc1c8 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2443,7 +2443,20 @@ efx_mcdi_phy_module_get_info(
 	return (rc);
 }
 
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+#define	INIT_EVQ_MAXNBUFS	MC_CMD_INIT_EVQ_V2_IN_DMA_ADDR_MAXNUM
+
 #if EFX_OPTS_EF10()
+# if (INIT_EVQ_MAXNBUFS < EF10_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFX_OPTS_EF10 */
+#if EFSYS_OPT_RIVERHEAD
+# if (INIT_EVQ_MAXNBUFS < RHEAD_EVQ_MAXNBUFS)
+#  error "INIT_EVQ_MAXNBUFS too small"
+# endif
+#endif /* EFSYS_OPT_RIVERHEAD */
 
 	__checkReturn	efx_rc_t
 efx_mcdi_init_evq(
@@ -2459,7 +2472,7 @@ efx_mcdi_init_evq(
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_EVQ_V2_IN_LEN(EF10_EVQ_MAXNBUFS),
+		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
 	int ev_cut_through;
@@ -2472,7 +2485,7 @@ efx_mcdi_init_evq(
 	efx_rc_t rc;
 
 	npages = efx_evq_nbufs(enp, nevs);
-	if (npages > EF10_EVQ_MAXNBUFS) {
+	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
 	}
@@ -2667,6 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index ea2517ba26..8e50f82154 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -52,6 +52,7 @@ sources = [
 	'hunt_nic.c',
 	'medford_nic.c',
 	'medford2_nic.c',
+	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
new file mode 100644
index 0000000000..36e355f209
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -0,0 +1,265 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD
+
+/*
+ * Non-interrupting event queue requires interrupting event queue to
+ * refer to for wake-up events even if wake ups are never used.
+ * It could be even non-allocated event queue.
+ */
+#define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
+
+
+	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+
+	return (0);
+}
+
+			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep)
+{
+	uint32_t irq;
+	efx_rc_t rc;
+
+	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
+
+	/* Set up the handler table */
+	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_driver	= NULL; /* FIXME */
+	eep->ee_drv_gen	= NULL; /* FIXME */
+	eep->ee_mcdi	= NULL; /* FIXME */
+
+	/* Set up the event queue */
+	/* INIT_EVQ expects function-relative vector number */
+	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
+	    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT) {
+		irq = index;
+	} else if (index == EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX) {
+		irq = index;
+		flags = (flags & ~EFX_EVQ_FLAGS_NOTIFY_MASK) |
+		    EFX_EVQ_FLAGS_NOTIFY_INTERRUPT;
+	} else {
+		irq = EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX;
+	}
+
+	/*
+	 * Interrupts may be raised for events immediately after the queue is
+	 * created. See bug58606.
+	 */
+	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
+	    B_FALSE);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep)
+{
+	efx_nic_t *enp = eep->ee_enp;
+
+	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_RIVERHEAD);
+
+	(void) efx_mcdi_fini_evq(enp, eep->ee_index);
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t rptr;
+	efx_dword_t dword;
+
+	rptr = count & eep->ee_mask;
+
+	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
+	    ERF_GZ_IDX, rptr);
+	/* EVQ_INT_PRIME lives function control window only on Riverhead */
+	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+
+	return (0);
+}
+
+			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data)
+{
+	_NOTE(ARGUNUSED(eep, data))
+
+	/* Not implemented yet */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+/*
+ * Poll event queue in batches. Size of the batch is equal to cache line
+ * size divided by event size.
+ *
+ * Event queue is written by NIC and read by CPU. If CPU starts reading
+ * of events on the cache line, read all remaining events in a tight
+ * loop while event is present.
+ */
+#define	EF100_EV_BATCH	8
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_PRESENT(_qword, _phase_bit)				\
+	(EFX_QWORD_FIELD((_qword), ESF_GZ_EV_EVQ_PHASE) == _phase_bit)
+
+			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_qword_t ev[EF100_EV_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_BATCH - (count & (EF100_EV_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_qword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READQ(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_PRESENT(ev[total], phase_bit))
+				break;
+
+			EFSYS_PROBE3(event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_QWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_qword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+			uint32_t code;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
+			switch (code) {
+			default:
+				EFSYS_PROBE3(bad_event,
+				    unsigned int, eep->ee_index,
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
+				    uint32_t,
+				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
+
+				EFSYS_ASSERT(eecp->eec_exception != NULL);
+				(void) eecp->eec_exception(arg,
+					EFX_EXCEPTION_EV_ERROR, code);
+				should_abort = B_TRUE;
+			}
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_BATCH);
+				batch += (EF100_EV_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+
+	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us)
+{
+	_NOTE(ARGUNUSED(eep, us))
+
+	return (ENOTSUP);
+}
+
+
+#if EFSYS_OPT_QSTATS
+			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < EV_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, eep->ee_stat[id]);
+		eep->ee_stat[id] = 0;
+	}
+}
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index b95302a13f..47885b28dc 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -12,6 +12,13 @@ extern "C" {
 #endif
 
 
+/*
+ * Riverhead requires physically contiguous event rings (so, just one
+ * DMA address is sufficient to represent it), but MCDI interface is still
+ * in terms of 4k size 4k-aligned DMA buffers.
+ */
+#define	RHEAD_EVQ_MAXNBUFS	32
+
 #define	RHEAD_EVQ_MAXNEVS	16384
 #define	RHEAD_EVQ_MINNEVS	256
 
@@ -98,6 +105,72 @@ rhead_nic_unprobe(
 	__in		efx_nic_t *enp);
 
 
+/* EV */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint32_t us,
+	__in		uint32_t flags,
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qdestroy(
+	__in		efx_evq_t *eep);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qprime(
+	__in		efx_evq_t *eep,
+	__in		unsigned int count);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpost(
+	__in	efx_evq_t *eep,
+	__in	uint16_t data);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_ev_qmoderate(
+	__in		efx_evq_t *eep,
+	__in		unsigned int us);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_ev_qstats_update(
+	__in				efx_evq_t *eep,
+	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 /* INTR */
 
 LIBEFX_INTERNAL
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (22 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
@ 2020-09-24 12:11   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
                     ` (37 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:11 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Client drivers relying on interrupts will fail to complete event
queue creation on Riverhead boards as the latter have no support
for INIT_DONE events which means that it's useless to wait until
initialisation callback is triggered by interrupt-driven polling.

Client drivers which avoid interrupt-driven polling still handle
INIT_DONE events by direct polling and will fail to do so.

Solve this problem by adding an extra poll-once method which
will be called by client drivers after queue creation (probably,
with driver-specific lock being held). The method will invoke
initialisation callback on Riverhead and do nothing on the other
boards. Then the drivers will proceed with normal waiting which
will complete immediately in the case of Riverhead.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  8 +++++
 drivers/common/sfc_efx/base/efx_ev.c          | 30 +++++++++++++++++++
 drivers/common/sfc_efx/base/hunt_nic.c        |  6 ++++
 drivers/common/sfc_efx/base/medford2_nic.c    |  6 ++++
 drivers/common/sfc_efx/base/medford_nic.c     |  6 ++++
 drivers/common/sfc_efx/base/rhead_nic.c       |  6 ++++
 drivers/common/sfc_efx/base/siena_nic.c       |  6 ++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 drivers/net/sfc/sfc_ev.c                      | 12 ++++++--
 9 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index c7fe814ca0..2c49280a43 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1443,6 +1443,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_vf;
 	uint32_t		enc_privilege_mask;
 #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+	boolean_t		enc_evq_init_done_ev_supported;
 	boolean_t		enc_bug26807_workaround;
 	boolean_t		enc_bug35388_workaround;
 	boolean_t		enc_bug41750_workaround;
@@ -2430,6 +2431,13 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+LIBEFX_API
+extern			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 LIBEFX_API
 extern			void
 efx_ev_qpoll(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index edc1b182c9..99a7743edb 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -423,6 +423,36 @@ efx_ev_qprefetch(
 
 #endif	/* EFSYS_OPT_EV_PREFETCH */
 
+/*
+ * This method is needed to ensure that eec_initialized callback
+ * is invoked after queue creation. The callback will be invoked
+ * on Riverhead boards which have no support for INIT_DONE events
+ * and will do nothing on other boards.
+ *
+ * The client drivers must call this method after calling efx_ev_create().
+ * The call must be done with the same locks being held (if any) which are
+ * normally acquired around efx_ev_qpoll() calls to ensure that
+ * eec_initialized callback is invoked within the same locking context.
+ */
+			void
+efx_ev_qcreate_check_init_done(
+	__in		efx_evq_t *eep,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	const efx_nic_cfg_t *encp;
+
+	EFSYS_ASSERT(eep != NULL);
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT(eecp != NULL);
+	EFSYS_ASSERT(eecp->eec_initialized != NULL);
+
+	encp = efx_nic_cfg_get(eep->ee_enp);
+
+	if (encp->enc_evq_init_done_ev_supported == B_FALSE)
+		(void) eecp->eec_initialized(arg);
+}
+
 			void
 efx_ev_qpoll(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/hunt_nic.c b/drivers/common/sfc_efx/base/hunt_nic.c
index 75c9050070..489c2d35d3 100644
--- a/drivers/common/sfc_efx/base/hunt_nic.c
+++ b/drivers/common/sfc_efx/base/hunt_nic.c
@@ -76,6 +76,12 @@ hunt_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford2_nic.c b/drivers/common/sfc_efx/base/medford2_nic.c
index 1a454fc34b..f19435a202 100644
--- a/drivers/common/sfc_efx/base/medford2_nic.c
+++ b/drivers/common/sfc_efx/base/medford2_nic.c
@@ -44,6 +44,12 @@ medford2_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/medford_nic.c b/drivers/common/sfc_efx/base/medford_nic.c
index 6c85b0c841..6ad9af9403 100644
--- a/drivers/common/sfc_efx/base/medford_nic.c
+++ b/drivers/common/sfc_efx/base/medford_nic.c
@@ -42,6 +42,12 @@ medford_board_cfg(
 	uint32_t bandwidth;
 	efx_rc_t rc;
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index c83d18e6ab..b779b4f8e1 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -51,6 +51,12 @@ rhead_board_cfg(
 
 	encp->enc_buftbl_limit = UINT32_MAX;
 
+	/*
+	 * Riverhead event queue creation completes
+	 * immediately (no initial event).
+	 */
+	encp->enc_evq_init_done_ev_supported = B_FALSE;
+
 	/*
 	 * Enable firmware workarounds for hardware errata.
 	 * Expected responses are:
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index b9b6d1951c..beabac0d38 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -135,6 +135,12 @@ siena_board_cfg(
 	encp->enc_rx_scale_additional_modes_supported = B_FALSE;
 #endif /* EFSYS_OPT_RX_SCALE */
 
+	/*
+	 * Event queue creation is complete when an
+	 * EVQ_INIT_DONE_EV event is received.
+	 */
+	encp->enc_evq_init_done_ev_supported = B_TRUE;
+
 	encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
 	/* Fragments must not span 4k boundaries. */
 	encp->enc_tx_dma_desc_boundary = 4096;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 5e2a7ad919..9b1715bfee 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -6,6 +6,7 @@ INTERNAL {
 	efx_ev_fini;
 	efx_ev_init;
 	efx_ev_qcreate;
+	efx_ev_qcreate_check_init_done;
 	efx_ev_qdestroy;
 	efx_ev_qmoderate;
 	efx_ev_qpending;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 83115e8775..7e5676fa45 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -608,6 +608,8 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	else
 		evq_flags |= EFX_EVQ_FLAGS_NOTIFY_DISABLED;
 
+	evq->init_state = SFC_EVQ_STARTING;
+
 	/* Create the common code event queue */
 	rc = efx_ev_qcreate(sa->nic, hw_index, esmp, evq->entries,
 			    0 /* unused on EF10 */, 0, evq_flags,
@@ -632,7 +634,13 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 		evq->callbacks = &sfc_ev_callbacks;
 	}
 
-	evq->init_state = SFC_EVQ_STARTING;
+	/*
+	 * Poll once to ensure that eec_initialized callback is invoked in
+	 * case if the hardware does not support INIT_DONE events. If the
+	 * hardware supports INIT_DONE events, this will do nothing, and the
+	 * corresponding event will be processed by sfc_ev_qpoll() below.
+	 */
+	efx_ev_qcreate_check_init_done(evq->common, evq->callbacks, evq);
 
 	/* Wait for the initialization event */
 	total_delay_us = 0;
@@ -665,10 +673,10 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 	return 0;
 
 fail_timedout:
-	evq->init_state = SFC_EVQ_INITIALIZED;
 	efx_ev_qdestroy(evq->common);
 
 fail_ev_qcreate:
+	evq->init_state = SFC_EVQ_INITIALIZED;
 	sfc_log_init(sa, "failed %d", rc);
 	return rc;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 25/60] common/sfc_efx/base: handle MCDI events on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (23 preceding siblings ...)
  2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
                     ` (36 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

EF100 MCDI event layout is same as on EF10 except added QDMA phase
bit which is unused on EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c   | 17 +++++++------
 drivers/common/sfc_efx/base/ef10_impl.h |  8 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  | 33 ++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index e2b5c62d5d..aec1c468a4 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -47,13 +47,6 @@ ef10_ev_drv_gen(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-static	__checkReturn	boolean_t
-ef10_ev_mcdi(
-	__in		efx_evq_t *eep,
-	__in		efx_qword_t *eqp,
-	__in		const efx_ev_callbacks_t *eecp,
-	__in_opt	void *arg);
-
 
 static	__checkReturn	efx_rc_t
 efx_mcdi_set_evq_tmr(
@@ -857,7 +850,11 @@ ef10_ev_drv_gen(
 	return (should_abort);
 }
 
-static	__checkReturn	boolean_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	boolean_t
 ef10_ev_mcdi(
 	__in		efx_evq_t *eep,
 	__in		efx_qword_t *eqp,
@@ -1064,6 +1061,10 @@ ef10_ev_mcdi(
 	return (should_abort);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 		void
 ef10_ev_rxlabel_init(
 	__in		efx_evq_t *eep,
diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e933d88135..e77fb4ddea 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -158,6 +158,14 @@ ef10_ev_rxlabel_fini(
 	__in		efx_evq_t *eep,
 	__in		unsigned int label);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	boolean_t
+ef10_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 /* INTR */
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 36e355f209..6113cc9cf3 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -17,6 +17,14 @@
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_init(
 	__in		efx_nic_t *enp)
@@ -54,7 +62,7 @@ rhead_ev_qcreate(
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
-	eep->ee_mcdi	= NULL; /* FIXME */
+	eep->ee_mcdi	= rhead_ev_mcdi;
 
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
@@ -193,6 +201,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_MCDI:
+				should_abort = eep->ee_mcdi(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			default:
 				EFSYS_PROBE3(bad_event,
 				    unsigned int, eep->ee_index,
@@ -262,4 +274,23 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_mcdi(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t ret;
+
+	/*
+	 * Event format was changed post Riverhead R1 and now
+	 * MCDI event layout on EF100 is exactly the same as on EF10
+	 * except added QDMA phase bit which is unused on EF10.
+	 */
+	ret = ef10_ev_mcdi(eep, eqp, eecp, arg);
+
+	return (ret);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (24 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
                     ` (35 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

RxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement RxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 184 ------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  28 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 187 +++++++++++++++++++++++++
 3 files changed, 215 insertions(+), 184 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index bfa55337c2..f27058963f 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -10,190 +10,6 @@
 
 #if EFX_OPTS_EF10()
 
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		efx_evq_t *eep,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
-{
-	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
-	int npages = efx_rxq_nbufs(enp, ndescs);
-	int i;
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	efx_rc_t rc;
-	uint32_t dma_mode;
-	boolean_t want_outer_classes;
-	boolean_t no_cont_ev;
-
-	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
-		/* TODO: Support scatter in NO_CONT_EV mode */
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	if (ps_bufsize > 0)
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
-		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
-	else
-		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
-
-	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
-		/*
-		 * WANT_OUTER_CLASSES can only be specified on hardware which
-		 * supports tunnel encapsulation offloads, even though it is
-		 * effectively the behaviour the hardware gives.
-		 *
-		 * Also, on hardware which does support such offloads, older
-		 * firmware rejects the flag if the offloads are not supported
-		 * by the current firmware variant, which means this may fail if
-		 * the capabilities are not updated when the firmware variant
-		 * changes. This is not an issue on newer firmware, as it was
-		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
-		 * specified on all firmware variants.
-		 */
-		want_outer_classes = B_TRUE;
-	} else {
-		want_outer_classes = B_FALSE;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
-	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
-	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
-	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
-	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
-	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
-	    INIT_RXQ_EXT_IN_DMA_MODE,
-	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
-	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
-	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
-
-	if (es_bufs_per_desc > 0) {
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
-		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
-	}
-
-	if (encp->enc_init_rxq_with_buffer_size)
-		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_rxq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
-		MC_CMD_FINI_RXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_RXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the RXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
 efx_mcdi_rss_context_alloc(
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f6b0850a65..48f853cf91 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,34 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif /* EFSYS_OPT_MCDI */
 
 #if EFSYS_OPT_MAC_STATS
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 841dacc1c8..8bf7c86c3a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2682,4 +2682,191 @@ efx_mcdi_fini_evq(
 
 #endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
+#if EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
+efx_mcdi_init_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		efx_evq_t *eep,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		efsys_mem_t *esmp,
+	__in		boolean_t disable_scatter,
+	__in		boolean_t want_inner_classes,
+	__in		uint32_t buf_size,
+	__in		uint32_t ps_bufsize,
+	__in		uint32_t es_bufs_per_desc,
+	__in		uint32_t es_max_dma_len,
+	__in		uint32_t es_buf_stride,
+	__in		uint32_t hol_block_timeout)
+{
+	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
+		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	int npages = efx_rxq_nbufs(enp, ndescs);
+	int i;
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	efx_rc_t rc;
+	uint32_t dma_mode;
+	boolean_t want_outer_classes;
+	boolean_t no_cont_ev;
+
+	EFSYS_ASSERT3U(ndescs, <=, encp->enc_rxq_max_ndescs);
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_rxq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
+	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+		/* TODO: Support scatter in NO_CONT_EV mode */
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	if (ps_bufsize > 0)
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
+	else if (es_bufs_per_desc > 0)
+		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
+	else
+		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
+
+	if (encp->enc_tunnel_encapsulations_supported != 0 &&
+	    !want_inner_classes) {
+		/*
+		 * WANT_OUTER_CLASSES can only be specified on hardware which
+		 * supports tunnel encapsulation offloads, even though it is
+		 * effectively the behaviour the hardware gives.
+		 *
+		 * Also, on hardware which does support such offloads, older
+		 * firmware rejects the flag if the offloads are not supported
+		 * by the current firmware variant, which means this may fail if
+		 * the capabilities are not updated when the firmware variant
+		 * changes. This is not an issue on newer firmware, as it was
+		 * changed in bug 69842 (v6.4.2.1007) to permit this flag to be
+		 * specified on all firmware variants.
+		 */
+		want_outer_classes = B_TRUE;
+	} else {
+		want_outer_classes = B_FALSE;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance);
+	MCDI_IN_POPULATE_DWORD_10(req, INIT_RXQ_EXT_IN_FLAGS,
+	    INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0,
+	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
+	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
+	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_DMA_MODE,
+	    dma_mode,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
+	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
+
+	if (es_bufs_per_desc > 0) {
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
+		    es_bufs_per_desc);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		MCDI_IN_SET_DWORD(req,
+		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
+		    hol_block_timeout);
+	}
+
+	if (encp->enc_init_rxq_with_buffer_size)
+		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
+		    buf_size);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_rxq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
+		MC_CMD_FINI_RXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_RXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_RXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_RXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif	/* EFX_OPTS_EF10() */
+
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 27/60] common/sfc_efx/base: move TxQ init/fini wrappers to generic
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (25 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
                     ` (34 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

TxQ init/fini MCDI is similar on Riverhead and these
functions should be reused to implement TxQ creation and
destruction on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Vijay Kumar Srivastava <vsrivast@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_tx.c  | 133 -------------------------
 drivers/common/sfc_efx/base/efx_impl.h |  17 ++++
 drivers/common/sfc_efx/base/efx_mcdi.c | 133 +++++++++++++++++++++++++
 3 files changed, 150 insertions(+), 133 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index e2f9ebac46..61c7e49fe8 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -20,139 +20,6 @@
 #define	EFX_TX_QSTAT_INCR(_etp, _stat)
 #endif
 
-static	__checkReturn	efx_rc_t
-efx_mcdi_init_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t ndescs,
-	__in		uint32_t target_evq,
-	__in		uint32_t label,
-	__in		uint32_t instance,
-	__in		uint16_t flags,
-	__in		efsys_mem_t *esmp)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
-		MC_CMD_INIT_TXQ_OUT_LEN);
-	efx_qword_t *dma_addr;
-	uint64_t addr;
-	int npages;
-	int i;
-	efx_rc_t rc;
-
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
-	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
-
-	if ((esmp == NULL) ||
-	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
-	npages = efx_txq_nbufs(enp, ndescs);
-	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
-		rc = EINVAL;
-		goto fail2;
-	}
-
-	req.emr_cmd = MC_CMD_INIT_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
-
-	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
-	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
-	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
-	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
-	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
-	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
-	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
-	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
-	    INIT_TXQ_IN_CRC_MODE, 0,
-	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
-
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
-	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
-
-	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
-	addr = EFSYS_MEM_ADDR(esmp);
-
-	for (i = 0; i < npages; i++) {
-		EFX_POPULATE_QWORD_2(*dma_addr,
-		    EFX_DWORD_1, (uint32_t)(addr >> 32),
-		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
-
-		dma_addr++;
-		addr += EFX_BUF_SIZE;
-	}
-
-	efx_mcdi_execute(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail3;
-	}
-
-	return (0);
-
-fail3:
-	EFSYS_PROBE(fail3);
-fail2:
-	EFSYS_PROBE(fail2);
-fail1:
-	EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
-static	__checkReturn	efx_rc_t
-efx_mcdi_fini_txq(
-	__in		efx_nic_t *enp,
-	__in		uint32_t instance)
-{
-	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
-		MC_CMD_FINI_TXQ_OUT_LEN);
-	efx_rc_t rc;
-
-	req.emr_cmd = MC_CMD_FINI_TXQ;
-	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
-	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
-
-	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
-
-	efx_mcdi_execute_quiet(enp, &req);
-
-	if (req.emr_rc != 0) {
-		rc = req.emr_rc;
-		goto fail1;
-	}
-
-	return (0);
-
-fail1:
-	/*
-	 * EALREADY is not an error, but indicates that the MC has rebooted and
-	 * that the TXQ has already been destroyed.
-	 */
-	if (rc != EALREADY)
-		EFSYS_PROBE1(fail1, efx_rc_t, rc);
-
-	return (rc);
-}
-
 	__checkReturn	efx_rc_t
 ef10_tx_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 48f853cf91..7d470619e1 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1456,6 +1456,23 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance);
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8bf7c86c3a..a2ac053f0c 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2867,6 +2867,139 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+	__checkReturn	efx_rc_t
+efx_mcdi_init_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t ndescs,
+	__in		uint32_t target_evq,
+	__in		uint32_t label,
+	__in		uint32_t instance,
+	__in		uint16_t flags,
+	__in		efsys_mem_t *esmp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+		MC_CMD_INIT_TXQ_OUT_LEN);
+	efx_qword_t *dma_addr;
+	uint64_t addr;
+	int npages;
+	int i;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
+
+	if ((esmp == NULL) ||
+	    (EFSYS_MEM_SIZE(esmp) < efx_txq_size(enp, ndescs))) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	npages = efx_txq_nbufs(enp, ndescs);
+	if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	req.emr_cmd = MC_CMD_INIT_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_INIT_TXQ_IN_LEN(npages);
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_INIT_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_SIZE, ndescs);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_TARGET_EVQ, target_evq);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_LABEL, label);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_INSTANCE, instance);
+
+	MCDI_IN_POPULATE_DWORD_9(req, INIT_TXQ_IN_FLAGS,
+	    INIT_TXQ_IN_FLAG_BUFF_MODE, 0,
+	    INIT_TXQ_IN_FLAG_IP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_IPV4) ? 0 : 1,
+	    INIT_TXQ_IN_FLAG_TCP_CSUM_DIS,
+	    (flags & EFX_TXQ_CKSUM_TCPUDP) ? 0 : 1,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_IP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_IPV4) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_INNER_TCP_CSUM_EN,
+	    (flags & EFX_TXQ_CKSUM_INNER_TCPUDP) ? 1 : 0,
+	    INIT_TXQ_EXT_IN_FLAG_TSOV2_EN, (flags & EFX_TXQ_FATSOV2) ? 1 : 0,
+	    INIT_TXQ_IN_FLAG_TCP_UDP_ONLY, 0,
+	    INIT_TXQ_IN_CRC_MODE, 0,
+	    INIT_TXQ_IN_FLAG_TIMESTAMP, 0);
+
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_OWNER_ID, 0);
+	MCDI_IN_SET_DWORD(req, INIT_TXQ_IN_PORT_ID, enp->en_vport_id);
+
+	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_TXQ_IN_DMA_ADDR);
+	addr = EFSYS_MEM_ADDR(esmp);
+
+	for (i = 0; i < npages; i++) {
+		EFX_POPULATE_QWORD_2(*dma_addr,
+		    EFX_DWORD_1, (uint32_t)(addr >> 32),
+		    EFX_DWORD_0, (uint32_t)(addr & 0xffffffff));
+
+		dma_addr++;
+		addr += EFX_BUF_SIZE;
+	}
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail3;
+	}
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+efx_mcdi_fini_txq(
+	__in		efx_nic_t *enp,
+	__in		uint32_t instance)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_TXQ_IN_LEN,
+		MC_CMD_FINI_TXQ_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_FINI_TXQ;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_FINI_TXQ_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_FINI_TXQ_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, FINI_TXQ_IN_INSTANCE, instance);
+
+	efx_mcdi_execute_quiet(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 28/60] common/sfc_efx/base: switch TxQ init to extended version
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (26 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
                     ` (33 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Extended version of MCDI allows up to 64 DMA addresses which are
required for Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_mcdi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index a2ac053f0c..8db52acd66 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2878,8 +2878,7 @@ efx_mcdi_init_txq(
 	__in		efsys_mem_t *esmp)
 {
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload,
-		MC_CMD_INIT_TXQ_IN_LEN(EF10_TXQ_MAXNBUFS),
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_TXQ_EXT_IN_LEN,
 		MC_CMD_INIT_TXQ_OUT_LEN);
 	efx_qword_t *dma_addr;
 	uint64_t addr;
@@ -2887,7 +2886,7 @@ efx_mcdi_init_txq(
 	int i;
 	efx_rc_t rc;
 
-	EFSYS_ASSERT(EF10_TXQ_MAXNBUFS >=
+	EFSYS_ASSERT(MC_CMD_INIT_TXQ_EXT_IN_DMA_ADDR_MAXNUM >=
 	    efx_txq_nbufs(enp, enp->en_nic_cfg.enc_txq_max_ndescs));
 
 	if ((esmp == NULL) ||
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 29/60] common/sfc_efx/base: maintain RxQ counter in generic code
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (27 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
                     ` (32 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

The counter is incremented in generic efx_rx_qcreate(), but was
asserted and decremented in NIC family specific queue create and
destroy callbacks.  Move assert and decrement to generic functions
as well to make NIC family specific callbacks shorter.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 4 ----
 drivers/common/sfc_efx/base/efx_rx.c  | 9 +++++----
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index f27058963f..7004ab2aca 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -844,7 +844,6 @@ ef10_rx_qcreate(
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1022,9 +1021,6 @@ ef10_rx_qdestroy(
 
 	ef10_ev_rxlabel_fini(eep, label);
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index cce34cfce9..a361112849 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -819,6 +819,8 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
+	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
+
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
@@ -975,6 +977,9 @@ efx_rx_qdestroy(
 
 	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
 
+	EFSYS_ASSERT(enp->en_rx_qcount != 0);
+	--enp->en_rx_qcount;
+
 	erxop->erxo_qdestroy(erp);
 }
 
@@ -1626,7 +1631,6 @@ siena_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS ==
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
-	EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
 
 	if (index >= encp->enc_rxq_limit) {
 		rc = EINVAL;
@@ -1697,9 +1701,6 @@ siena_rx_qdestroy(
 	efx_nic_t *enp = erp->er_enp;
 	efx_oword_t oword;
 
-	EFSYS_ASSERT(enp->en_rx_qcount != 0);
-	--enp->en_rx_qcount;
-
 	/* Purge descriptor queue */
 	EFX_ZERO_OWORD(oword);
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 30/60] common/sfc_efx/base: free Rx queue structure in generic code
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (28 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
                     ` (31 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Rx queue structure is allocated in generic code, but was freed in NIC
family specific callbacks. Move free to generic function makes NIC
family specific callbacks shorter and reduces code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 3 ---
 drivers/common/sfc_efx/base/efx_rx.c  | 6 +++---
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 7004ab2aca..58152be768 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -1015,13 +1015,10 @@ ef10_rx_qcreate(
 ef10_rx_qdestroy(
 	__in	efx_rxq_t *erp)
 {
-	efx_nic_t *enp = erp->er_enp;
 	efx_evq_t *eep = erp->er_eep;
 	unsigned int label = erp->er_label;
 
 	ef10_ev_rxlabel_fini(eep, label);
-
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 		void
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index a361112849..d208c2292e 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -981,6 +981,9 @@ efx_rx_qdestroy(
 	--enp->en_rx_qcount;
 
 	erxop->erxo_qdestroy(erp);
+
+	/* Free the RXQ object */
+	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 	__checkReturn	efx_rc_t
@@ -1706,9 +1709,6 @@ siena_rx_qdestroy(
 
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
-
-	/* Free the RXQ object */
-	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
 }
 
 static		void
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 31/60] common/sfc_efx/base: move Rx index check to generic code
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (29 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
                     ` (30 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Make NIC family specific functions a bit shorter and reduce
code duplication.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c | 45 +++++++++++----------------
 drivers/common/sfc_efx/base/efx_rx.c  | 31 +++++++++---------
 2 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 58152be768..48666be5b5 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -845,16 +845,11 @@ ef10_rx_qcreate(
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
-
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail2;
+			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
 		ps_buf_size = 0;
@@ -863,7 +858,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_PACKED_STREAM:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail3;
+			goto fail2;
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
@@ -883,7 +878,7 @@ ef10_rx_qcreate(
 			break;
 		default:
 			rc = ENOTSUP;
-			goto fail4;
+			goto fail3;
 		}
 		erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
 		break;
@@ -892,7 +887,7 @@ ef10_rx_qcreate(
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
 		if (type_data == NULL) {
 			rc = EINVAL;
-			goto fail5;
+			goto fail4;
 		}
 		ps_buf_size = 0;
 		es_bufs_per_desc =
@@ -907,7 +902,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 	default:
 		rc = ENOTSUP;
-		goto fail6;
+		goto fail5;
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -915,13 +910,13 @@ ef10_rx_qcreate(
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail7;
+			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
 		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
-			goto fail8;
+			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -932,17 +927,17 @@ ef10_rx_qcreate(
 	if (es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
-			goto fail9;
+			goto fail8;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail10;
+			goto fail9;
 		}
 		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
-			goto fail11;
+			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -964,7 +959,7 @@ ef10_rx_qcreate(
 		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
 		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
 		    es_buf_stride, hol_block_timeout)) != 0)
-		goto fail12;
+		goto fail11;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
@@ -975,36 +970,34 @@ ef10_rx_qcreate(
 
 	return (0);
 
-fail12:
-	EFSYS_PROBE(fail12);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail11:
 	EFSYS_PROBE(fail11);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail10:
 	EFSYS_PROBE(fail10);
 fail9:
 	EFSYS_PROBE(fail9);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
 fail8:
 	EFSYS_PROBE(fail8);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail7:
 	EFSYS_PROBE(fail7);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail6:
 	EFSYS_PROBE(fail6);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail5:
 	EFSYS_PROBE(fail5);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail4:
 	EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail3:
 	EFSYS_PROBE(fail3);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
 	EFSYS_PROBE(fail2);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index d208c2292e..bacab5ec67 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -824,11 +824,16 @@ efx_rx_qcreate_internal(
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs));
 	EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs));
 
+	if (index >= encp->enc_rxq_limit) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	if (!ISP2(ndescs) ||
 	    ndescs < encp->enc_rxq_min_ndescs ||
 	    ndescs > encp->enc_rxq_max_ndescs) {
 		rc = EINVAL;
-		goto fail1;
+		goto fail2;
 	}
 
 	/* Allocate an RXQ object */
@@ -836,7 +841,7 @@ efx_rx_qcreate_internal(
 
 	if (erp == NULL) {
 		rc = ENOMEM;
-		goto fail2;
+		goto fail3;
 	}
 
 	erp->er_magic = EFX_RXQ_MAGIC;
@@ -847,17 +852,19 @@ efx_rx_qcreate_internal(
 
 	if ((rc = erxop->erxo_qcreate(enp, index, label, type, type_data, esmp,
 	    ndescs, id, flags, eep, erp)) != 0)
-		goto fail3;
+		goto fail4;
 
 	enp->en_rx_qcount++;
 	*erpp = erp;
 
 	return (0);
 
-fail3:
-	EFSYS_PROBE(fail3);
+fail4:
+	EFSYS_PROBE(fail4);
 
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
@@ -1635,10 +1642,6 @@ siena_rx_qcreate(
 	    (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
-	if (index >= encp->enc_rxq_limit) {
-		rc = EINVAL;
-		goto fail1;
-	}
 	for (size = 0;
 	    (1U << size) <= encp->enc_rxq_max_ndescs / encp->enc_rxq_min_ndescs;
 	    size++)
@@ -1646,7 +1649,7 @@ siena_rx_qcreate(
 			break;
 	if (id + (1 << size) >= encp->enc_buftbl_limit) {
 		rc = EINVAL;
-		goto fail2;
+		goto fail1;
 	}
 
 	switch (type) {
@@ -1656,7 +1659,7 @@ siena_rx_qcreate(
 
 	default:
 		rc = EINVAL;
-		goto fail3;
+		goto fail2;
 	}
 
 	if (flags & EFX_RXQ_FLAG_SCATTER) {
@@ -1664,7 +1667,7 @@ siena_rx_qcreate(
 		jumbo = B_TRUE;
 #else
 		rc = EINVAL;
-		goto fail4;
+		goto fail3;
 #endif	/* EFSYS_OPT_RX_SCATTER */
 	}
 
@@ -1684,11 +1687,9 @@ siena_rx_qcreate(
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
-fail4:
-	EFSYS_PROBE(fail4);
-#endif
 fail3:
 	EFSYS_PROBE(fail3);
+#endif
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 32/60] common/sfc_efx/base: implement Rx control path for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (30 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
                     ` (29 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Reuse EF10 RSS-related functions since current version of the RSS
interface is compatible with EF10.

Implement own functions to create and destroy Rx queues which reuse
MCDI wrappers which are shared with EF10.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c    |  11 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   8 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   8 +-
 drivers/common/sfc_efx/base/efx_rx.c     |  35 +++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h | 129 +++++++++
 drivers/common/sfc_efx/base/rhead_rx.c   | 316 +++++++++++++++++++++++
 7 files changed, 498 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_rx.c

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 48666be5b5..61e0dab5b9 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	efx_rc_t
@@ -375,6 +375,8 @@ ef10_rx_init(
 	return (0);
 }
 
+#if EFX_OPTS_EF10()
+
 #if EFSYS_OPT_RX_SCATTER
 	__checkReturn	efx_rc_t
 ef10_rx_scatter_enable(
@@ -386,6 +388,8 @@ ef10_rx_scatter_enable(
 }
 #endif	/* EFSYS_OPT_RX_SCATTER */
 
+#endif	/* EFX_OPTS_EF10() */
+
 #if EFSYS_OPT_RX_SCALE
 	__checkReturn	efx_rc_t
 ef10_rx_scale_context_alloc(
@@ -542,6 +546,7 @@ ef10_rx_scale_tbl_set(
 }
 #endif /* EFSYS_OPT_RX_SCALE */
 
+#if EFX_OPTS_EF10()
 
 /*
  * EF10 RX pseudo-header
@@ -1014,6 +1019,8 @@ ef10_rx_qdestroy(
 	ef10_ev_rxlabel_fini(eep, label);
 }
 
+#endif /* EFX_OPTS_EF10() */
+
 		void
 ef10_rx_fini(
 	__in	efx_nic_t *enp)
@@ -1028,4 +1035,4 @@ ef10_rx_fini(
 #endif /* EFSYS_OPT_RX_SCALE */
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 7d470619e1..fac2815f25 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1428,10 +1428,6 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1456,6 +1452,10 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 8db52acd66..6a227858e6 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2680,10 +2680,6 @@ efx_mcdi_fini_evq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
 	__in		efx_nic_t *enp,
@@ -2867,6 +2863,10 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index bacab5ec67..5f17bf3afe 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -180,6 +180,35 @@ static const efx_rx_ops_t __efx_rx_ef10_ops = {
 };
 #endif	/* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_rx_ops_t __efx_rx_rhead_ops = {
+	rhead_rx_init,				/* erxo_init */
+	rhead_rx_fini,				/* erxo_fini */
+#if EFSYS_OPT_RX_SCATTER
+	rhead_rx_scatter_enable,		/* erxo_scatter_enable */
+#endif
+#if EFSYS_OPT_RX_SCALE
+	rhead_rx_scale_context_alloc,		/* erxo_scale_context_alloc */
+	rhead_rx_scale_context_free,		/* erxo_scale_context_free */
+	rhead_rx_scale_mode_set,		/* erxo_scale_mode_set */
+	rhead_rx_scale_key_set,			/* erxo_scale_key_set */
+	rhead_rx_scale_tbl_set,			/* erxo_scale_tbl_set */
+	rhead_rx_prefix_hash,			/* erxo_prefix_hash */
+#endif
+	rhead_rx_prefix_pktlen,			/* erxo_prefix_pktlen */
+	rhead_rx_qpost,				/* erxo_qpost */
+	rhead_rx_qpush,				/* erxo_qpush */
+#if EFSYS_OPT_RX_PACKED_STREAM
+	NULL,					/* erxo_qpush_ps_credits */
+	NULL,					/* erxo_qps_packet_info */
+#endif
+	rhead_rx_qflush,			/* erxo_qflush */
+	rhead_rx_qenable,			/* erxo_qenable */
+	rhead_rx_qcreate,			/* erxo_qcreate */
+	rhead_rx_qdestroy,			/* erxo_qdestroy */
+};
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_rx_init(
@@ -226,6 +255,12 @@ efx_rx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		erxop = &__efx_rx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8e50f82154..aff5017cff 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -55,6 +55,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_rx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 47885b28dc..0ba663653b 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -226,6 +226,135 @@ rhead_intr_fini(
 	__in		efx_nic_t *enp);
 
 
+/* RX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_fini(
+	__in		efx_nic_t *enp);
+
+#if EFSYS_OPT_RX_SCATTER
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size);
+
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer);
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp);
+
+LIBEFX_INTERNAL
+extern				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qpush(
+	__in		efx_rxq_t *erp,
+	__in		unsigned int added,
+	__inout		unsigned int *pushedp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_rx_qenable(
+	__in		efx_rxq_t *erp);
+
+union efx_rxq_type_data_u;
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const union efx_rxq_type_data_u *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_rx_qdestroy(
+	__in		efx_rxq_t *erp);
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
new file mode 100644
index 0000000000..0081b3ea53
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -0,0 +1,316 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_rx_init(
+	__in		efx_nic_t *enp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_init(enp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+		void
+rhead_rx_fini(
+	__in	efx_nic_t *enp)
+{
+	ef10_rx_fini(enp);
+}
+
+#if EFSYS_OPT_RX_SCATTER
+	__checkReturn	efx_rc_t
+rhead_rx_scatter_enable(
+	__in		efx_nic_t *enp,
+	__in		unsigned int buf_size)
+{
+	_NOTE(ARGUNUSED(enp, buf_size))
+	/* Nothing to do here */
+	return (0);
+}
+#endif	/* EFSYS_OPT_RX_SCATTER */
+
+#if EFSYS_OPT_RX_SCALE
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_alloc(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_scale_context_type_t type,
+	__in		uint32_t num_queues,
+	__out		uint32_t *rss_contextp)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_alloc(enp, type, num_queues, rss_contextp);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_context_free(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_context_free(enp, rss_context);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_mode_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in		efx_rx_hash_alg_t alg,
+	__in		efx_rx_hash_type_t type,
+	__in		boolean_t insert)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_mode_set(enp, rss_context, alg, type, insert);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_key_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	uint8_t *key,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_key_set(enp, rss_context, key, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_scale_tbl_set(
+	__in		efx_nic_t *enp,
+	__in		uint32_t rss_context,
+	__in_ecount(n)	unsigned int *table,
+	__in		size_t n)
+{
+	efx_rc_t rc;
+
+	rc = ef10_rx_scale_tbl_set(enp, rss_context, table, n);
+	if (rc != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	return (rc);
+}
+
+	__checkReturn	uint32_t
+rhead_rx_prefix_hash(
+	__in		efx_nic_t *enp,
+	__in		efx_rx_hash_alg_t func,
+	__in		uint8_t *buffer)
+{
+	_NOTE(ARGUNUSED(enp, func, buffer))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#endif /* EFSYS_OPT_RX_SCALE */
+
+	__checkReturn	efx_rc_t
+rhead_rx_prefix_pktlen(
+	__in		efx_nic_t *enp,
+	__in		uint8_t *buffer,
+	__out		uint16_t *lengthp)
+{
+	_NOTE(ARGUNUSED(enp, buffer, lengthp))
+
+	/* FIXME implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+				void
+rhead_rx_qpost(
+	__in			efx_rxq_t *erp,
+	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
+	__in			size_t size,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__in			unsigned int added)
+{
+	_NOTE(ARGUNUSED(erp, addrp, size, ndescs, completed, added))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+			void
+rhead_rx_qpush(
+	__in	efx_rxq_t *erp,
+	__in	unsigned int added,
+	__inout	unsigned int *pushedp)
+{
+	_NOTE(ARGUNUSED(erp, added, pushedp))
+
+	/* FIXME implement the method for Riverhead */
+
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qflush(
+	__in	efx_rxq_t *erp)
+{
+	efx_nic_t *enp = erp->er_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_rxq(enp, erp->er_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the RXQ has already been destroyed. Callers need to know that
+	 * the RXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qenable(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+}
+
+	__checkReturn	efx_rc_t
+rhead_rx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efx_rxq_type_t type,
+	__in		const efx_rxq_type_data_t *type_data,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		unsigned int flags,
+	__in		efx_evq_t *eep,
+	__in		efx_rxq_t *erp)
+{
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_rc_t rc;
+	boolean_t disable_scatter;
+
+	_NOTE(ARGUNUSED(id))
+
+	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS <=
+	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
+	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
+
+	switch (type) {
+	case EFX_RXQ_TYPE_DEFAULT:
+		if (type_data == NULL) {
+			rc = EINVAL;
+			goto fail1;
+		}
+		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		break;
+	default:
+		rc = ENOTSUP;
+		goto fail2;
+	}
+
+	/* Scatter can only be disabled if the firmware supports doing so */
+	if (flags & EFX_RXQ_FLAG_SCATTER)
+		disable_scatter = B_FALSE;
+	else
+		disable_scatter = encp->enc_rx_disable_scatter_supported;
+
+	/*
+	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
+	 * EF100 host interface both inner and outer classes are provided
+	 * by HW if applicable.
+	 */
+
+	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
+		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
+		    0, 0, 0, 0, 0)) != 0)
+		goto fail3;
+
+	erp->er_eep = eep;
+	erp->er_label = label;
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_rx_qdestroy(
+	__in	efx_rxq_t *erp)
+{
+	_NOTE(ARGUNUSED(erp))
+	/* Nothing to do here */
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 33/60] common/sfc_efx/base: implement Tx control path for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (31 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
                     ` (28 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Tx control path on Riverhead is very similar to EF10, but datapath
differs a lot since Tx descriptor size is 16 bytes (vs 8 bytes on EF10).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |   6 +-
 drivers/common/sfc_efx/base/efx_mcdi.c   |   6 +-
 drivers/common/sfc_efx/base/efx_tx.c     |  33 ++++
 drivers/common/sfc_efx/base/meson.build  |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h |  83 ++++++++++
 drivers/common/sfc_efx/base/rhead_tx.c   | 192 +++++++++++++++++++++++
 6 files changed, 311 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tx.c

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fac2815f25..d7e11c6323 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1452,10 +1452,6 @@ efx_mcdi_fini_rxq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
@@ -1473,7 +1469,7 @@ efx_mcdi_fini_txq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif /* EFSYS_OPT_MCDI */
 
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 6a227858e6..278c5e2a64 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2863,10 +2863,6 @@ efx_mcdi_fini_rxq(
 	return (rc);
 }
 
-#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
-
-#if EFX_OPTS_EF10()
-
 	__checkReturn	efx_rc_t
 efx_mcdi_init_txq(
 	__in		efx_nic_t *enp,
@@ -2999,6 +2995,6 @@ efx_mcdi_fini_txq(
 	return (rc);
 }
 
-#endif	/* EFX_OPTS_EF10() */
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #endif	/* EFSYS_OPT_MCDI */
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index 38c64e028b..d7f31fd46d 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -205,6 +205,33 @@ static const efx_tx_ops_t	__efx_tx_medford2_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tx_ops_t	__efx_tx_rhead_ops = {
+	rhead_tx_init,				/* etxo_init */
+	rhead_tx_fini,				/* etxo_fini */
+	rhead_tx_qcreate,			/* etxo_qcreate */
+	rhead_tx_qdestroy,			/* etxo_qdestroy */
+	rhead_tx_qpost,				/* etxo_qpost */
+	rhead_tx_qpush,				/* etxo_qpush */
+	rhead_tx_qpace,				/* etxo_qpace */
+	rhead_tx_qflush,			/* etxo_qflush */
+	rhead_tx_qenable,			/* etxo_qenable */
+	NULL,					/* etxo_qpio_enable */
+	NULL,					/* etxo_qpio_disable */
+	NULL,					/* etxo_qpio_write */
+	NULL,					/* etxo_qpio_post */
+	rhead_tx_qdesc_post,			/* etxo_qdesc_post */
+	NULL,					/* etxo_qdesc_dma_create */
+	NULL,					/* etxo_qdesc_tso_create */
+	NULL,					/* etxo_qdesc_tso2_create */
+	NULL,					/* etxo_qdesc_vlantci_create */
+	NULL,					/* etxo_qdesc_checksum_create */
+#if EFSYS_OPT_QSTATS
+	rhead_tx_qstats_update,			/* etxo_qstats_update */
+#endif
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 	__checkReturn	efx_rc_t
 efx_tx_init(
@@ -251,6 +278,12 @@ efx_tx_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		etxop = &__efx_tx_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index aff5017cff..8f944bb45b 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -56,6 +56,7 @@ sources = [
 	'rhead_intr.c',
 	'rhead_nic.c',
 	'rhead_rx.c',
+	'rhead_tx.c',
 ]
 
 extra_flags = [
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 0ba663653b..c3ffad7208 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -355,6 +355,89 @@ rhead_rx_qdestroy(
 	__in		efx_rxq_t *erp);
 
 
+/* TX */
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern		void
+rhead_tx_qdestroy(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *ebp,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp);
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tx_qdesc_post(
+	__in		efx_txq_t *etp,
+	__in_ecount(n)	efx_desc_t *ed,
+	__in		unsigned int n,
+	__in		unsigned int completed,
+	__inout		unsigned int *addedp);
+
+#if EFSYS_OPT_QSTATS
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_tx.c b/drivers/common/sfc_efx/base/rhead_tx.c
new file mode 100644
index 0000000000..4c60f329d1
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tx.c
@@ -0,0 +1,192 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+
+#if EFSYS_OPT_RIVERHEAD
+
+	__checkReturn	efx_rc_t
+rhead_tx_init(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+	return (0);
+}
+
+			void
+rhead_tx_fini(
+	__in		efx_nic_t *enp)
+{
+	_NOTE(ARGUNUSED(enp))
+	/* Nothing to do here */
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qcreate(
+	__in		efx_nic_t *enp,
+	__in		unsigned int index,
+	__in		unsigned int label,
+	__in		efsys_mem_t *esmp,
+	__in		size_t ndescs,
+	__in		uint32_t id,
+	__in		uint16_t flags,
+	__in		efx_evq_t *eep,
+	__in		efx_txq_t *etp,
+	__out		unsigned int *addedp)
+{
+	efx_rc_t rc;
+
+	/*
+	 * NMC manages the NMMU entries, and so buffer table IDs are
+	 * ignored here
+	 */
+	_NOTE(ARGUNUSED(id))
+
+	if ((rc = efx_mcdi_init_txq(enp, ndescs, eep->ee_index, label, index,
+	    flags, esmp)) != 0)
+		goto fail1;
+
+	/*
+	 * Return the initial queue index which is zero since no option
+	 * descriptors are sent at start of day.
+	 */
+	*addedp = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+		void
+rhead_tx_qdestroy(
+	__in	efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qpost(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_buffer_t *eb,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(eb))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+			void
+rhead_tx_qpush(
+	__in		efx_txq_t *etp,
+	__in		unsigned int added,
+	__in		unsigned int pushed)
+{
+	_NOTE(ARGUNUSED(etp, added, pushed))
+
+	/* FIXME Implement the method for Riverhead */
+	EFSYS_ASSERT(B_FALSE);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qpace(
+	__in		efx_txq_t *etp,
+	__in		unsigned int ns)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ns))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+	__checkReturn	efx_rc_t
+rhead_tx_qflush(
+	__in		efx_txq_t *etp)
+{
+	efx_nic_t *enp = etp->et_enp;
+	efx_rc_t rc;
+
+	if ((rc = efx_mcdi_fini_txq(enp, etp->et_index)) != 0)
+		goto fail1;
+
+	return (0);
+
+fail1:
+	/*
+	 * EALREADY is not an error, but indicates that the MC has rebooted and
+	 * that the TXQ has already been destroyed. Callers need to know that
+	 * the TXQ flush has completed to avoid waiting until timeout for a
+	 * flush done event that will not be delivered.
+	 */
+	if (rc != EALREADY)
+		EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+			void
+rhead_tx_qenable(
+	__in		efx_txq_t *etp)
+{
+	_NOTE(ARGUNUSED(etp))
+	/* Nothing to do here */
+}
+
+	__checkReturn		efx_rc_t
+rhead_tx_qdesc_post(
+	__in			efx_txq_t *etp,
+	__in_ecount(ndescs)	efx_desc_t *ed,
+	__in			unsigned int ndescs,
+	__in			unsigned int completed,
+	__inout			unsigned int *addedp)
+{
+	_NOTE(ARGUNUSED(etp))
+	_NOTE(ARGUNUSED(ed))
+	_NOTE(ARGUNUSED(ndescs))
+	_NOTE(ARGUNUSED(completed))
+	_NOTE(ARGUNUSED(addedp))
+
+	/* FIXME Implement the method for Riverhead */
+
+	return (ENOTSUP);
+}
+
+#if EFSYS_OPT_QSTATS
+
+			void
+rhead_tx_qstats_update(
+	__in				efx_txq_t *etp,
+	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat)
+{
+	unsigned int id;
+
+	for (id = 0; id < TX_NQSTATS; id++) {
+		efsys_stat_t *essp = &stat[id];
+
+		EFSYS_STAT_INCR(essp, etp->et_stat[id]);
+		etp->et_stat[id] = 0;
+	}
+}
+
+#endif /* EFSYS_OPT_QSTATS */
+
+#endif /* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (32 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
                     ` (27 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Rx/Tx queue DMA sync should not assume descriptor size to be the same
for all NIC familties since it Tx descritor size is 16 on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 2 +-
 drivers/common/sfc_efx/base/ef10_tx.c  | 4 ++--
 drivers/common/sfc_efx/base/efx_impl.h | 9 +++++----
 drivers/common/sfc_efx/base/efx_rx.c   | 2 +-
 drivers/common/sfc_efx/base/efx_tx.c   | 2 +-
 5 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 61e0dab5b9..2f0d2d2f5b 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -693,7 +693,7 @@ ef10_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    EF10_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_VI_WRITED(enp, ER_DZ_RX_DESC_UPD_REG,
 	    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/ef10_tx.c b/drivers/common/sfc_efx/base/ef10_tx.c
index 61c7e49fe8..7cc9324b4b 100644
--- a/drivers/common/sfc_efx/base/ef10_tx.c
+++ b/drivers/common/sfc_efx/base/ef10_tx.c
@@ -375,7 +375,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_DOORBELL_WRITEO(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &oword);
@@ -391,7 +391,7 @@ ef10_tx_qpush(
 
 		/* Ensure ordering of memory (descriptors) and PIO (doorbell) */
 		EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-					    wptr, id);
+		    EF10_TXQ_DESC_SIZE, wptr, id);
 		EFSYS_PIO_WRITE_BARRIER();
 		EFX_BAR_VI_WRITED2(enp, ER_DZ_TX_DESC_UPD_REG,
 		    etp->et_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index d7e11c6323..52f974073f 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1292,15 +1292,16 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
-#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr)	\
+#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size,	\
+				      _wptr, _owptr)			\
 	do {								\
 		unsigned int _new = (_wptr);				\
 		unsigned int _old = (_owptr);				\
 									\
 		if ((_new) >= (_old))					\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
-			    (_old) * sizeof (efx_desc_t),		\
-			    ((_new) - (_old)) * sizeof (efx_desc_t));	\
+			    (_old) * (_desc_size),			\
+			    ((_new) - (_old)) * (_desc_size));		\
 		else							\
 			/*						\
 			 * It is cheaper to sync entire map than sync	\
@@ -1309,7 +1310,7 @@ struct efx_txq_s {
 			 */						\
 			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
 			    0,						\
-			    (_entries) * sizeof (efx_desc_t));		\
+			    (_entries) * (_desc_size));			\
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 5f17bf3afe..14eda45f4a 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1581,7 +1581,7 @@ siena_rx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(erp->er_esmp, erp->er_mask + 1,
-	    wptr, pushed & erp->er_mask);
+	    SIENA_RXQ_DESC_SIZE, wptr, pushed & erp->er_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_RX_DESC_UPD_REGP0,
 			    erp->er_index, &dword, B_FALSE);
diff --git a/drivers/common/sfc_efx/base/efx_tx.c b/drivers/common/sfc_efx/base/efx_tx.c
index d7f31fd46d..d9568bf4a6 100644
--- a/drivers/common/sfc_efx/base/efx_tx.c
+++ b/drivers/common/sfc_efx/base/efx_tx.c
@@ -866,7 +866,7 @@ siena_tx_qpush(
 
 	/* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
 	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(etp->et_esmp, etp->et_mask + 1,
-	    wptr, pushed & etp->et_mask);
+	    SIENA_TXQ_DESC_SIZE, wptr, pushed & etp->et_mask);
 	EFSYS_PIO_WRITE_BARRIER();
 	EFX_BAR_TBL_WRITED3(enp, FR_BZ_TX_DESC_UPD_REGP0,
 			    etp->et_index, &dword, B_FALSE);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 35/60] common/sfc_efx/base: handle Rx events for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (33 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
                     ` (26 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Rx event on Riverhead provides a number of received packets and
no classification/offloads information is available Rx event.

Introduce a new event callback to be implemented by drivers.
The callback provides information about the number of completed
packets. libefx-based drivers should implement the new callback
for Riverhead and keep the old one for Siena and EF10 NICs.
The new callback may be used for Medford2 NO_CONT_EV Rx mode
support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  8 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 56 +++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2c49280a43..983b723145 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2277,6 +2277,13 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t size,
 	__in		uint16_t flags);
 
+typedef	__checkReturn	boolean_t
+(*efx_rx_packets_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int num_packets,
+	__in		uint32_t flags);
+
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 
 /*
@@ -2394,6 +2401,7 @@ typedef __checkReturn	boolean_t
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
+	efx_rx_packets_ev_t		eec_rx_packets;
 #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 6113cc9cf3..44a79e2e5d 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -58,7 +65,7 @@ rhead_ev_qcreate(
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
 	/* Set up the handler table */
-	eep->ee_rx	= NULL; /* FIXME */
+	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= NULL; /* FIXME */
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
@@ -201,6 +208,10 @@ rhead_ev_qpoll(
 
 			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
 			switch (code) {
+			case ESE_GZ_EF100_EV_RX_PKTS:
+				should_abort = eep->ee_rx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -274,6 +285,49 @@ rhead_ev_qstats_update(
 }
 #endif /* EFSYS_OPT_QSTATS */
 
+static	__checkReturn	boolean_t
+rhead_ev_rx_packets(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t label;
+	uint32_t num_packets;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_RX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_RX event reports the number of received
+	 * packets (unlike EF10 which reports a descriptor index).
+	 * The client driver is responsible for maintaining the Rx
+	 * descriptor index, and computing how many descriptors are
+	 * occupied by each received packet (based on the Rx buffer size
+	 * and the packet length from the Rx prefix).
+	 */
+	num_packets = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_RXPKTS_NUM_PKT);
+
+	/*
+	 * The receive event may indicate more than one packet, and so
+	 * does not contain the packet length. Read the packet length
+	 * from the prefix when handling each packet.
+	 */
+	EFSYS_ASSERT(eecp->eec_rx_packets != NULL);
+	should_abort = eecp->eec_rx_packets(arg, label, num_packets,
+	    EFX_PKT_PREFIX_LEN);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 36/60] common/sfc_efx/base: handle Tx complete on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (34 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
                     ` (25 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Introduce a new event callback which has the same prototype, but
provides number of completed descriptors instead of the last
completed descriptor index.

When all libefx-based drivers implement the new callback, libefx
may be updated to use it for Siena and EF10 family NICs and
the old one may be removed.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h      |  7 ++++
 drivers/common/sfc_efx/base/rhead_ev.c | 51 +++++++++++++++++++++++++-
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 983b723145..2437980c9e 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2319,6 +2319,12 @@ typedef	__checkReturn	boolean_t
 	__in		uint32_t label,
 	__in		uint32_t id);
 
+typedef	__checkReturn	boolean_t
+(*efx_tx_ndescs_ev_t)(
+	__in_opt	void *arg,
+	__in		uint32_t label,
+	__in		unsigned int ndescs);
+
 #define	EFX_EXCEPTION_RX_RECOVERY	0x00000001
 #define	EFX_EXCEPTION_RX_DSC_ERROR	0x00000002
 #define	EFX_EXCEPTION_TX_DSC_ERROR	0x00000003
@@ -2406,6 +2412,7 @@ typedef struct efx_ev_callbacks_s {
 	efx_rx_ps_ev_t			eec_rx_ps;
 #endif
 	efx_tx_ev_t			eec_tx;
+	efx_tx_ndescs_ev_t		eec_tx_ndescs;
 	efx_exception_ev_t		eec_exception;
 	efx_rxq_flush_done_ev_t		eec_rxq_flush_done;
 	efx_rxq_flush_failed_ev_t	eec_rxq_flush_failed;
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 44a79e2e5d..380729d174 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -23,6 +23,13 @@ rhead_ev_rx_packets(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
@@ -66,7 +73,7 @@ rhead_ev_qcreate(
 
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
-	eep->ee_tx	= NULL; /* FIXME */
+	eep->ee_tx	= rhead_ev_tx_completion;
 	eep->ee_driver	= NULL; /* FIXME */
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
@@ -212,6 +219,10 @@ rhead_ev_qpoll(
 				should_abort = eep->ee_rx(eep,
 				    &(ev[index]), eecp, arg);
 				break;
+			case ESE_GZ_EF100_EV_TX_COMPLETION:
+				should_abort = eep->ee_tx(eep,
+				    &(ev[index]), eecp, arg);
+				break;
 			case ESE_GZ_EF100_EV_MCDI:
 				should_abort = eep->ee_mcdi(eep,
 				    &(ev[index]), eecp, arg);
@@ -328,6 +339,44 @@ rhead_ev_rx_packets(
 	return (should_abort);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_tx_completion(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eqp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_nic_t *enp = eep->ee_enp;
+	uint32_t num_descs;
+	uint32_t label;
+	boolean_t should_abort;
+
+	EFX_EV_QSTAT_INCR(eep, EV_TX);
+
+	/* Discard events after RXQ/TXQ errors, or hardware not available */
+	if (enp->en_reset_flags &
+	    (EFX_RESET_RXQ_ERR | EFX_RESET_TXQ_ERR | EFX_RESET_HW_UNAVAIL))
+		return (B_FALSE);
+
+	label = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_Q_LABEL);
+
+	/*
+	 * On EF100 the EV_TX event reports the number of completed Tx
+	 * descriptors (on EF10, the event reports the low bits of the
+	 * index of the last completed descriptor).
+	 * The client driver completion callback will compute the
+	 * descriptor index, so that is not needed here.
+	 */
+	num_descs = EFX_QWORD_FIELD(*eqp, ESF_GZ_EV_TXCMPL_NUM_DESC);
+
+	EFSYS_PROBE2(tx_ndescs, uint32_t, label, unsigned int, num_descs);
+
+	EFSYS_ASSERT(eecp->eec_tx_ndescs != NULL);
+	should_abort = eecp->eec_tx_ndescs(arg, label, num_descs);
+
+	return (should_abort);
+}
+
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 37/60] common/sfc_efx/base: indicate support for TSO version 3
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (35 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
                     ` (24 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead boards support TSO version 3.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 6 ++++++
 drivers/common/sfc_efx/base/efx.h       | 1 +
 drivers/common/sfc_efx/base/siena_nic.c | 1 +
 3 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 80dc99aed5..43f3412f35 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1109,6 +1109,12 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_fw_assisted_tso_v2_encap_enabled = B_FALSE;
 
+	/* Check if TSOv3 is supported */
+	if (CAP_FLAGS2(req, TX_TSO_V3))
+		encp->enc_tso_v3_enabled = B_TRUE;
+	else
+		encp->enc_tso_v3_enabled = B_FALSE;
+
 	/* Check if the firmware has vadapter/vport/vswitch support */
 	if (CAP_FLAGS1(req, EVB))
 		encp->enc_datapath_cap_evb = B_TRUE;
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 2437980c9e..08f7cddc95 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1469,6 +1469,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
+	boolean_t		enc_tso_v3_enabled;
 	/* Number of TSO contexts on the NIC (FATSOv2) */
 	uint32_t		enc_fw_assisted_tso_v2_n_contexts;
 	boolean_t		enc_hw_tx_insert_vlan_enabled;
diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c
index beabac0d38..9c30e27f59 100644
--- a/drivers/common/sfc_efx/base/siena_nic.c
+++ b/drivers/common/sfc_efx/base/siena_nic.c
@@ -176,6 +176,7 @@ siena_board_cfg(
 	encp->enc_fw_assisted_tso_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
 	encp->enc_fw_assisted_tso_v2_n_contexts = 0;
+	encp->enc_tso_v3_enabled = B_FALSE;
 	encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
 	encp->enc_rx_packed_stream_supported = B_FALSE;
 	encp->enc_rx_var_packed_stream_supported = B_FALSE;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 38/60] common/sfc_efx/base: report restrictions for TSO version 3
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (36 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
                     ` (23 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Riverhead puts a number of restrictions on TSO transactions.
Reflect some of them in the NIC configuration structure.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_nic.c  | 21 +++++++++++++++++++++
 drivers/common/sfc_efx/base/efx.h       | 10 ++++++++++
 drivers/common/sfc_efx/base/rhead_nic.c | 23 +++++++++++++++++++----
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 43f3412f35..927af87e0d 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2077,6 +2077,27 @@ ef10_nic_board_cfg(
 	 */
 	encp->enc_tx_tso_tcp_header_offset_limit = EF10_TCP_HEADER_OFFSET_LIMIT;
 
+	/* EF10 TSO engine demands that packet header be contiguous. */
+	encp->enc_tx_tso_max_header_ndescs = 1;
+
+	/* The overall TSO header length is not limited. */
+	encp->enc_tx_tso_max_header_length = UINT32_MAX;
+
+	/*
+	 * There are no specific limitations on the number of
+	 * TSO payload descriptors.
+	 */
+	encp->enc_tx_tso_max_payload_ndescs = UINT32_MAX;
+
+	/* TSO superframe payload length is not limited. */
+	encp->enc_tx_tso_max_payload_length = UINT32_MAX;
+
+	/*
+	 * Limitation on the maximum number of outgoing packets per
+	 * TSO transaction described in SF-108452-SW.
+	 */
+	encp->enc_tx_tso_max_nframes = 32767;
+
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
 	 * MC_CMD_GET_RESOURCE_LIMITS here as that reports the available
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 08f7cddc95..a2c2e49bba 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1466,6 +1466,16 @@ typedef struct efx_nic_cfg_s {
 	 * the hardware to apply TSO packet edits.
 	 */
 	uint32_t		enc_tx_tso_tcp_header_offset_limit;
+	/* Maximum number of header DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_ndescs;
+	/* Maximum header length acceptable by TSO transaction. */
+	uint32_t		enc_tx_tso_max_header_length;
+	/* Maximum number of payload DMA descriptors per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_ndescs;
+	/* Maximum payload length per TSO transaction. */
+	uint32_t		enc_tx_tso_max_payload_length;
+	/* Maximum number of frames to be generated per TSO transaction. */
+	uint32_t		enc_tx_tso_max_nframes;
 	boolean_t		enc_fw_assisted_tso_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_enabled;
 	boolean_t		enc_fw_assisted_tso_v2_encap_enabled;
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index b779b4f8e1..7fb28eae31 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -33,11 +33,26 @@ rhead_board_cfg(
 	encp->enc_tx_dma_desc_boundary = 0;
 
 	/*
-	 * Maximum number of bytes into the frame the TCP header can start for
-	 * firmware assisted TSO to work.
-	 * FIXME Get from design parameter DP_TSO_MAX_HDR_LEN.
+	 * Initialise design parameters to either a runtime value read from
+	 * the design parameters area or the well known default value
+	 * (see SF-119689-TC section 4.4 for details).
+	 * FIXME: Read design parameters area values.
 	 */
-	encp->enc_tx_tso_tcp_header_offset_limit = 0;
+	encp->enc_tx_tso_max_header_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_header_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_HDR_LEN_DEFAULT;
+	encp->enc_tx_tso_max_payload_ndescs =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT;
+	encp->enc_tx_tso_max_payload_length =
+	    ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT;
+	encp->enc_tx_tso_max_nframes =
+	    ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT;
+
+	/*
+	 * Riverhead does not put any restrictions on TCP header offset limit.
+	 */
+	encp->enc_tx_tso_tcp_header_offset_limit = UINT32_MAX;
 
 	/*
 	 * Set resource limits for MC_CMD_ALLOC_VIS. Note that we cannot use
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 39/60] common/sfc_efx: do not include libefx headers from efsys.h
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (37 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
                     ` (22 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

efsys.h may depends on target system headers only. Otherwise, it could
result in cross-dependency when libefx header depends on efsys.h and
efsys.h depends on the libefx header.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <andrewle@xilinx.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/efsys.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index 1567d91588..e191cb5b6a 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -50,7 +50,6 @@ extern "C" {
 #else
 #error "Cannot determine system endianness"
 #endif
-#include "efx_types.h"
 
 
 typedef bool boolean_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 40/60] common/sfc_efx/base: add API to get Rx prefix information
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (38 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
                     ` (21 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Define default Siena, EF10 default, packed stream, equal-stride
superbuffer and Riverhead default prefixes in order to make an API
to get Rx prefix layout information generic and usable on all NICs.

Riverhead supports many Rx prefixes. Riverhead FW supports MCDI to
choose Rx prefix based on required Rx prefix fields and allows to
query the prefix layout using MCDI. The patch prepares to introduce
the support in libefx and provides fallback for NICs and FW which
lacks the support.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c         | 80 ++++++++++++++++++-
 drivers/common/sfc_efx/base/efx.h             | 61 ++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h        |  1 +
 drivers/common/sfc_efx/base/efx_rx.c          | 29 +++++++
 drivers/common/sfc_efx/base/efx_types.h       |  1 +
 drivers/common/sfc_efx/base/rhead_rx.c        | 30 +++++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 7 files changed, 201 insertions(+), 2 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 2f0d2d2f5b..43d545b377 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -549,8 +549,8 @@ ef10_rx_scale_tbl_set(
 #if EFX_OPTS_EF10()
 
 /*
- * EF10 RX pseudo-header
- * ---------------------
+ * EF10 RX pseudo-header (aka Rx prefix)
+ * -------------------------------------
  *
  * Receive packets are prefixed by an (optional) 14 byte pseudo-header:
  *
@@ -566,7 +566,77 @@ ef10_rx_scale_tbl_set(
  *       (32bit little-endian)
  *
  * See "The RX Pseudo-header" in SF-109306-TC.
+ *
+ * EF10 does not support Rx prefix choice using MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
  */
+static const efx_rx_prefix_layout_t ef10_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 14,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH]			=
+		    { 0,  32, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI]		=
+		    { 32, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI]	=
+		    { 48, 16, B_TRUE },
+		[EFX_RX_PREFIX_FIELD_LENGTH]			=
+		    { 64, 16, B_FALSE },
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP]		=
+		    { 80, 32, B_FALSE },
+	}
+};
+
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+/*
+ * EF10 packed stream Rx prefix layout.
+ *
+ * See SF-112241-TC Full speed capture for Huntington and Medford section 4.5.
+ */
+static const efx_rx_prefix_layout_t ef10_packed_stream_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 8,
+	.erpl_fields	= {
+#define	EF10_PS_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_DZ_PS_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_PS_RX_PREFIX_FIELD(PARTIAL_TSTAMP, TSTAMP),
+		EF10_PS_RX_PREFIX_FIELD(LENGTH, CAP_LEN),
+		EF10_PS_RX_PREFIX_FIELD(ORIG_LENGTH, ORIG_LEN),
+
+#undef	EF10_PS_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
+
+/*
+ * EF10 equal stride super-buffer Rx prefix layout.
+ *
+ * See SF-119419-TC DPDK Firmware Driver Interface section 3.4.
+ */
+static const efx_rx_prefix_layout_t ef10_essb_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ES_EZ_ESSB_RX_PREFIX_LEN,
+	.erpl_fields	= {
+#define	EF10_ESSB_RX_PREFIX_FIELD(_efx, _ef10) \
+	EFX_RX_PREFIX_FIELD(_efx, ES_EZ_ESSB_RX_PREFIX_ ## _ef10, B_FALSE)
+
+		EF10_ESSB_RX_PREFIX_FIELD(LENGTH, DATA_LEN),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK, MARK),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH_VALID, HASH_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_MARK_VALID, MARK_VALID),
+		EF10_ESSB_RX_PREFIX_FIELD(USER_FLAG, MATCH_FLAG),
+		EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH, HASH),
+
+#undef	EF10_ESSB_RX_PREFIX_FIELD
+	}
+};
+
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	__checkReturn	efx_rc_t
 ef10_rx_prefix_pktlen(
@@ -836,6 +906,7 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
 	boolean_t disable_scatter;
 	boolean_t want_inner_classes;
@@ -852,6 +923,7 @@ ef10_rx_qcreate(
 
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
+		erpl = &ef10_default_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
@@ -861,6 +933,7 @@ ef10_rx_qcreate(
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
+		erpl = &ef10_packed_stream_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail2;
@@ -890,6 +963,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
+		erpl = &ef10_essb_rx_prefix_layout;
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail4;
@@ -973,6 +1047,8 @@ ef10_rx_qcreate(
 
 	erp->er_ev_qstate = &erp->er_eep->ee_rxq_state[label];
 
+	erp->er_prefix_layout = *erpl;
+
 	return (0);
 
 fail11:
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index a2c2e49bba..41222a71f1 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1396,6 +1396,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
+	/* Maximum Rx prefix size if many Rx prefixes are supported */
 	uint32_t		enc_rx_prefix_size;
 	uint32_t		enc_rx_buf_align_start;
 	uint32_t		enc_rx_buf_align_end;
@@ -2760,6 +2761,66 @@ efx_rxq_nbufs(
 
 #define	EFX_RXQ_LIMIT(_ndescs)		((_ndescs) - 16)
 
+/*
+ * libefx representation of the Rx prefix layout information.
+ *
+ * The information may be used inside libefx to implement Rx prefix fields
+ * accessors and by drivers which process Rx prefix itself.
+ */
+
+/*
+ * All known Rx prefix fields.
+ *
+ * An Rx prefix may have a subset of these fields.
+ */
+typedef enum efx_rx_prefix_field_e {
+	EFX_RX_PREFIX_FIELD_LENGTH = 0,
+	EFX_RX_PREFIX_FIELD_ORIG_LENGTH,
+	EFX_RX_PREFIX_FIELD_CLASS,
+	EFX_RX_PREFIX_FIELD_RSS_HASH,
+	EFX_RX_PREFIX_FIELD_RSS_HASH_VALID,
+	EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP,
+	EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI,
+	EFX_RX_PREFIX_FIELD_USER_FLAG,
+	EFX_RX_PREFIX_FIELD_USER_MARK,
+	EFX_RX_PREFIX_FIELD_USER_MARK_VALID,
+	EFX_RX_PREFIX_FIELD_CSUM_FRAME,
+	EFX_RX_PREFIX_FIELD_INGRESS_VPORT,
+	EFX_RX_PREFIX_NFIELDS
+} efx_rx_prefix_field_t;
+
+/*
+ * Location and endianness of a field in Rx prefix.
+ *
+ * If width is zero, the field is not present.
+ */
+typedef struct efx_rx_prefix_field_info_s {
+	uint16_t			erpfi_offset_bits;
+	uint8_t				erpfi_width_bits;
+	boolean_t			erpfi_big_endian;
+} efx_rx_prefix_field_info_t;
+
+/* Helper macro to define Rx prefix fields */
+#define	EFX_RX_PREFIX_FIELD(_efx, _field, _big_endian)		\
+	[EFX_RX_PREFIX_FIELD_ ## _efx] = {			\
+		.erpfi_offset_bits	= EFX_LOW_BIT(_field),	\
+		.erpfi_width_bits	= EFX_WIDTH(_field),	\
+		.erpfi_big_endian	= (_big_endian),	\
+	}
+
+typedef struct efx_rx_prefix_layout_s {
+	uint32_t			erpl_id;
+	uint8_t				erpl_length;
+	efx_rx_prefix_field_info_t	erpl_fields[EFX_RX_PREFIX_NFIELDS];
+} efx_rx_prefix_layout_t;
+
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp);
+
 typedef enum efx_rxq_type_e {
 	EFX_RXQ_TYPE_DEFAULT,
 	EFX_RXQ_TYPE_PACKED_STREAM,
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 52f974073f..01869155fa 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -944,6 +944,7 @@ struct efx_rxq_s {
 	size_t				er_buf_size;
 	efsys_mem_t			*er_esmp;
 	efx_evq_rxq_state_t		*er_ev_qstate;
+	efx_rx_prefix_layout_t		er_prefix_layout;
 };
 
 #define	EFX_RXQ_MAGIC	0x15022005
diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c
index 14eda45f4a..3536b0eb07 100644
--- a/drivers/common/sfc_efx/base/efx_rx.c
+++ b/drivers/common/sfc_efx/base/efx_rx.c
@@ -1059,6 +1059,18 @@ efx_pseudo_hdr_hash_get(
 }
 #endif	/* EFSYS_OPT_RX_SCALE */
 
+	__checkReturn	efx_rc_t
+efx_rx_prefix_get_layout(
+	__in		const efx_rxq_t *erp,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
+
+	*erplp = erp->er_prefix_layout;
+
+	return (0);
+}
+
 #if EFSYS_OPT_SIENA
 
 static	__checkReturn	efx_rc_t
@@ -1477,6 +1489,21 @@ siena_rx_scale_tbl_set(
  *   LL.LL         LFSR hash     (16-bit big-endian)
  */
 
+/*
+ * Provide Rx prefix layout with Toeplitz hash only since LSFR is
+ * used by no supported drivers.
+ *
+ * Siena does not support Rx prefix choice via MC_CMD_GET_RX_PREFIX_ID
+ * and query its layout using MC_CMD_QUERY_RX_PREFIX_ID.
+ */
+static const efx_rx_prefix_layout_t siena_toeplitz_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= 16,
+	.erpl_fields	= {
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] = { 12 * 8, 32, B_TRUE },
+	}
+};
+
 #if EFSYS_OPT_RX_SCALE
 static	__checkReturn	uint32_t
 siena_rx_prefix_hash(
@@ -1719,6 +1746,8 @@ siena_rx_qcreate(
 	EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
 			    erp->er_index, &oword, B_TRUE);
 
+	erp->er_prefix_layout = siena_toeplitz_rx_prefix_layout;
+
 	return (0);
 
 #if !EFSYS_OPT_RX_SCATTER
diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ae8a1031df..ab35e61b84 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -1628,6 +1628,7 @@ extern int fix_lint;
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
 #endif
 
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 0081b3ea53..c9ab3f92e1 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,35 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Default Rx prefix layout on Riverhead if FW does not support Rx
+ * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
+ * using MC_CMD_QUERY_RX_PREFIX_ID.
+ *
+ * See SF-119689-TC Riverhead Host Interface section 6.4.
+ */
+static const efx_rx_prefix_layout_t rhead_default_rx_prefix_layout = {
+	.erpl_id	= 0,
+	.erpl_length	= ESE_GZ_RX_PKT_PREFIX_LEN,
+	.erpl_fields	= {
+#define	RHEAD_RX_PREFIX_FIELD(_name, _big_endian) \
+	EFX_RX_PREFIX_FIELD(_name, ESF_GZ_RX_PREFIX_ ## _name, _big_endian)
+
+		RHEAD_RX_PREFIX_FIELD(LENGTH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH_VALID, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_FLAG, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CLASS, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(PARTIAL_TSTAMP, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(RSS_HASH, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(USER_MARK, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(INGRESS_VPORT, B_FALSE),
+		RHEAD_RX_PREFIX_FIELD(CSUM_FRAME, B_TRUE),
+		RHEAD_RX_PREFIX_FIELD(VLAN_STRIP_TCI, B_TRUE),
+
+#undef	RHEAD_RX_PREFIX_FIELD
+	}
+};
+
 	__checkReturn	efx_rc_t
 rhead_rx_init(
 	__in		efx_nic_t *enp)
@@ -292,6 +321,7 @@ rhead_rx_qcreate(
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
 
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 9b1715bfee..16fffee321 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -130,6 +130,7 @@ INTERNAL {
 	efx_rx_fini;
 	efx_rx_hash_default_support_get;
 	efx_rx_init;
+	efx_rx_prefix_get_layout;
 	efx_rx_qcreate;
 	efx_rx_qcreate_es_super_buffer;
 	efx_rx_qdestroy;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 41/60] common/sfc_efx/base: group RxQ parameters into a structure
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (39 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
                     ` (20 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Make number of efx_mcdi_init_rxq() arguments reasonable before
addition of one more argument.
Non essential parameters not supported in some cases are moved
into helper structure.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_rx.c  | 57 +++++++++++---------------
 drivers/common/sfc_efx/base/efx_impl.h | 20 +++++----
 drivers/common/sfc_efx/base/efx_mcdi.c | 33 ++++++---------
 drivers/common/sfc_efx/base/rhead_rx.c | 14 ++++---
 4 files changed, 58 insertions(+), 66 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c
index 43d545b377..ea5f514f18 100644
--- a/drivers/common/sfc_efx/base/ef10_rx.c
+++ b/drivers/common/sfc_efx/base/ef10_rx.c
@@ -906,21 +906,18 @@ ef10_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+	efx_mcdi_init_rxq_params_t params;
 	const efx_rx_prefix_layout_t *erpl;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
-	boolean_t want_inner_classes;
-	unsigned int ps_buf_size;
-	uint32_t es_bufs_per_desc = 0;
-	uint32_t es_max_dma_len = 0;
-	uint32_t es_buf_stride = 0;
-	uint32_t hol_block_timeout = 0;
 
 	_NOTE(ARGUNUSED(id, erp))
 
 	EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+	params.buf_size = erp->er_buf_size;
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		erpl = &ef10_default_rx_prefix_layout;
@@ -929,7 +926,6 @@ ef10_rx_qcreate(
 			goto fail1;
 		}
 		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
-		ps_buf_size = 0;
 		break;
 #if EFSYS_OPT_RX_PACKED_STREAM
 	case EFX_RXQ_TYPE_PACKED_STREAM:
@@ -940,19 +936,19 @@ ef10_rx_qcreate(
 		}
 		switch (type_data->ertd_packed_stream.eps_buf_size) {
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_512K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_128K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
 			break;
 		case EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K:
-			ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
+			params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
 			break;
 		default:
 			rc = ENOTSUP;
@@ -968,14 +964,13 @@ ef10_rx_qcreate(
 			rc = EINVAL;
 			goto fail4;
 		}
-		ps_buf_size = 0;
-		es_bufs_per_desc =
+		params.es_bufs_per_desc =
 		    type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
-		es_max_dma_len =
+		params.es_max_dma_len =
 		    type_data->ertd_es_super_buffer.eessb_max_dma_len;
-		es_buf_stride =
+		params.es_buf_stride =
 		    type_data->ertd_es_super_buffer.eessb_buf_stride;
-		hol_block_timeout =
+		params.hol_block_timeout =
 		    type_data->ertd_es_super_buffer.eessb_hol_block_timeout;
 		break;
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -985,59 +980,57 @@ ef10_rx_qcreate(
 	}
 
 #if EFSYS_OPT_RX_PACKED_STREAM
-	if (ps_buf_size != 0) {
+	if (params.ps_buf_size != 0) {
 		/* Check if datapath firmware supports packed stream mode */
 		if (encp->enc_rx_packed_stream_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail6;
 		}
 		/* Check if packed stream allows configurable buffer sizes */
-		if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
+		if ((params.ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
 		    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
 			rc = ENOTSUP;
 			goto fail7;
 		}
 	}
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
-	EFSYS_ASSERT(ps_buf_size == 0);
+	EFSYS_ASSERT(params.ps_buf_size == 0);
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
-	if (es_bufs_per_desc > 0) {
+	if (params.es_bufs_per_desc > 0) {
 		if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail8;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail9;
 		}
-		if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
+		if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
 			    EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
 			rc = EINVAL;
 			goto fail10;
 		}
 	}
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-	EFSYS_ASSERT(es_bufs_per_desc == 0);
+	EFSYS_ASSERT(params.es_bufs_per_desc == 0);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	if (flags & EFX_RXQ_FLAG_INNER_CLASSES)
-		want_inner_classes = B_TRUE;
+		params.want_inner_classes = B_TRUE;
 	else
-		want_inner_classes = B_FALSE;
+		params.want_inner_classes = B_FALSE;
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
-		    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
-		    es_buf_stride, hol_block_timeout)) != 0)
+		    esmp, &params)) != 0)
 		goto fail11;
 
 	erp->er_eep = eep;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 01869155fa..c373192554 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1430,6 +1430,17 @@ efx_mcdi_fini_evq(
 	__in		efx_nic_t *enp,
 	__in		uint32_t instance);
 
+typedef struct efx_mcdi_init_rxq_params_s {
+	boolean_t	disable_scatter;
+	boolean_t	want_inner_classes;
+	uint32_t	buf_size;
+	uint32_t	ps_buf_size;
+	uint32_t	es_bufs_per_desc;
+	uint32_t	es_max_dma_len;
+	uint32_t	es_buf_stride;
+	uint32_t	hol_block_timeout;
+} efx_mcdi_init_rxq_params_t;
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 efx_mcdi_init_rxq(
@@ -1439,14 +1450,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout);
+	__in		const efx_mcdi_init_rxq_params_t *params);
 
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 278c5e2a64..aa19c7c759 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2688,14 +2688,7 @@ efx_mcdi_init_rxq(
 	__in		uint32_t label,
 	__in		uint32_t instance,
 	__in		efsys_mem_t *esmp,
-	__in		boolean_t disable_scatter,
-	__in		boolean_t want_inner_classes,
-	__in		uint32_t buf_size,
-	__in		uint32_t ps_bufsize,
-	__in		uint32_t es_bufs_per_desc,
-	__in		uint32_t es_max_dma_len,
-	__in		uint32_t es_buf_stride,
-	__in		uint32_t hol_block_timeout)
+	__in		const efx_mcdi_init_rxq_params_t *params)
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
@@ -2719,21 +2712,21 @@ efx_mcdi_init_rxq(
 	}
 
 	no_cont_ev = (eep->ee_flags & EFX_EVQ_FLAGS_NO_CONT_EV);
-	if ((no_cont_ev == B_TRUE) && (disable_scatter == B_FALSE)) {
+	if ((no_cont_ev == B_TRUE) && (params->disable_scatter == B_FALSE)) {
 		/* TODO: Support scatter in NO_CONT_EV mode */
 		rc = EINVAL;
 		goto fail2;
 	}
 
-	if (ps_bufsize > 0)
+	if (params->ps_buf_size > 0)
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM;
-	else if (es_bufs_per_desc > 0)
+	else if (params->es_bufs_per_desc > 0)
 		dma_mode = MC_CMD_INIT_RXQ_V3_IN_EQUAL_STRIDE_SUPER_BUFFER;
 	else
 		dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET;
 
 	if (encp->enc_tunnel_encapsulations_supported != 0 &&
-	    !want_inner_classes) {
+	    !params->want_inner_classes) {
 		/*
 		 * WANT_OUTER_CLASSES can only be specified on hardware which
 		 * supports tunnel encapsulation offloads, even though it is
@@ -2768,31 +2761,31 @@ efx_mcdi_init_rxq(
 	    INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0,
 	    INIT_RXQ_EXT_IN_CRC_MODE, 0,
 	    INIT_RXQ_EXT_IN_FLAG_PREFIX, 1,
-	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter,
+	    INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, params->disable_scatter,
 	    INIT_RXQ_EXT_IN_DMA_MODE,
 	    dma_mode,
-	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize,
+	    INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, params->ps_buf_size,
 	    INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
 	    INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
 
-	if (es_bufs_per_desc > 0) {
+	if (params->es_bufs_per_desc > 0) {
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_PACKET_BUFFERS_PER_BUCKET,
-		    es_bufs_per_desc);
+		    params->es_bufs_per_desc);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, es_max_dma_len);
+		    INIT_RXQ_V3_IN_ES_MAX_DMA_LEN, params->es_max_dma_len);
 		MCDI_IN_SET_DWORD(req,
-		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, es_buf_stride);
+		    INIT_RXQ_V3_IN_ES_PACKET_STRIDE, params->es_buf_stride);
 		MCDI_IN_SET_DWORD(req,
 		    INIT_RXQ_V3_IN_ES_HEAD_OF_LINE_BLOCK_TIMEOUT,
-		    hol_block_timeout);
+		    params->hol_block_timeout);
 	}
 
 	if (encp->enc_init_rxq_with_buffer_size)
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
-		    buf_size);
+		    params->buf_size);
 
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index c9ab3f92e1..38c905444a 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -280,8 +280,8 @@ rhead_rx_qcreate(
 	__in		efx_rxq_t *erp)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	efx_mcdi_init_rxq_params_t params;
 	efx_rc_t rc;
-	boolean_t disable_scatter;
 
 	_NOTE(ARGUNUSED(id))
 
@@ -289,13 +289,15 @@ rhead_rx_qcreate(
 	    (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
 	EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+	memset(&params, 0, sizeof (params));
+
 	switch (type) {
 	case EFX_RXQ_TYPE_DEFAULT:
 		if (type_data == NULL) {
 			rc = EINVAL;
 			goto fail1;
 		}
-		erp->er_buf_size = type_data->ertd_default.ed_buf_size;
+		params.buf_size = type_data->ertd_default.ed_buf_size;
 		break;
 	default:
 		rc = ENOTSUP;
@@ -304,9 +306,9 @@ rhead_rx_qcreate(
 
 	/* Scatter can only be disabled if the firmware supports doing so */
 	if (flags & EFX_RXQ_FLAG_SCATTER)
-		disable_scatter = B_FALSE;
+		params.disable_scatter = B_FALSE;
 	else
-		disable_scatter = encp->enc_rx_disable_scatter_supported;
+		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
@@ -315,12 +317,12 @@ rhead_rx_qcreate(
 	 */
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-		    esmp, disable_scatter, B_FALSE, erp->er_buf_size,
-		    0, 0, 0, 0, 0)) != 0)
+		    esmp, &params)) != 0)
 		goto fail3;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
+	erp->er_buf_size = params.buf_size;
 	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
 
 	return (0);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (40 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
                     ` (19 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Riverhead supports many Rx prefixes. The Rx prefix may be chosen
based on which information is required.

To have better performance choose the smallest Rx prefix which
meets our requirements.

Right now there is no way to specify requirements on Rx queue
creation, but it could be added in the future.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h |   1 +
 drivers/common/sfc_efx/base/efx_mcdi.c |  10 +-
 drivers/common/sfc_efx/base/rhead_rx.c | 333 ++++++++++++++++++++++++-
 3 files changed, 338 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index c373192554..fc0a654f80 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1439,6 +1439,7 @@ typedef struct efx_mcdi_init_rxq_params_s {
 	uint32_t	es_max_dma_len;
 	uint32_t	es_buf_stride;
 	uint32_t	hol_block_timeout;
+	uint32_t	prefix_id;
 } efx_mcdi_init_rxq_params_t;
 
 LIBEFX_INTERNAL
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index aa19c7c759..b8e45b458d 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2692,8 +2692,8 @@ efx_mcdi_init_rxq(
 {
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
-	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
-		MC_CMD_INIT_RXQ_V4_OUT_LEN);
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V5_IN_LEN,
+		MC_CMD_INIT_RXQ_V5_OUT_LEN);
 	int npages = efx_rxq_nbufs(enp, ndescs);
 	int i;
 	efx_qword_t *dma_addr;
@@ -2747,9 +2747,9 @@ efx_mcdi_init_rxq(
 
 	req.emr_cmd = MC_CMD_INIT_RXQ;
 	req.emr_in_buf = payload;
-	req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
+	req.emr_in_length = MC_CMD_INIT_RXQ_V5_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
+	req.emr_out_length = MC_CMD_INIT_RXQ_V5_OUT_LEN;
 
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
 	MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
@@ -2787,6 +2787,8 @@ efx_mcdi_init_rxq(
 		MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
 		    params->buf_size);
 
+	MCDI_IN_SET_DWORD(req, INIT_RXQ_V5_IN_RX_PREFIX_ID, params->prefix_id);
+
 	dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
 	addr = EFSYS_MEM_ADDR(esmp);
 
diff --git a/drivers/common/sfc_efx/base/rhead_rx.c b/drivers/common/sfc_efx/base/rhead_rx.c
index 38c905444a..d683f280ce 100644
--- a/drivers/common/sfc_efx/base/rhead_rx.c
+++ b/drivers/common/sfc_efx/base/rhead_rx.c
@@ -10,6 +10,12 @@
 
 #if EFSYS_OPT_RIVERHEAD
 
+/*
+ * Maximum number of Rx prefixes supported by Rx prefix choice to be
+ * returned from firmware.
+ */
+#define	RHEAD_RX_PREFIX_IDS_MAX		16
+
 /*
  * Default Rx prefix layout on Riverhead if FW does not support Rx
  * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
@@ -265,6 +271,312 @@ rhead_rx_qenable(
 	_NOTE(ARGUNUSED(erp))
 }
 
+static	__checkReturn	efx_rc_t
+efx_mcdi_get_rx_prefix_ids(
+	__in					efx_nic_t *enp,
+	__in					uint32_t mcdi_fields_mask,
+	__in					unsigned int max_ids,
+	__out					unsigned int *nids,
+	__out_ecount_part(max_ids, *nids)	uint32_t *idsp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	uint32_t num;
+
+	req.emr_cmd = MC_CMD_GET_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_GET_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_GET_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, GET_RX_PREFIX_ID_IN_FIELDS, mcdi_fields_mask);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_GET_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	num = MCDI_OUT_DWORD(req, GET_RX_PREFIX_ID_OUT_NUM_RX_PREFIX_IDS);
+
+	if (req.emr_out_length_used != MC_CMD_GET_RX_PREFIX_ID_OUT_LEN(num)) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	*nids = MIN(num, max_ids);
+
+	EFX_STATIC_ASSERT(sizeof (idsp[0]) ==
+	    MC_CMD_GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID_LEN);
+	memcpy(idsp,
+	    MCDI_OUT2(req, uint32_t, GET_RX_PREFIX_ID_OUT_RX_PREFIX_ID),
+	    *nids * sizeof (idsp[0]));
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rx_prefix_field_t
+efx_mcdi_rx_prefix_field_map(unsigned int mcdi_idx)
+{
+	static const efx_rx_prefix_field_t efx_mcdi_to_rx_prefix_field[] = {
+#define	EFX_MCDI_TO_RX_PREFIX_FIELD(_field) \
+	[RX_PREFIX_FIELD_INFO_ ## _field] = EFX_RX_PREFIX_FIELD_ ## _field
+
+		EFX_MCDI_TO_RX_PREFIX_FIELD(LENGTH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH_VALID),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_FLAG),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CLASS),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(PARTIAL_TSTAMP),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(RSS_HASH),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(USER_MARK),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(INGRESS_VPORT),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(CSUM_FRAME),
+		EFX_MCDI_TO_RX_PREFIX_FIELD(VLAN_STRIP_TCI),
+
+#undef	EFX_MCDI_TO_RX_PREFIX_FIELD
+	};
+
+	if (mcdi_idx >= EFX_ARRAY_SIZE(efx_mcdi_to_rx_prefix_field))
+		return (EFX_RX_PREFIX_NFIELDS);
+
+	return (efx_mcdi_to_rx_prefix_field[mcdi_idx]);
+}
+
+static	__checkReturn	int
+efx_rx_prefix_field_map_to_mcdi(
+	__in		efx_rx_prefix_field_t field)
+{
+	static const int efx_rx_prefix_field_to_mcdi[] = {
+		[EFX_RX_PREFIX_FIELD_LENGTH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_LENGTH),
+		[EFX_RX_PREFIX_FIELD_ORIG_LENGTH] = -1,
+		[EFX_RX_PREFIX_FIELD_CLASS] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CLASS),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH),
+		[EFX_RX_PREFIX_FIELD_RSS_HASH_VALID] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_RSS_HASH_VALID),
+		[EFX_RX_PREFIX_FIELD_PARTIAL_TSTAMP] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_PARTIAL_TSTAMP),
+		[EFX_RX_PREFIX_FIELD_VLAN_STRIP_TCI] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_VLAN_STRIP_TCI),
+		[EFX_RX_PREFIX_FIELD_INNER_VLAN_STRIP_TCI] = -1,
+		[EFX_RX_PREFIX_FIELD_USER_FLAG] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_FLAG),
+		[EFX_RX_PREFIX_FIELD_USER_MARK] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_USER_MARK),
+		[EFX_RX_PREFIX_FIELD_USER_MARK_VALID] = -1,
+		[EFX_RX_PREFIX_FIELD_CSUM_FRAME] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_CSUM_FRAME),
+		[EFX_RX_PREFIX_FIELD_INGRESS_VPORT] =
+			EFX_LOW_BIT(MC_CMD_GET_RX_PREFIX_ID_IN_INGRESS_VPORT),
+	};
+
+	if (field >= EFX_ARRAY_SIZE(efx_rx_prefix_field_to_mcdi))
+		return (-1);
+
+	return (efx_rx_prefix_field_to_mcdi[field]);
+}
+
+static	__checkReturn	efx_rc_t
+efx_rx_prefix_fields_mask_to_mcdi(
+	__in		uint32_t fields_mask,
+	__out		uint32_t *mcdi_fields_maskp)
+{
+	uint32_t mcdi_fields_mask = 0;
+	unsigned int i;
+
+	for (i = 0; i < EFX_RX_PREFIX_NFIELDS; ++i) {
+		if (fields_mask & (1U << i)) {
+			int mcdi_field = efx_rx_prefix_field_map_to_mcdi(i);
+
+			if (mcdi_field < 0)
+				return (EINVAL);
+
+			mcdi_fields_mask |= (1U << mcdi_field);
+		}
+	}
+
+	*mcdi_fields_maskp = mcdi_fields_mask;
+	return (0);
+}
+
+static	__checkReturn	efx_rc_t
+efx_mcdi_query_rx_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t prefix_id,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN,
+		MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX);
+	efx_rc_t rc;
+	size_t response_len;
+	const efx_dword_t *resp;
+	const efx_dword_t *finfo;
+	unsigned int num_fields;
+	unsigned int mcdi_field;
+	efx_rx_prefix_field_t field;
+	unsigned int i;
+
+	req.emr_cmd = MC_CMD_QUERY_RX_PREFIX_ID;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_QUERY_RX_PREFIX_ID_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMAX;
+
+	MCDI_IN_SET_DWORD(req, QUERY_RX_PREFIX_ID_IN_RX_PREFIX_ID, prefix_id);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used < MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	if (MCDI_OUT_BYTE(req, QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE) !=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_TYPE_FIXED) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	EFX_STATIC_ASSERT(MC_CMD_QUERY_RX_PREFIX_ID_OUT_LENMIN >=
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST);
+	response_len = req.emr_out_length_used -
+	    MC_CMD_QUERY_RX_PREFIX_ID_OUT_RESPONSE_OFST;
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LENMIN) {
+		rc = EMSGSIZE;
+		goto fail4;
+	}
+
+	resp = MCDI_OUT2(req, efx_dword_t, QUERY_RX_PREFIX_ID_OUT_RESPONSE);
+
+	memset(erplp, 0, sizeof (*erplp));
+	erplp->erpl_id = prefix_id;
+	erplp->erpl_length =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_PREFIX_LENGTH_BYTES);
+	num_fields =
+	    EFX_DWORD_FIELD(*resp, RX_PREFIX_FIXED_RESPONSE_FIELD_COUNT);
+
+	if (response_len < RX_PREFIX_FIXED_RESPONSE_LEN(num_fields)) {
+		rc = EMSGSIZE;
+		goto fail5;
+	}
+
+	finfo = (const efx_dword_t *)((const uint8_t *)resp +
+	     RX_PREFIX_FIXED_RESPONSE_FIELDS_OFST);
+
+	for (i = 0; i < num_fields; ++i, ++finfo) {
+		mcdi_field = EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_TYPE);
+
+		field = efx_mcdi_rx_prefix_field_map(mcdi_field);
+		if (field >= EFX_RX_PREFIX_NFIELDS)
+			continue;
+
+		erplp->erpl_fields[field].erpfi_offset_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_OFFSET_BITS);
+		erplp->erpl_fields[field].erpfi_width_bits =
+		    EFX_DWORD_FIELD(*finfo, RX_PREFIX_FIELD_INFO_WIDTH_BITS);
+	}
+
+	return (0);
+
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn	efx_rc_t
+rhead_rx_choose_prefix_id(
+	__in		efx_nic_t *enp,
+	__in		uint32_t fields_mask,
+	__out		efx_rx_prefix_layout_t *erplp)
+{
+	efx_rx_prefix_layout_t erpl;
+	uint32_t prefix_ids[RHEAD_RX_PREFIX_IDS_MAX];
+	uint32_t mcdi_fields_mask;
+	unsigned int num = 0;
+	unsigned int i;
+	efx_rc_t rc;
+
+	rc = efx_rx_prefix_fields_mask_to_mcdi(fields_mask, &mcdi_fields_mask);
+	if (rc != 0)
+		goto fail1;
+
+	memset(erplp, 0, sizeof (*erplp));
+
+	rc = efx_mcdi_get_rx_prefix_ids(enp, mcdi_fields_mask,
+	    EFX_ARRAY_SIZE(prefix_ids), &num, prefix_ids);
+	if (rc == ENOTSUP) {
+		/* Not supported MCDI, use default prefix ID */
+		*erplp = rhead_default_rx_prefix_layout;
+		goto done;
+	}
+	if (rc != 0)
+		goto fail2;
+
+	if (num == 0) {
+		rc = ENOTSUP;
+		goto fail3;
+	}
+
+	for (i = 0; i < num; ++i) {
+		rc = efx_mcdi_query_rx_prefix_id(enp, prefix_ids[i], &erpl);
+		if (rc != 0)
+			goto fail4;
+
+		/* Choose the smallest prefix which meets our requirements */
+		if (i == 0 || erpl.erpl_length < erplp->erpl_length)
+			*erplp = erpl;
+	}
+
+done:
+	return (0);
+
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn	efx_rc_t
 rhead_rx_qcreate(
 	__in		efx_nic_t *enp,
@@ -281,6 +593,7 @@ rhead_rx_qcreate(
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
 	efx_mcdi_init_rxq_params_t params;
+	efx_rx_prefix_layout_t erpl;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))
@@ -310,6 +623,20 @@ rhead_rx_qcreate(
 	else
 		params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
+	/*
+	 * LENGTH is required in EF100 host interface, as receive events
+	 * do not include the packet length.
+	 * NOTE: Required fields are hard-wired now. Future designs will
+	 * want to allow the client (driver) code to have control over
+	 * which fields are required or may be allow to request so-called
+	 * default Rx prefix (which ID is equal to 0).
+	 */
+	if ((rc = rhead_rx_choose_prefix_id(enp,
+	    (1U << EFX_RX_PREFIX_FIELD_LENGTH), &erpl)) != 0)
+		goto fail3;
+
+	params.prefix_id = erpl.erpl_id;
+
 	/*
 	 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
 	 * EF100 host interface both inner and outer classes are provided
@@ -318,15 +645,17 @@ rhead_rx_qcreate(
 
 	if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
 		    esmp, &params)) != 0)
-		goto fail3;
+		goto fail4;
 
 	erp->er_eep = eep;
 	erp->er_label = label;
 	erp->er_buf_size = params.buf_size;
-	erp->er_prefix_layout = rhead_default_rx_prefix_layout;
+	erp->er_prefix_layout = erpl;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 43/60] common/sfc_efx/base: add function control window concept
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (41 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
                     ` (18 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window can be located at a different offset than
other windows on Riverhead. Meaning that the drivers must handle
accesses to the function control window differently in case of EF100.

Add accessor macros for function control window and change
EFX NIC create API to facilitate that accessors.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_mcdi.c | 21 ++++++++-----
 drivers/common/sfc_efx/base/efx.h       |  1 +
 drivers/common/sfc_efx/base/efx_impl.h  | 39 +++++++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_nic.c   |  9 ++++++
 drivers/common/sfc_efx/base/rhead_ev.c  |  2 +-
 drivers/common/sfc_efx/base/rhead_nic.c |  2 +-
 drivers/net/sfc/sfc.c                   |  3 +-
 7 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_mcdi.c b/drivers/common/sfc_efx/base/ef10_mcdi.c
index 727f14826e..b324ec825b 100644
--- a/drivers/common/sfc_efx/base/ef10_mcdi.c
+++ b/drivers/common/sfc_efx/base/ef10_mcdi.c
@@ -56,7 +56,7 @@ ef10_mcdi_init(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -166,7 +166,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -179,7 +179,7 @@ ef10_mcdi_send_request(
 	switch (enp->en_family) {
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+		EFX_BAR_FCW_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword);
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 	default:
@@ -237,11 +237,18 @@ ef10_mcdi_poll_reboot(
 
 	old_status = emip->emi_mc_reboot_status;
 
-	EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
-	    ER_GZ_MC_SFT_STATUS_OFST);
-
 	/* Update MC reboot status word */
-	EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
+	switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
+		break;
+#endif	/* EFSYS_OPT_RIVERHEAD */
+	default:
+		EFX_BAR_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG,
+			      &dword, B_FALSE);
+		break;
+	}
 	new_status = dword.ed_u32[0];
 
 	/* MC has rebooted if the value has changed */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 41222a71f1..1531b7f57f 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -150,6 +150,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index fc0a654f80..b1457f361a 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -846,6 +846,7 @@ struct efx_nic_s {
 			int			ena_vi_base;
 			int			ena_vi_count;
 			int			ena_vi_shift;
+			uint32_t		ena_fcw_base;
 #if EFSYS_OPT_VPD
 			caddr_t			ena_svpd;
 			size_t			ena_svpd_length;
@@ -1114,6 +1115,9 @@ struct efx_txq_s {
  * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers,
  * to ensure the correct runtime VI window size is used on Medford2.
  *
+ * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control
+ * window registers, to ensure the correct starting offset is used.
+ *
  * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers.
  */
 
@@ -1218,6 +1222,41 @@ struct efx_txq_s {
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/*
+ * Accessors for memory BAR function control window registers.
+ *
+ * The function control window is located at an offset which can be
+ * non-zero in case of Riverhead.
+ */
+
+#if EFSYS_OPT_RIVERHEAD
+
+#define	EFX_BAR_FCW_READD(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+		EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_BAR_FCW_WRITED(_enp, _reg, _edp)				\
+	do {								\
+		EFX_CHECK_REG((_enp), (_reg));				\
+		EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg,	\
+		    uint32_t, _reg ## _OFST,				\
+		    uint32_t, (_edp)->ed_u32[0]);			\
+		EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST +	\
+		    (_enp)->en_arch.ef10.ena_fcw_base,			\
+		    (_edp), B_FALSE);					\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#endif	/* EFSYS_OPT_RIVERHEAD */
+
 /*
  * Accessors for memory BAR per-VI registers.
  *
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 465e2c7a36..3dc287a095 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -215,6 +215,7 @@ efx_nic_create(
 	__in		efx_family_t family,
 	__in		efsys_identifier_t *esip,
 	__in		efsys_bar_t *esbp,
+	__in		uint32_t fcw_offset,
 	__in		efsys_lock_t *eslp,
 	__deref_out	efx_nic_t **enpp)
 {
@@ -316,6 +317,7 @@ efx_nic_create(
 		    EFX_FEATURE_MCDI |
 		    EFX_FEATURE_MAC_HEADER_FILTERS |
 		    EFX_FEATURE_MCDI_DMA;
+		enp->en_arch.ef10.ena_fcw_base = fcw_offset;
 		break;
 #endif	/* EFSYS_OPT_RIVERHEAD */
 
@@ -324,6 +326,11 @@ efx_nic_create(
 		goto fail2;
 	}
 
+	if ((family != EFX_FAMILY_RIVERHEAD) && (fcw_offset != 0)) {
+		rc = EINVAL;
+		goto fail3;
+	}
+
 	enp->en_family = family;
 	enp->en_esip = esip;
 	enp->en_esbp = esbp;
@@ -333,6 +340,8 @@ efx_nic_create(
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 380729d174..8392a2be5b 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -133,7 +133,7 @@ rhead_ev_qprime(
 	EFX_POPULATE_DWORD_2(dword, ERF_GZ_EVQ_ID, eep->ee_index,
 	    ERF_GZ_IDX, rptr);
 	/* EVQ_INT_PRIME lives function control window only on Riverhead */
-	EFX_BAR_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword, B_FALSE);
+	EFX_BAR_FCW_WRITED(enp, ER_GZ_EVQ_INT_PRIME, &dword);
 
 	return (0);
 }
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 7fb28eae31..a773a43bcc 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -456,7 +456,7 @@ rhead_nic_hw_unavailable(
 	if (enp->en_reset_flags & EFX_RESET_HW_UNAVAIL)
 		return (B_TRUE);
 
-	EFX_BAR_READD(enp, ER_GZ_MC_SFT_STATUS, &dword, B_FALSE);
+	EFX_BAR_FCW_READD(enp, ER_GZ_MC_SFT_STATUS, &dword);
 	if (EFX_DWORD_FIELD(dword, EFX_DWORD_0) == 0xffffffff)
 		goto unavail;
 
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 03ea5dc128..4be65c15dc 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -1046,7 +1046,8 @@ sfc_probe(struct sfc_adapter *sa)
 	sfc_log_init(sa, "create nic");
 	rte_spinlock_init(&sa->nic_lock);
 	rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa,
-			    &sa->mem_bar, &sa->nic_lock, &enp);
+			    &sa->mem_bar, 0,
+			    &sa->nic_lock, &enp);
 	if (rc != 0)
 		goto fail_nic_create;
 	sa->nic = enp;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 44/60] common/sfc_efx/base: add function control window lookup API
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (42 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
                     ` (17 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Riverhead NIC may provide a locator of function control window
(EF100 resource locator).
The locator may be present in a Xilinx capabilities table which
itself is located by looking into extended PCI capabilities.

PCI capabilities are made possible to access by adding PCI config
space interface to efsys.

APIs are implemented to facilitate function control window lookup:
 - API to find an extended PCI capability given a capability ID;
 - API to read Xilinx PCI capability;

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             |  33 ++
 drivers/common/sfc_efx/base/efx_check.h       |   6 +
 drivers/common/sfc_efx/base/efx_impl.h        |  61 ++++
 drivers/common/sfc_efx/base/efx_nic.c         |  41 +++
 drivers/common/sfc_efx/base/efx_pci.c         | 302 ++++++++++++++++++
 drivers/common/sfc_efx/base/meson.build       |   2 +
 drivers/common/sfc_efx/base/rhead_impl.h      |  13 +
 drivers/common/sfc_efx/base/rhead_pci.c       |  68 ++++
 drivers/common/sfc_efx/efsys.h                |   2 +
 .../sfc_efx/rte_common_sfc_efx_version.map    |   1 +
 10 files changed, 529 insertions(+)
 create mode 100644 drivers/common/sfc_efx/base/efx_pci.c
 create mode 100644 drivers/common/sfc_efx/base/rhead_pci.c

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 1531b7f57f..9f4445c099 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -59,6 +59,19 @@ typedef enum efx_family_e {
 	EFX_FAMILY_NTYPES
 } efx_family_t;
 
+typedef enum efx_bar_type_e {
+	EFX_BAR_TYPE_MEM,
+	EFX_BAR_TYPE_IO
+} efx_bar_type_t;
+
+typedef struct efx_bar_region_s {
+	efx_bar_type_t		ebr_type;
+	int			ebr_index;
+	efsys_dma_addr_t	ebr_offset;
+	efsys_dma_addr_t	ebr_length;
+} efx_bar_region_t;
+
+/* The function is deprecated. It is used only if Riverhead is not supported. */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_family(
@@ -67,6 +80,26 @@ efx_family(
 	__out		efx_family_t *efp,
 	__out		unsigned int *membarp);
 
+#if EFSYS_OPT_PCI
+
+/* Determine EFX family and perform lookup of the function control window
+ *
+ * The function requires PCI config handle from which all memory bars can
+ * be accessed.
+ * A user of the API must be aware of memory bars indexes (not available
+ * on Windows).
+ */
+LIBEFX_API
+extern	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
+
 
 #define	EFX_PCI_VENID_SFC			0x1924
 #define	EFX_PCI_VENID_XILINX			0x10EE
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 978321cf67..af90a4c373 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -378,4 +378,10 @@
 # endif
 #endif /* EFSYS_OPT_EVB */
 
+#if EFSYS_OPT_PCI
+# if !EFSYS_OPT_RIVERHEAD
+#  error "PCI requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_PCI */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index b1457f361a..422f97c5ca 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1558,6 +1558,67 @@ efx_mcdi_mac_stats(
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Find the next extended capability in a PCI device's config space
+ * with specified capability id.
+ * Passing 0 offset makes the function search from the start.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if a capability is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp);
+
+/*
+ * Get the next extended capability in a PCI device's config space.
+ * Passing 0 offset makes the function get the first capability.
+ * If search succeeds, the capability is in modified offset.
+ *
+ * Returns ENOENT if there is no next capability.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp);
+
+/*
+ * Find the next Xilinx capabilities table location by searching
+ * PCI extended capabilities.
+ *
+ * Returns ENOENT if a table location is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
+
+/*
+ * Read a Xilinx extended PCI capability that gives the location
+ * of a Xilinx capabilities table.
+ *
+ * Returns ENOENT if the extended PCI capability does not contain
+ * Xilinx capabilities table locator.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp);
+
+#endif /* EFSYS_OPT_PCI */
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index 3dc287a095..dcf0987ebf 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -103,6 +103,47 @@ efx_family(
 	return (ENOTSUP);
 }
 
+#if EFSYS_OPT_PCI
+
+	__checkReturn	efx_rc_t
+efx_family_probe_bar(
+	__in		uint16_t venid,
+	__in		uint16_t devid,
+	__in		efsys_pci_config_t *espcp,
+	__out		efx_family_t *efp,
+	__out		efx_bar_region_t *ebrp)
+{
+	efx_rc_t rc;
+	unsigned int membar;
+
+	if (venid == EFX_PCI_VENID_XILINX) {
+		switch (devid) {
+#if EFSYS_OPT_RIVERHEAD
+		case EFX_PCI_DEVID_RIVERHEAD:
+		case EFX_PCI_DEVID_RIVERHEAD_VF:
+			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			if (rc == 0)
+				*efp = EFX_FAMILY_RIVERHEAD;
+
+			return (rc);
+#endif /* EFSYS_OPT_RIVERHEAD */
+		default:
+			break;
+		}
+	}
+
+	rc = efx_family(venid, devid, efp, &membar);
+	if (rc == 0) {
+		ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+		ebrp->ebr_index = membar;
+		ebrp->ebr_offset = 0;
+		ebrp->ebr_length = 0;
+	}
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
 
 #if EFSYS_OPT_SIENA
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
new file mode 100644
index 0000000000..8707220849
--- /dev/null
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -0,0 +1,302 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+efx_pci_config_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	efx_rc_t rc = 0;
+	size_t next;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	if (*offsetp == 0) {
+		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
+	} else {
+		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail2;
+		}
+
+		next = EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_NEXT);
+		if (next < ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE)
+			rc = ENOENT;
+		else
+			*offsetp = next;
+	}
+
+	/*
+	 * Returns 0 if the next capability is present otherwise ENOENT
+	 * indicating that the function finished correctly.
+	 */
+	return (rc);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_config_find_next_ext_cap(
+	__in				efsys_pci_config_t *espcp,
+	__in				uint16_t cap_id,
+	__inout				size_t *offsetp)
+{
+	efx_dword_t hdr;
+	size_t position;
+	efx_rc_t rc;
+
+	if (offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	position = *offsetp;
+
+	while (1) {
+		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		EFSYS_PCI_CONFIG_READD(espcp, position +
+				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+				&hdr, &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail3;
+		}
+
+		if (EFX_DWORD_FIELD(hdr, ESF_GZ_PCI_EXPRESS_XCAP_ID) ==
+		    cap_id) {
+			*offsetp = position;
+			rc = 0;
+			break;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_find_next_xilinx_cap_table(
+	__in				efsys_pci_config_t *espcp,
+	__inout				size_t *pci_cap_offsetp,
+	__out				unsigned int *xilinx_tbl_barp,
+	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
+{
+	size_t cap_offset;
+	efx_rc_t rc;
+
+	if (pci_cap_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	cap_offset = *pci_cap_offsetp;
+
+	while (1) {
+		unsigned int tbl_bar;
+		efsys_dma_addr_t tbl_offset;
+
+		rc = efx_pci_config_find_next_ext_cap(espcp,
+				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
+		if (rc != 0) {
+			if (rc == ENOENT)
+				break;
+			else
+				goto fail2;
+		}
+
+		/*
+		 * The found extended PCI capability is a vendor-specific
+		 * capability, but not necessarily a Xilinx capabilities table
+		 * locator. Try to read it and skip it if the capability is
+		 * not the locator.
+		 */
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+						       &tbl_bar, &tbl_offset);
+		if (rc == 0) {
+			*xilinx_tbl_barp = tbl_bar;
+			*xilinx_tbl_offsetp = tbl_offset;
+			*pci_cap_offsetp = cap_offset;
+			break;
+		} else {
+			if (rc == ENOENT)
+				continue;
+			else
+				goto fail3;
+		}
+	}
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that search finished
+	 * correctly.
+	 */
+	return (rc);
+
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+	__checkReturn			efx_rc_t
+efx_pci_read_ext_cap_xilinx_table(
+	__in				efsys_pci_config_t *espcp,
+	__in				size_t cap_offset,
+	__out				unsigned int *barp,
+	__out				efsys_dma_addr_t *offsetp)
+{
+	size_t vsec_offset = cap_offset + ESE_GZ_PCI_EXPRESS_XCAP_HDR_SIZE;
+	efx_dword_t cap_hdr;
+	efx_oword_t vsec;
+	uint32_t vsec_len;
+	uint32_t vsec_id;
+	uint32_t vsec_rev;
+	uint32_t offset_low;
+	uint32_t offset_high = 0;
+	unsigned int bar;
+	efsys_dma_addr_t offset;
+	efx_rc_t rc;
+
+	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
+			       &cap_hdr, &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail1;
+	}
+
+	if (EFX_DWORD_FIELD(cap_hdr, ESF_GZ_PCI_EXPRESS_XCAP_VER) !=
+	    ESE_GZ_PCI_EXPRESS_XCAP_VER_VSEC) {
+		rc = EINVAL;
+		goto fail2;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
+			       &vsec.eo_dword[0], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail3;
+	}
+
+	vsec_len = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_LEN);
+	vsec_id = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_ID);
+	vsec_rev = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_VER);
+
+	/*
+	 * Condition of the vendor-specific extended PCI capability not being
+	 * a Xilinx capabilities table locator.
+	 */
+	if (vsec_id != ESE_GZ_XILINX_VSEC_ID) {
+		rc = ENOENT;
+		goto fail4;
+	}
+
+	if (vsec_rev != ESE_GZ_VSEC_VER_XIL_CFGBAR ||
+	    vsec_len < ESE_GZ_VSEC_LEN_MIN) {
+		rc = EINVAL;
+		goto fail5;
+	}
+
+	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
+			       &vsec.eo_dword[1], &rc);
+	if (rc != 0) {
+		rc = EIO;
+		goto fail6;
+	}
+
+	bar = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_BAR);
+	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
+
+	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
+		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
+				&vsec.eo_dword[2], &rc);
+		if (rc != 0) {
+			rc = EIO;
+			goto fail7;
+		}
+
+		offset_high = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_HI);
+	}
+
+	/* High bits of low offset are discarded by the shift */
+	offset = offset_low << ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT;
+
+	/*
+	 * Avoid the 'left shift count >= width of type' warning on systems
+	 * without uint64_t support.
+	 */
+#if EFSYS_HAS_UINT64
+	offset |= (uint64_t)offset_high << ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT;
+#else
+	_NOTE(ARGUNUSED(offset_high))
+#endif
+
+	*offsetp = offset;
+	*barp = bar;
+
+	return (0);
+
+fail7:
+	EFSYS_PROBE(fail7);
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
+fail4:
+	EFSYS_PROBE(fail4);
+fail3:
+	EFSYS_PROBE(fail3);
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 8f944bb45b..21feb36c73 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -19,6 +19,7 @@ sources = [
 	'efx_mon.c',
 	'efx_nic.c',
 	'efx_nvram.c',
+	'efx_pci.c',
 	'efx_phy.c',
 	'efx_port.c',
 	'efx_proxy.c',
@@ -55,6 +56,7 @@ sources = [
 	'rhead_ev.c',
 	'rhead_intr.c',
 	'rhead_nic.c',
+	'rhead_pci.c',
 	'rhead_rx.c',
 	'rhead_tx.c',
 ]
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index c3ffad7208..c62cf8c2c6 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,19 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_PCI
+
+/*
+ * Perform discovery of function control window by looking for a
+ * EF100 locator in Xilinx capabilities tables.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp);
+
+#endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
 }
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
new file mode 100644
index 0000000000..f8e372b79c
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019 Solarflare Communications Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
+
+	__checkReturn			efx_rc_t
+rhead_pci_nic_membar_lookup(
+	__in				efsys_pci_config_t *espcp,
+	__out				efx_bar_region_t *ebrp)
+{
+	boolean_t xilinx_tbl_found = B_FALSE;
+	unsigned int xilinx_tbl_bar;
+	efsys_dma_addr_t xilinx_tbl_offset;
+	size_t pci_capa_offset = 0;
+	boolean_t bar_found = B_FALSE;
+	efx_rc_t rc = ENOENT;
+
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
+	 * the following discovery steps.
+	 */
+	while (1) {
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+							&xilinx_tbl_bar,
+							&xilinx_tbl_offset);
+		if (rc != 0) {
+			/*
+			 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+			 * defines the following fallbacks for the memory bar
+			 * and the offset when no Xilinx capabilities table is
+			 * found.
+			 */
+			if (rc == ENOENT && xilinx_tbl_found == B_FALSE) {
+				ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+				ebrp->ebr_index = EFX_MEM_BAR_RIVERHEAD;
+				ebrp->ebr_offset = 0;
+				ebrp->ebr_length = 0;
+				bar_found = B_TRUE;
+				break;
+			} else {
+				goto fail1;
+			}
+
+		}
+
+		xilinx_tbl_found = B_TRUE;
+	}
+
+	if (bar_found == B_FALSE)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+#endif /* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index e191cb5b6a..de1c1c38e3 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -162,6 +162,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 0
 
+#define EFSYS_OPT_PCI 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 16fffee321..627469a025 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -19,6 +19,7 @@ INTERNAL {
 	efx_evq_size;
 
 	efx_family;
+	efx_family_probe_bar;
 
 	efx_filter_fini;
 	efx_filter_init;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 45/60] common/sfc_efx/base: add efsys API to find a memory BAR
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (43 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
                     ` (16 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Function control window lookup needs memory BARs handles to
search Xilinx capabilities tables.

Define an API to get a memory BAR handle by a PCIe device handle and
BAR index.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index f8e372b79c..47e89cf8a2 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -20,6 +20,7 @@ rhead_pci_nic_membar_lookup(
 	size_t pci_capa_offset = 0;
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
+	efsys_bar_t xil_eb;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -50,13 +51,19 @@ rhead_pci_nic_membar_lookup(
 		}
 
 		xilinx_tbl_found = B_TRUE;
+
+		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		if (rc != 0)
+			goto fail2;
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail2;
+		goto fail3;
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
 fail2:
 	EFSYS_PROBE(fail2);
 fail1:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (44 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
                     ` (15 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

APIs for searching a capability in a Xilinx capabilities table and
reading table entries are needed for function control window lookup
to get the bar index and offset of the window.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   | 15 ++++++
 drivers/common/sfc_efx/base/efx_pci.c    | 61 ++++++++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_impl.h |  7 +++
 drivers/common/sfc_efx/base/rhead_nic.c  | 50 +++++++++++++++++++
 drivers/common/sfc_efx/base/rhead_pci.c  | 51 +++++++++++++++++++-
 5 files changed, 183 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 422f97c5ca..dfe5f1fecf 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1617,6 +1617,21 @@ efx_pci_read_ext_cap_xilinx_table(
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
 
+/*
+ * Find a capability with specified format_id in a Xilinx capabilities table.
+ * Searching is started from provided offset, taking skip_first into account.
+ * If search succeeds, found capability is in modified offset.
+ *
+ * Returns ENOENT if an entry with specified format id is not found.
+ */
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp);
+
 #endif /* EFSYS_OPT_PCI */
 
 #ifdef	__cplusplus
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index 8707220849..bdf995cf84 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -299,4 +299,65 @@ efx_pci_read_ext_cap_xilinx_table(
 	return (rc);
 }
 
+	__checkReturn			efx_rc_t
+efx_pci_xilinx_cap_tbl_find(
+	__in				efsys_bar_t *esbp,
+	__in				uint32_t format_id,
+	__in				boolean_t skip_first,
+	__inout				efsys_dma_addr_t *entry_offsetp)
+{
+	efsys_dma_addr_t offset = *entry_offsetp;
+	boolean_t skip = skip_first;
+	efx_qword_t header;
+	uint32_t format;
+	uint32_t last;
+	efx_rc_t rc;
+
+	if (entry_offsetp == NULL) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	rc = ENOENT;
+	/*
+	 * SF-119689-TC Riverhead Host Interface section 4.2.2.
+	 * describes the following discovery steps.
+	 */
+	do {
+		/*
+		 * Xilinx Capabilities Table requires 32bit aligned reads.
+		 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+		 */
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+				&header.eq_dword[0], B_FALSE);
+		EFSYS_BAR_READD(esbp, offset +
+				(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+				&header.eq_dword[1], B_FALSE);
+
+		format = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_FORMAT);
+		last = EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_LAST);
+
+		if (skip == B_FALSE && format == format_id) {
+			*entry_offsetp = offset;
+			rc = 0;
+			break;
+		}
+
+		offset += EFX_QWORD_FIELD32(header, ESF_GZ_CFGBAR_ENTRY_SIZE);
+		skip = B_FALSE;
+	} while (last == B_FALSE);
+
+	/*
+	 * Returns 0 if found otherwise ENOENT indicating that
+	 * search finished correctly.
+	 */
+	return (rc);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index c62cf8c2c6..91347c335a 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -451,6 +451,13 @@ rhead_pci_nic_membar_lookup(
 
 #endif /* EFSYS_OPT_PCI */
 
+LIBEFX_INTERNAL
+extern	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index a773a43bcc..787afb37a3 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -518,4 +518,54 @@ rhead_nic_register_test(
 
 #endif	/* EFSYS_OPT_DIAG */
 
+	__checkReturn			efx_rc_t
+rhead_nic_xilinx_cap_tbl_read_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t offset,
+	__out				efx_bar_region_t *ebrp)
+{
+	efx_oword_t entry;
+	uint32_t rev;
+	uint32_t len;
+	efx_rc_t rc;
+
+	/*
+	 * Xilinx Capabilities Table requires 32bit aligned reads.
+	 * See SF-119689-TC section 4.2.2 "Discovery Steps".
+	 */
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_FORMAT) / 8),
+			&entry.eo_dword[0], B_FALSE);
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_ENTRY_SIZE) / 8),
+			&entry.eo_dword[1], B_FALSE);
+
+	rev = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_REV);
+	len = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_ENTRY_SIZE);
+
+	if (rev != ESE_GZ_CFGBAR_ENTRY_REV_EF100 ||
+	    len < ESE_GZ_CFGBAR_ENTRY_SIZE_EF100) {
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	EFSYS_BAR_READD(esbp, offset +
+			(EFX_LOW_BIT(ESF_GZ_CFGBAR_EF100_BAR) / 8),
+			&entry.eo_dword[2], B_FALSE);
+
+	ebrp->ebr_index = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_EF100_BAR);
+	ebrp->ebr_offset = EFX_OWORD_FIELD32(entry,
+			ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF) <<
+			ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT;
+	ebrp->ebr_type = EFX_BAR_TYPE_MEM;
+	ebrp->ebr_length = 0;
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 47e89cf8a2..0a6e72f076 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -9,6 +9,41 @@
 
 #if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_PCI
 
+/*
+ * Search for a EF100 resource locator from the given offset of an entry
+ * in a Xilinx capabilities table.
+ */
+static	__checkReturn			efx_rc_t
+rhead_xilinx_cap_tbl_find_ef100_locator(
+	__in				efsys_bar_t *esbp,
+	__in				efsys_dma_addr_t tbl_offset,
+	__out				efx_bar_region_t *ef100_ebrp)
+{
+	efx_rc_t rc;
+	efsys_dma_addr_t entry_offset = tbl_offset;
+
+	rc = efx_pci_xilinx_cap_tbl_find(esbp, ESE_GZ_CFGBAR_ENTRY_EF100,
+					   B_FALSE, &entry_offset);
+	if (rc != 0) {
+		/* EF100 locator not found (ENOENT) or other error */
+		goto fail1;
+	}
+
+	rc = rhead_nic_xilinx_cap_tbl_read_ef100_locator(esbp, entry_offset,
+							 ef100_ebrp);
+	if (rc != 0)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
@@ -55,13 +90,27 @@ rhead_pci_nic_membar_lookup(
 		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
 		if (rc != 0)
 			goto fail2;
+
+		rc = rhead_xilinx_cap_tbl_find_ef100_locator(&xil_eb,
+							     xilinx_tbl_offset,
+							     ebrp);
+		if (rc == 0) {
+			/* Found valid EF100 locator. */
+			bar_found = B_TRUE;
+			break;
+		} else if (rc != ENOENT) {
+			/* Table access failed, so terminate search. */
+			goto fail3;
+		}
 	}
 
 	if (bar_found == B_FALSE)
-		goto fail3;
+		goto fail4;
 
 	return (0);
 
+fail4:
+	EFSYS_PROBE(fail4);
 fail3:
 	EFSYS_PROBE(fail3);
 fail2:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (45 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
                     ` (14 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

Check that BAR lookup was successful by looking at the content
of signature register.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/rhead_pci.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index 0a6e72f076..dfb163b96d 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -56,6 +56,9 @@ rhead_pci_nic_membar_lookup(
 	boolean_t bar_found = B_FALSE;
 	efx_rc_t rc = ENOENT;
 	efsys_bar_t xil_eb;
+	efsys_bar_t nic_eb;
+	efx_dword_t magic_ed;
+	uint32_t magic;
 
 	/*
 	 * SF-119689-TC Riverhead Host Interface section 4.2.2. describes
@@ -107,8 +110,25 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
+	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	if (rc != 0)
+		goto fail5;
+
+	EFSYS_BAR_READD(&nic_eb, ebrp->ebr_offset + ER_GZ_NIC_MAGIC_OFST,
+			&magic_ed, B_FALSE);
+
+	magic = EFX_DWORD_FIELD(magic_ed, ERF_GZ_NIC_MAGIC);
+	if (magic != EFE_GZ_NIC_MAGIC_EXPECTED) {
+		rc = EINVAL;
+		goto fail6;
+	}
+
 	return (0);
 
+fail6:
+	EFSYS_PROBE(fail6);
+fail5:
+	EFSYS_PROBE(fail5);
 fail4:
 	EFSYS_PROBE(fail4);
 fail3:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (46 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
                     ` (13 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

The procedures for destroying UDP tunnels are NIC family specific,
so they should be implemented separately for each of them.

Check for supported UDP encapsulation is removed from generic
operations since it is no longer used by the generic libefx API.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx_impl.h   |  2 +-
 drivers/common/sfc_efx/base/efx_tunnel.c | 39 +++++++++++++++---------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index dfe5f1fecf..64156de884 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -303,8 +303,8 @@ efx_filter_reconfigure(
 
 #if EFSYS_OPT_TUNNEL
 typedef struct efx_tunnel_ops_s {
-	boolean_t	(*eto_udp_encap_supported)(efx_nic_t *);
 	efx_rc_t	(*eto_reconfigure)(efx_nic_t *);
+	void		(*eto_fini)(efx_nic_t *);
 } efx_tunnel_ops_t;
 #endif /* EFSYS_OPT_TUNNEL */
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index b1d1407bd2..5f2186c4c8 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -12,8 +12,8 @@
 
 #if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
 static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_udp_encap_supported */
 	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
 };
 #endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
 
@@ -26,9 +26,13 @@ static	__checkReturn	efx_rc_t
 ef10_tunnel_reconfigure(
 	__in		efx_nic_t *enp);
 
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp);
+
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
-	ef10_udp_encap_supported,	/* eto_udp_encap_supported */
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
+	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
@@ -204,22 +208,12 @@ efx_tunnel_init(
 efx_tunnel_fini(
 	__in		efx_nic_t *enp)
 {
-	boolean_t resetting;
-
 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
-	if ((enp->en_etop->eto_udp_encap_supported != NULL) &&
-	    enp->en_etop->eto_udp_encap_supported(enp)) {
-		/*
-		 * The UNLOADING flag allows the MC to suppress the datapath
-		 * reset if it was set on the last call to
-		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
-		 */
-		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
-		    &resetting);
-	}
+	if (enp->en_etop->eto_fini != NULL)
+		enp->en_etop->eto_fini(enp);
 
 	enp->en_etop = NULL;
 	enp->en_mod_flags &= ~EFX_MOD_TUNNEL;
@@ -476,6 +470,23 @@ ef10_tunnel_reconfigure(
 
 	return (rc);
 }
+
+static			void
+ef10_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	boolean_t resetting;
+
+	if (ef10_udp_encap_supported(enp) != B_FALSE) {
+		/*
+		 * The UNLOADING flag allows the MC to suppress the datapath
+		 * reset if it was set on the last call to
+		 * MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS by all functions
+		 */
+		(void) efx_mcdi_set_tunnel_encap_udp_ports(enp, NULL, B_TRUE,
+		    &resetting);
+	}
+}
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
 #endif /* EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (47 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
                     ` (12 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

UDP tunnel reconfigure operation takes UDP tunnel table, which contains
entries that need to be applied to HW. This approach does not retain
information about what entries were removed or added, which is required
for Riverhead.

Add states to the table entries to indicate add or remove operations.
On tunnel reconfiguration added and removed entries become busy to
indicate that the entries are currently configured and to prevent add or
remove operations from other threads. After tunnel reconfiguration is
complete, the states are reset - added entries become applied and
removed entries are purged from the table.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        |   9 +-
 drivers/common/sfc_efx/base/efx_impl.h   |   9 +
 drivers/common/sfc_efx/base/efx_tunnel.c | 276 +++++++++++++++++++++--
 3 files changed, 269 insertions(+), 25 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 9f4445c099..4a0a1231dc 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -3659,6 +3659,9 @@ efx_tunnel_config_udp_add(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of the port is in progress in other thread.
+ */
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
@@ -3666,8 +3669,12 @@ efx_tunnel_config_udp_remove(
 	__in		uint16_t port /* host/cpu-endian */,
 	__in		efx_tunnel_protocol_t protocol);
 
+/*
+ * Returns EBUSY if reconfiguration of any of the tunnel entries
+ * is in progress in other thread.
+ */
 LIBEFX_API
-extern			void
+extern	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in		efx_nic_t *enp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 64156de884..1ae4eeaf88 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -489,9 +489,18 @@ siena_filter_tbl_clear(
 
 #if EFSYS_OPT_TUNNEL
 
+/* State of a UDP tunnel table entry */
+typedef enum efx_tunnel_udp_entry_state_e {
+	EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */
+	EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */
+	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
+} efx_tunnel_udp_entry_state_t;
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
+	boolean_t			etue_busy;
+	efx_tunnel_udp_entry_state_t	etue_state;
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 5f2186c4c8..204871e00d 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -7,6 +7,43 @@
 #include "efx.h"
 #include "efx_impl.h"
 
+/*
+ * State diagram of the UDP tunnel table entries
+ * (efx_tunnel_udp_entry_state_t and busy flag):
+ *
+ *                             +---------+
+ *                    +--------| APPLIED |<-------+
+ *                    |        +---------+        |
+ *                    |                           |
+ *                    |                efx_tunnel_reconfigure (end)
+ *   efx_tunnel_config_udp_remove                 |
+ *                    |                    +------------+
+ *                    v                    | BUSY ADDED |
+ *               +---------+               +------------+
+ *               | REMOVED |                      ^
+ *               +---------+                      |
+ *                    |               efx_tunnel_reconfigure (begin)
+ *  efx_tunnel_reconfigure (begin)                |
+ *                    |                           |
+ *                    v                     +-----------+
+ *            +--------------+              |   ADDED   |<---------+
+ *            | BUSY REMOVED |              +-----------+          |
+ *            +--------------+                    |                |
+ *                    |              efx_tunnel_config_udp_remove  |
+ *  efx_tunnel_reconfigure (end)                  |                |
+ *                    |                           |                |
+ *                    |        +---------+        |                |
+ *                    |        |+-------+|        |                |
+ *                    +------->|| empty ||<-------+                |
+ *                             |+-------+|                         |
+ *                             +---------+        efx_tunnel_config_udp_add
+ *                                  |                              |
+ *                                  +------------------------------+
+ *
+ * Note that there is no BUSY APPLIED state since removing an applied entry
+ * should not be blocked by ongoing reconfiguration in another thread -
+ * reconfiguration will remove only busy entries.
+ */
 
 #if EFSYS_OPT_TUNNEL
 
@@ -36,6 +73,24 @@ static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+/* Indicates that an entry is to be set */
+static	__checkReturn		boolean_t
+ef10_entry_staged(
+	__in			efx_tunnel_udp_entry_t *entry)
+{
+	switch (entry->etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		return (entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		return (!entry->etue_busy);
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		return (B_TRUE);
+	default:
+		EFSYS_ASSERT(0);
+		return (B_FALSE);
+	}
+}
+
 static	__checkReturn		efx_rc_t
 efx_mcdi_set_tunnel_encap_udp_ports(
 	__in			efx_nic_t *enp,
@@ -51,11 +106,17 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	efx_rc_t rc;
 	unsigned int i;
 	unsigned int entries_num;
+	unsigned int entry;
 
-	if (etcp == NULL)
-		entries_num = 0;
-	else
-		entries_num = etcp->etc_udp_entries_num;
+	entries_num = 0;
+	if (etcp != NULL) {
+		for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+			if (ef10_entry_staged(&etcp->etc_udp_entries[i]) !=
+			    B_FALSE) {
+				entries_num++;
+			}
+		}
+	}
 
 	req.emr_cmd = MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS;
 	req.emr_in_buf = payload;
@@ -73,9 +134,12 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 	MCDI_IN_SET_WORD(req, SET_TUNNEL_ENCAP_UDP_PORTS_IN_NUM_ENTRIES,
 	    entries_num);
 
-	for (i = 0; i < entries_num; ++i) {
+	for (i = 0, entry = 0; entry < entries_num; ++entry, ++i) {
 		uint16_t mcdi_udp_protocol;
 
+		while (ef10_entry_staged(&etcp->etc_udp_entries[i]) == B_FALSE)
+			i++;
+
 		switch (etcp->etc_udp_entries[i].etue_protocol) {
 		case EFX_TUNNEL_PROTOCOL_VXLAN:
 			mcdi_udp_protocol = TUNNEL_ENCAP_UDP_PORT_ENTRY_VXLAN;
@@ -97,7 +161,7 @@ efx_mcdi_set_tunnel_encap_udp_ports(
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_LEN);
 		EFX_POPULATE_DWORD_2(
 		    MCDI_IN2(req, efx_dword_t,
-			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[i],
+			SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES)[entry],
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_UDP_PORT,
 		    etcp->etc_udp_entries[i].etue_port,
 		    TUNNEL_ENCAP_UDP_PORT_ENTRY_PROTOCOL,
@@ -230,7 +294,8 @@ efx_tunnel_config_find_udp_tunnel_entry(
 	for (i = 0; i < etcp->etc_udp_entries_num; ++i) {
 		efx_tunnel_udp_entry_t *p = &etcp->etc_udp_entries[i];
 
-		if (p->etue_port == port) {
+		if (p->etue_port == port &&
+		    p->etue_state != EFX_TUNNEL_UDP_ENTRY_REMOVED) {
 			*entryp = i;
 			return (0);
 		}
@@ -281,6 +346,8 @@ efx_tunnel_config_udp_add(
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_port = port;
 	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_protocol =
 	    protocol;
+	etcp->etc_udp_entries[etcp->etc_udp_entries_num].etue_state =
+	    EFX_TUNNEL_UDP_ENTRY_ADDED;
 
 	etcp->etc_udp_entries_num++;
 
@@ -304,6 +371,61 @@ efx_tunnel_config_udp_add(
 	return (rc);
 }
 
+/*
+ * Returns the index of the entry after the deleted one,
+ * or one past the last entry.
+ */
+static			unsigned int
+efx_tunnel_config_udp_do_remove(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
+	etcp->etc_udp_entries_num--;
+
+	if (entry < etcp->etc_udp_entries_num) {
+		memmove(&etcp->etc_udp_entries[entry],
+		    &etcp->etc_udp_entries[entry + 1],
+		    (etcp->etc_udp_entries_num - entry) *
+		    sizeof (etcp->etc_udp_entries[0]));
+	}
+
+	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
+	    sizeof (etcp->etc_udp_entries[0]));
+
+	return (entry);
+}
+
+/*
+ * Returns the index of the entry after the specified one,
+ * or one past the last entry. The index is correct whether
+ * the specified entry was removed or not.
+ */
+static			unsigned int
+efx_tunnel_config_udp_remove_prepare(
+	__in		efx_tunnel_cfg_t *etcp,
+	__in		unsigned int entry)
+{
+	unsigned int next = entry + 1;
+
+	switch (etcp->etc_udp_entries[entry].etue_state) {
+	case EFX_TUNNEL_UDP_ENTRY_ADDED:
+		next = efx_tunnel_config_udp_do_remove(etcp, entry);
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+		break;
+	case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+		etcp->etc_udp_entries[entry].etue_state =
+		    EFX_TUNNEL_UDP_ENTRY_REMOVED;
+		break;
+	default:
+		EFSYS_ASSERT(0);
+		break;
+	}
+
+	return (next);
+}
+
 	__checkReturn	efx_rc_t
 efx_tunnel_config_udp_remove(
 	__in		efx_nic_t *enp,
@@ -323,28 +445,25 @@ efx_tunnel_config_udp_remove(
 	if (rc != 0)
 		goto fail1;
 
-	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
-		rc = EINVAL;
+	if (etcp->etc_udp_entries[entry].etue_busy != B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
 	}
 
-	EFSYS_ASSERT3U(etcp->etc_udp_entries_num, >, 0);
-	etcp->etc_udp_entries_num--;
-
-	if (entry < etcp->etc_udp_entries_num) {
-		memmove(&etcp->etc_udp_entries[entry],
-		    &etcp->etc_udp_entries[entry + 1],
-		    (etcp->etc_udp_entries_num - entry) *
-		    sizeof (etcp->etc_udp_entries[0]));
+	if (etcp->etc_udp_entries[entry].etue_protocol != protocol) {
+		rc = EINVAL;
+		goto fail3;
 	}
 
-	memset(&etcp->etc_udp_entries[etcp->etc_udp_entries_num], 0,
-	    sizeof (etcp->etc_udp_entries[0]));
+	(void) efx_tunnel_config_udp_remove_prepare(etcp, entry);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (0);
 
+fail3:
+	EFSYS_PROBE(fail3);
+
 fail2:
 	EFSYS_PROBE(fail2);
 
@@ -355,21 +474,51 @@ efx_tunnel_config_udp_remove(
 	return (rc);
 }
 
-			void
+static			boolean_t
+efx_tunnel_table_all_available(
+	__in			efx_tunnel_cfg_t *etcp)
+{
+	unsigned int i;
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		if (etcp->etc_udp_entries[i].etue_busy != B_FALSE)
+			return (B_FALSE);
+	}
+
+	return (B_TRUE);
+}
+
+	__checkReturn	efx_rc_t
 efx_tunnel_config_clear(
 	__in			efx_nic_t *enp)
 {
 	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
 	efsys_lock_state_t state;
+	unsigned int i;
+	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
 
 	EFSYS_LOCK(enp->en_eslp, state);
 
-	etcp->etc_udp_entries_num = 0;
-	memset(etcp->etc_udp_entries, 0, sizeof (etcp->etc_udp_entries));
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
+		goto fail1;
+	}
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num)
+		i = efx_tunnel_config_udp_remove_prepare(etcp, i);
 
 	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (rc);
 }
 
 	__checkReturn	efx_rc_t
@@ -377,6 +526,12 @@ efx_tunnel_reconfigure(
 	__in		efx_nic_t *enp)
 {
 	const efx_tunnel_ops_t *etop = enp->en_etop;
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_tunnel_udp_entry_t *entry;
+	boolean_t locked = B_FALSE;
+	efsys_lock_state_t state;
+	boolean_t resetting;
+	unsigned int i;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_TUNNEL);
@@ -386,16 +541,89 @@ efx_tunnel_reconfigure(
 		goto fail1;
 	}
 
-	if ((rc = enp->en_etop->eto_reconfigure(enp)) != 0)
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	if (efx_tunnel_table_all_available(etcp) == B_FALSE) {
+		rc = EBUSY;
 		goto fail2;
+	}
 
-	return (0);
+	for (i = 0; i < etcp->etc_udp_entries_num; i++) {
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_state != EFX_TUNNEL_UDP_ENTRY_APPLIED)
+			entry->etue_busy = B_TRUE;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	rc = enp->en_etop->eto_reconfigure(enp);
+	if (rc != 0 && rc != EAGAIN)
+		goto fail3;
+
+	resetting = (rc == EAGAIN) ? B_TRUE : B_FALSE;
+
+	EFSYS_LOCK(enp->en_eslp, state);
+	locked = B_TRUE;
+
+	/*
+	 * Delete entries marked for removal since they are no longer
+	 * needed after successful NIC-specific reconfiguration.
+	 * Added entries become applied because they are installed in
+	 * the hardware.
+	 */
+
+	i = 0;
+	while (i < etcp->etc_udp_entries_num) {
+		unsigned int next = i + 1;
+
+		entry = &etcp->etc_udp_entries[i];
+		if (entry->etue_busy != B_FALSE) {
+			entry->etue_busy = B_FALSE;
+
+			switch (entry->etue_state) {
+			case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_ADDED:
+				entry->etue_state =
+				    EFX_TUNNEL_UDP_ENTRY_APPLIED;
+				break;
+			case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+				next = efx_tunnel_config_udp_do_remove(etcp, i);
+				break;
+			default:
+				EFSYS_ASSERT(0);
+				break;
+			}
+		}
+
+		i = next;
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+	locked = B_FALSE;
+
+	return ((resetting == B_FALSE) ? 0 : EAGAIN);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+	EFSYS_ASSERT(locked == B_FALSE);
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etcp->etc_udp_entries_num; i++)
+		etcp->etc_udp_entries[i].etue_busy = B_FALSE;
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
 
 fail2:
 	EFSYS_PROBE(fail2);
 
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+	if (locked)
+		EFSYS_UNLOCK(enp->en_eslp, state);
 
 	return (rc);
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (48 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
                     ` (11 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

EF100 uses VNIC encapsulation rule MCDI for configuring UDP
tunnels in HW individually. Use busy added and removed states
of UDP tunnel table entries for the implementation.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c  |  10 +-
 drivers/common/sfc_efx/base/efx_impl.h     |   7 +
 drivers/common/sfc_efx/base/efx_mcdi.h     |  11 +
 drivers/common/sfc_efx/base/efx_tunnel.c   |  25 +-
 drivers/common/sfc_efx/base/meson.build    |   1 +
 drivers/common/sfc_efx/base/rhead_impl.h   |  14 +
 drivers/common/sfc_efx/base/rhead_nic.c    |  17 +
 drivers/common/sfc_efx/base/rhead_tunnel.c | 343 +++++++++++++++++++++
 8 files changed, 418 insertions(+), 10 deletions(-)
 create mode 100644 drivers/common/sfc_efx/base/rhead_tunnel.c

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 51e6f1a210..0e5f04fe3b 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -1328,9 +1328,15 @@ ef10_filter_supported_filters(
 		rc = efx_mcdi_get_parser_disp_info(enp, &buffer[next_buf_idx],
 		    next_buf_length, B_TRUE, &mcdi_encap_list_length);
 		if (rc != 0) {
-			if (rc == ENOSPC)
+			if (rc == ENOSPC) {
 				no_space = B_TRUE;
-			else
+			} else if (rc == EINVAL) {
+				/*
+				 * Do not fail if the MCDI do not recognize the
+				 * query for encapsulated packet filters.
+				 */
+				mcdi_encap_list_length = 0;
+			} else
 				goto fail2;
 		} else {
 			for (i = next_buf_idx;
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index 1ae4eeaf88..be3f3f6bf5 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -496,11 +496,18 @@ typedef enum efx_tunnel_udp_entry_state_e {
 	EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */
 } efx_tunnel_udp_entry_state_t;
 
+#if EFSYS_OPT_RIVERHEAD
+typedef uint32_t	efx_vnic_encap_rule_handle_t;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 typedef struct efx_tunnel_udp_entry_s {
 	uint16_t			etue_port; /* host/cpu-endian */
 	uint16_t			etue_protocol;
 	boolean_t			etue_busy;
 	efx_tunnel_udp_entry_state_t	etue_state;
+#if EFSYS_OPT_RIVERHEAD
+	efx_vnic_encap_rule_handle_t	etue_handle;
+#endif /* EFSYS_OPT_RIVERHEAD */
 } efx_tunnel_udp_entry_t;
 
 typedef struct efx_tunnel_cfg_s {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h
index 97ac8bf496..77a3d636e2 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.h
+++ b/drivers/common/sfc_efx/base/efx_mcdi.h
@@ -384,6 +384,17 @@ efx_mcdi_phy_module_get_info(
 		MC_CMD_ ## _field9, _value9,				\
 		MC_CMD_ ## _field10, _value10)
 
+/*
+ * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in
+ * network order to avoid conversion to little-endian that is done in
+ * other setters.
+ */
+#define	MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value)
+
+#define	MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value)			\
+	MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value)
+
 #define	MCDI_OUT(_emr, _type, _ofst)					\
 	((_type *)((_emr).emr_out_buf + (_ofst)))
 
diff --git a/drivers/common/sfc_efx/base/efx_tunnel.c b/drivers/common/sfc_efx/base/efx_tunnel.c
index 204871e00d..02b83d97ed 100644
--- a/drivers/common/sfc_efx/base/efx_tunnel.c
+++ b/drivers/common/sfc_efx/base/efx_tunnel.c
@@ -47,13 +47,6 @@
 
 #if EFSYS_OPT_TUNNEL
 
-#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD
-static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
-	NULL,	/* eto_reconfigure */
-	NULL,	/* eto_fini */
-};
-#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_RIVERHEAD */
-
 #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static	__checkReturn	boolean_t
 ef10_udp_encap_supported(
@@ -66,13 +59,29 @@ ef10_tunnel_reconfigure(
 static			void
 ef10_tunnel_fini(
 	__in		efx_nic_t *enp);
+#endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON
+static const efx_tunnel_ops_t	__efx_tunnel_dummy_ops = {
+	NULL,	/* eto_reconfigure */
+	NULL,	/* eto_fini */
+};
+#endif /* EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON */
+
+#if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
 static const efx_tunnel_ops_t	__efx_tunnel_ef10_ops = {
 	ef10_tunnel_reconfigure,	/* eto_reconfigure */
 	ef10_tunnel_fini,		/* eto_fini */
 };
 #endif /* EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_tunnel_ops_t	__efx_tunnel_rhead_ops = {
+	rhead_tunnel_reconfigure,	/* eto_reconfigure */
+	rhead_tunnel_fini,		/* eto_fini */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 /* Indicates that an entry is to be set */
 static	__checkReturn		boolean_t
 ef10_entry_staged(
@@ -241,7 +250,7 @@ efx_tunnel_init(
 
 #if EFSYS_OPT_RIVERHEAD
 	case EFX_FAMILY_RIVERHEAD:
-		etop = &__efx_tunnel_dummy_ops;
+		etop = &__efx_tunnel_rhead_ops;
 		break;
 #endif /* EFSYS_OPT_RIVERHEAD */
 
diff --git a/drivers/common/sfc_efx/base/meson.build b/drivers/common/sfc_efx/base/meson.build
index 21feb36c73..e0acbda993 100644
--- a/drivers/common/sfc_efx/base/meson.build
+++ b/drivers/common/sfc_efx/base/meson.build
@@ -58,6 +58,7 @@ sources = [
 	'rhead_nic.c',
 	'rhead_pci.c',
 	'rhead_rx.c',
+	'rhead_tunnel.c',
 	'rhead_tx.c',
 ]
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 91347c335a..4d5307d18b 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -437,6 +437,20 @@ rhead_tx_qstats_update(
 
 #endif /* EFSYS_OPT_QSTATS */
 
+#if EFSYS_OPT_TUNNEL
+
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp);
+
+LIBEFX_INTERNAL
+extern			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_TUNNEL */
+
 #if EFSYS_OPT_PCI
 
 /*
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 787afb37a3..f965c1735e 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -22,6 +22,23 @@ rhead_board_cfg(
 	if ((rc = efx_mcdi_nic_board_cfg(enp)) != 0)
 		goto fail1;
 
+	/*
+	 * The tunnel encapsulation initialization happens unconditionally
+	 * for now.
+	 */
+	encp->enc_tunnel_encapsulations_supported =
+	    (1u << EFX_TUNNEL_PROTOCOL_VXLAN) |
+	    (1u << EFX_TUNNEL_PROTOCOL_GENEVE) |
+	    (1u << EFX_TUNNEL_PROTOCOL_NVGRE);
+
+	/*
+	 * Software limitation inherited from EF10. This limit is not
+	 * increased since the hardware does not report this limit, it is
+	 * handled internally resulting in a tunnel add error when there is no
+	 * space for more UDP tunnels.
+	 */
+	encp->enc_tunnel_config_udp_entries_max = EFX_TUNNEL_MAXNENTRIES;
+
 	encp->enc_clk_mult = 1; /* not used for Riverhead */
 
 	/*
diff --git a/drivers/common/sfc_efx/base/rhead_tunnel.c b/drivers/common/sfc_efx/base/rhead_tunnel.c
new file mode 100644
index 0000000000..34ba074eac
--- /dev/null
+++ b/drivers/common/sfc_efx/base/rhead_tunnel.c
@@ -0,0 +1,343 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright(c) 2020 Xilinx, Inc.
+ */
+
+#include "efx.h"
+#include "efx_impl.h"
+
+#if EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL
+
+/* Match by Ether-type */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_ETHER_TYPE \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_ETHER_TYPE_LBN)
+/* Match by outer VLAN ID */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_OUTER_VID \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_OUTER_VLAN_LBN)
+/* Match by local IP host address */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_HOST \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_IP_LBN)
+/* Match by IP transport protocol */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_IP_PROTO_LBN)
+/* Match by local TCP/UDP port */
+#define	EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT \
+	(1u << MC_CMD_VNIC_ENCAP_RULE_ADD_IN_MATCH_DST_PORT_LBN)
+
+/*
+ * Helper structure to pass parameters to MCDI function to add a VNIC
+ * encapsulation rule.
+ */
+typedef struct efx_vnic_encap_rule_spec_s {
+	uint32_t		evers_mport_selector; /* Host-endian */
+	uint32_t		evers_match_flags; /* Host-endian */
+	uint16_t		evers_ether_type; /* Host-endian */
+	uint16_t		evers_outer_vid; /* Host-endian */
+	efx_oword_t		evers_loc_host; /* Big-endian */
+	uint8_t			evers_ip_proto;
+	uint16_t		evers_loc_port; /* Host-endian */
+	efx_tunnel_protocol_t	evers_encap_type;
+} efx_vnic_encap_rule_spec_t;
+
+static				uint32_t
+efx_tunnel_protocol2mae_encap_type(
+	__in		efx_tunnel_protocol_t proto,
+	__out		uint32_t *typep)
+{
+	efx_rc_t rc;
+
+	switch (proto) {
+	case EFX_TUNNEL_PROTOCOL_NONE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NONE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_VXLAN:
+		*typep = MAE_MCDI_ENCAP_TYPE_VXLAN;
+		break;
+	case EFX_TUNNEL_PROTOCOL_GENEVE:
+		*typep = MAE_MCDI_ENCAP_TYPE_GENEVE;
+		break;
+	case EFX_TUNNEL_PROTOCOL_NVGRE:
+		*typep = MAE_MCDI_ENCAP_TYPE_NVGRE;
+		break;
+	default:
+		rc = EINVAL;
+		goto fail1;
+	}
+
+	return (0);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_add(
+	__in			efx_nic_t *enp,
+	__in			const efx_vnic_encap_rule_spec_t *spec,
+	__out			efx_vnic_encap_rule_handle_t *handle)
+
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN,
+		MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN);
+	uint32_t encap_type;
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_ADD;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_ADD_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MPORT_SELECTOR,
+	    spec->evers_mport_selector);
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_MATCH_FLAGS,
+	    spec->evers_match_flags);
+
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_ETHER_TYPE,
+	    __CPU_TO_BE_16(spec->evers_ether_type));
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_OUTER_VLAN_WORD,
+	    __CPU_TO_BE_16(spec->evers_outer_vid));
+
+	/*
+	 * Address is already in network order as well as the MCDI field,
+	 * so plain copy is used.
+	 */
+	EFX_STATIC_ASSERT(sizeof (spec->evers_loc_host) ==
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+	memcpy(MCDI_IN2(req, uint8_t, VNIC_ENCAP_RULE_ADD_IN_DST_IP),
+	    &spec->evers_loc_host.eo_byte[0],
+	    MC_CMD_VNIC_ENCAP_RULE_ADD_IN_DST_IP_LEN);
+
+	MCDI_IN_SET_BYTE(req, VNIC_ENCAP_RULE_ADD_IN_IP_PROTO,
+	    spec->evers_ip_proto);
+	MCDI_IN_SET_WORD_NATIVE(req, VNIC_ENCAP_RULE_ADD_IN_DST_PORT,
+	    __CPU_TO_BE_16(spec->evers_loc_port));
+
+	rc = efx_tunnel_protocol2mae_encap_type(spec->evers_encap_type,
+	    &encap_type);
+	if (rc != 0)
+		goto fail1;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_ADD_IN_ENCAP_TYPE, encap_type);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail2;
+	}
+
+	if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_ADD_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail3;
+	}
+
+	if (handle != NULL)
+		*handle = MCDI_OUT_DWORD(req, VNIC_ENCAP_RULE_ADD_OUT_HANDLE);
+
+	return (0);
+
+fail3:
+	EFSYS_PROBE(fail3);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static	__checkReturn		efx_rc_t
+efx_mcdi_vnic_encap_rule_remove(
+	__in			efx_nic_t *enp,
+	__in			efx_vnic_encap_rule_handle_t handle)
+
+{
+	efx_mcdi_req_t req;
+	EFX_MCDI_DECLARE_BUF(payload,
+	    MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN,
+	    MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN);
+	efx_rc_t rc;
+
+	req.emr_cmd = MC_CMD_VNIC_ENCAP_RULE_REMOVE;
+	req.emr_in_buf = payload;
+	req.emr_in_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_IN_LEN;
+	req.emr_out_buf = payload;
+	req.emr_out_length = MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN;
+
+	MCDI_IN_SET_DWORD(req, VNIC_ENCAP_RULE_REMOVE_IN_HANDLE, handle);
+
+	efx_mcdi_execute(enp, &req);
+
+	if (req.emr_rc != 0) {
+		rc = req.emr_rc;
+		goto fail1;
+	}
+
+	if (req.emr_out_length_used != MC_CMD_VNIC_ENCAP_RULE_REMOVE_OUT_LEN) {
+		rc = EMSGSIZE;
+		goto fail2;
+	}
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
+static			void
+rhead_vnic_encap_rule_spec_init(
+	__in		const efx_tunnel_udp_entry_t *etuep,
+	__out		efx_vnic_encap_rule_spec_t *spec)
+{
+	memset(spec, 0, sizeof (*spec));
+
+	spec->evers_mport_selector = MAE_MPORT_SELECTOR_ASSIGNED;
+	spec->evers_match_flags = EFX_VNIC_ENCAP_RULE_MATCH_IP_PROTO |
+	    EFX_VNIC_ENCAP_RULE_MATCH_LOC_PORT;
+	spec->evers_ip_proto = EFX_IPPROTO_UDP;
+	spec->evers_loc_port = etuep->etue_port;
+	spec->evers_encap_type = etuep->etue_protocol;
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_add(
+	__in		efx_nic_t *enp,
+	__inout		efx_tunnel_udp_entry_t *etuep)
+{
+	efx_vnic_encap_rule_spec_t spec;
+
+	rhead_vnic_encap_rule_spec_init(etuep, &spec);
+	return (efx_mcdi_vnic_encap_rule_add(enp, &spec, &etuep->etue_handle));
+}
+
+static	__checkReturn	efx_rc_t
+rhead_udp_port_tunnel_remove(
+	__in		efx_nic_t *enp,
+	__in		efx_tunnel_udp_entry_t *etuep)
+{
+	return (efx_mcdi_vnic_encap_rule_remove(enp, etuep->etue_handle));
+}
+
+	__checkReturn	efx_rc_t
+rhead_tunnel_reconfigure(
+	__in		efx_nic_t *enp)
+{
+	efx_tunnel_cfg_t *etcp = &enp->en_tunnel_cfg;
+	efx_rc_t rc;
+	efsys_lock_state_t state;
+	efx_tunnel_cfg_t etc;
+	efx_tunnel_cfg_t added;
+	unsigned int i;
+	unsigned int j;
+
+	memset(&added, 0, sizeof(added));
+
+	/*
+	 * Make a local copy of UDP tunnel table to release the lock
+	 * when executing MCDIs.
+	 */
+	EFSYS_LOCK(enp->en_eslp, state);
+	memcpy(&etc, etcp, sizeof (etc));
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	for (i = 0; i < etc.etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *etc_entry = &etc.etc_udp_entries[i];
+
+		if (etc_entry->etue_busy == B_FALSE)
+			continue;
+
+		switch (etc_entry->etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			rc = rhead_udp_port_tunnel_add(enp, etc_entry);
+			if (rc != 0)
+				goto fail1;
+			added.etc_udp_entries[added.etc_udp_entries_num] =
+			    *etc_entry;
+			added.etc_udp_entries_num++;
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			rc = rhead_udp_port_tunnel_remove(enp, etc_entry);
+			if (rc != 0)
+				goto fail2;
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	EFSYS_LOCK(enp->en_eslp, state);
+
+	/*
+	 * Adding or removing non-busy entries does not change the
+	 * order of busy entries. Therefore one linear search iteration
+	 * suffices.
+	 */
+	for (i = 0, j = 0; i < etcp->etc_udp_entries_num; i++) {
+		efx_tunnel_udp_entry_t *cur_entry = &etcp->etc_udp_entries[i];
+		efx_tunnel_udp_entry_t *added_entry = &added.etc_udp_entries[j];
+
+		if (cur_entry->etue_state == EFX_TUNNEL_UDP_ENTRY_ADDED &&
+		    cur_entry->etue_port == added_entry->etue_port) {
+			cur_entry->etue_handle = added_entry->etue_handle;
+			j++;
+		}
+	}
+
+	EFSYS_UNLOCK(enp->en_eslp, state);
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	while (i-- > 0) {
+		if (etc.etc_udp_entries[i].etue_busy == B_FALSE)
+			continue;
+
+		switch (etc.etc_udp_entries[i].etue_state) {
+		case EFX_TUNNEL_UDP_ENTRY_APPLIED:
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_ADDED:
+			(void) rhead_udp_port_tunnel_remove(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		case EFX_TUNNEL_UDP_ENTRY_REMOVED:
+			(void) rhead_udp_port_tunnel_add(enp,
+					&etc.etc_udp_entries[i]);
+			break;
+		default:
+			EFSYS_ASSERT(0);
+			break;
+		}
+	}
+
+	return (rc);
+}
+
+			void
+rhead_tunnel_fini(
+	__in		efx_nic_t *enp)
+{
+	(void) efx_tunnel_config_clear(enp);
+	(void) efx_tunnel_reconfigure(enp);
+}
+
+#endif	/* EFSYS_OPT_RIVERHEAD && EFSYS_OPT_TUNNEL */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 51/60] common/sfc_efx/base: replace PCI efsys macros with functions
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (49 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
                     ` (10 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Igor Romanov

From: Igor Romanov <igor.romanov@oktetlabs.ru>

efsys macros that manipulate PCI devices cannot be defined in
common sfc_efx DPDK driver since in DPDK build the bus drivers
that provide required functionality are built after common drivers.

Replace the macros with function callbacks to remove that build
dependency. Drivers now should pass the callbacks directly to
efx function instead of defining implementation in efsys.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h        | 29 ++++++++++++++++++++
 drivers/common/sfc_efx/base/efx_impl.h   |  4 +++
 drivers/common/sfc_efx/base/efx_nic.c    |  3 ++-
 drivers/common/sfc_efx/base/efx_pci.c    | 34 +++++++++++++-----------
 drivers/common/sfc_efx/base/rhead_impl.h |  1 +
 drivers/common/sfc_efx/base/rhead_pci.c  |  8 +++---
 6 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 4a0a1231dc..7e747e6122 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -82,6 +82,34 @@ efx_family(
 
 #if EFSYS_OPT_PCI
 
+typedef struct efx_pci_ops_s {
+	/*
+	 * Function for reading PCIe configuration space.
+	 *
+	 * espcp	System-specific PCIe device handle;
+	 * offset	Offset inside PCIe configuration space to start reading
+	 *		from;
+	 * edp		EFX DWORD structure that should be populated by function
+	 *		in little-endian order;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_config_readd)(efsys_pci_config_t *espcp,
+					    uint32_t offset, efx_dword_t *edp);
+	/*
+	 * Function for finding PCIe memory bar handle by its index from a PCIe
+	 * device handle. The found memory bar is available in read-only mode.
+	 *
+	 * configp	System-specific PCIe device handle;
+	 * index	Memory bar index;
+	 * memp		Pointer to the found memory bar handle;
+	 *
+	 * Returns status code, 0 on success, any other value on error.
+	 */
+	efx_rc_t	(*epo_find_mem_bar)(efsys_pci_config_t *configp,
+					    int index, efsys_bar_t *memp);
+} efx_pci_ops_t;
+
 /* Determine EFX family and perform lookup of the function control window
  *
  * The function requires PCI config handle from which all memory bars can
@@ -95,6 +123,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp);
 
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index be3f3f6bf5..f58586bee0 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -1588,6 +1588,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp);
 
@@ -1602,6 +1603,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp);
 
 /*
@@ -1614,6 +1616,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp);
@@ -1629,6 +1632,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp);
diff --git a/drivers/common/sfc_efx/base/efx_nic.c b/drivers/common/sfc_efx/base/efx_nic.c
index dcf0987ebf..a78c4c3737 100644
--- a/drivers/common/sfc_efx/base/efx_nic.c
+++ b/drivers/common/sfc_efx/base/efx_nic.c
@@ -110,6 +110,7 @@ efx_family_probe_bar(
 	__in		uint16_t venid,
 	__in		uint16_t devid,
 	__in		efsys_pci_config_t *espcp,
+	__in		const efx_pci_ops_t *epop,
 	__out		efx_family_t *efp,
 	__out		efx_bar_region_t *ebrp)
 {
@@ -121,7 +122,7 @@ efx_family_probe_bar(
 #if EFSYS_OPT_RIVERHEAD
 		case EFX_PCI_DEVID_RIVERHEAD:
 		case EFX_PCI_DEVID_RIVERHEAD_VF:
-			rc = rhead_pci_nic_membar_lookup(espcp, ebrp);
+			rc = rhead_pci_nic_membar_lookup(espcp, epop, ebrp);
 			if (rc == 0)
 				*efp = EFX_FAMILY_RIVERHEAD;
 
diff --git a/drivers/common/sfc_efx/base/efx_pci.c b/drivers/common/sfc_efx/base/efx_pci.c
index bdf995cf84..1e7307476f 100644
--- a/drivers/common/sfc_efx/base/efx_pci.c
+++ b/drivers/common/sfc_efx/base/efx_pci.c
@@ -12,6 +12,7 @@
 	__checkReturn			efx_rc_t
 efx_pci_config_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *offsetp)
 {
 	efx_dword_t hdr;
@@ -26,9 +27,9 @@ efx_pci_config_next_ext_cap(
 	if (*offsetp == 0) {
 		*offsetp = ESE_GZ_PCI_BASE_CONFIG_SPACE_SIZE;
 	} else {
-		EFSYS_PCI_CONFIG_READD(espcp, *offsetp +
+		rc = epop->epo_config_readd(espcp, *offsetp +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail2;
@@ -58,6 +59,7 @@ efx_pci_config_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_config_find_next_ext_cap(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				uint16_t cap_id,
 	__inout				size_t *offsetp)
 {
@@ -73,7 +75,7 @@ efx_pci_config_find_next_ext_cap(
 	position = *offsetp;
 
 	while (1) {
-		rc = efx_pci_config_next_ext_cap(espcp, &position);
+		rc = efx_pci_config_next_ext_cap(espcp, epop, &position);
 		if (rc != 0) {
 			if (rc == ENOENT)
 				break;
@@ -81,9 +83,9 @@ efx_pci_config_find_next_ext_cap(
 				goto fail2;
 		}
 
-		EFSYS_PCI_CONFIG_READD(espcp, position +
+		rc = epop->epo_config_readd(espcp, position +
 				(EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-				&hdr, &rc);
+				&hdr);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail3;
@@ -116,6 +118,7 @@ efx_pci_config_find_next_ext_cap(
 	__checkReturn			efx_rc_t
 efx_pci_find_next_xilinx_cap_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__inout				size_t *pci_cap_offsetp,
 	__out				unsigned int *xilinx_tbl_barp,
 	__out				efsys_dma_addr_t *xilinx_tbl_offsetp)
@@ -134,7 +137,7 @@ efx_pci_find_next_xilinx_cap_table(
 		unsigned int tbl_bar;
 		efsys_dma_addr_t tbl_offset;
 
-		rc = efx_pci_config_find_next_ext_cap(espcp,
+		rc = efx_pci_config_find_next_ext_cap(espcp, epop,
 				ESE_GZ_PCI_EXPRESS_XCAP_ID_VNDR, &cap_offset);
 		if (rc != 0) {
 			if (rc == ENOENT)
@@ -149,7 +152,7 @@ efx_pci_find_next_xilinx_cap_table(
 		 * locator. Try to read it and skip it if the capability is
 		 * not the locator.
 		 */
-		rc = efx_pci_read_ext_cap_xilinx_table(espcp, cap_offset,
+		rc = efx_pci_read_ext_cap_xilinx_table(espcp, epop, cap_offset,
 						       &tbl_bar, &tbl_offset);
 		if (rc == 0) {
 			*xilinx_tbl_barp = tbl_bar;
@@ -183,6 +186,7 @@ efx_pci_find_next_xilinx_cap_table(
 	__checkReturn			efx_rc_t
 efx_pci_read_ext_cap_xilinx_table(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__in				size_t cap_offset,
 	__out				unsigned int *barp,
 	__out				efsys_dma_addr_t *offsetp)
@@ -199,9 +203,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	efsys_dma_addr_t offset;
 	efx_rc_t rc;
 
-	EFSYS_PCI_CONFIG_READD(espcp, cap_offset +
+	rc = epop->epo_config_readd(espcp, cap_offset +
 			       (EFX_LOW_BIT(ESF_GZ_PCI_EXPRESS_XCAP_ID) / 8),
-			       &cap_hdr, &rc);
+			       &cap_hdr);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail1;
@@ -213,9 +217,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail2;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_ID) / 8),
-			       &vsec.eo_dword[0], &rc);
+			       &vsec.eo_dword[0]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail3;
@@ -240,9 +244,9 @@ efx_pci_read_ext_cap_xilinx_table(
 		goto fail5;
 	}
 
-	EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+	rc = epop->epo_config_readd(espcp, vsec_offset +
 			       (EFX_LOW_BIT(ESF_GZ_VSEC_TBL_BAR) / 8),
-			       &vsec.eo_dword[1], &rc);
+			       &vsec.eo_dword[1]);
 	if (rc != 0) {
 		rc = EIO;
 		goto fail6;
@@ -252,9 +256,9 @@ efx_pci_read_ext_cap_xilinx_table(
 	offset_low = EFX_OWORD_FIELD32(vsec, ESF_GZ_VSEC_TBL_OFF_LO);
 
 	if (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT) {
-		EFSYS_PCI_CONFIG_READD(espcp, vsec_offset +
+		rc = epop->epo_config_readd(espcp, vsec_offset +
 				(EFX_LOW_BIT(ESF_GZ_VSEC_TBL_OFF_HI) / 8),
-				&vsec.eo_dword[2], &rc);
+				&vsec.eo_dword[2]);
 		if (rc != 0) {
 			rc = EIO;
 			goto fail7;
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 4d5307d18b..3383c47ec6 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -461,6 +461,7 @@ LIBEFX_INTERNAL
 extern	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp);
 
 #endif /* EFSYS_OPT_PCI */
diff --git a/drivers/common/sfc_efx/base/rhead_pci.c b/drivers/common/sfc_efx/base/rhead_pci.c
index dfb163b96d..0f4b4cb910 100644
--- a/drivers/common/sfc_efx/base/rhead_pci.c
+++ b/drivers/common/sfc_efx/base/rhead_pci.c
@@ -47,6 +47,7 @@ rhead_xilinx_cap_tbl_find_ef100_locator(
 	__checkReturn			efx_rc_t
 rhead_pci_nic_membar_lookup(
 	__in				efsys_pci_config_t *espcp,
+	__in				const efx_pci_ops_t *epop,
 	__out				efx_bar_region_t *ebrp)
 {
 	boolean_t xilinx_tbl_found = B_FALSE;
@@ -65,7 +66,8 @@ rhead_pci_nic_membar_lookup(
 	 * the following discovery steps.
 	 */
 	while (1) {
-		rc = efx_pci_find_next_xilinx_cap_table(espcp, &pci_capa_offset,
+		rc = efx_pci_find_next_xilinx_cap_table(espcp, epop,
+							&pci_capa_offset,
 							&xilinx_tbl_bar,
 							&xilinx_tbl_offset);
 		if (rc != 0) {
@@ -90,7 +92,7 @@ rhead_pci_nic_membar_lookup(
 
 		xilinx_tbl_found = B_TRUE;
 
-		EFSYS_PCI_FIND_MEM_BAR(espcp, xilinx_tbl_bar, &xil_eb, &rc);
+		rc = epop->epo_find_mem_bar(espcp, xilinx_tbl_bar, &xil_eb);
 		if (rc != 0)
 			goto fail2;
 
@@ -110,7 +112,7 @@ rhead_pci_nic_membar_lookup(
 	if (bar_found == B_FALSE)
 		goto fail4;
 
-	EFSYS_PCI_FIND_MEM_BAR(espcp, ebrp->ebr_index, &nic_eb, &rc);
+	rc = epop->epo_find_mem_bar(espcp, ebrp->ebr_index, &nic_eb);
 	if (rc != 0)
 		goto fail5;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (50 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
                     ` (9 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

There is no difference yet in EVB support on EF10 and Riverhead.
So, it is better to reuse existing methods.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_evb.c  |  8 ++++----
 drivers/common/sfc_efx/base/efx_check.h |  4 ++--
 drivers/common/sfc_efx/base/efx_evb.c   | 24 ++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_evb.c b/drivers/common/sfc_efx/base/ef10_evb.c
index aeeaa5189f..089d791543 100644
--- a/drivers/common/sfc_efx/base/ef10_evb.c
+++ b/drivers/common/sfc_efx/base/ef10_evb.c
@@ -9,13 +9,13 @@
 
 #if EFSYS_OPT_EVB
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 	__checkReturn	efx_rc_t
 ef10_evb_init(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
 	return (0);
 }
@@ -24,7 +24,7 @@ ef10_evb_init(
 ef10_evb_fini(
 	__in		efx_nic_t *enp)
 {
-	EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 }
 
 static	__checkReturn	efx_rc_t
@@ -545,5 +545,5 @@ ef10_evb_vport_stats(
 			EFX_STATS_UPLOAD, 0));
 }
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 #endif /* EFSYS_OPT_EVB */
diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index af90a4c373..f9f97946e5 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -373,8 +373,8 @@
 
 #if EFSYS_OPT_EVB
 /* Support enterprise virtual bridging */
-# if !(EFX_OPTS_EF10())
-#  error "EVB requires EF10 arch"
+# if !(EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10())
+#  error "EVB requires RIVERHEAD or EF10 arch"
 # endif
 #endif /* EFSYS_OPT_EVB */
 
diff --git a/drivers/common/sfc_efx/base/efx_evb.c b/drivers/common/sfc_efx/base/efx_evb.c
index 17318b7e11..b6c9b88fc2 100644
--- a/drivers/common/sfc_efx/base/efx_evb.c
+++ b/drivers/common/sfc_efx/base/efx_evb.c
@@ -46,6 +46,24 @@ static const efx_evb_ops_t	__efx_evb_ef10_ops = {
 };
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+static const efx_evb_ops_t	__efx_evb_rhead_ops = {
+	ef10_evb_init,			/* eeo_init */
+	ef10_evb_fini,			/* eeo_fini */
+	ef10_evb_vswitch_alloc,		/* eeo_vswitch_alloc */
+	ef10_evb_vswitch_free,		/* eeo_vswitch_free */
+	ef10_evb_vport_alloc,		/* eeo_vport_alloc */
+	ef10_evb_vport_free,		/* eeo_vport_free */
+	ef10_evb_vport_mac_addr_add,	/* eeo_vport_mac_addr_add */
+	ef10_evb_vport_mac_addr_del,	/* eeo_vport_mac_addr_del */
+	ef10_evb_vadaptor_alloc,	/* eeo_vadaptor_alloc */
+	ef10_evb_vadaptor_free,		/* eeo_vadaptor_free */
+	ef10_evb_vport_assign,		/* eeo_vport_assign */
+	ef10_evb_vport_reconfigure,	/* eeo_vport_reconfigure */
+	ef10_evb_vport_stats,		/* eeo_vport_stats */
+};
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	__checkReturn	efx_rc_t
 efx_evb_init(
 	__in		efx_nic_t *enp)
@@ -83,6 +101,12 @@ efx_evb_init(
 		break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+	case EFX_FAMILY_RIVERHEAD:
+		eeop = &__efx_evb_rhead_ops;
+		break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 	default:
 		EFSYS_ASSERT(0);
 		rc = ENOTSUP;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (51 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
                     ` (8 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev

Riverhead has EVB support similar to EF10 and NIC must allocate
its vAdaptor on init.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_impl.h |  5 +++
 drivers/common/sfc_efx/base/ef10_nic.c  | 10 +++++-
 drivers/common/sfc_efx/base/rhead_nic.c | 43 +++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h
index e77fb4ddea..d7b3c3db52 100644
--- a/drivers/common/sfc_efx/base/ef10_impl.h
+++ b/drivers/common/sfc_efx/base/ef10_impl.h
@@ -234,6 +234,11 @@ efx_mcdi_vadaptor_free(
 	__in		efx_nic_t *enp,
 	__in		uint32_t port_id);
 
+LIBEFX_INTERNAL
+extern	__checkReturn	efx_rc_t
+ef10_upstream_port_vadaptor_alloc(
+	__in		efx_nic_t *enp);
+
 LIBEFX_INTERNAL
 extern	__checkReturn	efx_rc_t
 ef10_nic_probe(
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 927af87e0d..7a11930242 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -2321,7 +2321,11 @@ ef10_nic_reset(
 	return (rc);
 }
 
-static	__checkReturn	efx_rc_t
+#endif	/* EFX_OPTS_EF10() */
+
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+
+	__checkReturn	efx_rc_t
 ef10_upstream_port_vadaptor_alloc(
 	__in		efx_nic_t *enp)
 {
@@ -2373,6 +2377,10 @@ ef10_upstream_port_vadaptor_alloc(
 	return (rc);
 }
 
+#endif	/* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
+
+#if EFX_OPTS_EF10()
+
 	__checkReturn	efx_rc_t
 ef10_nic_init(
 	__in		efx_nic_t *enp)
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index f965c1735e..9b8f09d12c 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -336,6 +336,7 @@ rhead_nic_init(
 	uint32_t vi_count, vi_base, vi_shift;
 	uint32_t vi_window_size;
 	efx_rc_t rc;
+	boolean_t alloc_vadaptor = B_TRUE;
 
 	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp));
 	EFSYS_ASSERT3U(edcp->edc_max_piobuf_count, ==, 0);
@@ -387,12 +388,34 @@ rhead_nic_init(
 	enp->en_arch.ef10.ena_wc_mem_map_offset = 0;
 	enp->en_arch.ef10.ena_wc_mem_map_size = 0;
 
-	enp->en_vport_id = EVB_PORT_ID_NULL;
-
 	enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V2;
 
+	/*
+	 * For SR-IOV use case, vAdaptor is allocated for PF and associated VFs
+	 * during NIC initialization when vSwitch is created and vPorts are
+	 * allocated. Hence, skip vAdaptor allocation for EVB and update vPort
+	 * ID in NIC structure with the one allocated for PF.
+	 */
+
+	enp->en_vport_id = EVB_PORT_ID_ASSIGNED;
+#if EFSYS_OPT_EVB
+	if ((enp->en_vswitchp != NULL) && (enp->en_vswitchp->ev_evcp != NULL)) {
+		/* For EVB use vPort allocated on vSwitch */
+		enp->en_vport_id = enp->en_vswitchp->ev_evcp->evc_vport_id;
+		alloc_vadaptor = B_FALSE;
+	}
+#endif
+	if (alloc_vadaptor != B_FALSE) {
+		/* Allocate a vAdaptor attached to our upstream vPort/pPort */
+		if ((rc = ef10_upstream_port_vadaptor_alloc(enp)) != 0)
+			goto fail5;
+	}
+
 	return (0);
 
+fail5:
+	EFSYS_PROBE(fail5);
+
 fail4:
 	EFSYS_PROBE(fail4);
 
@@ -497,6 +520,22 @@ rhead_nic_set_hw_unavailable(
 rhead_nic_fini(
 	__in		efx_nic_t *enp)
 {
+	boolean_t do_vadaptor_free = B_TRUE;
+
+#if EFSYS_OPT_EVB
+	if (enp->en_vswitchp != NULL) {
+		/*
+		 * For SR-IOV the vAdaptor is freed with the vSwitch,
+		 * so do not free it here.
+		 */
+		do_vadaptor_free = B_FALSE;
+	}
+#endif
+	if (do_vadaptor_free != B_FALSE) {
+		(void) efx_mcdi_vadaptor_free(enp, enp->en_vport_id);
+		enp->en_vport_id = EVB_PORT_ID_NULL;
+	}
+
 	(void) efx_mcdi_free_vis(enp);
 	enp->en_arch.ef10.ena_vi_count = 0;
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 54/60] common/sfc_efx/base: add option for extended width events
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (52 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
                     ` (7 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses event queues with 256bit extended width events to
support descriptor proxy queues.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 7 +++++++
 drivers/common/sfc_efx/efsys.h          | 1 +
 2 files changed, 8 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index f9f97946e5..40ba57be6f 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -384,4 +384,11 @@
 # endif
 #endif /* EFSYS_OPT_PCI */
 
+/* Support extended width event queues */
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+# if !EFSYS_OPT_RIVERHEAD
+#  error "EV_EXTENDED_WIDTH requires RIVERHEAD"
+# endif
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index de1c1c38e3..f74b703cda 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -142,6 +142,7 @@ prefetch_read_once(const volatile void *addr)
 #define EFSYS_OPT_FILTER 1
 #define EFSYS_OPT_RX_SCATTER 0
 
+#define EFSYS_OPT_EV_EXTENDED_WIDTH 0
 #define EFSYS_OPT_EV_PREFETCH 0
 
 #define EFSYS_OPT_DECODE_INTR_FATAL 0
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 55/60] common/sfc_efx/base: add 256bit type
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (53 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
                     ` (6 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 requires support for extended-width event descriptors
for use with descriptor proxy queues. Extend libefx types
used for hardware access (and endian conversion) to support
a 256bit data type.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_types.h | 580 +++++++++++++++++++++++-
 1 file changed, 571 insertions(+), 9 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_types.h b/drivers/common/sfc_efx/base/efx_types.h
index ab35e61b84..f7ec9a7378 100644
--- a/drivers/common/sfc_efx/base/efx_types.h
+++ b/drivers/common/sfc_efx/base/efx_types.h
@@ -19,16 +19,16 @@ extern "C" {
 /*
  * Bitfield access
  *
- * Solarflare NICs make extensive use of bitfields up to 128 bits
- * wide.  Since there is no native 128-bit datatype on most systems,
+ * Solarflare NICs make extensive use of bitfields up to 256 bits
+ * wide.  Since there is no native 256-bit datatype on most systems,
  * and since 64-bit datatypes are inefficient on 32-bit systems and
  * vice versa, we wrap accesses in a way that uses the most efficient
  * datatype.
  *
  * The NICs are PCI devices and therefore little-endian.  Since most
  * of the quantities that we deal with are DMAed to/from host memory,
- * we define	our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
- * to be little-endian.
+ * we define our datatypes (efx_xword_t, efx_oword_t, efx_qword_t and
+ * efx_dword_t) to be little-endian.
  *
  * In the less common case of using PIO for individual register
  * writes, we construct the little-endian datatype in host memory and
@@ -93,10 +93,22 @@ extern "C" {
 #define	EFX_DWORD_3_LBN 96
 #define	EFX_DWORD_3_WIDTH 32
 
+#define	EFX_DWORD_4_LBN 128
+#define	EFX_DWORD_4_WIDTH 32
+
+#define	EFX_DWORD_5_LBN 160
+#define	EFX_DWORD_5_WIDTH 32
+
+#define	EFX_DWORD_6_LBN 192
+#define	EFX_DWORD_6_WIDTH 32
+
+#define	EFX_DWORD_7_LBN 224
+#define	EFX_DWORD_7_WIDTH 32
+
 /*
- * There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
- * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
- * support field widths larger than 32 bits.
+ * There are intentionally no EFX_QWORD_<N> field definitions here as the
+ * implementation of EFX_QWORD_FIELD, EFX_OWORD_FIELD and EFX_XWORD_FIELD
+ * do not support field widths larger than 32 bits.
  */
 
 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
@@ -220,6 +232,28 @@ typedef union efx_oword_u {
 	uint8_t eo_u8[16];
 } efx_oword_t;
 
+/*
+ * A hexaword (i.e. 256-bit) datatype
+ *
+ * This datatype is defined to be little-endian.
+ */
+typedef union efx_xword_u {
+	efx_byte_t ex_byte[32];
+	efx_word_t ex_word[16];
+	efx_dword_t ex_dword[8];
+	efx_qword_t ex_qword[4];
+	efx_oword_t ex_oword[2];
+#if EFSYS_HAS_SSE2_M128
+	__m128i ex_u128[2];
+#endif
+#if EFSYS_HAS_UINT64
+	uint64_t ex_u64[4];
+#endif
+	uint32_t ex_u32[8];
+	uint16_t ex_u16[16];
+	uint8_t ex_u8[32];
+} efx_xword_t;
+
 #pragma pack()
 
 #define	__SWAP16(_x)				\
@@ -295,6 +329,9 @@ typedef union efx_oword_u {
 /* Format string for printing an efx_oword_t */
 #define	EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
 
+/* Format string for printing an efx_xword_t */
+#define	EFX_XWORD_FMT "0x%08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x"
+
 /* Parameters for printing an efx_byte_t */
 #define	EFX_BYTE_VAL(_byte)					\
 	((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
@@ -319,6 +356,17 @@ typedef union efx_oword_u {
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])),	\
 	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
 
+/* Parameters for printing an efx_xword_t */
+#define	EFX_XWORD_VAL(_xword)					\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[7])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[6])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[5])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[4])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[3])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[2])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[1])),	\
+	((unsigned int)__LE_TO_CPU_32((_xword).ex_u32[0]))
+
 /*
  * Stop lint complaining about some shifts.
  */
@@ -389,6 +437,34 @@ extern int fix_lint;
 #define	EFX_EXTRACT8(_element, _min, _max, _low, _high)			\
 	EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
 
+#define	EFX_EXTRACT_XWORD64(_xword, _low, _high)			\
+	(EFX_EXTRACT64((_xword).ex_u64[0], FIX_LINT(0), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[1], FIX_LINT(64), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[2], FIX_LINT(128), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT64((_xword).ex_u64[3], FIX_LINT(192), FIX_LINT(255),	\
+	    _low, _high))
+
+#define	EFX_EXTRACT_XWORD32(_oword, _low, _high)			\
+	(EFX_EXTRACT32((_xword).ex_u32[0], FIX_LINT(0), FIX_LINT(31),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[1], FIX_LINT(32), FIX_LINT(63),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[2], FIX_LINT(64), FIX_LINT(95),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[3], FIX_LINT(96), FIX_LINT(127),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[4], FIX_LINT(128), FIX_LINT(159),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[5], FIX_LINT(160), FIX_LINT(191),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[6], FIX_LINT(192), FIX_LINT(223),	\
+	    _low, _high) |						\
+	EFX_EXTRACT32((_xword).ex_u32[7], FIX_LINT(224), FIX_LINT(255),	\
+	    _low, _high))
+
 #define	EFX_EXTRACT_OWORD64(_oword, _low, _high)			\
 	(EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63),	\
 	    _low, _high) |						\
@@ -428,6 +504,14 @@ extern int fix_lint;
 	    _low, _high))
 
 
+#define	EFX_XWORD_FIELD64(_xword, _field)				\
+	((uint32_t)EFX_EXTRACT_XWORD64(_xword, EFX_LOW_BIT(_field),	\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
+#define	EFX_XWORD_FIELD32(_xword, _field)				\
+	(EFX_EXTRACT_XWORD32(_xword, EFX_LOW_BIT(_field),		\
+	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
+
 #define	EFX_OWORD_FIELD64(_oword, _field)				\
 	((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field),	\
 	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
@@ -457,6 +541,22 @@ extern int fix_lint;
 	    EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
 
 
+#define	EFX_XWORD_IS_EQUAL64(_xword_a, _xword_b)			\
+	((_xword_a).ex_u64[0] == (_xword_b).ex_u64[0] &&		\
+	    (_xword_a).ex_u64[1] == (_xword_b).ex_u64[1] &&		\
+	    (_xword_a).ex_u64[2] == (_xword_b).ex_u64[2] &&		\
+	    (_xword_a).ex_u64[3] == (_xword_b).ex_u64[3])
+
+#define	EFX_XWORD_IS_EQUAL32(_xword_a, _xword_b)			\
+	((_xword_a).ex_u32[0] == (_xword_b).ex_u32[0] &&		\
+	    (_xword_a).ex_u32[1] == (_xword_b).ex_u32[1] &&		\
+	    (_xword_a).ex_u32[2] == (_xword_b).ex_u32[2] &&		\
+	    (_xword_a).ex_u32[3] == (_xword_b).ex_u32[3] &&		\
+	    (_xword_a).ex_u32[4] == (_xword_b).ex_u32[4] &&		\
+	    (_xword_a).ex_u32[5] == (_xword_b).ex_u32[5] &&		\
+	    (_xword_a).ex_u32[6] == (_xword_b).ex_u32[6] &&		\
+	    (_xword_a).ex_u32[7] == (_xword_b).ex_u32[7])
+
 #define	EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b)			\
 	((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] &&		\
 	    (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
@@ -484,6 +584,22 @@ extern int fix_lint;
 	((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
 
 
+#define	EFX_XWORD_IS_ZERO64(_xword)					\
+	(((_xword).ex_u64[0] |						\
+	    (_xword).ex_u64[1] |					\
+	    (_xword).ex_u64[2] |					\
+	    (_xword).ex_u64[3]) == 0)
+
+#define	EFX_XWORD_IS_ZERO32(_xword)					\
+	(((_xword).ex_u32[0] |						\
+	    (_xword).ex_u32[1] |					\
+	    (_xword).ex_u32[2] |					\
+	    (_xword).ex_u32[3] |					\
+	    (_xword).ex_u32[4] |					\
+	    (_xword).ex_u32[5] |					\
+	    (_xword).ex_u32[6] |					\
+	    (_xword).ex_u32[7]) == 0)
+
 #define	EFX_OWORD_IS_ZERO64(_oword)					\
 	(((_oword).eo_u64[0] |						\
 	    (_oword).eo_u64[1]) == 0)
@@ -511,6 +627,22 @@ extern int fix_lint;
 	(((_byte).eb_u8[0]) == 0)
 
 
+#define	EFX_XWORD_IS_SET64(_xword)					\
+	(((_xword).ex_u64[0] &						\
+	    (_xword).ex_u64[1] &					\
+	    (_xword).ex_u64[2] &					\
+	    (_xword).ex_u64[3]) == ~((uint64_t)0))
+
+#define	EFX_XWORD_IS_SET32(_xword)					\
+	(((_xword).ex_u32[0] &						\
+	    (_xword).ex_u32[1] &					\
+	    (_xword).ex_u32[2] &					\
+	    (_xword).ex_u32[3] &					\
+	    (_xword).ex_u32[4] &					\
+	    (_xword).ex_u32[5] &					\
+	    (_xword).ex_u32[6] &					\
+	    (_xword).ex_u32[7]) == ~((uint32_t)0))
+
 #define	EFX_OWORD_IS_SET64(_oword)					\
 	(((_oword).eo_u64[0] &						\
 	    (_oword).eo_u64[1]) == ~((uint64_t)0))
@@ -668,6 +800,108 @@ extern int fix_lint;
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) |	\
 	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
 
+#define	EFX_POPULATE_XWORD64(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = EFX_INSERT_FIELDS64(0, 63,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = EFX_INSERT_FIELDS64(64, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = EFX_INSERT_FIELDS64(128, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = EFX_INSERT_FIELDS64(192, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_POPULATE_XWORD32(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
+	    _field10, _value10)						\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = EFX_INSERT_FIELDS32(32, 63,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = EFX_INSERT_FIELDS32(64, 95,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = EFX_INSERT_FIELDS32(96, 127,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = EFX_INSERT_FIELDS32(128, 159,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = EFX_INSERT_FIELDS32(160, 191,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = EFX_INSERT_FIELDS32(192, 223,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = EFX_INSERT_FIELDS32(224, 255,	\
+		    _field1, _value1, _field2, _value2,			\
+		    _field3, _value3, _field4, _value4,			\
+		    _field5, _value5, _field6, _value6,			\
+		    _field7, _value7, _field8, _value8,			\
+		    _field9, _value9, _field10, _value10);		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_POPULATE_OWORD64(_oword,					\
 	    _field1, _value1, _field2, _value2, _field3, _value3,	\
 	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
@@ -815,6 +1049,82 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+/* Populate a hexaword field with various numbers of arguments */
+#define	EFX_POPULATE_XWORD_10 EFX_POPULATE_XWORD
+
+#define	EFX_POPULATE_XWORD_9(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
+	EFX_POPULATE_XWORD_10(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8,	_field9, _value9)
+
+#define	EFX_POPULATE_XWORD_8(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)				\
+	EFX_POPULATE_XWORD_9(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7, _field8, _value8)
+
+#define	EFX_POPULATE_XWORD_7(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)						\
+	EFX_POPULATE_XWORD_8(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
+	    _field7, _value7)
+
+#define	EFX_POPULATE_XWORD_6(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
+	EFX_POPULATE_XWORD_7(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5,	_field6, _value6)
+
+#define	EFX_POPULATE_XWORD_5(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)				\
+	EFX_POPULATE_XWORD_6(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4, _field5, _value5)
+
+#define	EFX_POPULATE_XWORD_4(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)						\
+	EFX_POPULATE_XWORD_5(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3,	\
+	    _field4, _value4)
+
+#define	EFX_POPULATE_XWORD_3(_xword,					\
+	    _field1, _value1, _field2, _value2, _field3, _value3)	\
+	EFX_POPULATE_XWORD_4(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2, _field3, _value3)
+
+#define	EFX_POPULATE_XWORD_2(_xword,					\
+	    _field1, _value1, _field2, _value2)				\
+	EFX_POPULATE_XWORD_3(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1, _field2, _value2)
+
+#define	EFX_POPULATE_XWORD_1(_xword,					\
+	    _field1, _value1)						\
+	EFX_POPULATE_XWORD_2(_xword, EFX_DUMMY_FIELD, 0,		\
+	    _field1, _value1)
+
+#define	EFX_ZERO_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_1(_xword, EFX_DUMMY_FIELD, 0)
+
+#define	EFX_SET_XWORD(_xword)						\
+	EFX_POPULATE_XWORD_8(_xword,					\
+	    EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff,		\
+	    EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff,		\
+	    EFX_DWORD_4, 0xffffffff, EFX_DWORD_5, 0xffffffff,		\
+	    EFX_DWORD_6, 0xffffffff, EFX_DWORD_7, 0xffffffff)
+
 /* Populate an octword field with various numbers of arguments */
 #define	EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
 
@@ -1210,6 +1520,64 @@ extern int fix_lint;
 #define	EFX_INPLACE_MASK8(_min, _max, _field)				\
 	EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
 
+#define	EFX_SET_XWORD_FIELD64(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] = (((_xword).ex_u64[0] &		\
+		    ~EFX_INPLACE_MASK64(0, 63, _field)) |		\
+		    EFX_INSERT_FIELD64(0, 63, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[1] = (((_xword).ex_u64[1] &		\
+		    ~EFX_INPLACE_MASK64(64, 127, _field)) |		\
+		    EFX_INSERT_FIELD64(64, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[2] = (((_xword).ex_u64[2] &		\
+		    ~EFX_INPLACE_MASK64(128, 191, _field)) |		\
+		    EFX_INSERT_FIELD64(128, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[3] = (((_xword).ex_u64[3] &		\
+		    ~EFX_INPLACE_MASK64(192, 255, _field)) |		\
+		    EFX_INSERT_FIELD64(192, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_FIELD32(_xword, _field, _value)			\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] = (((_xword).ex_u32[0] &		\
+		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
+		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[1] = (((_xword).ex_u32[1] &		\
+		    ~EFX_INPLACE_MASK32(32, 63, _field)) |		\
+		    EFX_INSERT_FIELD32(32, 63, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[2] = (((_xword).ex_u32[2] &		\
+		    ~EFX_INPLACE_MASK32(64, 95, _field)) |		\
+		    EFX_INSERT_FIELD32(64, 95, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[3] = (((_xword).ex_u32[3] &		\
+		    ~EFX_INPLACE_MASK32(96, 127, _field)) |		\
+		    EFX_INSERT_FIELD32(96, 127, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[4] = (((_xword).ex_u32[4] &		\
+		    ~EFX_INPLACE_MASK32(128, 159, _field)) |		\
+		    EFX_INSERT_FIELD32(128, 159, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[5] = (((_xword).ex_u32[5] &		\
+		    ~EFX_INPLACE_MASK32(160, 191, _field)) |		\
+		    EFX_INSERT_FIELD32(160, 191, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[6] = (((_xword).ex_u32[6] &		\
+		    ~EFX_INPLACE_MASK32(192, 223, _field)) |		\
+		    EFX_INSERT_FIELD32(192, 223, _field, _value));	\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[7] = (((_xword).ex_u32[7] &		\
+		    ~EFX_INPLACE_MASK32(224, 255, _field)) |		\
+		    EFX_INSERT_FIELD32(224, 255, _field, _value));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_SET_OWORD_FIELD64(_oword, _field, _value)			\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1317,6 +1685,107 @@ extern int fix_lint;
 		(uint8_t)(1 << EFX_SSUB((_bit), (_base))) :		\
 		0U)
 
+#define	EFX_SET_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] |=					\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_SET_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] |=					\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT64(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u64[0] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u64[1] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u64[2] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u64[3] &=					\
+		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(192)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_CLEAR_XWORD_BIT32(_xword, _bit)				\
+	do {								\
+		_NOTE(CONSTANTCONDITION)				\
+		(_xword).ex_u32[0] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
+		(_xword).ex_u32[1] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));	\
+		(_xword).ex_u32[2] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64)));	\
+		(_xword).ex_u32[3] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96)));	\
+		(_xword).ex_u32[4] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(128)));	\
+		(_xword).ex_u32[5] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(160)));	\
+		(_xword).ex_u32[6] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(192)));	\
+		(_xword).ex_u32[7] &=					\
+		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(224)));	\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_TEST_XWORD_BIT64(_xword, _bit)				\
+	(((_xword).ex_u64[0] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u64[1] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u64[2] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u64[3] &						\
+		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(192)))))
+
+#define	EFX_TEST_XWORD_BIT32(_xword, _bit)				\
+	(((_xword).ex_u32[0] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||	\
+	((_xword).ex_u32[1] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) ||	\
+	((_xword).ex_u32[2] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) ||	\
+	((_xword).ex_u32[3] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))) ||	\
+	((_xword).ex_u32[4] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(128)))) ||\
+	((_xword).ex_u32[5] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(160)))) ||\
+	((_xword).ex_u32[6] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(192)))) ||\
+	((_xword).ex_u32[7] &						\
+		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(224)))))
+
+
 #define	EFX_SET_OWORD_BIT64(_oword, _bit)				\
 	do {								\
 		_NOTE(CONSTANTCONDITION)				\
@@ -1486,6 +1955,50 @@ extern int fix_lint;
 		    __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
 
 
+#define	EFX_OR_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] |= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] |= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] |= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] |= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_OR_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] |= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] |= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] |= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] |= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] |= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] |= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] |= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] |= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD64(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u64[0] &= (_xword2).ex_u64[0];		\
+		(_xword1).ex_u64[1] &= (_xword2).ex_u64[1];		\
+		(_xword1).ex_u64[2] &= (_xword2).ex_u64[2];		\
+		(_xword1).ex_u64[3] &= (_xword2).ex_u64[3];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
+#define	EFX_AND_XWORD32(_xword1, _xword2)				\
+	do {								\
+		(_xword1).ex_u32[0] &= (_xword2).ex_u32[0];		\
+		(_xword1).ex_u32[1] &= (_xword2).ex_u32[1];		\
+		(_xword1).ex_u32[2] &= (_xword2).ex_u32[2];		\
+		(_xword1).ex_u32[3] &= (_xword2).ex_u32[3];		\
+		(_xword1).ex_u32[4] &= (_xword2).ex_u32[4];		\
+		(_xword1).ex_u32[5] &= (_xword2).ex_u32[5];		\
+		(_xword1).ex_u32[6] &= (_xword2).ex_u32[6];		\
+		(_xword1).ex_u32[7] &= (_xword2).ex_u32[7];		\
+	_NOTE(CONSTANTCONDITION)					\
+	} while (B_FALSE)
+
 #define	EFX_OR_OWORD64(_oword1, _oword2)				\
 	do {								\
 		(_oword1).eo_u64[0] |= (_oword2).eo_u64[0];		\
@@ -1580,53 +2093,102 @@ extern int fix_lint;
 	_NOTE(CONSTANTCONDITION)					\
 	} while (B_FALSE)
 
+
 #if EFSYS_USE_UINT64
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD64
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD64
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD64
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL64
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL64
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL64
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO64
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO64
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO64
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET64
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET64
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET64
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD64
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD64
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD64
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD64
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD64
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD64
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT64
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT64
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT64
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT64
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT64
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT64
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT64
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT64
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT64
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD64
+#define	EFX_AND_XWORD		EFX_AND_XWORD64
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD64
 #define	EFX_AND_OWORD		EFX_AND_OWORD64
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD64
 #define	EFX_AND_QWORD		EFX_AND_QWORD64
-#else
+
+#else /* EFSYS_USE_UINT64 */
+
+#define	EFX_XWORD_FIELD		EFX_XWORD_FIELD32
 #define	EFX_OWORD_FIELD		EFX_OWORD_FIELD32
 #define	EFX_QWORD_FIELD		EFX_QWORD_FIELD32
+
+#define	EFX_XWORD_IS_EQUAL	EFX_XWORD_IS_EQUAL32
 #define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL32
 #define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL32
+
+#define	EFX_XWORD_IS_ZERO	EFX_XWORD_IS_ZERO32
 #define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO32
 #define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO32
+
+#define	EFX_XWORD_IS_SET	EFX_XWORD_IS_SET32
 #define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET32
 #define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET32
+
+#define	EFX_POPULATE_XWORD	EFX_POPULATE_XWORD32
 #define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD32
 #define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD32
+
+#define	EFX_SET_XWORD_FIELD	EFX_SET_XWORD_FIELD32
 #define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD32
 #define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD32
+
+#define	EFX_SET_XWORD_BIT	EFX_SET_XWORD_BIT32
+#define	EFX_CLEAR_XWORD_BIT	EFX_CLEAR_XWORD_BIT32
+#define	EFX_TEST_XWORD_BIT	EFX_TEST_XWORD_BIT32
+
 #define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT32
 #define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT32
 #define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT32
+
 #define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT32
 #define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT32
 #define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT32
+
+#define	EFX_OR_XWORD		EFX_OR_XWORD32
+#define	EFX_AND_XWORD		EFX_AND_XWORD32
+
 #define	EFX_OR_OWORD		EFX_OR_OWORD32
 #define	EFX_AND_OWORD		EFX_AND_OWORD32
+
 #define	EFX_OR_QWORD		EFX_OR_QWORD32
 #define	EFX_AND_QWORD		EFX_AND_QWORD32
-#endif
+
+#endif /* EFSYS_USE_UINT64 */
 
 
 #ifdef	__cplusplus
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 56/60] common/sfc_efx/base: support creation of extended width EvQ
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (54 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
                     ` (5 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Add a flag to request an extended width event queue, and
check that the supplied buffer is large enough to hold the
event queue descriptors.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/ef10_ev.c    |  2 +
 drivers/common/sfc_efx/base/ef10_nic.c   | 18 +++++++-
 drivers/common/sfc_efx/base/efx.h        | 12 +++++-
 drivers/common/sfc_efx/base/efx_ev.c     | 53 ++++++++++++++++++++----
 drivers/common/sfc_efx/base/efx_mcdi.c   | 20 +++++++--
 drivers/common/sfc_efx/base/rhead_ev.c   | 19 ++++++++-
 drivers/common/sfc_efx/base/rhead_impl.h |  4 ++
 drivers/common/sfc_efx/base/rhead_nic.c  |  6 +++
 drivers/net/sfc/sfc_ev.c                 |  6 +--
 9 files changed, 120 insertions(+), 20 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_ev.c b/drivers/common/sfc_efx/base/ef10_ev.c
index aec1c468a4..8e7cc27d63 100644
--- a/drivers/common/sfc_efx/base/ef10_ev.c
+++ b/drivers/common/sfc_efx/base/ef10_ev.c
@@ -127,6 +127,8 @@ ef10_ev_qcreate(
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 	/*
 	 * NO_CONT_EV mode is only requested from the firmware when creating
 	 * receive queues, but here it needs to be specified at event queue
diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c
index 7a11930242..81cd436424 100644
--- a/drivers/common/sfc_efx/base/ef10_nic.c
+++ b/drivers/common/sfc_efx/base/ef10_nic.c
@@ -1043,14 +1043,14 @@ ef10_get_datapath_caps(
 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
 	efx_mcdi_req_t req;
 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_CAPABILITIES_IN_LEN,
-		MC_CMD_GET_CAPABILITIES_V5_OUT_LEN);
+		MC_CMD_GET_CAPABILITIES_V7_OUT_LEN);
 	efx_rc_t rc;
 
 	req.emr_cmd = MC_CMD_GET_CAPABILITIES;
 	req.emr_in_buf = payload;
 	req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
 	req.emr_out_buf = payload;
-	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V5_OUT_LEN;
+	req.emr_out_length = MC_CMD_GET_CAPABILITIES_V7_OUT_LEN;
 
 	efx_mcdi_execute_quiet(enp, &req);
 
@@ -1073,6 +1073,11 @@ ef10_get_datapath_caps(
 	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V2_OUT_FLAGS2) &	\
 	    (1u << (MC_CMD_GET_CAPABILITIES_V2_OUT_ ## _flag ## _LBN))))
 
+#define	CAP_FLAGS3(_req, _flag)						\
+	(((_req).emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V7_OUT_LEN) && \
+	    (MCDI_OUT_DWORD((_req), GET_CAPABILITIES_V7_OUT_FLAGS3) &	\
+	    (1u << (MC_CMD_GET_CAPABILITIES_V7_OUT_ ## _flag ## _LBN))))
+
 	/* Check if RXDP firmware inserts 14 byte prefix */
 	if (CAP_FLAGS1(req, RX_PREFIX_LEN_14))
 		encp->enc_rx_prefix_size = 14;
@@ -1202,6 +1207,15 @@ ef10_get_datapath_caps(
 	else
 		encp->enc_init_evq_v2_supported = B_FALSE;
 
+	/*
+	 * Check if firmware supports extended width event queues, which have
+	 * a different event descriptor layout.
+	 */
+	if (CAP_FLAGS3(req, EXTENDED_WIDTH_EVQS_SUPPORTED))
+		encp->enc_init_evq_extended_width_supported = B_TRUE;
+	else
+		encp->enc_init_evq_extended_width_supported = B_FALSE;
+
 	/*
 	 * Check if the NO_CONT_EV mode for RX events is supported.
 	 */
diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index 7e747e6122..ecd16712ba 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -1456,6 +1456,7 @@ typedef struct efx_nic_cfg_s {
 	uint32_t		enc_evq_timer_quantum_ns;
 	uint32_t		enc_evq_timer_max_us;
 	uint32_t		enc_clk_mult;
+	uint32_t		enc_ev_ew_desc_size;
 	uint32_t		enc_ev_desc_size;
 	uint32_t		enc_rx_desc_size;
 	uint32_t		enc_tx_desc_size;
@@ -1557,6 +1558,7 @@ typedef struct efx_nic_cfg_s {
 	boolean_t		enc_allow_set_mac_with_installed_filters;
 	boolean_t		enc_enhanced_set_mac_supported;
 	boolean_t		enc_init_evq_v2_supported;
+	boolean_t		enc_init_evq_extended_width_supported;
 	boolean_t		enc_no_cont_ev_mode_supported;
 	boolean_t		enc_init_rxq_with_buffer_size;
 	boolean_t		enc_rx_packed_stream_supported;
@@ -2264,13 +2266,15 @@ LIBEFX_API
 extern	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 LIBEFX_API
 extern	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs);
+	__in	unsigned int ndescs,
+	__in	uint32_t flags);
 
 #define	EFX_EVQ_FLAGS_TYPE_MASK		(0x3)
 #define	EFX_EVQ_FLAGS_TYPE_AUTO		(0x0)
@@ -2291,6 +2295,10 @@ efx_evq_nbufs(
  */
 #define	EFX_EVQ_FLAGS_NO_CONT_EV	(0x10)
 
+/* Configure EVQ for extended width events (EF100 only) */
+#define	EFX_EVQ_FLAGS_EXTENDED_WIDTH	(0x20)
+
+
 LIBEFX_API
 extern	__checkReturn	efx_rc_t
 efx_ev_qcreate(
diff --git a/drivers/common/sfc_efx/base/efx_ev.c b/drivers/common/sfc_efx/base/efx_ev.c
index 99a7743edb..32e7fff3af 100644
--- a/drivers/common/sfc_efx/base/efx_ev.c
+++ b/drivers/common/sfc_efx/base/efx_ev.c
@@ -201,19 +201,35 @@ efx_ev_init(
 	__checkReturn	size_t
 efx_evq_size(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 
-	return (ndescs * encp->enc_ev_desc_size);
+	desc_size = encp->enc_ev_desc_size;
+
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#else
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+#endif
+
+	return (ndescs * desc_size);
 }
 
 	__checkReturn	unsigned int
 efx_evq_nbufs(
 	__in	const efx_nic_t *enp,
-	__in	unsigned int ndescs)
+	__in	unsigned int ndescs,
+	__in	uint32_t flags)
 {
-	return (EFX_DIV_ROUND_UP(efx_evq_size(enp, ndescs), EFX_BUF_SIZE));
+	size_t size;
+
+	size = efx_evq_size(enp, ndescs, flags);
+
+	return (EFX_DIV_ROUND_UP(size, EFX_BUF_SIZE));
 }
 
 		void
@@ -282,6 +298,13 @@ efx_ev_qcreate(
 		goto fail4;
 	}
 
+	if ((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) &&
+	    (encp->enc_ev_ew_desc_size == 0)) {
+		/* Extended width event descriptors are not supported. */
+		rc = EINVAL;
+		goto fail5;
+	}
+
 	EFSYS_ASSERT(ISP2(encp->enc_evq_max_nevs));
 	EFSYS_ASSERT(ISP2(encp->enc_evq_min_nevs));
 
@@ -289,14 +312,20 @@ efx_ev_qcreate(
 	    ndescs < encp->enc_evq_min_nevs ||
 	    ndescs > encp->enc_evq_max_nevs) {
 		rc = EINVAL;
-		goto fail5;
+		goto fail6;
+	}
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * encp->enc_ev_desc_size)) {
+		/* Buffer too small for event queue descriptors. */
+		rc = EINVAL;
+		goto fail7;
 	}
 
 	/* Allocate an EVQ object */
 	EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_evq_t), eep);
 	if (eep == NULL) {
 		rc = ENOMEM;
-		goto fail6;
+		goto fail8;
 	}
 
 	eep->ee_magic = EFX_EVQ_MAGIC;
@@ -319,16 +348,20 @@ efx_ev_qcreate(
 
 	if ((rc = eevop->eevo_qcreate(enp, index, esmp, ndescs, id, us, flags,
 	    eep)) != 0)
-		goto fail7;
+		goto fail9;
 
 	return (0);
 
-fail7:
-	EFSYS_PROBE(fail7);
+fail9:
+	EFSYS_PROBE(fail9);
 
 	*eepp = NULL;
 	enp->en_ev_qcount--;
 	EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_evq_t), eep);
+fail8:
+	EFSYS_PROBE(fail8);
+fail7:
+	EFSYS_PROBE(fail7);
 fail6:
 	EFSYS_PROBE(fail6);
 fail5:
@@ -1255,6 +1288,8 @@ siena_ev_qcreate(
 
 	_NOTE(ARGUNUSED(esmp))
 
+	EFSYS_ASSERT((flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) == 0);
+
 #if EFSYS_OPT_RX_SCALE
 	if (enp->en_intr.ei_type == EFX_INTR_LINE &&
 	    index >= EFX_MAXRSS_LEGACY) {
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index b8e45b458d..ede052a26a 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -2475,6 +2475,7 @@ efx_mcdi_init_evq(
 		MC_CMD_INIT_EVQ_V2_IN_LEN(INIT_EVQ_MAXNBUFS),
 		MC_CMD_INIT_EVQ_V2_OUT_LEN);
 	boolean_t interrupting;
+	int ev_extended_width;
 	int ev_cut_through;
 	int ev_merge;
 	unsigned int evq_type;
@@ -2484,7 +2485,7 @@ efx_mcdi_init_evq(
 	int i;
 	efx_rc_t rc;
 
-	npages = efx_evq_nbufs(enp, nevs);
+	npages = efx_evq_nbufs(enp, nevs, flags);
 	if (npages > INIT_EVQ_MAXNBUFS) {
 		rc = EINVAL;
 		goto fail1;
@@ -2558,14 +2559,27 @@ efx_mcdi_init_evq(
 		}
 	}
 
-	MCDI_IN_POPULATE_DWORD_7(req, INIT_EVQ_V2_IN_FLAGS,
+	/*
+	 * On EF100, extended width event queues have a different event
+	 * descriptor layout and are used to support descriptor proxy queues.
+	 */
+	ev_extended_width = 0;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (encp->enc_init_evq_extended_width_supported) {
+		if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+			ev_extended_width = 1;
+	}
+#endif
+
+	MCDI_IN_POPULATE_DWORD_8(req, INIT_EVQ_V2_IN_FLAGS,
 	    INIT_EVQ_V2_IN_FLAG_INTERRUPTING, interrupting,
 	    INIT_EVQ_V2_IN_FLAG_RPTR_DOS, 0,
 	    INIT_EVQ_V2_IN_FLAG_INT_ARMD, 0,
 	    INIT_EVQ_V2_IN_FLAG_CUT_THRU, ev_cut_through,
 	    INIT_EVQ_V2_IN_FLAG_RX_MERGE, ev_merge,
 	    INIT_EVQ_V2_IN_FLAG_TX_MERGE, ev_merge,
-	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type);
+	    INIT_EVQ_V2_IN_FLAG_TYPE, evq_type,
+	    INIT_EVQ_V2_IN_FLAG_EXT_WIDTH, ev_extended_width);
 
 	/* If the value is zero then disable the timer */
 	if (us == 0) {
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 8392a2be5b..a83c6150d8 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -66,11 +66,26 @@ rhead_ev_qcreate(
 	__in		uint32_t flags,
 	__in		efx_evq_t *eep)
 {
+	const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
+	size_t desc_size;
 	uint32_t irq;
 	efx_rc_t rc;
 
 	_NOTE(ARGUNUSED(id))	/* buftbl id managed by MC */
 
+	desc_size = encp->enc_ev_desc_size;
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH)
+		desc_size = encp->enc_ev_ew_desc_size;
+#endif
+	EFSYS_ASSERT(desc_size != 0);
+
+	if (EFSYS_MEM_SIZE(esmp) < (ndescs * desc_size)) {
+		/* Buffer too small for event queue descriptors */
+		rc = EINVAL;
+		goto fail1;
+	}
+
 	/* Set up the handler table */
 	eep->ee_rx	= rhead_ev_rx_packets;
 	eep->ee_tx	= rhead_ev_tx_completion;
@@ -98,10 +113,12 @@ rhead_ev_qcreate(
 	rc = efx_mcdi_init_evq(enp, index, esmp, ndescs, irq, us, flags,
 	    B_FALSE);
 	if (rc != 0)
-		goto fail1;
+		goto fail2;
 
 	return (0);
 
+fail2:
+	EFSYS_PROBE(fail2);
 fail1:
 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
diff --git a/drivers/common/sfc_efx/base/rhead_impl.h b/drivers/common/sfc_efx/base/rhead_impl.h
index 3383c47ec6..09a991f566 100644
--- a/drivers/common/sfc_efx/base/rhead_impl.h
+++ b/drivers/common/sfc_efx/base/rhead_impl.h
@@ -32,6 +32,10 @@ extern "C" {
 #define	RHEAD_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
 #define	RHEAD_TXQ_DESC_SIZE	(sizeof (efx_oword_t))
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+#define	RHEAD_EVQ_EW_DESC_SIZE	(sizeof (efx_xword_t))
+#endif
+
 
 /* NIC */
 
diff --git a/drivers/common/sfc_efx/base/rhead_nic.c b/drivers/common/sfc_efx/base/rhead_nic.c
index 9b8f09d12c..66db68b384 100644
--- a/drivers/common/sfc_efx/base/rhead_nic.c
+++ b/drivers/common/sfc_efx/base/rhead_nic.c
@@ -129,6 +129,12 @@ rhead_board_cfg(
 	encp->enc_evq_timer_quantum_ns = 0;
 	encp->enc_evq_timer_max_us = 0;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	encp->enc_ev_ew_desc_size = RHEAD_EVQ_EW_DESC_SIZE;
+#else
+	encp->enc_ev_ew_desc_size = 0;
+#endif
+
 	encp->enc_ev_desc_size = RHEAD_EVQ_DESC_SIZE;
 	encp->enc_rx_desc_size = RHEAD_RXQ_DESC_SIZE;
 	encp->enc_tx_desc_size = RHEAD_TXQ_DESC_SIZE;
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 7e5676fa45..cc7d5d1179 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -600,7 +600,7 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 
 	/* Clear all events */
 	(void)memset((void *)esmp->esm_base, 0xff,
-		     efx_evq_size(sa->nic, evq->entries));
+		     efx_evq_size(sa->nic, evq->entries, evq_flags));
 
 	if ((sa->intr.lsc_intr && hw_index == sa->mgmt_evq_index) ||
 	    (sa->intr.rxq_intr && evq->dp_rxq != NULL))
@@ -833,8 +833,8 @@ sfc_ev_qinit(struct sfc_adapter *sa,
 
 	/* Allocate DMA space */
 	rc = sfc_dma_alloc(sa, sfc_evq_type2str(type), type_index,
-			   efx_evq_size(sa->nic, evq->entries), socket_id,
-			   &evq->mem);
+			   efx_evq_size(sa->nic, evq->entries, sa->evq_flags),
+			   socket_id, &evq->mem);
 	if (rc != 0)
 		goto fail_dma_alloc;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 57/60] common/sfc_efx/base: poll extended width event queues
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (55 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
                     ` (4 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Extended width queues use a different layout and so require
a different polling loop.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 155 ++++++++++++++++++++++++-
 1 file changed, 154 insertions(+), 1 deletion(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index a83c6150d8..df5e3e26c6 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -30,7 +30,6 @@ rhead_ev_tx_completion(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
-
 static	__checkReturn	boolean_t
 rhead_ev_mcdi(
 	__in		efx_evq_t *eep,
@@ -38,6 +37,22 @@ rhead_ev_mcdi(
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 
 	__checkReturn	efx_rc_t
 rhead_ev_init(
@@ -200,6 +215,13 @@ rhead_ev_qpoll(
 	unsigned int index;
 	size_t offset;
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+	if (eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) {
+		rhead_ev_ew_qpoll(eep, countp, eecp, arg);
+		return;
+	}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
 	EFSYS_ASSERT(countp != NULL);
 	EFSYS_ASSERT(eecp != NULL);
@@ -285,6 +307,137 @@ rhead_ev_qpoll(
 	*countp = count;
 }
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+static			boolean_t
+rhead_ev_ew_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+
+	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
+	switch (code) {
+	default:
+		/* Omit currently unused reserved bits from the probe. */
+		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_7),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_4),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_3),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_2),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_XWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+	}
+
+	return (should_abort);
+}
+
+/*
+ * Poll extended width event queue. Size of the batch is equal to cache line
+ * size divided by event size.
+ */
+#define	EF100_EV_EW_BATCH	2
+
+/*
+ * Check if event is present.
+ *
+ * Riverhead EvQs use a phase bit to indicate the presence of valid events,
+ * by flipping the phase bit on each wrap of the write index.
+ */
+#define	EF100_EV_EW_PRESENT(_xword, _phase_bit)				\
+	(EFX_XWORD_FIELD((_xword), ESF_GZ_EV_256_EV32_PHASE) == (_phase_bit))
+
+static			void
+rhead_ev_ew_qpoll(
+	__in		efx_evq_t *eep,
+	__inout		unsigned int *countp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_xword_t ev[EF100_EV_EW_BATCH];
+	unsigned int batch;
+	unsigned int phase_bit;
+	unsigned int total;
+	unsigned int count;
+	unsigned int index;
+	size_t offset;
+
+	EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
+	EFSYS_ASSERT((eep->ee_flags & EFX_EVQ_FLAGS_EXTENDED_WIDTH) != 0);
+	EFSYS_ASSERT(countp != NULL);
+	EFSYS_ASSERT(eecp != NULL);
+
+	count = *countp;
+	do {
+		/* Read up until the end of the batch period */
+		batch = EF100_EV_EW_BATCH - (count & (EF100_EV_EW_BATCH - 1));
+		phase_bit = (count & (eep->ee_mask + 1)) != 0;
+		offset = (count & eep->ee_mask) * sizeof (efx_xword_t);
+		for (total = 0; total < batch; ++total) {
+			EFSYS_MEM_READX(eep->ee_esmp, offset, &(ev[total]));
+
+			if (!EF100_EV_EW_PRESENT(ev[total], phase_bit))
+				break;
+
+			/* Omit unused reserved bits from the probe. */
+			EFSYS_PROBE7(ew_event, unsigned int, eep->ee_index,
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_7),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_4),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_3),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_2),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_1),
+			    uint32_t, EFX_XWORD_FIELD(ev[total], EFX_DWORD_0));
+
+			offset += sizeof (efx_xword_t);
+		}
+
+		/* Process the batch of events */
+		for (index = 0; index < total; ++index) {
+			boolean_t should_abort;
+
+			EFX_EV_QSTAT_INCR(eep, EV_ALL);
+
+			should_abort =
+			    rhead_ev_ew_dispatch(eep, &(ev[index]), eecp, arg);
+
+			if (should_abort) {
+				/* Ignore subsequent events */
+				total = index + 1;
+
+				/*
+				 * Poison batch to ensure the outer
+				 * loop is broken out of.
+				 */
+				EFSYS_ASSERT(batch <= EF100_EV_EW_BATCH);
+				batch += (EF100_EV_EW_BATCH << 1);
+				EFSYS_ASSERT(total != batch);
+				break;
+			}
+		}
+
+		/*
+		 * There is no necessity to clear processed events since
+		 * phase bit which is flipping on each write index wrap
+		 * is used for event presence indication.
+		 */
+
+		count += total;
+
+	} while (total == batch);
+
+	*countp = count;
+}
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
+
 	__checkReturn	efx_rc_t
 rhead_ev_qmoderate(
 	__in		efx_evq_t *eep,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 58/60] common/sfc_efx/base: handle normal events in extended width
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (56 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
                     ` (3 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

Process the encasulated events as for the normal event loop. The phase
bit in the encapsulated event should be ignored, as the polling loop
uses the phase bit from the extended-width event.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/rhead_ev.c | 79 +++++++++++++++++---------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index df5e3e26c6..5bda315171 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -16,6 +16,13 @@
  */
 #define	EFX_RHEAD_ALWAYS_INTERRUPTING_EVQ_INDEX	(0)
 
+static			boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
 static	__checkReturn	boolean_t
 rhead_ev_rx_packets(
 	__in		efx_evq_t *eep,
@@ -181,6 +188,41 @@ rhead_ev_qpost(
 	EFSYS_ASSERT(B_FALSE);
 }
 
+static	__checkReturn	boolean_t
+rhead_ev_dispatch(
+	__in		efx_evq_t *eep,
+	__in		efx_qword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	boolean_t should_abort;
+	uint32_t code;
+
+	code = EFX_QWORD_FIELD(*eventp, ESF_GZ_E_TYPE);
+	switch (code) {
+	case ESE_GZ_EF100_EV_RX_PKTS:
+		should_abort = eep->ee_rx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_TX_COMPLETION:
+		should_abort = eep->ee_tx(eep, eventp, eecp, arg);
+		break;
+	case ESE_GZ_EF100_EV_MCDI:
+		should_abort = eep->ee_mcdi(eep, eventp, eecp, arg);
+		break;
+	default:
+		EFSYS_PROBE3(bad_event, unsigned int, eep->ee_index,
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_1),
+		    uint32_t, EFX_QWORD_FIELD(*eventp, EFX_DWORD_0));
+
+		EFSYS_ASSERT(eecp->eec_exception != NULL);
+		(void) eecp->eec_exception(arg, EFX_EXCEPTION_EV_ERROR, code);
+		should_abort = B_TRUE;
+		break;
+	}
+
+	return (should_abort);
+}
+
 /*
  * Poll event queue in batches. Size of the batch is equal to cache line
  * size divided by event size.
@@ -248,37 +290,12 @@ rhead_ev_qpoll(
 		/* Process the batch of events */
 		for (index = 0; index < total; ++index) {
 			boolean_t should_abort;
-			uint32_t code;
 
 			EFX_EV_QSTAT_INCR(eep, EV_ALL);
 
-			code = EFX_QWORD_FIELD(ev[index], ESF_GZ_E_TYPE);
-			switch (code) {
-			case ESE_GZ_EF100_EV_RX_PKTS:
-				should_abort = eep->ee_rx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_TX_COMPLETION:
-				should_abort = eep->ee_tx(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			case ESE_GZ_EF100_EV_MCDI:
-				should_abort = eep->ee_mcdi(eep,
-				    &(ev[index]), eecp, arg);
-				break;
-			default:
-				EFSYS_PROBE3(bad_event,
-				    unsigned int, eep->ee_index,
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_1),
-				    uint32_t,
-				    EFX_QWORD_FIELD(ev[index], EFX_DWORD_0));
-
-				EFSYS_ASSERT(eecp->eec_exception != NULL);
-				(void) eecp->eec_exception(arg,
-					EFX_EXCEPTION_EV_ERROR, code);
-				should_abort = B_TRUE;
-			}
+			should_abort =
+			    rhead_ev_dispatch(eep, &(ev[index]), eecp, arg);
+
 			if (should_abort) {
 				/* Ignore subsequent events */
 				total = index + 1;
@@ -322,6 +339,12 @@ rhead_ev_ew_dispatch(
 
 	code = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_256_EV32_TYPE);
 	switch (code) {
+	case ESE_GZ_EF100_EVEW_64BIT:
+		/* NOTE: ignore phase bit in encapsulated 64bit event. */
+		should_abort =
+		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
+		break;
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 59/60] common/sfc_efx/base: add option for descriptor proxy queues
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (57 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
                     ` (2 subsequent siblings)
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

EF100 uses descriptor proxy queues to support virtio-blk proxy.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx_check.h | 10 ++++++++++
 drivers/common/sfc_efx/efsys.h          |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx_check.h b/drivers/common/sfc_efx/base/efx_check.h
index 40ba57be6f..8f42d87a04 100644
--- a/drivers/common/sfc_efx/base/efx_check.h
+++ b/drivers/common/sfc_efx/base/efx_check.h
@@ -391,4 +391,14 @@
 # endif
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
+/* Support descriptor proxy queues */
+#if EFSYS_OPT_DESC_PROXY
+# if !EFSYS_OPT_RIVERHEAD
+#  error "DESC_PROXY requires RIVERHEAD"
+# endif
+# if !EFSYS_OPT_EV_EXTENDED_WIDTH
+#  error "DESC_PROXY requires EV_EXTENDED_WIDTH"
+# endif
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif /* _SYS_EFX_CHECK_H */
diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h
index f74b703cda..9ad7c82b86 100644
--- a/drivers/common/sfc_efx/efsys.h
+++ b/drivers/common/sfc_efx/efsys.h
@@ -165,6 +165,8 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_PCI 0
 
+#define EFSYS_OPT_DESC_PROXY 0
+
 /* ID */
 
 typedef struct __efsys_identifier_s efsys_identifier_t;
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* [dpdk-dev] [PATCH v3 60/60] common/sfc_efx/base: handle descriptor proxy queue events
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (58 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
@ 2020-09-24 12:12   ` Andrew Rybchenko
  2020-09-29 11:32   ` [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
  2020-09-29 11:52   ` Ferruh Yigit
  61 siblings, 0 replies; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-24 12:12 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton

From: Andy Moreton <amoreton@xilinx.com>

The TXQ_DESC and VIRTQ_DESC events are used to pass host descriptors
over an extended width event queue to an application processor for
handling. See SF-122927-TC and SF-122966-SW for details.

Signed-off-by: Andy Moreton <amoreton@xilinx.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/common/sfc_efx/base/efx.h      | 32 +++++++++
 drivers/common/sfc_efx/base/efx_impl.h | 10 +++
 drivers/common/sfc_efx/base/rhead_ev.c | 95 ++++++++++++++++++++++++++
 3 files changed, 137 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h
index ecd16712ba..07a7e3c952 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -2487,6 +2487,33 @@ typedef __checkReturn	boolean_t
 
 #endif	/* EFSYS_OPT_MAC_STATS */
 
+#if EFSYS_OPT_DESC_PROXY
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_txq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		efx_oword_t txq_desc);
+
+/*
+ * NOTE: This callback returns the raw descriptor data, which has not been
+ * converted to host endian. The callback must use the EFX_OWORD macros
+ * to extract the descriptor fields as host endian values.
+ */
+typedef __checkReturn	boolean_t
+(*efx_desc_proxy_virtq_desc_ev_t)(
+	__in_opt	void *arg,
+	__in		uint16_t vi_id,
+	__in		uint16_t avail,
+	__in		efx_oword_t virtq_desc);
+
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 typedef struct efx_ev_callbacks_s {
 	efx_initialized_ev_t		eec_initialized;
 	efx_rx_ev_t			eec_rx;
@@ -2511,6 +2538,11 @@ typedef struct efx_ev_callbacks_s {
 #if EFSYS_OPT_MAC_STATS
 	efx_mac_stats_ev_t		eec_mac_stats;
 #endif	/* EFSYS_OPT_MAC_STATS */
+#if EFSYS_OPT_DESC_PROXY
+	efx_desc_proxy_txq_desc_ev_t	eec_desc_proxy_txq_desc;
+	efx_desc_proxy_virtq_desc_ev_t	eec_desc_proxy_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 } efx_ev_callbacks_t;
 
 LIBEFX_API
diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h
index f58586bee0..196fd4a79c 100644
--- a/drivers/common/sfc_efx/base/efx_impl.h
+++ b/drivers/common/sfc_efx/base/efx_impl.h
@@ -902,6 +902,11 @@ struct efx_nic_s {
 typedef	boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *,
     const efx_ev_callbacks_t *, void *);
 
+#if EFSYS_OPT_EV_EXTENDED_WIDTH
+typedef	boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *,
+    const efx_ev_callbacks_t *, void *);
+#endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
+
 typedef struct efx_evq_rxq_state_s {
 	unsigned int			eers_rx_read_ptr;
 	unsigned int			eers_rx_mask;
@@ -934,6 +939,11 @@ struct efx_evq_s {
 	efx_ev_handler_t		ee_mcdi;
 #endif	/* EFSYS_OPT_MCDI */
 
+#if EFSYS_OPT_DESC_PROXY
+	efx_ev_ew_handler_t		ee_ew_txq_desc;
+	efx_ev_ew_handler_t		ee_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	efx_evq_rxq_state_t		ee_rxq_state[EFX_EV_RX_NLABELS];
 };
 
diff --git a/drivers/common/sfc_efx/base/rhead_ev.c b/drivers/common/sfc_efx/base/rhead_ev.c
index 5bda315171..2b5635f1cd 100644
--- a/drivers/common/sfc_efx/base/rhead_ev.c
+++ b/drivers/common/sfc_efx/base/rhead_ev.c
@@ -58,6 +58,22 @@ rhead_ev_ew_qpoll(
 	__inout		unsigned int *countp,
 	__in		const efx_ev_callbacks_t *eecp,
 	__in_opt	void *arg);
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg);
+#endif /* EFSYS_OPT_DESC_PROXY */
 #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */
 
 
@@ -115,6 +131,11 @@ rhead_ev_qcreate(
 	eep->ee_drv_gen	= NULL; /* FIXME */
 	eep->ee_mcdi	= rhead_ev_mcdi;
 
+#if EFSYS_OPT_DESC_PROXY
+	eep->ee_ew_txq_desc	= rhead_ev_ew_txq_desc;
+	eep->ee_ew_virtq_desc	= rhead_ev_ew_virtq_desc;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	/* Set up the event queue */
 	/* INIT_EVQ expects function-relative vector number */
 	if ((flags & EFX_EVQ_FLAGS_NOTIFY_MASK) ==
@@ -345,6 +366,16 @@ rhead_ev_ew_dispatch(
 		    rhead_ev_dispatch(eep, &eventp->ex_qword[0], eecp, arg);
 		break;
 
+#if EFSYS_OPT_DESC_PROXY
+	case ESE_GZ_EF100_EVEW_TXQ_DESC:
+		should_abort = eep->ee_ew_txq_desc(eep, eventp, eecp, arg);
+		break;
+
+	case ESE_GZ_EF100_EVEW_VIRTQ_DESC:
+		should_abort = eep->ee_ew_virtq_desc(eep, eventp, eecp, arg);
+		break;
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 	default:
 		/* Omit currently unused reserved bits from the probe. */
 		EFSYS_PROBE7(ew_bad_event, unsigned int, eep->ee_index,
@@ -589,4 +620,68 @@ rhead_ev_mcdi(
 	return (ret);
 }
 
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_txq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t txq_desc;
+	uint16_t vi_id;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_TXQ_DP_VI_ID);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	txq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_txq_desc != NULL);
+	should_abort = eecp->eec_desc_proxy_txq_desc(arg, vi_id, txq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
+
+#if EFSYS_OPT_DESC_PROXY
+static			boolean_t
+rhead_ev_ew_virtq_desc(
+	__in		efx_evq_t *eep,
+	__in		efx_xword_t *eventp,
+	__in		const efx_ev_callbacks_t *eecp,
+	__in_opt	void *arg)
+{
+	efx_oword_t virtq_desc;
+	uint16_t vi_id;
+	uint16_t avail;
+	boolean_t should_abort;
+
+	_NOTE(ARGUNUSED(eep))
+
+	vi_id = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_VI_ID);
+	avail = EFX_XWORD_FIELD(*eventp, ESF_GZ_EV_VQ_DP_AVAIL_ENTRY);
+
+	/*
+	 * NOTE: This is the raw descriptor data, and has not been converted
+	 * to host endian. The handler callback must use the EFX_OWORD macros
+	 * to extract the descriptor fields as host endian values.
+	 */
+	virtq_desc = eventp->ex_oword[0];
+
+	EFSYS_ASSERT(eecp->eec_desc_proxy_virtq_desc != NULL);
+	should_abort =
+	    eecp->eec_desc_proxy_virtq_desc(arg, vi_id, avail, virtq_desc);
+
+	return (should_abort);
+}
+#endif /* EFSYS_OPT_DESC_PROXY */
+
 #endif	/* EFSYS_OPT_RIVERHEAD */
-- 
2.17.1


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (59 preceding siblings ...)
  2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
@ 2020-09-29 11:32   ` Ferruh Yigit
  2020-09-29 11:41     ` Andrew Rybchenko
  2020-09-29 11:52   ` Ferruh Yigit
  61 siblings, 1 reply; 192+ messages in thread
From: Ferruh Yigit @ 2020-09-29 11:32 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 9/24/2020 1:11 PM, Andrew Rybchenko wrote:
> Riverhead is a new NIC family, the first one with EF100 architecture.
> Control interface is an MCDI similar to EF10. Datapath interface is
> completely new.

Hi Andrew,

Can you please update documentation and release notes for new Riverhead devices, 
it is OK to send it as separate patches from this patchset.

> 
> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
> enabled.
> 
> EF10-based NICs are tested with the patch series applied with and
> without EFSYS_OPT_RIVERHEAD enabled.
> 
> net/sfc patches will follow.
> 
> v3:
>   - more spelling fixes
>   - fix extremely long lines in common/sfc_efx/base: update MCDI headers
> 
> v2:
>   - fix spelling in few patches
>   - use tabs to indent instead of spaces
> 
> Andrew Rybchenko (41):
>    common/sfc_efx/base: add EF100 registers definitions
>    common/sfc_efx/base: update MCDI headers
>    common/sfc_efx/base: add event queue operation to do polling
>    common/sfc_efx/base: add efsys option for Riverhead
>    common/sfc_efx/base: add Riverhead NIC family
>    common/sfc_efx/base: update registers check for Riverhead
>    common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>    common/sfc_efx/base: use EF10 PHY methods for Riverhead
>    common/sfc_efx/base: move 14b prefix check out of caps get
>    common/sfc_efx/base: remove PF count get from caps get
>    common/sfc_efx/base: factor out helper to get board config
>    common/sfc_efx/base: set NIC features in generic place
>    common/sfc_efx/base: factor out MCDI entity reset helper
>    common/sfc_efx/base: add Riverhead support to NIC module
>    common/sfc_efx/base: use dummy tunnel ops for Riverhead
>    common/sfc_efx/base: use EF10 filter methods for Riverhead
>    common/sfc_efx/base: use EF10 MAC methods for Riverhead
>    common/sfc_efx/base: add interrupts module for Riverhead
>    common/sfc_efx/base: move EvQ init/fini wrappers to generic
>    common/sfc_efx/base: move EvQ create generic checks
>    common/sfc_efx/base: prepare to merge EvQ init functions
>    common/sfc_efx/base: merge versions of init EvQ wrappers
>    common/sfc_efx/base: add event queue module for Riverhead
>    common/sfc_efx/base: handle MCDI events on Riverhead
>    common/sfc_efx/base: move RxQ init/fini wrappers to generic
>    common/sfc_efx/base: move TxQ init/fini wrappers to generic
>    common/sfc_efx/base: switch TxQ init to extended version
>    common/sfc_efx/base: maintain RxQ counter in generic code
>    common/sfc_efx/base: free Rx queue structure in generic code
>    common/sfc_efx/base: move Rx index check to generic code
>    common/sfc_efx/base: implement Rx control path for Riverhead
>    common/sfc_efx/base: implement Tx control path for Riverhead
>    common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>    common/sfc_efx/base: handle Rx events for Riverhead
>    common/sfc_efx/base: handle Tx complete on Riverhead
>    common/sfc_efx: do not include libefx headers from efsys.h
>    common/sfc_efx/base: add API to get Rx prefix information
>    common/sfc_efx/base: group RxQ parameters into a structure
>    common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>    common/sfc_efx/base: use EF10 EVB methods for Riverhead
>    common/sfc_efx/base: allocate vAdaptor on Riverhead
> 
> Andy Moreton (7):
>    common/sfc_efx/base: add option for extended width events
>    common/sfc_efx/base: add 256bit type
>    common/sfc_efx/base: support creation of extended width EvQ
>    common/sfc_efx/base: poll extended width event queues
>    common/sfc_efx/base: handle normal events in extended width
>    common/sfc_efx/base: add option for descriptor proxy queues
>    common/sfc_efx/base: handle descriptor proxy queue events
> 
> Igor Romanov (9):
>    common/sfc_efx/base: add function control window concept
>    common/sfc_efx/base: add function control window lookup API
>    common/sfc_efx/base: add efsys API to find a memory BAR
>    common/sfc_efx/base: add Xilinx capabilities table lookup
>    common/sfc_efx/base: add NIC magic check on BAR lookup
>    common/sfc_efx/base: introduce UDP tunnel destruct operation
>    common/sfc_efx/base: introduce states for UDP tunnel entries
>    common/sfc_efx/base: support UDP tunnel operations for EF100
>    common/sfc_efx/base: replace PCI efsys macros with functions
> 
> Ivan Malov (3):
>    common/sfc_efx/base: complete EvQ creation on Riverhead
>    common/sfc_efx/base: indicate support for TSO version 3
>    common/sfc_efx/base: report restrictions for TSO version 3

<...>


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-29 11:32   ` [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
@ 2020-09-29 11:41     ` Andrew Rybchenko
  2020-09-29 11:52       ` Ferruh Yigit
  0 siblings, 1 reply; 192+ messages in thread
From: Andrew Rybchenko @ 2020-09-29 11:41 UTC (permalink / raw)
  To: Ferruh Yigit, dev

On 9/29/20 2:32 PM, Ferruh Yigit wrote:
> On 9/24/2020 1:11 PM, Andrew Rybchenko wrote:
>> Riverhead is a new NIC family, the first one with EF100 architecture.
>> Control interface is an MCDI similar to EF10. Datapath interface is
>> completely new.
> 
> Hi Andrew,
> 
> Can you please update documentation and release notes for new Riverhead
> devices, it is OK to send it as separate patches from this patchset.

Hi Ferruh,

these patches just update base driver. It does not add any new
functionality visible to DPDK users.
The point here is to prepare base driver to add new HW to
DPDK native net/sfc driver. Release notes will be updated
at the point (this release).
I can join these patch series, but it is already tooooo long.

Thanks,
Andrew.

> 
>>
>> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
>> enabled.
>>
>> EF10-based NICs are tested with the patch series applied with and
>> without EFSYS_OPT_RIVERHEAD enabled.
>>
>> net/sfc patches will follow.
>>
>> v3:
>>   - more spelling fixes
>>   - fix extremely long lines in common/sfc_efx/base: update MCDI headers
>>
>> v2:
>>   - fix spelling in few patches
>>   - use tabs to indent instead of spaces
>>
>> Andrew Rybchenko (41):
>>    common/sfc_efx/base: add EF100 registers definitions
>>    common/sfc_efx/base: update MCDI headers
>>    common/sfc_efx/base: add event queue operation to do polling
>>    common/sfc_efx/base: add efsys option for Riverhead
>>    common/sfc_efx/base: add Riverhead NIC family
>>    common/sfc_efx/base: update registers check for Riverhead
>>    common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>>    common/sfc_efx/base: use EF10 PHY methods for Riverhead
>>    common/sfc_efx/base: move 14b prefix check out of caps get
>>    common/sfc_efx/base: remove PF count get from caps get
>>    common/sfc_efx/base: factor out helper to get board config
>>    common/sfc_efx/base: set NIC features in generic place
>>    common/sfc_efx/base: factor out MCDI entity reset helper
>>    common/sfc_efx/base: add Riverhead support to NIC module
>>    common/sfc_efx/base: use dummy tunnel ops for Riverhead
>>    common/sfc_efx/base: use EF10 filter methods for Riverhead
>>    common/sfc_efx/base: use EF10 MAC methods for Riverhead
>>    common/sfc_efx/base: add interrupts module for Riverhead
>>    common/sfc_efx/base: move EvQ init/fini wrappers to generic
>>    common/sfc_efx/base: move EvQ create generic checks
>>    common/sfc_efx/base: prepare to merge EvQ init functions
>>    common/sfc_efx/base: merge versions of init EvQ wrappers
>>    common/sfc_efx/base: add event queue module for Riverhead
>>    common/sfc_efx/base: handle MCDI events on Riverhead
>>    common/sfc_efx/base: move RxQ init/fini wrappers to generic
>>    common/sfc_efx/base: move TxQ init/fini wrappers to generic
>>    common/sfc_efx/base: switch TxQ init to extended version
>>    common/sfc_efx/base: maintain RxQ counter in generic code
>>    common/sfc_efx/base: free Rx queue structure in generic code
>>    common/sfc_efx/base: move Rx index check to generic code
>>    common/sfc_efx/base: implement Rx control path for Riverhead
>>    common/sfc_efx/base: implement Tx control path for Riverhead
>>    common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>>    common/sfc_efx/base: handle Rx events for Riverhead
>>    common/sfc_efx/base: handle Tx complete on Riverhead
>>    common/sfc_efx: do not include libefx headers from efsys.h
>>    common/sfc_efx/base: add API to get Rx prefix information
>>    common/sfc_efx/base: group RxQ parameters into a structure
>>    common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>>    common/sfc_efx/base: use EF10 EVB methods for Riverhead
>>    common/sfc_efx/base: allocate vAdaptor on Riverhead
>>
>> Andy Moreton (7):
>>    common/sfc_efx/base: add option for extended width events
>>    common/sfc_efx/base: add 256bit type
>>    common/sfc_efx/base: support creation of extended width EvQ
>>    common/sfc_efx/base: poll extended width event queues
>>    common/sfc_efx/base: handle normal events in extended width
>>    common/sfc_efx/base: add option for descriptor proxy queues
>>    common/sfc_efx/base: handle descriptor proxy queue events
>>
>> Igor Romanov (9):
>>    common/sfc_efx/base: add function control window concept
>>    common/sfc_efx/base: add function control window lookup API
>>    common/sfc_efx/base: add efsys API to find a memory BAR
>>    common/sfc_efx/base: add Xilinx capabilities table lookup
>>    common/sfc_efx/base: add NIC magic check on BAR lookup
>>    common/sfc_efx/base: introduce UDP tunnel destruct operation
>>    common/sfc_efx/base: introduce states for UDP tunnel entries
>>    common/sfc_efx/base: support UDP tunnel operations for EF100
>>    common/sfc_efx/base: replace PCI efsys macros with functions
>>
>> Ivan Malov (3):
>>    common/sfc_efx/base: complete EvQ creation on Riverhead
>>    common/sfc_efx/base: indicate support for TSO version 3
>>    common/sfc_efx/base: report restrictions for TSO version 3
> 
> <...>


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-29 11:41     ` Andrew Rybchenko
@ 2020-09-29 11:52       ` Ferruh Yigit
  0 siblings, 0 replies; 192+ messages in thread
From: Ferruh Yigit @ 2020-09-29 11:52 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 9/29/2020 12:41 PM, Andrew Rybchenko wrote:
> On 9/29/20 2:32 PM, Ferruh Yigit wrote:
>> On 9/24/2020 1:11 PM, Andrew Rybchenko wrote:
>>> Riverhead is a new NIC family, the first one with EF100 architecture.
>>> Control interface is an MCDI similar to EF10. Datapath interface is
>>> completely new.
>>
>> Hi Andrew,
>>
>> Can you please update documentation and release notes for new Riverhead
>> devices, it is OK to send it as separate patches from this patchset.
> 
> Hi Ferruh,
> 
> these patches just update base driver. It does not add any new
> functionality visible to DPDK users.
> The point here is to prepare base driver to add new HW to
> DPDK native net/sfc driver. Release notes will be updated
> at the point (this release).
 >

Got it, if you already have a plan to update the documentation and release note 
that is OK.


> I can join these patch series, but it is already tooooo long.
> 

scary

> Thanks,
> Andrew.
> 
>>
>>>
>>> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
>>> enabled.
>>>
>>> EF10-based NICs are tested with the patch series applied with and
>>> without EFSYS_OPT_RIVERHEAD enabled.
>>>
>>> net/sfc patches will follow.
>>>
>>> v3:
>>>    - more spelling fixes
>>>    - fix extremely long lines in common/sfc_efx/base: update MCDI headers
>>>
>>> v2:
>>>    - fix spelling in few patches
>>>    - use tabs to indent instead of spaces
>>>
>>> Andrew Rybchenko (41):
>>>     common/sfc_efx/base: add EF100 registers definitions
>>>     common/sfc_efx/base: update MCDI headers
>>>     common/sfc_efx/base: add event queue operation to do polling
>>>     common/sfc_efx/base: add efsys option for Riverhead
>>>     common/sfc_efx/base: add Riverhead NIC family
>>>     common/sfc_efx/base: update registers check for Riverhead
>>>     common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>>>     common/sfc_efx/base: use EF10 PHY methods for Riverhead
>>>     common/sfc_efx/base: move 14b prefix check out of caps get
>>>     common/sfc_efx/base: remove PF count get from caps get
>>>     common/sfc_efx/base: factor out helper to get board config
>>>     common/sfc_efx/base: set NIC features in generic place
>>>     common/sfc_efx/base: factor out MCDI entity reset helper
>>>     common/sfc_efx/base: add Riverhead support to NIC module
>>>     common/sfc_efx/base: use dummy tunnel ops for Riverhead
>>>     common/sfc_efx/base: use EF10 filter methods for Riverhead
>>>     common/sfc_efx/base: use EF10 MAC methods for Riverhead
>>>     common/sfc_efx/base: add interrupts module for Riverhead
>>>     common/sfc_efx/base: move EvQ init/fini wrappers to generic
>>>     common/sfc_efx/base: move EvQ create generic checks
>>>     common/sfc_efx/base: prepare to merge EvQ init functions
>>>     common/sfc_efx/base: merge versions of init EvQ wrappers
>>>     common/sfc_efx/base: add event queue module for Riverhead
>>>     common/sfc_efx/base: handle MCDI events on Riverhead
>>>     common/sfc_efx/base: move RxQ init/fini wrappers to generic
>>>     common/sfc_efx/base: move TxQ init/fini wrappers to generic
>>>     common/sfc_efx/base: switch TxQ init to extended version
>>>     common/sfc_efx/base: maintain RxQ counter in generic code
>>>     common/sfc_efx/base: free Rx queue structure in generic code
>>>     common/sfc_efx/base: move Rx index check to generic code
>>>     common/sfc_efx/base: implement Rx control path for Riverhead
>>>     common/sfc_efx/base: implement Tx control path for Riverhead
>>>     common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>>>     common/sfc_efx/base: handle Rx events for Riverhead
>>>     common/sfc_efx/base: handle Tx complete on Riverhead
>>>     common/sfc_efx: do not include libefx headers from efsys.h
>>>     common/sfc_efx/base: add API to get Rx prefix information
>>>     common/sfc_efx/base: group RxQ parameters into a structure
>>>     common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>>>     common/sfc_efx/base: use EF10 EVB methods for Riverhead
>>>     common/sfc_efx/base: allocate vAdaptor on Riverhead
>>>
>>> Andy Moreton (7):
>>>     common/sfc_efx/base: add option for extended width events
>>>     common/sfc_efx/base: add 256bit type
>>>     common/sfc_efx/base: support creation of extended width EvQ
>>>     common/sfc_efx/base: poll extended width event queues
>>>     common/sfc_efx/base: handle normal events in extended width
>>>     common/sfc_efx/base: add option for descriptor proxy queues
>>>     common/sfc_efx/base: handle descriptor proxy queue events
>>>
>>> Igor Romanov (9):
>>>     common/sfc_efx/base: add function control window concept
>>>     common/sfc_efx/base: add function control window lookup API
>>>     common/sfc_efx/base: add efsys API to find a memory BAR
>>>     common/sfc_efx/base: add Xilinx capabilities table lookup
>>>     common/sfc_efx/base: add NIC magic check on BAR lookup
>>>     common/sfc_efx/base: introduce UDP tunnel destruct operation
>>>     common/sfc_efx/base: introduce states for UDP tunnel entries
>>>     common/sfc_efx/base: support UDP tunnel operations for EF100
>>>     common/sfc_efx/base: replace PCI efsys macros with functions
>>>
>>> Ivan Malov (3):
>>>     common/sfc_efx/base: complete EvQ creation on Riverhead
>>>     common/sfc_efx/base: indicate support for TSO version 3
>>>     common/sfc_efx/base: report restrictions for TSO version 3
>>
>> <...>
> 


^ permalink raw reply	[flat|nested] 192+ messages in thread

* Re: [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family
  2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
                     ` (60 preceding siblings ...)
  2020-09-29 11:32   ` [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
@ 2020-09-29 11:52   ` Ferruh Yigit
  61 siblings, 0 replies; 192+ messages in thread
From: Ferruh Yigit @ 2020-09-29 11:52 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 9/24/2020 1:11 PM, Andrew Rybchenko wrote:
> Riverhead is a new NIC family, the first one with EF100 architecture.
> Control interface is an MCDI similar to EF10. Datapath interface is
> completely new.
> 
> The patch series is build tested with and without EFSYS_OPT_RIVERHEAD
> enabled.
> 
> EF10-based NICs are tested with the patch series applied with and
> without EFSYS_OPT_RIVERHEAD enabled.
> 
> net/sfc patches will follow.
> 
> v3:
>   - more spelling fixes
>   - fix extremely long lines in common/sfc_efx/base: update MCDI headers
> 
> v2:
>   - fix spelling in few patches
>   - use tabs to indent instead of spaces
> 
> Andrew Rybchenko (41):
>    common/sfc_efx/base: add EF100 registers definitions
>    common/sfc_efx/base: update MCDI headers
>    common/sfc_efx/base: add event queue operation to do polling
>    common/sfc_efx/base: add efsys option for Riverhead
>    common/sfc_efx/base: add Riverhead NIC family
>    common/sfc_efx/base: update registers check for Riverhead
>    common/sfc_efx/base: use EF10 MCDI methods for Riverhead
>    common/sfc_efx/base: use EF10 PHY methods for Riverhead
>    common/sfc_efx/base: move 14b prefix check out of caps get
>    common/sfc_efx/base: remove PF count get from caps get
>    common/sfc_efx/base: factor out helper to get board config
>    common/sfc_efx/base: set NIC features in generic place
>    common/sfc_efx/base: factor out MCDI entity reset helper
>    common/sfc_efx/base: add Riverhead support to NIC module
>    common/sfc_efx/base: use dummy tunnel ops for Riverhead
>    common/sfc_efx/base: use EF10 filter methods for Riverhead
>    common/sfc_efx/base: use EF10 MAC methods for Riverhead
>    common/sfc_efx/base: add interrupts module for Riverhead
>    common/sfc_efx/base: move EvQ init/fini wrappers to generic
>    common/sfc_efx/base: move EvQ create generic checks
>    common/sfc_efx/base: prepare to merge EvQ init functions
>    common/sfc_efx/base: merge versions of init EvQ wrappers
>    common/sfc_efx/base: add event queue module for Riverhead
>    common/sfc_efx/base: handle MCDI events on Riverhead
>    common/sfc_efx/base: move RxQ init/fini wrappers to generic
>    common/sfc_efx/base: move TxQ init/fini wrappers to generic
>    common/sfc_efx/base: switch TxQ init to extended version
>    common/sfc_efx/base: maintain RxQ counter in generic code
>    common/sfc_efx/base: free Rx queue structure in generic code
>    common/sfc_efx/base: move Rx index check to generic code
>    common/sfc_efx/base: implement Rx control path for Riverhead
>    common/sfc_efx/base: implement Tx control path for Riverhead
>    common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead
>    common/sfc_efx/base: handle Rx events for Riverhead
>    common/sfc_efx/base: handle Tx complete on Riverhead
>    common/sfc_efx: do not include libefx headers from efsys.h
>    common/sfc_efx/base: add API to get Rx prefix information
>    common/sfc_efx/base: group RxQ parameters into a structure
>    common/sfc_efx/base: choose smallest Rx prefix on Riverhead
>    common/sfc_efx/base: use EF10 EVB methods for Riverhead
>    common/sfc_efx/base: allocate vAdaptor on Riverhead
> 
> Andy Moreton (7):
>    common/sfc_efx/base: add option for extended width events
>    common/sfc_efx/base: add 256bit type
>    common/sfc_efx/base: support creation of extended width EvQ
>    common/sfc_efx/base: poll extended width event queues
>    common/sfc_efx/base: handle normal events in extended width
>    common/sfc_efx/base: add option for descriptor proxy queues
>    common/sfc_efx/base: handle descriptor proxy queue events
> 
> Igor Romanov (9):
>    common/sfc_efx/base: add function control window concept
>    common/sfc_efx/base: add function control window lookup API
>    common/sfc_efx/base: add efsys API to find a memory BAR
>    common/sfc_efx/base: add Xilinx capabilities table lookup
>    common/sfc_efx/base: add NIC magic check on BAR lookup
>    common/sfc_efx/base: introduce UDP tunnel destruct operation
>    common/sfc_efx/base: introduce states for UDP tunnel entries
>    common/sfc_efx/base: support UDP tunnel operations for EF100
>    common/sfc_efx/base: replace PCI efsys macros with functions
> 
> Ivan Malov (3):
>    common/sfc_efx/base: complete EvQ creation on Riverhead
>    common/sfc_efx/base: indicate support for TSO version 3
>    common/sfc_efx/base: report restrictions for TSO version 3
> 

Series applied to dpdk-next-net/main, thanks.


^ permalink raw reply	[flat|nested] 192+ messages in thread

end of thread, other threads:[~2020-09-29 11:52 UTC | newest]

Thread overview: 192+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-22  8:48 [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
2020-09-22  8:48 ` [dpdk-dev] [PATCH 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
2020-09-22  8:48 ` [dpdk-dev] [PATCH 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
2020-09-22  8:48 ` [dpdk-dev] [PATCH 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
2020-09-22  8:48 ` [dpdk-dev] [PATCH 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
2020-09-22  8:48 ` [dpdk-dev] [PATCH 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
2020-09-22  8:49 ` [dpdk-dev] [PATCH 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
2020-09-22  9:20 ` [dpdk-dev] [PATCH 00/60] common/sfc_efx: support Riverhead NIC family Andrew Rybchenko
2020-09-22  9:33 ` [dpdk-dev] [PATCH v2 " Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
2020-09-23 17:20     ` Ferruh Yigit
2020-09-24 12:09       ` Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
2020-09-22  9:33   ` [dpdk-dev] [PATCH v2 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
2020-09-22  9:34   ` [dpdk-dev] [PATCH v2 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
2020-09-23 17:45   ` [dpdk-dev] [PATCH v2 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
2020-09-24  6:31     ` Andrew Rybchenko
2020-09-24 12:11 ` [dpdk-dev] [PATCH v3 " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 01/60] common/sfc_efx/base: add EF100 registers definitions Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 02/60] common/sfc_efx/base: update MCDI headers Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 03/60] common/sfc_efx/base: add event queue operation to do polling Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 04/60] common/sfc_efx/base: add efsys option for Riverhead Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 05/60] common/sfc_efx/base: add Riverhead NIC family Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 06/60] common/sfc_efx/base: update registers check for Riverhead Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 07/60] common/sfc_efx/base: use EF10 MCDI methods " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 08/60] common/sfc_efx/base: use EF10 PHY " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 09/60] common/sfc_efx/base: move 14b prefix check out of caps get Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 10/60] common/sfc_efx/base: remove PF count get from " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 11/60] common/sfc_efx/base: factor out helper to get board config Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 12/60] common/sfc_efx/base: set NIC features in generic place Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 13/60] common/sfc_efx/base: factor out MCDI entity reset helper Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 14/60] common/sfc_efx/base: add Riverhead support to NIC module Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 15/60] common/sfc_efx/base: use dummy tunnel ops for Riverhead Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 16/60] common/sfc_efx/base: use EF10 filter methods " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 17/60] common/sfc_efx/base: use EF10 MAC " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 18/60] common/sfc_efx/base: add interrupts module " Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 19/60] common/sfc_efx/base: move EvQ init/fini wrappers to generic Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 20/60] common/sfc_efx/base: move EvQ create generic checks Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 21/60] common/sfc_efx/base: prepare to merge EvQ init functions Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 22/60] common/sfc_efx/base: merge versions of init EvQ wrappers Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 23/60] common/sfc_efx/base: add event queue module for Riverhead Andrew Rybchenko
2020-09-24 12:11   ` [dpdk-dev] [PATCH v3 24/60] common/sfc_efx/base: complete EvQ creation on Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 25/60] common/sfc_efx/base: handle MCDI events " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 26/60] common/sfc_efx/base: move RxQ init/fini wrappers to generic Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 27/60] common/sfc_efx/base: move TxQ " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 28/60] common/sfc_efx/base: switch TxQ init to extended version Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 29/60] common/sfc_efx/base: maintain RxQ counter in generic code Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 30/60] common/sfc_efx/base: free Rx queue structure " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 31/60] common/sfc_efx/base: move Rx index check to " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 32/60] common/sfc_efx/base: implement Rx control path for Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 33/60] common/sfc_efx/base: implement Tx " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 34/60] common/sfc_efx/base: fix Tx descriptor DMA sync on Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 35/60] common/sfc_efx/base: handle Rx events for Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 36/60] common/sfc_efx/base: handle Tx complete on Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 37/60] common/sfc_efx/base: indicate support for TSO version 3 Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 38/60] common/sfc_efx/base: report restrictions " Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 39/60] common/sfc_efx: do not include libefx headers from efsys.h Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 40/60] common/sfc_efx/base: add API to get Rx prefix information Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 41/60] common/sfc_efx/base: group RxQ parameters into a structure Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 42/60] common/sfc_efx/base: choose smallest Rx prefix on Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 43/60] common/sfc_efx/base: add function control window concept Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 44/60] common/sfc_efx/base: add function control window lookup API Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 45/60] common/sfc_efx/base: add efsys API to find a memory BAR Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 46/60] common/sfc_efx/base: add Xilinx capabilities table lookup Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 47/60] common/sfc_efx/base: add NIC magic check on BAR lookup Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 48/60] common/sfc_efx/base: introduce UDP tunnel destruct operation Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 49/60] common/sfc_efx/base: introduce states for UDP tunnel entries Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 50/60] common/sfc_efx/base: support UDP tunnel operations for EF100 Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 51/60] common/sfc_efx/base: replace PCI efsys macros with functions Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 52/60] common/sfc_efx/base: use EF10 EVB methods for Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 53/60] common/sfc_efx/base: allocate vAdaptor on Riverhead Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 54/60] common/sfc_efx/base: add option for extended width events Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 55/60] common/sfc_efx/base: add 256bit type Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 56/60] common/sfc_efx/base: support creation of extended width EvQ Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 57/60] common/sfc_efx/base: poll extended width event queues Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 58/60] common/sfc_efx/base: handle normal events in extended width Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 59/60] common/sfc_efx/base: add option for descriptor proxy queues Andrew Rybchenko
2020-09-24 12:12   ` [dpdk-dev] [PATCH v3 60/60] common/sfc_efx/base: handle descriptor proxy queue events Andrew Rybchenko
2020-09-29 11:32   ` [dpdk-dev] [PATCH v3 00/60] common/sfc_efx: support Riverhead NIC family Ferruh Yigit
2020-09-29 11:41     ` Andrew Rybchenko
2020-09-29 11:52       ` Ferruh Yigit
2020-09-29 11:52   ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).