diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile
index 55e9cd5..aca6bfb 100644
--- a/drivers/net/fm10k/Makefile
+++ b/drivers/net/fm10k/Makefile
@@ -11,6 +11,9 @@ LIB = librte_pmd_fm10k.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DALLOW_EXPERIMENTAL_API
+ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y)
+CFLAGS += -DENABLE_FM10K_MANAGEMENT
+endif
 
 EXPORT_MAP := rte_pmd_fm10k_version.map
 
@@ -62,6 +65,10 @@ $(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER))
 
 VPATH += $(SRCDIR)/base
 
+ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y)
+VPATH += $(SRCDIR)/switch
+endif
+
 #
 # all source are stored in SRCS-y
 # base driver is based on the package of cid-fm10k.2017.01.24.tar.gz
@@ -75,6 +82,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c
+
+ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y)
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_i2c.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c
+endif
+
 SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h
new file mode 100644
index 0000000..6bf72a8
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_debug.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#ifndef _FM10K_DEBUG_H_
+#define _FM10K_DEBUG_H_
+
+
+#define FM10K_SW_ERR(...)		PMD_INIT_LOG(ERR, __VA_ARGS__)
+#define FM10K_SW_INFO(...)		PMD_INIT_LOG(INFO, __VA_ARGS__)
+#define FM10K_SW_TRACE(...)		PMD_INIT_LOG(DEBUG, __VA_ARGS__)
+
+#define FM10K_SW_ASSERT(...)	do {} while (0)
+
+#define FM10K_SW_STATS_TRACE_ENABLE		1
+#define FM10K_SW_FFU_CONF_TRACE_ENABLE	0
+#define FM10K_SW_MIRROR_TRACE_ENABLE	0
+
+#endif /* _FM10K_DEBUG_H_ */
diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c
new file mode 100644
index 0000000..28b0c34
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_i2c.c
@@ -0,0 +1,310 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#include <rte_malloc.h>
+
+#include <rte_time.h>
+#include <rte_kvargs.h>
+#include <rte_hash.h>
+#include <rte_flow.h>
+#include <rte_flow_driver.h>
+#include <rte_tm_driver.h>
+
+#include "fm10k_debug.h"
+#include "fm10k_i2c.h"
+#include "fm10k_regs.h"
+#include "fm10k_switch.h"
+
+static void fm10k_i2c_init(struct fm10k_i2c *);
+
+struct fm10k_i2c *
+fm10k_i2c_attach(struct fm10k_switch *sw)
+{
+	struct fm10k_i2c *i2c;
+
+	FM10K_SW_TRACE("i2c: attaching");
+
+	i2c = (struct fm10k_i2c *)rte_zmalloc("fm10k_i2c",
+			sizeof(struct fm10k_i2c), 0);
+	if (i2c == NULL) {
+		FM10K_SW_INFO("i2c: failed to allocate context");
+		goto fail;
+	}
+
+	i2c->sw = sw;
+	pthread_mutex_init(&i2c->req_lock, NULL);
+	pthread_mutex_init(&i2c->bus_lock, NULL);
+	sem_init(&i2c->req_cv, 0, 0);
+
+	fm10k_i2c_init(i2c);
+
+	FM10K_SW_TRACE("i2c: attach successful");
+	return i2c;
+fail:
+	if (i2c)
+		fm10k_i2c_detach(i2c);
+	return NULL;
+}
+
+void
+fm10k_i2c_detach(struct fm10k_i2c *i2c)
+{
+	FM10K_SW_TRACE("i2c: detaching");
+
+	rte_free(i2c);
+}
+
+static void
+fm10k_i2c_init(struct fm10k_i2c *i2c)
+{
+	struct fm10k_switch *sw = i2c->sw;
+	struct fm10k_device_info *cfg = sw->info;
+	uint32_t freq = FM10K_SW_I2C_CFG_DIVIDER_400_KHZ;
+	uint32_t data;
+
+	if (FM10K_SW_CARD_ID(cfg->subvendor, cfg->subdevice) ==
+			FM10K_SW_CARD(SILICOM, PE3100G2DQIRM_QXSL4))
+		freq = FM10K_SW_I2C_CFG_DIVIDER_100_KHZ;
+
+	/* clear any pending interrupt */
+	fm10k_write_switch_reg(sw, FM10K_SW_I2C_CTRL,
+		FM10K_SW_I2C_CTRL_INTERRUPT_PENDING);
+
+	/* 400 KHz, master mode, unmask interrupt */
+	data = fm10k_read_switch_reg(sw, FM10K_SW_I2C_CFG);
+	data &= ~FM10K_SW_I2C_CFG_SLAVE_ENABLE;
+	if (FM10K_SW_CARD_ID(cfg->subvendor, cfg->subdevice) ==
+			FM10K_SW_CARD(SILICOM, PE3100G2DQIRM_QXSL4))
+		FM10K_SW_REPLACE_REG_FIELD(data, I2C_CFG_DIVIDER, freq, data);
+	data &=  ~FM10K_SW_I2C_CFG_INTERRUPT_MASK;
+	fm10k_write_switch_reg(sw, FM10K_SW_I2C_CFG, data);
+
+	if (FM10K_SW_CARD_ID(cfg->subvendor, cfg->subdevice) ==
+			FM10K_SW_CARD(SILICOM, PE3100G2DQIRM_QXSL4))
+		/* reset I2C */
+		fm10k_gpio_output_set(sw, 5, 1);
+}
+
+unsigned int
+fm10k_i2c_intr(struct fm10k_i2c *i2c)
+{
+	struct fm10k_switch *sw = i2c->sw;
+	struct fm10k_i2c_req *req;
+	int i;
+	uint32_t data[3];
+	uint32_t ctrl;
+
+	req = i2c->cur_req;
+
+	FM10K_SW_SWITCH_LOCK(sw);
+	ctrl = fm10k_read_switch_reg(sw, FM10K_SW_I2C_CTRL);
+	fm10k_write_switch_reg(sw, FM10K_SW_I2C_CTRL,
+	    FM10K_SW_I2C_CTRL_INTERRUPT_PENDING);
+
+	req->status = FM10K_SW_REG_FIELD(ctrl, I2C_CTRL_COMMAND_COMPLETED);
+
+	if ((req->cmd == FM10K_SW_I2C_COMMAND_RD ||
+			req->cmd == FM10K_SW_I2C_COMMAND_WR_RD) &&
+			req->status == FM10K_SW_I2C_COMPLETION_NORMAL) {
+		for (i = 0; i < FM10K_SW_HOWMANY(req->read_len, 4, 4); i++)
+			data[i] = fm10k_read_switch_reg
+						(sw, FM10K_SW_I2C_DATA(i));
+
+		for (i = 0; i < req->read_len; i++)
+			req->msg[i] =
+				(data[i / 4] >> (24 - (i % 4) * 8)) & 0xff;
+	}
+	FM10K_SW_SWITCH_UNLOCK(sw);
+	sem_post(&i2c->req_cv);
+
+	return 1;
+}
+
+int
+fm10k_i2c_exec(struct fm10k_i2c *i2c, struct fm10k_i2c_req *req)
+{
+	struct fm10k_switch *sw = i2c->sw;
+	int i;
+	uint32_t ctrl;
+	uint32_t data[3];
+
+	if (((req->cmd == FM10K_SW_I2C_COMMAND_WR ||
+		    req->cmd == FM10K_SW_I2C_COMMAND_WR_RD) &&
+		req->write_len > FM10K_SW_I2C_MSG_MAX) ||
+	    ((req->cmd == FM10K_SW_I2C_COMMAND_RD ||
+		req->cmd == FM10K_SW_I2C_COMMAND_WR_RD) &&
+		((req->read_len == 0  ||
+		    req->read_len > FM10K_SW_I2C_MSG_MAX))))
+		return (-1);
+
+	FM10K_SW_TRACE("i2c: initiating command %u", req->cmd);
+
+	ctrl =
+	    FM10K_SW_MAKE_REG_FIELD(I2C_CTRL_ADDR, req->addr << 1) |
+	    FM10K_SW_MAKE_REG_FIELD(I2C_CTRL_COMMAND, req->cmd);
+
+	if (req->cmd == FM10K_SW_I2C_COMMAND_WR ||
+			req->cmd == FM10K_SW_I2C_COMMAND_WR_RD) {
+		ctrl |= FM10K_SW_MAKE_REG_FIELD
+				(I2C_CTRL_LENGTH_W, req->write_len);
+
+		data[0] = 0;
+		data[1] = 0;
+		data[2] = 0;
+
+		for (i = 0; i < req->write_len; i++)
+			data[i / 4] |= req->msg[i] << (24 - (i % 4) * 8);
+
+		for (i = 0; i < FM10K_SW_HOWMANY(req->write_len, 4, 4); i++)
+			fm10k_write_switch_reg(sw,
+					FM10K_SW_I2C_DATA(i), data[i]);
+	}
+
+	if (req->cmd == FM10K_SW_I2C_COMMAND_RD ||
+	    req->cmd == FM10K_SW_I2C_COMMAND_WR_RD)
+		ctrl |= FM10K_SW_MAKE_REG_FIELD
+				(I2C_CTRL_LENGTH_R, req->read_len);
+
+	req->status = FM10K_SW_I2C_COMPLETION_RUNNING;
+	i2c->cur_req = req;
+
+	FM10K_SW_SWITCH_LOCK(sw);
+	/* zero command field */
+	fm10k_write_switch_reg(sw, FM10K_SW_I2C_CTRL, 0);
+	/* initiate command */
+	fm10k_write_switch_reg(sw, FM10K_SW_I2C_CTRL, ctrl);
+	FM10K_SW_SWITCH_UNLOCK(sw);
+
+	while (req->status == FM10K_SW_I2C_COMPLETION_RUNNING)
+		sem_wait(&i2c->req_cv);
+
+	return 0;
+}
+
+int
+fm10k_i2c_read8(struct fm10k_i2c *i2c, uint8_t addr, uint8_t *result)
+{
+	struct fm10k_i2c_req req;
+	int error;
+
+	req.addr = addr;
+	req.cmd = FM10K_SW_I2C_COMMAND_RD;
+	req.read_len = 1;
+	req.msg[0] = 0;
+
+	error = fm10k_i2c_exec(i2c, &req);
+	if (error)
+		goto done;
+
+	if (req.status != FM10K_SW_I2C_COMPLETION_NORMAL) {
+		FM10K_SW_INFO("i2c read failed (%u)", req.status);
+		error = -1;
+		goto done;
+	}
+
+	*result = req.msg[0];
+
+done:
+	return (error);
+}
+
+int
+fm10k_i2c_read8_ext(struct fm10k_i2c *i2c,
+		uint8_t addr, uint8_t reg, uint8_t *result)
+{
+	struct fm10k_i2c_req req;
+	int error;
+
+	req.addr = addr;
+	req.cmd = FM10K_SW_I2C_COMMAND_WR_RD;
+	req.write_len = 1;
+	req.read_len = 1;
+	req.msg[0] = reg;
+
+	error = fm10k_i2c_exec(i2c, &req);
+	if (error)
+		goto done;
+
+	if (req.status != FM10K_SW_I2C_COMPLETION_NORMAL) {
+		FM10K_SW_INFO("i2c read failed (%u)", req.status);
+		error = -1;
+		goto done;
+	}
+
+	*result = req.msg[0];
+done:
+	return (error);
+}
+
+int
+fm10k_i2c_write8(struct fm10k_i2c *i2c, uint8_t addr, uint8_t data)
+{
+	struct fm10k_i2c_req req;
+	int error;
+
+	req.addr = addr;
+	req.cmd = FM10K_SW_I2C_COMMAND_WR;
+	req.write_len = 1;
+	req.msg[0] = data;
+
+	error = fm10k_i2c_exec(i2c, &req);
+	if (error)
+		goto done;
+
+	if (req.status != FM10K_SW_I2C_COMPLETION_NORMAL) {
+		error = -1;
+		goto done;
+	}
+
+done:
+	return (error);
+}
+
+int
+fm10k_i2c_write16(struct fm10k_i2c *i2c,
+		uint8_t addr, uint8_t data0, uint8_t data1)
+{
+	struct fm10k_i2c_req req;
+	int error;
+
+	req.addr = addr;
+	req.cmd = FM10K_SW_I2C_COMMAND_WR;
+	req.write_len = 2;
+	req.msg[0] = data0;
+	req.msg[1] = data1;
+
+	error = fm10k_i2c_exec(i2c, &req);
+	if (error)
+		goto done;
+
+	if (req.status != FM10K_SW_I2C_COMPLETION_NORMAL) {
+		error = -1;
+		goto done;
+	}
+done:
+	return (error);
+}
+
+int
+fm10k_i2c_probe(struct fm10k_i2c *i2c, uint8_t addr)
+{
+	struct fm10k_i2c_req req;
+	int error;
+
+	req.addr = addr;
+	req.cmd = FM10K_SW_I2C_COMMAND_WR;
+	req.write_len = 0;
+
+	error = fm10k_i2c_exec(i2c, &req);
+	if (error)
+		goto done;
+
+	if (req.status != FM10K_SW_I2C_COMPLETION_NORMAL) {
+		error = -1;
+		goto done;
+	}
+
+done:
+	return (error);
+}
diff --git a/drivers/net/fm10k/switch/fm10k_i2c.h b/drivers/net/fm10k/switch/fm10k_i2c.h
new file mode 100644
index 0000000..f835afe
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_i2c.h
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#ifndef _FM10K_SW_I2C_H_
+#define _FM10K_SW_I2C_H_
+
+#include <semaphore.h>
+#include <pthread.h>
+#include "rte_spinlock.h"
+#include "fm10k_debug.h"
+
+#define FM10K_SW_I2C_MSG_MAX	12
+
+struct fm10k_i2c_req {
+	uint8_t addr; /* 7-bit address */
+	uint8_t cmd;  /* FM10K_SW_I2C_COMMAND_* */
+	uint8_t write_len;
+	uint8_t read_len;
+	uint8_t status; /* FM10K_SW_I2C_COMPLETION_ */
+	uint8_t msg[FM10K_SW_I2C_MSG_MAX];
+};
+
+struct fm10k_i2c {
+	struct fm10k_switch *sw;
+	pthread_mutex_t bus_lock;
+	pthread_mutex_t req_lock;
+	sem_t req_cv;
+	struct fm10k_i2c_req *cur_req;
+};
+
+#define FM10K_SW_I2C_LOCK(i2c_)	\
+	pthread_mutex_lock(&(i2c_)->bus_lock)
+#define FM10K_SW_I2C_UNLOCK(i2c_)	\
+	pthread_mutex_unlock(&(i2c_)->bus_lock)
+
+#define FM10K_SW_I2C_REQ_LOCK(i2c_)	\
+			pthread_mutex_lock(&((i2c_)->req_lock))
+#define FM10K_SW_I2C_REQ_UNLOCK(i2c_) \
+			pthread_mutex_unlock(&((i2c_)->req_lock))
+
+struct fm10k_i2c *fm10k_i2c_attach(struct fm10k_switch *sw);
+void fm10k_i2c_detach(struct fm10k_i2c *i2c);
+unsigned int fm10k_i2c_intr(struct fm10k_i2c *i2c);
+int fm10k_i2c_exec(struct fm10k_i2c *i2c, struct fm10k_i2c_req *req);
+int fm10k_i2c_read8(struct fm10k_i2c *i2c, uint8_t addr, uint8_t *result);
+int fm10k_i2c_read8_ext(struct fm10k_i2c *i2c,
+				uint8_t addr, uint8_t reg, uint8_t *result);
+int fm10k_i2c_write8(struct fm10k_i2c *i2c, uint8_t addr, uint8_t data);
+int fm10k_i2c_write16(struct fm10k_i2c *i2c,
+				uint8_t addr, uint8_t data0, uint8_t data1);
+int fm10k_i2c_probe(struct fm10k_i2c *i2c, uint8_t addr);
+
+#endif /* _FM10K_SW_I2C_H_ */
diff --git a/drivers/net/fm10k/switch/fm10k_regs.h b/drivers/net/fm10k/switch/fm10k_regs.h
new file mode 100644
index 0000000..29bb95a
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_regs.h
@@ -0,0 +1,2202 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#ifndef _FM10K_REGS_H_
+#define _FM10K_REGS_H_
+
+#include <stdint.h>
+
+
+/* Convert a 32-bit word offset into a byte offset */
+#define FM10K_SW_REG_OFF(wo_)				(wo_)
+#define FM10K_SW_MASK32(max_bit_, min_bit_) \
+			((0xffffffffU << (min_bit_)) & \
+			(0xffffffffU >> (31 - (max_bit_))))
+#define FM10K_SW_REG_FIELD(r_, name_) \
+			(((uint32_t)(r_) & \
+			FM10K_SW_MASK32(FM10K_SW_##name_##_msb, \
+			FM10K_SW_##name_##_lsb)) >> FM10K_SW_##name_##_lsb)
+#define FM10K_SW_REG_FIELD_IDX(r_, name_, i_, i1_, i2_) \
+			(((uint32_t)(r_) & \
+			FM10K_SW_MASK32(FM10K_SW_##name_##_msb(i_), \
+			FM10K_SW_##name_##_lsb(i2_))) >> \
+			FM10K_SW_##name_##_lsb(i3_))
+#define FM10K_SW_MAKE_REG_FIELD(name_, v_) \
+			(((uint32_t)(v_) << FM10K_SW_##name_##_lsb) & \
+			FM10K_SW_MASK32(FM10K_SW_##name_##_msb, \
+			FM10K_SW_##name_##_lsb))
+#define FM10K_SW_MAKE_REG_FIELD_IDX(name_, i_, v_, i1_, i2_) \
+			(((uint32_t)(v_) << FM10K_SW_##name_##_lsb(i_)) & \
+			FM10K_SW_MASK32(FM10K_SW_##name_##_msb(i1_), \
+			FM10K_SW_##name_##_lsb(i2_)))
+#define FM10K_SW_REPLACE_REG_FIELD(r_, name_, v_, r1_) \
+			(r_ = (((r1_) & \
+			~FM10K_SW_MASK32(FM10K_SW_##name_##_msb, \
+			FM10K_SW_##name_##_lsb)) | \
+			FM10K_SW_MAKE_REG_FIELD(name_, v_)))
+#define FM10K_SW_REPLACE_REG_FIELD_IDX(r_, name_, i_, v_, r1_, i1_, i2_) \
+			(r_ = (((r1_) & \
+			~FM10K_SW_MASK32(FM10K_SW_##name_##_msb(i1_), \
+			FM10K_SW_##name_##_lsb(i2_))) | \
+			FM10K_SW_MAKE_REG_FIELD_IDX(name_, i_, v_)))
+#define FM10K_SW_MASK64(max_bit_, min_bit_)			\
+			((0xffffffffffffffffULL << (min_bit_)) &	\
+			(0xffffffffffffffffULL >> (63 - (max_bit_))))
+#define FM10K_SW_REG_FIELD64(r_, name_) \
+			(((uint64_t)(r_) & \
+			FM10K_SW_MASK64(FM10K_SW_##name_##_msb64, \
+			FM10K_SW_##name_##_lsb64)) >> \
+			FM10K_SW_##name_##_lsb64)
+#define FM10K_SW_REG_FIELD_IDX64(r_, name_, i_, i1_, i2_) \
+			(((uint64_t)(r_) & \
+			FM10K_SW_MASK64(FM10K_SW_##name_##_msb64(i_), \
+			FM10K_SW_##name_##_lsb64(i1_))) >> \
+			FM10K_SW_##name_##_lsb64(i2_))
+#define FM10K_SW_MAKE_REG_FIELD64(name_, v_) \
+			(((uint64_t)(v_) << FM10K_SW_##name_##_lsb64) & \
+			FM10K_SW_MASK64(FM10K_SW_##name_##_msb64, \
+			FM10K_SW_##name_##_lsb64))
+#define FM10K_SW_MAKE_REG_FIELD_IDX64(name_, i_, v_, i1_, i2_) \
+			(((uint64_t)(v_) << FM10K_SW_##name_##_lsb64(i_)) & \
+			FM10K_SW_MASK64(FM10K_SW_##name_##_msb64(i1_), \
+			FM10K_SW_##name_##_lsb64(i2_)))
+#define FM10K_SW_REPLACE_REG_FIELD64(r_, name_, v_, r1_)	\
+			(r_ = (((r1_) & \
+			~FM10K_SW_MASK64(FM10K_SW_##name_##_msb64, \
+			FM10K_SW_##name_##_lsb64)) | \
+			FM10K_SW_MAKE_REG_FIELD64(name_, v_)))
+#define FM10K_SW_REPLACE_REG_FIELD_IDX64(r_, name_, i_, v_, r1_, i1_, i2_) \
+			(r_ = (((r1_) & \
+			~FM10K_SW_MASK64(FM10K_SW_##name_##_msb64(i1_), \
+			FM10K_SW_##name_##_lsb64(i2_))) | \
+			FM10K_SW_MAKE_REG_FIELD_IDX64(name_, i_, v_)))
+
+/* These operate on arrays of 32-bit words */
+#define FM10K_SW_SET_ARRAY_BIT(a_, name_, b_, a1_) \
+			((a_)[FM10K_SW_##name_##_bit / 32] = \
+			((a1_)[FM10K_SW_##name_##_bit / 32] & \
+			~(1 << (FM10K_SW_##name_##_bit % 32))) | \
+			(((b_) & 0x1) << (FM10K_SW_##name_##_bit % 32)))
+
+/* Does not support fields that cross 32-bit boundaries */
+#define FM10K_SW_MAKE_ARRAY_FIELD(name_, v_) \
+			(((uint32_t)(v_) << (FM10K_SW_##name_##_lsb % 32)) & \
+			FM10K_SW_MASK32(FM10K_SW_##name_##_msb % 32, \
+			FM10K_SW_##name_##_lsb % 32))
+
+/* Does not support fields that cross 32-bit boundaries */
+#define FM10K_SW_REPLACE_ARRAY_FIELD(a_, name_, v_, a1_)	\
+			((a_)[FM10K_SW_##name_##_lsb / 32] = \
+			(((a1_)[FM10K_SW_##name_##_lsb / 32] & \
+			~FM10K_SW_MASK32(FM10K_SW_##name_##_msb % 32, \
+			FM10K_SW_##name_##_lsb % 32)) | \
+			FM10K_SW_MAKE_ARRAY_FIELD(name_, v_)))
+
+
+/*
+ * BAR0 registers
+ */
+/* Interrupt throttle timer selection values */
+#define	FM10K_SW_INT_TIMER_0			0
+#define	FM10K_SW_INT_TIMER_1			1
+#define	FM10K_SW_INT_TIMER_IMMEDIATE	2
+#define	FM10K_SW_INT_TIMER_DISABLED		3
+
+#define FM10K_SW_CTRL					FM10K_SW_REG_OFF(0x0)
+#define	FM10K_SW_CTRL_BAR4_ALLOWED		(1 << 2)
+#define FM10K_SW_CTRL_EXT				FM10K_SW_REG_OFF(0x1)
+#define FM10K_SW_CTRL_EXT_NS_DIS		(1 << 0)
+#define	FM10K_SW_CTRL_EXT_RO_DIS		(1 << 1)
+#define	FM10K_SW_CTRL_EXT_SWITCH_LOOPBACK	(1 << 2)
+#define FM10K_SW_EXVET					FM10K_SW_REG_OFF(0x2)
+#define FM10K_SW_GCR					FM10K_SW_REG_OFF(0x3)
+#define FM10K_SW_FACTPS					FM10K_SW_REG_OFF(0x4)
+#define FM10K_SW_GCR_EXT				FM10K_SW_REG_OFF(0x5)
+#define FM10K_SW_EICR					FM10K_SW_REG_OFF(0x6)
+#define	FM10K_SW_EICR_PCA_FAULT_SHIFT	0
+#define	FM10K_SW_EICR_PCA_FAULT			\
+			(1 << FM10K_SW_EICR_PCA_FAULT_SHIFT)
+#define	FM10K_SW_EICR_THI_FAULT_SHIFT	2
+#define	FM10K_SW_EICR_THI_FAULT			\
+			(1 << FM10K_SW_EICR_THI_FAULT_SHIFT)
+#define	FM10K_SW_EICR_FUM_FAULT_SHIFT	5
+#define	FM10K_SW_EICR_FUM_FAULT			\
+			(1 << FM10K_SW_EICR_FUM_FAULT_SHIFT)
+#define	FM10K_SW_EICR_MAILBOX_SHIFT		6
+#define	FM10K_SW_EICR_MAILBOX			\
+			(1 << FM10K_SW_EICR_MAILBOX_SHIFT)
+#define	FM10K_SW_EICR_SWITCH_READY_SHIFT	7
+#define	FM10K_SW_EICR_SWITCH_READY		\
+			(1 << FM10K_SW_EICR_SWITCH_READY_SHIFT)
+#define	FM10K_SW_EICR_SWITCH_NREADY_SHIFT	8
+#define	FM10K_SW_EICR_SWITCH_NREADY		\
+			(1 << FM10K_SW_EICR_SWITCH_NREADY_SHIFT)
+#define	FM10K_SW_EICR_SWITCH_INT_SHIFT	9
+#define	FM10K_SW_EICR_SWITCH_INT		\
+			(1 << FM10K_SW_EICR_SWITCH_INT_SHIFT)
+#define	FM10K_SW_EICR_SRAM_ERROR_SHIFT	10
+#define	FM10K_SW_EICR_SRAM_ERROR		\
+			(1 << FM10K_SW_EICR_SRAM_ERROR_SHIFT)
+#define	FM10K_SW_EICR_VFLR_SHIFT		11
+#define	FM10K_SW_EICR_VFLR				\
+			(1 << FM10K_SW_EICR_VFLR_SHIFT)
+#define	FM10K_SW_EICR_MAX_HOLD_TIME_SHIFT	12
+#define	FM10K_SW_EICR_MAX_HOLD_TIME		\
+			(1 << FM10K_SW_EICR_MAX_HOLD_TIME_SHIFT)
+#define FM10K_SW_EIMR			FM10K_SW_REG_OFF(0x7)
+#define	FM10K_SW_EIMR_DISABLE_ALL		0x55555555
+#define	FM10K_SW_EIMR_NO_CHANGE			0x0
+#define	FM10K_SW_EIMR_DISABLE			0x1
+#define	FM10K_SW_EIMR_ENABLE			0x2
+#define	FM10K_SW_EIMR_FIELD(i_, v_)		\
+			(FM10K_SW_EIMR_##v_ << (FM10K_SW_EICR_##i_##_SHIFT * 2))
+#define	FM10K_SW_EIMR_ENABLED(e_, i_)	\
+			((((e_) >> (FM10K_SW_EICR_##i_##_SHIFT * 2)) & 0x3) == \
+			FM10K_SW_EIMR_ENABLE)
+#define FM10K_SW_PCA_FAULT				FM10K_SW_REG_OFF(0x8)
+#define FM10K_SW_THI_FAULT				FM10K_SW_REG_OFF(0x10)
+#define FM10K_SW_FUM_FAULT				FM10K_SW_REG_OFF(0x1C)
+#define FM10K_SW_MAXHOLDQ(n_)			FM10K_SW_REG_OFF(0x20 + (n_))
+#define	FM10K_SW_MAXHOLDQ_ENTRIES		8
+#define FM10K_SW_SM_AREA				FM10K_SW_REG_OFF(0x28)
+#define FM10K_SW_DGLORTMAP(n_)			FM10K_SW_REG_OFF(0x30 + (n_))
+#define	FM10K_SW_DGLORTMAP_ENTRIES		8
+#define	FM10K_SW_DGLORTMAP_MATCH_ANY	0x00000000
+#define	FM10K_SW_DGLORTMAP_MATCH_NONE	0x0000ffff
+#define	FM10K_SW_DGLORTMAP_VALUE_lsb	0
+#define	FM10K_SW_DGLORTMAP_VALUE_msb	15
+#define	FM10K_SW_DGLORTMAP_MASK_lsb		16
+#define	FM10K_SW_DGLORTMAP_MASK_msb		31
+#define FM10K_SW_DGLORTDEC(n_)			FM10K_SW_REG_OFF(0x38 + (n_))
+#define	FM10K_SW_DGLORTDEC_Q_LENGTH_lsb	0
+#define	FM10K_SW_DGLORTDEC_Q_LENGTH_msb	3
+#define	FM10K_SW_DGLORTDEC_VSI_LENGTH_lsb	4
+#define	FM10K_SW_DGLORTDEC_VSI_LENGTH_msb	6
+#define	FM10K_SW_DGLORTDEC_VSI_BASE_lsb	7
+#define	FM10K_SW_DGLORTDEC_VSI_BASE_msb	13
+#define	FM10K_SW_DGLORTDEC_PC_LENGTH_lsb	14
+#define	FM10K_SW_DGLORTDEC_PC_LENGTH_msb	15
+#define	FM10K_SW_DGLORTDEC_Q_BASE_lsb	16
+#define	FM10K_SW_DGLORTDEC_Q_BASE_msb	23
+#define	FM10K_SW_DGLORTDEC_RSS_LENGTH_MAX	7
+#define	FM10K_SW_DGLORTDEC_RSS_LENGTH_lsb	24
+#define	FM10K_SW_DGLORTDEC_RSS_LENGTH_msb	26
+#define	FM10K_SW_DGLORTDEC_INNTER_RSS	(1 << 27)
+#define FM10K_SW_TUNNEL_CFG				FM10K_SW_REG_OFF(0x40)
+#define FM10K_SW_SWPRI_MAP(pri_)		FM10K_SW_REG_OFF(0x50 + (pri_))
+#define FM10K_SW_RSSRK(f_, n_)			\
+			FM10K_SW_REG_OFF(0x800 + 0x10 * (f_) + (n_))
+#define FM10K_SW_RSSRK_ENTRIES			10
+#define FM10K_SW_RETA(f_, n_)			\
+			FM10K_SW_REG_OFF(0x1000 + 0x20 * (f_) + (n_))
+#define FM10K_SW_RETA_ENTRIES			32
+#define FM10K_SW_RETA_ENTRY(e0_, e1_, e2_, e3_)	\
+			(((e0_) & 0xff) | \
+			(((e1_) & 0xff) << 8) | \
+			(((e2_) & 0xff) << 16) | \
+			(((e3_) & 0xff) << 24))
+#define FM10K_SW_TC_CREDIT(g_)			FM10K_SW_REG_OFF(0x2000 + (g_))
+#define FM10K_SW_TC_MAXCREDIT(g_)		FM10K_SW_REG_OFF(0x2040 + (g_))
+#define FM10K_SW_TC_RATE(g_)			FM10K_SW_REG_OFF(0x2080 + (g_))
+#define FM10K_SW_TC_RATE_STATUS			FM10K_SW_REG_OFF(0x20C0)
+#define FM10K_SW_PAUSE					FM10K_SW_REG_OFF(0x20C2)
+#define FM10K_SW_DMA_CTRL				FM10K_SW_REG_OFF(0x20C3)
+#define	FM10K_SW_DMA_CTRL_TX_ENABLE		(1 << 0)
+#define	FM10K_SW_DMA_CTRL_TX_HOST_PENDING	(1 << 1)
+#define	FM10K_SW_DMA_CTRL_TX_DATA		(1 << 2)
+#define	FM10K_SW_DMA_CTRL_TX_ACTIVE		(1 << 3)
+#define	FM10K_SW_DMA_CTRL_RX_ENABLE		(1 << 4)
+#define	FM10K_SW_DMA_CTRL_RX_HOST_PENDING	(1 << 5)
+#define	FM10K_SW_DMA_CTRL_RX_DATA		(1 << 6)
+#define	FM10K_SW_DMA_CTRL_RX_ACTIVE		(1 << 7)
+#define	FM10K_SW_DMA_CTRL_RX_DESC_SIZE_32	(1 << 8)
+#define	FM10K_SW_DMA_CTRL_MIN_MSS_lsb	9
+#define	FM10K_SW_DMA_CTRL_MIN_MSS_msb	22
+#define	FM10K_SW_DMA_CTRL_MAX_HOLD_TIME_lsb 23
+#define	FM10K_SW_DMA_CTRL_MAX_HOLD_TIME_msb 27
+#define	FM10K_SW_DMA_CTRL_DATA_PATH_RESET	(1 << 29)
+#define	FM10K_SW_DMA_CTRL_MAX_QS_lsb	30
+#define	FM10K_SW_DMA_CTRL_MAX_QS_msb	31
+#define	FM10K_SW_DMA_CTRL_MAX_QS_256	0
+#define	FM10K_SW_DMA_CTRL_MAX_QS_128	1
+#define	FM10K_SW_DMA_CTRL_MAX_QS_64		2
+#define FM10K_SW_DMA_CTRL2				FM10K_SW_REG_OFF(0x20C4)
+#define FM10K_SW_DTXTCPFLGL				FM10K_SW_REG_OFF(0x20C5)
+#define FM10K_SW_DTXTCPFLGH				FM10K_SW_REG_OFF(0x20C6)
+#define FM10K_SW_TPH_CTRL				FM10K_SW_REG_OFF(0x20C7)
+#define FM10K_SW_MRQC(f_)				\
+			FM10K_SW_REG_OFF(0x2100 + (f_))
+#define	FM10K_SW_MRQC_TCPIPV4			(1 << 0)
+#define	FM10K_SW_MRQC_IPV4				(1 << 1)
+#define	FM10K_SW_MRQC_IPV6				(1 << 4)
+#define	FM10K_SW_MRQC_TCPIPV6			(1 << 5)
+#define	FM10K_SW_MRQC_UDPIPV4			(1 << 6)
+#define	FM10K_SW_MRQC_UDPIPV6			(1 << 7)
+#define FM10K_SW_TQMAP(nvf_, vf_, vq_, vf1_, vq1_)	\
+			FM10K_SW_REG_OFF(0x2800 + \
+			(((nvf_) & ~0x7) ? \
+			((vf_) * 32 + ((vq_) & 0x1f)) : \
+			((vf1_) * 256 + (vq1_))))
+#define FM10K_SW_RQMAP(nvf_, vf_, vq_, vf1_, vq1_) \
+			FM10K_SW_REG_OFF(0x3000 + \
+			(((nvf_) & ~0x7) ? \
+			((vf_) * 32 + ((vq_) & 0x1f)) : \
+			((vf1_) * 256 + (vq1_))))
+#define FM10K_SW_STATS_TIMEOUT			FM10K_SW_REG_OFF(0x3800)
+#define FM10K_SW_STATS_UR				FM10K_SW_REG_OFF(0x3801)
+#define FM10K_SW_STATS_CA				FM10K_SW_REG_OFF(0x3802)
+#define FM10K_SW_STATS_UM				FM10K_SW_REG_OFF(0x3803)
+#define FM10K_SW_STATS_XEC				FM10K_SW_REG_OFF(0x3804)
+#define FM10K_SW_STATS_VLAN_DROP		FM10K_SW_REG_OFF(0x3805)
+#define FM10K_SW_STATS_LOOPBACK_DROP	FM10K_SW_REG_OFF(0x3806)
+#define FM10K_SW_STATS_NODESC_DROP		FM10K_SW_REG_OFF(0x3807)
+#define FM10K_SW_RRTIME_CFG				FM10K_SW_REG_OFF(0x3808)
+#define FM10K_SW_RRTIME_LIMIT(n_)		\
+			FM10K_SW_REG_OFF(0x380C + 0x40 * (n_))
+#define FM10K_SW_RRTIME_COUNT(n_)		\
+			FM10K_SW_REG_OFF(0x3810 + 0x40 * (n_))
+#define FM10K_SW_SYSTIME				FM10K_SW_REG_OFF(0x3814)
+#define FM10K_SW_SYSTIME0				FM10K_SW_REG_OFF(0x3816)
+#define FM10K_SW_SYSTIME_CFG			FM10K_SW_REG_OFF(0x3818)
+#define FM10K_SW_PFVFBME				FM10K_SW_REG_OFF(0x381A)
+#define FM10K_SW_PHYADDR				FM10K_SW_REG_OFF(0x381C)
+#define FM10K_SW_RDBAL(q_)				\
+			FM10K_SW_REG_OFF(0x4000 + 0x40 * (q_))
+#define FM10K_SW_RDBAH(q_)				\
+			FM10K_SW_REG_OFF(0x4001 + 0x40 * (q_))
+#define FM10K_SW_RDLEN(q_)				\
+			FM10K_SW_REG_OFF(0x4002 + 0x40 * (q_))
+#define FM10K_SW_TPH_RXCTRL(q_)			\
+			FM10K_SW_REG_OFF(0x4003 + 0x40 * (q_))
+#define	FM10K_SW_TPH_RXCTRL_DESC_TPHEN	(1 << 5)
+#define	FM10K_SW_TPH_RXCTRL_HEADER_TPHEN	(1 << 6)
+#define	FM10K_SW_TPH_RXCTRL_PAYLOAD_TPHEN	(1 << 7)
+#define	FM10K_SW_TPH_RXCTRL_DESC_READ_RO_EN	(1 << 9)
+#define	FM10K_SW_TPH_RXCTRL_DESC_WRITE_RO_EN (1 << 11)
+#define	FM10K_SW_TPH_RXCTRL_DATA_WRITE_RO_EN (1 << 13)
+#define	FM10K_SW_TPH_RXCTRL_REP_HEADER_RO_EN (1 << 15)
+#define FM10K_SW_RDH(q_)				\
+			FM10K_SW_REG_OFF(0x4004 + 0x40 * (q_))
+#define FM10K_SW_RDT(q_)				\
+			FM10K_SW_REG_OFF(0x4005 + 0x40 * (q_))
+#define	FM10K_SW_RDT_RDT_lsb			0
+#define	FM10K_SW_RDT_RDT_msb			15
+#define FM10K_SW_RXQCTL(q_)				\
+			FM10K_SW_REG_OFF(0x4006 + 0x40 * (q_))
+#define	FM10K_SW_RXQCTL_ENABLE			(1 << 0)
+#define	FM10K_SW_RXQCTL_VF_lsb			2
+#define	FM10K_SW_RXQCTL_VF_msb			7
+#define	FM10K_SW_RXQCTL_OWNED_BY_VF		(1 << 8)
+#define FM10K_SW_RXDCTL(q_)				\
+			FM10K_SW_REG_OFF(0x4007 + 0x40 * (q_))
+#define	FM10K_SW_RXDCTL_MAX_TIME_lsb	0
+#define	FM10K_SW_RXDCTL_MAX_TIME_msb	7
+#define	FM10K_SW_RXDCTL_WRITE_BACK_IMM	(1 << 8)
+#define	FM10K_SW_RXDCTL_DROP_ON_EMPTY	(1 << 9)
+#define	FM10K_SW_RXDCTL_WRITE_RSS_HASH	(1 << 10)
+#define FM10K_SW_RXINT(q_)				\
+			FM10K_SW_REG_OFF(0x4008 + 0x40 * (q_))
+#define	FM10K_SW_RXINT_INT_lsb			0
+#define	FM10K_SW_RXINT_INT_msb			7
+#define	FM10K_SW_RXINT_INT_TIMER_lsb	8
+#define	FM10K_SW_RXINT_INT_TIMER_msb	9
+#define FM10K_SW_SRRCTL(q_)				\
+			FM10K_SW_REG_OFF(0x4009 + 0x40 * (q_))
+#define	FM10K_SW_SRRCTL_BSIZE_PACKET_lsb	0
+#define	FM10K_SW_SRRCTL_BSIZE_PACKET_msb	7
+#define	FM10K_SW_SRRCTL_BSIZE_HEADER_lsb	8
+#define	FM10K_SW_SRRCTL_BSIZE_HEADER_msb	13
+#define	FM10K_SW_SRRCTL_DESC_TYPE_lsb	14
+#define	FM10K_SW_SRRCTL_DESC_TYPE_msb	15
+#define	FM10K_SW_SRRCTL_DESC_TYPE_NO_SPLIT	0
+#define	FM10K_SW_SRRCTL_DESC_TYPE_HDR_SPLIT	1
+#define	FM10K_SW_SRRCTL_DESC_TYPE_SIZE_SPLIT	2
+#define	FM10K_SW_SRRCTL_PSR_TYPE_lsb	16
+#define	FM10K_SW_SRRCTL_PSR_TYPE_msb	29
+#define	FM10K_SW_SRRCTL_LOOPBACK_SUPPRESS	(1 << 30)
+#define	FM10K_SW_SRRCTL_BUFFER_CHAINING_EN	(1 << 31)
+#define FM10K_SW_QPRC(q_)				\
+			FM10K_SW_REG_OFF(0x400A + 0x40 * (q_))
+#define FM10K_SW_QPRDC(q_)				\
+			FM10K_SW_REG_OFF(0x400B + 0x40 * (q_))
+#define FM10K_SW_QBRC_L(q_)				\
+			FM10K_SW_REG_OFF(0x400C + 0x40 * (q_))
+#define FM10K_SW_QBRC_H(q_)				\
+			FM10K_SW_REG_OFF(0x400D + 0x40 * (q_))
+#define FM10K_SW_RX_SGLORT(q_)			\
+			FM10K_SW_REG_OFF(0x400E + 0x40 * (q_))
+#define FM10K_SW_TDBAL(q_)				\
+			FM10K_SW_REG_OFF(0x8000 + 0x40 * (q_))
+#define FM10K_SW_TDBAH(q_)				\
+			FM10K_SW_REG_OFF(0x8001 + 0x40 * (q_))
+#define FM10K_SW_TDLEN(q_)				\
+			FM10K_SW_REG_OFF(0x8002 + 0x40 * (q_))
+#define FM10K_SW_TPH_TXCTRL(q_)			\
+			FM10K_SW_REG_OFF(0x8003 + 0x40 * (q_))
+#define	FM10K_SW_TPH_TXCTRL_DESC_TPHEN	(1 << 5)
+#define	FM10K_SW_TPH_TXCTRL_DESC_READ_RO_EN	(1 << 9)
+#define	FM10K_SW_TPH_TXCTRL_DESC_WRITE_RO_EN (1 << 11)
+#define	FM10K_SW_TPH_TXCTRL_DATA_READ_RO_EN	(1 << 13)
+#define FM10K_SW_TDH(q_)				\
+			FM10K_SW_REG_OFF(0x8004 + 0x40 * (q_))
+#define FM10K_SW_TDT(q_)				\
+			FM10K_SW_REG_OFF(0x8005 + 0x40 * (q_))
+#define	FM10K_SW_TDT_TDT_lsb			0
+#define	FM10K_SW_TDT_TDT_msb			15
+#define FM10K_SW_TXDCTL(q_)				\
+			FM10K_SW_REG_OFF(0x8006 + 0x40 * (q_))
+#define	FM10K_SW_TXDCTL_PTHRESH_lsb		0
+#define	FM10K_SW_TXDCTL_PTHRESH_msb		6
+#define	FM10K_SW_TXDCTL_HTHRESH_lsb		7
+#define	FM10K_SW_TXDCTL_HTHRESH_msb		13
+#define	FM10K_SW_TXDCTL_ENABLE			(1 << 14)
+#define	FM10K_SW_TXDCTL_MAX_TIME_lsb	16
+#define	FM10K_SW_TXDCTL_MAX_TIME_msb	27
+#define	FM10K_SW_TXDCTL_PUSH_DESC		(1 << 28)
+#define FM10K_SW_TXQCTL(q_)				\
+			FM10K_SW_REG_OFF(0x8007 + 0x40 * (q_))
+#define	FM10K_SW_TXQCTL_VF_lsb			0
+#define	FM10K_SW_TXQCTL_VF_msb			5
+#define	FM10K_SW_TXQCTL_OWNED_BY_VF		(1 << 6)
+#define	FM10K_SW_TXQCTL_PC_lsb			7
+#define	FM10K_SW_TXQCTL_PC_msb			9
+#define	FM10K_SW_TXQCTL_TC_lsb			10
+#define	FM10K_SW_TXQCTL_TC_msb			15
+#define	FM10K_SW_TXQCTL_VID_lsb			16
+#define	FM10K_SW_TXQCTL_VID_msb			27
+#define	FM10K_SW_TXQCTL_UNLIMITED_BW	(1 << 28)
+#define	FM10K_SW_TXQCTL_PUSH_MODE_DIS	(1 << 29)
+#define FM10K_SW_TXINT(q_)				\
+			FM10K_SW_REG_OFF(0x8008 + 0x40 * (q_))
+#define	FM10K_SW_TXINT_INT_lsb			0
+#define	FM10K_SW_TXINT_INT_msb			7
+#define	FM10K_SW_TXINT_INT_TIMER_lsb	8
+#define	FM10K_SW_TXINT_INT_TIMER_msb	9
+#define FM10K_SW_QPTC(q_)				\
+			FM10K_SW_REG_OFF(0x8009 + 0x40 * (q_))
+#define FM10K_SW_QBTC_L(q_)				\
+			FM10K_SW_REG_OFF(0x800A + 0x40 * (q_))
+#define FM10K_SW_QBTC_H(q_)				\
+			FM10K_SW_REG_OFF(0x800B + 0x40 * (q_))
+#define FM10K_SW_TQDLOC(q_)				\
+			FM10K_SW_REG_OFF(0x800C + 0x40 * (q_))
+#define	FM10K_SW_TQDLOC_BASE_lsb		0
+#define	FM10K_SW_TQDLOC_BASE_msb		15
+#define	FM10K_SW_TQDLOC_SIZE_lsb		16
+#define	FM10K_SW_TQDLOC_SIZE_msb		19
+#define	FM10K_SW_TQDLOC_SIZE_32	5
+#define	FM10K_SW_TQDLOC_SIZE_64	6
+#define	FM10K_SW_TQDLOC_SIZE_128		7
+#define FM10K_SW_TX_SGLORT(q_)			\
+			FM10K_SW_REG_OFF(0x800D + 0x40 * (q_))
+#define	FM10K_SW_TX_SGLORT_SGLORT_lsb	0
+#define	FM10K_SW_TX_SGLORT_SGLORT_msb	15
+#define FM10K_SW_PFVTCTL(q_)			\
+			FM10K_SW_REG_OFF(0x800E + 0x40 * (q_))
+#define FM10K_SW_TX_DESC(q_, d_, w_)	\
+			FM10K_SW_REG_OFF(0x40000 + \
+			0x400 * (q_) + 0x4 * (d_) + (w_))
+#define FM10K_SW_PBACL(n_)				\
+			FM10K_SW_REG_OFF(0x10000 + (n_))
+#define FM10K_SW_INT_MAP(n_)			\
+			FM10K_SW_REG_OFF(0x10080 + (n_))
+#define	FM10K_SW_INT_MAP_ENTRIES		8
+#define	FM10K_SW_INT_MAP_INDEX_MAILBOX	0
+#define	FM10K_SW_INT_MAP_INDEX_FAULT	1
+#define	FM10K_SW_INT_MAP_INDEX_SWITCH_UP_DOWN 2
+#define	FM10K_SW_INT_MAP_INDEX_SWITCH	3
+#define	FM10K_SW_INT_MAP_INDEX_SRAM		4
+#define	FM10K_SW_INT_MAP_INDEX_VFLR		5
+#define	FM10K_SW_INT_MAP_INDEX_MAX_HOLD_TIME 6
+#define	FM10K_SW_INT_MAP_INT_lsb		0
+#define	FM10K_SW_INT_MAP_INT_msb		7
+#define	FM10K_SW_INT_MAP_INT_TIMER_lsb	8
+#define	FM10K_SW_INT_MAP_INT_TIMER_msb	9
+#define FM10K_SW_MSIX_VECTOR(v_)		\
+			FM10K_SW_REG_OFF(0x11000 + 0x4 * (v_))
+#define FM10K_SW_INT_CTRL				\
+			FM10K_SW_REG_OFF(0x12000)
+#define	FM10K_SW_INT_CTRL_NEXT_VECTOR_lsb	0
+#define	FM10K_SW_INT_CTRL_NEXT_VECTOR_msb	9
+#define	FM10K_SW_INT_CTRL_ENABLE_MODERATOR	(1 << 10)
+#define FM10K_SW_ITR(v_)				\
+			FM10K_SW_REG_OFF(0x12400 + (v_))
+
+/*
+ * Interrupt throttle timer intervals in microseconds.  These provide the
+ * direct values for programming the ITR interval field when using a Gen3
+ * PCLK, otherwise they need to be scaled appropriately.
+ */
+#define FM10K_SW_ITR_INTERVAL_20K		50
+#define FM10K_SW_ITR_INTERVAL_40K		25
+#define FM10K_SW_ITR_INTERVAL_0_lsb		0
+#define FM10K_SW_ITR_INTERVAL_0_msb		11
+#define FM10K_SW_ITR_INTERVAL_1_lsb		12
+#define FM10K_SW_ITR_INTERVAL_1_msb		23
+#define FM10K_SW_ITR_TIMER_0_EXPIRED	(1 << 24)
+#define FM10K_SW_ITR_TIMER_1_EXPIRED	(1 << 25)
+#define FM10K_SW_ITR_PENDING_0			(1 << 26)
+#define FM10K_SW_ITR_PENDING_1			(1 << 27)
+#define FM10K_SW_ITR_PENDING_2			(1 << 28)
+#define FM10K_SW_ITR_AUTO_MASK			(1 << 29)
+#define FM10K_SW_ITR_MASK_lsb			30
+#define FM10K_SW_ITR_MASK_msb			31
+#define	FM10K_SW_ITR_MASK_R_ENABLED		0
+#define	FM10K_SW_ITR_MASK_R_BLOCKED		1
+#define	FM10K_SW_ITR_MASK_W_KEEP		0
+#define	FM10K_SW_ITR_MASK_W_BLOCK		1
+#define	FM10K_SW_ITR_MASK_W_ENABLE		2
+#define FM10K_SW_ITR2(v_)				\
+			FM10K_SW_REG_OFF(0x12800 + 0x2 * (v_))
+#define FM10K_SW_IP						\
+			FM10K_SW_REG_OFF(0x13000)
+#define FM10K_SW_IP_HOT_RESET			(1 << 0)
+#define FM10K_SW_IP_DEVICE_STATE_CHANGE	(1 << 1)
+#define FM10K_SW_IP_MAILBOX				(1 << 2)
+#define FM10K_SW_IP_VPD_REQUEST			(1 << 3)
+#define FM10K_SW_IP_SRAM_ERROR			(1 << 4)
+#define FM10K_SW_IP_PFLR				(1 << 5)
+#define FM10K_SW_IP_DATA_PATH_RESET		(1 << 6)
+#define FM10K_SW_IP_OUT_OF_RESET		(1 << 7)
+#define FM10K_SW_IP_NOT_IN_RESET		(1 << 8)
+#define FM10K_SW_IP_TIMEOUT				(1 << 9)
+#define FM10K_SW_IP_VFLR				(1 << 10)
+#define FM10K_SW_IM						\
+			FM10K_SW_REG_OFF(0x13001)
+#define FM10K_SW_IM_ALL					\
+			FM10K_SW_MASK32(10, 0)
+#define FM10K_SW_IM_HOT_RESET			(1 << 0)
+#define FM10K_SW_IM_DEVICE_STATE_CHANGE	(1 << 1)
+#define FM10K_SW_IM_MAILBOX				(1 << 2)
+#define FM10K_SW_IM_VPD_REQUEST			(1 << 3)
+#define FM10K_SW_IM_SRAM_ERROR			(1 << 4)
+#define FM10K_SW_IM_PFLR				(1 << 5)
+#define FM10K_SW_IM_DATA_PATH_RESET		(1 << 6)
+#define FM10K_SW_IM_OUT_OF_RESET		(1 << 7)
+#define FM10K_SW_IM_TIMEOUT				(1 << 9)
+#define FM10K_SW_IM_VFLR				(1 << 10)
+#define FM10K_SW_IB				FM10K_SW_REG_OFF(0x13002)
+#define FM10K_SW_SRAM_IP		FM10K_SW_REG_OFF(0x13003)
+#define FM10K_SW_SRAM_IM		FM10K_SW_REG_OFF(0x13004)
+#define FM10K_SW_VLAN_TABLE(f_)			\
+			FM10K_SW_REG_OFF(0x14000 + 0x80 * (f_))
+#define FM10K_SW_VLAN_TABLE_ENTRIES	128
+#define FM10K_SW_VLAN_TABLE_ENTRY(f_, n_) \
+			FM10K_SW_REG_OFF(0x14000 + 0x80 * (f_) + (n_))
+#define FM10K_SW_VLAN_TABLE_VLAN_ENTRY(f_, vl_)	\
+			FM10K_SW_REG_OFF(0x14000 + 0x80 * (f_) + ((vl_) >> 5))
+#define FM10K_SW_VLAN_TABLE_VLAN_BIT(vl_)	(1 << ((vl_) & 0x1f))
+#define FM10K_SW_MBMEM(n_)				\
+			FM10K_SW_REG_OFF(0x18000 + (n_))
+#define FM10K_SW_MBX(vf_)				\
+			FM10K_SW_REG_OFF(0x18800 + (vf_))
+#define FM10K_SW_MBICR(vf_)				\
+			FM10K_SW_REG_OFF(0x18840 + ((vf_) >> 5))
+#define FM10K_SW_GMBX			FM10K_SW_REG_OFF(0x18842)
+#define FM10K_SW_GMBX_GLOBAL_REQ			(1 << 1)
+#define FM10K_SW_GMBX_GLOBAL_ACK			(1 << 2)
+#define FM10K_SW_GMBX_PF_REQ_INTERRUPT	(1 << 3)
+#define FM10K_SW_GMBX_PF_ACK_INTERRUPT	(1 << 4)
+#define FM10K_SW_GMBX_PF_INTERRUPT_ENABLE_lsb	5
+#define FM10K_SW_GMBX_PF_INTERRUPT_ENABLE_msb	6
+#define	FM10K_SW_GMBX_INTERRUPT_NO_CHANGE	0
+#define	FM10K_SW_GMBX_INTERRUPT_ENABLE	1
+#define	FM10K_SW_GMBX_INTERRUPT_DISABLE	2
+#define FM10K_SW_GMBX_PF_REQ				(1 << 7)
+#define FM10K_SW_GMBX_PF_ACK				(1 << 8)
+#define FM10K_SW_GMBX_GLOBAL_REQ_INTERRUPT		(1 << 9)
+#define FM10K_SW_GMBX_GLOBAL_ACK_INTERRUPT		(1 << 10)
+#define FM10K_SW_GMBX_GLOBAL_INTERRUPT_ENABLE_lsb	11
+#define FM10K_SW_GMBX_GLOBAL_INTERRUPT_ENABLE_msb	12
+#define FM10K_SW_PFVFLRE		FM10K_SW_REG_OFF(0x18844)
+#define FM10K_SW_PFVFLREC		FM10K_SW_REG_OFF(0x18846)
+#define FM10K_SW_TEST_CFG0		FM10K_SW_REG_OFF(0x18849)
+#define FM10K_SW_INT_SRAM_CTRL	FM10K_SW_REG_OFF(0x18850)
+#define FM10K_SW_FUM_SRAM_CTRL	FM10K_SW_REG_OFF(0x18852)
+#define FM10K_SW_PCA_SRAM_CTRL	FM10K_SW_REG_OFF(0x18854)
+#define FM10K_SW_PP_SRAM_CTRL	FM10K_SW_REG_OFF(0x18858)
+#define FM10K_SW_PCW_SRAM_CTRL	FM10K_SW_REG_OFF(0x1885C)
+#define FM10K_SW_RHI_SRAM_CTRL1	FM10K_SW_REG_OFF(0x18872)
+#define FM10K_SW_RHI_SRAM_CTRL2	FM10K_SW_REG_OFF(0x18860)
+#define FM10K_SW_THI_SRAM_CTRL1	FM10K_SW_REG_OFF(0x18864)
+#define FM10K_SW_THI_SRAM_CTRL2	FM10K_SW_REG_OFF(0x18868)
+#define FM10K_SW_TIMEOUT_CFG	FM10K_SW_REG_OFF(0x1886B)
+#define FM10K_SW_LVMMC			FM10K_SW_REG_OFF(0x18880)
+#define FM10K_SW_LVMMI			FM10K_SW_REG_OFF(0x18881)
+#define FM10K_SW_HOST_MISC		FM10K_SW_REG_OFF(0x19000)
+#define FM10K_SW_HOST_LANE_CTRL	FM10K_SW_REG_OFF(0x19001)
+#define FM10K_SW_SERDES_CTRL(l_)		\
+			FM10K_SW_REG_OFF(0x19010 + 0x2 * (l_))
+
+/*
+ * BAR4 registers
+ */
+
+/*
+ * Access to non-master PEP registers via BAR4
+ */
+#define FM10K_SW_PCIE_GLOBAL(p_, r_)	\
+			(FM10K_SW_REG_OFF(((p_) + 1) << 20) | FM10K_SW_##r_)
+
+/*
+ * SBUS register fields for use with both the PCIE and EPL SBUS interfaces.
+ */
+#define FM10K_SW_SBUS_CFG_SBUS_CONTROLLER_RESET	(1 << 0)
+#define FM10K_SW_SBUS_CFG_ROM_ENABLE			(1 << 1)
+#define FM10K_SW_SBUS_CFG_ROM_BUSY				(1 << 2)
+#define FM10K_SW_SBUS_CFG_BIST_DONE_PASS		(1 << 3)
+#define FM10K_SW_SBUS_CFG_BIST_DONE_FAIL		(1 << 4)
+
+#define FM10K_SW_SBUS_COMMAND_REGISTER_lsb		0
+#define FM10K_SW_SBUS_COMMAND_REGISTER_msb		7
+#define FM10K_SW_SBUS_COMMAND_ADDRESS_lsb		8
+#define FM10K_SW_SBUS_COMMAND_ADDRESS_msb		15
+#define FM10K_SW_SBUS_COMMAND_OP_lsb			16
+#define FM10K_SW_SBUS_COMMAND_OP_msb			23
+#define FM10K_SW_SBUS_OP_RESET					0x20
+#define FM10K_SW_SBUS_OP_WRITE					0x21
+#define FM10K_SW_SBUS_OP_READ					0x22
+#define FM10K_SW_SBUS_COMMAND_EXECUTE			(1 << 24)
+#define FM10K_SW_SBUS_COMMAND_BUSY				(1 << 25)
+#define FM10K_SW_SBUS_COMMAND_RESULT_CODE_lsb	26
+#define FM10K_SW_SBUS_COMMAND_RESULT_CODE_msb	28
+#define FM10K_SW_SBUS_RESULT_RESET				0x00
+#define FM10K_SW_SBUS_RESULT_WRITE				0x01
+#define FM10K_SW_SBUS_RESULT_READ				0x04
+
+#define FM10K_SW_SBUS_ADDR_EPL_RMON2			1
+#define FM10K_SW_SBUS_ADDR_EPL_LANE(e_, l_)		(4 * (e_) + (l_) + 2)
+#define FM10K_SW_SBUS_ADDR_EPL_SERDES(s_)		((s_) + 2)
+#define FM10K_SW_SBUS_ADDR_EPL_RMON3			38
+#define FM10K_SW_SBUS_ADDR_EPL_PMRO				39
+
+/* Common to both EPL and PCIE
+ */
+#define FM10K_SW_SBUS_ADDR_SPICO				253
+#define FM10K_SW_SBUS_ADDR_SBUS_CONTROLLER		254
+#define FM10K_SW_SBUS_ADDR_BROADCAST			0xFF
+
+
+#define FM10K_SW_MGMT_BASE						\
+						FM10K_SW_REG_OFF(0x000000)
+#define FM10K_SW_MGMT_REG(wo_)					\
+			(FM10K_SW_MGMT_BASE + FM10K_SW_REG_OFF(wo_))
+
+#define FM10K_SW_FATAL_CODE			FM10K_SW_MGMT_REG(0x0)
+#define FM10K_SW_LAST_FATAL_CODE	FM10K_SW_MGMT_REG(0x1)
+#define FM10K_SW_FATAL_COUNT		FM10K_SW_MGMT_REG(0x2)
+#define FM10K_SW_SOFT_RESET			FM10K_SW_MGMT_REG(0x3)
+#define FM10K_SW_SOFT_RESET_COLD_RESET		(1 << 0)
+#define FM10K_SW_SOFT_RESET_EPL_RESET		(1 << 1)
+#define FM10K_SW_SOFT_RESET_SWITCH_RESET	(1 << 2)
+#define FM10K_SW_SOFT_RESET_SWITCH_READY	(1 << 3)
+#define FM10K_SW_SOFT_RESET_PCIE_RESET(p_)	(1 << ((p_) + 4))
+#define FM10K_SW_SOFT_RESET_PCIE_ACTIVE(p_) (1 << ((p_) + 13))
+#define FM10K_SW_DEVICE_CFG			FM10K_SW_MGMT_REG(0x4)
+#define FM10K_SW_DEVICE_CFG_PCIE_MODE_PAIRS		4
+#define FM10K_SW_DEVICE_CFG_PCIE_MODE_2X4(p_)	(1 << (p_))
+#define FM10K_SW_DEVICE_CFG_PCIE_100G_DIS		(1 << 4)
+#define FM10K_SW_DEVICE_CFG_FEATURE_lsb			5
+#define FM10K_SW_DEVICE_CFG_FEATURE_msb			6
+#define	FM10K_SW_DEVICE_CFG_PCIE_FULL			0
+#define	FM10K_SW_DEVICE_CFG_PCIE_HALF			1
+#define	FM10K_SW_DEVICE_CFG_PCIE_BASIC			2
+#define FM10K_SW_DEVICE_CFG_PCIE_EN(p_)			(1 << (7 + (p_)))
+#define FM10K_SW_RESET_CFG				FM10K_SW_MGMT_REG(0x5)
+#define FM10K_SW_WATCHDOG_CFG			FM10K_SW_MGMT_REG(0x6)
+#define FM10K_SW_MGMT_SCRATCH(n_)		FM10K_SW_MGMT_REG(0x8 + (n_))
+#define FM10K_SW_VITAL_PRODUCT_DATA		FM10K_SW_MGMT_REG(0x304)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT FM10K_SW_MGMT_REG(0x400)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE_BSM_lsb64	0
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE_BSM_msb64	8
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE_BSM(n_)	(1ULL << (n_))
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE_lsb64		9
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE_msb64		17
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PCIE(n_)		\
+			(1ULL << ((n_) + 9))
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_EPL_lsb64		18
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_EPL_msb64		26
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_EPL(n_)		\
+			(1ULL << ((n_) + 18))
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_TUNNEL_lsb64	27
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_TUNNEL_msb64	28
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_TUNNEL(n_)		\
+			(1ULL << ((n_) + 27))
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_CORE			(1ULL << 29)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_SOFTWARE		(1ULL << 30)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_GPIO			(1ULL << 31)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_I2C			(1ULL << 32)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_MDIO			(1ULL << 33)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_CRM			(1ULL << 34)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_FH_TAIL		(1ULL << 35)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_FH_HEAD		(1ULL << 36)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_SBUS_EPL		(1ULL << 37)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_SBUS_PCIE		(1ULL << 38)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_PINS			(1ULL << 39)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_FIBM			(1ULL << 40)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_BSM			(1ULL << 41)
+#define FM10K_SW_GLOBAL_INTERRUPT_DETECT_XCLK			(1ULL << 42)
+#define FM10K_SW_INTERRUPT_MASK_INT			\
+						FM10K_SW_MGMT_REG(0x402)
+#define FM10K_SW_INTERRUPT_MASK_PCIE(p_)				\
+					FM10K_SW_MGMT_REG(0x420 + 0x2 * (p_))
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE_BSM_lsb64		0
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE_BSM_msb64		8
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE_BSM(n_)		(1ULL << (n_))
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE_lsb64			9
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE_msb64			17
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PCIE(n_)			\
+			(1ULL << ((n_) + 9))
+#define FM10K_SW_INTERRUPT_MASK_PCIE_EPL_lsb64			18
+#define FM10K_SW_INTERRUPT_MASK_PCIE_EPL_msb64			26
+#define FM10K_SW_INTERRUPT_MASK_PCIE_EPL(n_)			\
+			(1ULL << ((n_) + 18))
+#define FM10K_SW_INTERRUPT_MASK_PCIE_TUNNEL_lsb64		27
+#define FM10K_SW_INTERRUPT_MASK_PCIE_TUNNEL_msb64		28
+#define FM10K_SW_INTERRUPT_MASK_PCIE_TUNNEL(n_)			\
+			(1ULL << ((n_) + 27))
+#define FM10K_SW_INTERRUPT_MASK_PCIE_CORE		(1ULL << 29)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_SOFTWARE	(1ULL << 30)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_GPIO		(1ULL << 31)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_I2C		(1ULL << 32)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_MDIO		(1ULL << 33)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_CRM		(1ULL << 34)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_FH_TAIL	(1ULL << 35)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_FH_HEAD	(1ULL << 36)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_SBUS_EPL	(1ULL << 37)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_SBUS_PCIE	(1ULL << 38)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_PINS		(1ULL << 39)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_FIBM		(1ULL << 40)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_BSM		(1ULL << 41)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_XCLK		(1ULL << 42)
+#define FM10K_SW_INTERRUPT_MASK_PCIE_ALL		FM10K_SW_MASK64(42, 0)
+#define FM10K_SW_INTERRUPT_MASK_FIBM			FM10K_SW_MGMT_REG(0x440)
+#define FM10K_SW_INTERRUPT_MASK_BSM		FM10K_SW_MGMT_REG(0x442)
+#define FM10K_SW_CORE_INTERRUPT_DETECT	FM10K_SW_MGMT_REG(0x444)
+#define FM10K_SW_CORE_INTERRUPT_MASK	FM10K_SW_MGMT_REG(0x445)
+#define FM10K_SW_SRAM_ERR_IP			FM10K_SW_MGMT_REG(0x446)
+#define FM10K_SW_SRAM_ERR_IM			FM10K_SW_MGMT_REG(0x448)
+#define FM10K_SW_PINS_STAT				FM10K_SW_MGMT_REG(0x44A)
+#define FM10K_SW_PINS_IP				FM10K_SW_MGMT_REG(0x44B)
+#define FM10K_SW_PINS_IM				FM10K_SW_MGMT_REG(0x44C)
+#define FM10K_SW_SW_IP					FM10K_SW_MGMT_REG(0x44D)
+#define FM10K_SW_SW_IM					FM10K_SW_MGMT_REG(0x44E)
+#define FM10K_SW_SW_TEST_AND_SET		FM10K_SW_MGMT_REG(0x44F)
+#define FM10K_SW_LSM_CLKOBS_CTRL		FM10K_SW_MGMT_REG(0x450)
+#define FM10K_SW_CHIP_VERSION			FM10K_SW_MGMT_REG(0x452)
+#define FM10K_SW_BSM_SCRATCH(n_)		FM10K_SW_MGMT_REG(0x800 + (n_))
+#define FM10K_SW_BSM_CTRL				FM10K_SW_MGMT_REG(0xC00)
+#define FM10K_SW_BSM_ARGS				FM10K_SW_MGMT_REG(0xC01)
+#define FM10K_SW_BSM_ADDR_OFFSET(n_)	FM10K_SW_MGMT_REG(0xC04 + (n_))
+#define FM10K_SW_BSM_COUNTER(n_)		FM10K_SW_MGMT_REG(0xC08 + (n_))
+#define FM10K_SW_BSM_SRAM_CTRL			FM10K_SW_MGMT_REG(0xC0A)
+#define FM10K_SW_BSM_IP					FM10K_SW_MGMT_REG(0xC0B)
+#define FM10K_SW_BSM_IM					FM10K_SW_MGMT_REG(0xC0C)
+#define FM10K_SW_PIN_STRAP_STAT			FM10K_SW_MGMT_REG(0xC0D)
+#define FM10K_SW_FUSE_DATA_0			FM10K_SW_MGMT_REG(0xC0E)
+#define FM10K_SW_FUSE_SKU_lsb			11
+#define FM10K_SW_FUSE_SKU_msb			15
+#define FM10K_SW_FUSE_SKU_FM10840		0
+#define FM10K_SW_FUSE_SKU_FM10420		1
+#define FM10K_SW_FUSE_SKU_FM10064		2
+#define FM10K_SW_FUSE_DATA_1			FM10K_SW_MGMT_REG(0xC0F)
+#define FM10K_SW_BIST_CTRL				FM10K_SW_MGMT_REG(0xC10)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_PCIE(p_)	(1ULL << (p_))
+#define FM10K_SW_BIST_CTRL_BIST_RUN_EPL			(1ULL << 9)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_FABRIC		(1ULL << 10)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_TUNNEL		(1ULL << 11)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_BSM			(1ULL << 12)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_CRM			(1ULL << 13)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_FIBM		(1ULL << 14)
+#define FM10K_SW_BIST_CTRL_BIST_RUN_SBM			(1ULL << 15)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_PCIE(p_)	(1ULL << (p_))
+#define FM10K_SW_BIST_CTRL_BIST_MODE_EPL		(1ULL << 41)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_FABRIC		(1ULL << 42)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_TUNNEL		(1ULL << 43)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_BSM		(1ULL << 44)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_CRM		(1ULL << 45)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_FIBM		(1ULL << 46)
+#define FM10K_SW_BIST_CTRL_BIST_MODE_SBM		(1ULL << 47)
+#define FM10K_SW_REI_CTRL			FM10K_SW_MGMT_REG(0xC12)
+#define FM10K_SW_REI_STAT			FM10K_SW_MGMT_REG(0xC13)
+#define FM10K_SW_GPIO_CFG			FM10K_SW_MGMT_REG(0xC15)
+#define FM10K_SW_GPIO_DATA			FM10K_SW_MGMT_REG(0xC16)
+#define FM10K_SW_GPIO_IP			FM10K_SW_MGMT_REG(0xC17)
+#define FM10K_SW_GPIO_IM			FM10K_SW_MGMT_REG(0xC18)
+#define FM10K_SW_I2C_CFG			FM10K_SW_MGMT_REG(0xC19)
+#define FM10K_SW_I2C_CFG_SLAVE_ENABLE			(1 << 0)
+#define FM10K_SW_I2C_CFG_ADDR_lsb				1
+#define FM10K_SW_I2C_CFG_ADDR_msb				7
+#define FM10K_SW_I2C_CFG_DIVIDER_lsb			8
+#define FM10K_SW_I2C_CFG_DIVIDER_msb			19
+#define	FM10K_SW_I2C_CFG_DIVIDER_100_KHZ		52
+#define	FM10K_SW_I2C_CFG_DIVIDER_400_KHZ		10
+#define FM10K_SW_I2C_CFG_INTERRUPT_MASK			(1 << 20)
+#define FM10K_SW_I2C_CFG_DEBOUNCE_FILTER_COUNT_LIMIT_lsb 21
+#define FM10K_SW_I2C_CFG_DEBOUNCE_FILTER_COUNT_LIMIT_msb 27
+#define FM10K_SW_I2C_DATA(n_)	FM10K_SW_MGMT_REG(0xC1C + (n_))
+#define FM10K_SW_I2C_CTRL		FM10K_SW_MGMT_REG(0xC20)
+#define FM10K_SW_I2C_CTRL_ADDR_lsb				0
+#define FM10K_SW_I2C_CTRL_ADDR_msb				7
+#define FM10K_SW_I2C_CTRL_COMMAND_lsb			8
+#define FM10K_SW_I2C_CTRL_COMMAND_msb			9
+#define	FM10K_SW_I2C_COMMAND_NULL				0
+#define	FM10K_SW_I2C_COMMAND_WR					1
+#define	FM10K_SW_I2C_COMMAND_WR_RD				2
+#define	FM10K_SW_I2C_COMMAND_RD					3
+#define FM10K_SW_I2C_CTRL_LENGTH_W_lsb			10
+#define FM10K_SW_I2C_CTRL_LENGTH_W_msb			13
+#define FM10K_SW_I2C_CTRL_LENGTH_R_lsb			14
+#define FM10K_SW_I2C_CTRL_LENGTH_R_msb			17
+#define FM10K_SW_I2C_CTRL_LENGTH_SENT_lsb		18
+#define FM10K_SW_I2C_CTRL_LENGTH_SENT_msb		21
+#define FM10K_SW_I2C_CTRL_COMMAND_COMPLETED_lsb 22
+#define FM10K_SW_I2C_CTRL_COMMAND_COMPLETED_msb 25
+#define	FM10K_SW_I2C_COMPLETION_RUNNING			0
+#define	FM10K_SW_I2C_COMPLETION_NORMAL			1
+#define	FM10K_SW_I2C_COMPLETION_PREMATURE		2
+#define	FM10K_SW_I2C_COMPLETION_NO_DEVICE		3
+#define	FM10K_SW_I2C_COMPLETION_TIMEOUT			4
+#define	FM10K_SW_I2C_COMPLETION_LOST_ARB		5
+#define	FM10K_SW_I2C_COMPLETION_BUS_WAIT		6
+#define	FM10K_SW_I2C_COMPLETION_INVALID			7
+#define FM10K_SW_I2C_CTRL_INTERRUPT_PENDING		(1 << 26)
+#define FM10K_SW_MDIO_CFG		FM10K_SW_MGMT_REG(0xC22)
+#define FM10K_SW_MDIO_DATA		FM10K_SW_MGMT_REG(0xC23)
+#define FM10K_SW_MDIO_CTRL		FM10K_SW_MGMT_REG(0xC24)
+#define FM10K_SW_SPI_TX_DATA	FM10K_SW_MGMT_REG(0xC26)
+#define FM10K_SW_SPI_RX_DATA	FM10K_SW_MGMT_REG(0xC27)
+#define FM10K_SW_SPI_HEADER		FM10K_SW_MGMT_REG(0xC28)
+#define FM10K_SW_SPI_CTRL		FM10K_SW_MGMT_REG(0xC29)
+#define FM10K_SW_LED_CFG		FM10K_SW_MGMT_REG(0xC2B)
+#define FM10K_SW_SCAN_DATA_IN	FM10K_SW_MGMT_REG(0xC2D)
+#define FM10K_SW_SCAN_DATA_IN_SCAN_DATA_lsb		0
+#define FM10K_SW_SCAN_DATA_IN_SCAN_DATA_msb		24
+#define FM10K_SW_SCAN_DATA_IN_SHIFT_IN			(1 << 25)
+#define FM10K_SW_SCAN_DATA_IN_SHIFT_OUT			(1 << 26)
+#define FM10K_SW_SCAN_DATA_IN_UPDATE_NODES		(1 << 27)
+#define FM10K_SW_SCAN_DATA_IN_INJECT			(1 << 28)
+#define FM10K_SW_SCAN_DATA_IN_DRAIN				(1 << 29)
+#define FM10K_SW_SCAN_DATA_IN_PASSTHRU			(1 << 30)
+#define FM10K_SW_SCAN_DATA_IN_SINGLE			(1 << 31)
+#define FM10K_SW_CRM_DATA(m_, n_)		\
+			FM10K_SW_MGMT_REG(0x1000 + 0x2 * (m_) + (n_))
+#define FM10K_SW_CRM_CTRL			FM10K_SW_MGMT_REG(0x2000)
+#define FM10K_SW_CRM_STATUS			FM10K_SW_MGMT_REG(0x2001)
+#define FM10K_SW_CRM_TIME			FM10K_SW_MGMT_REG(0x2002)
+#define FM10K_SW_CRM_SRAM_CTRL		FM10K_SW_MGMT_REG(0x2004)
+#define FM10K_SW_CRM_IP				FM10K_SW_MGMT_REG(0x2008)
+#define FM10K_SW_CRM_IM				FM10K_SW_MGMT_REG(0x200C)
+#define FM10K_SW_CRM_COMMAND(n_)	FM10K_SW_MGMT_REG(0x2080 + 0x2 * (n_))
+#define FM10K_SW_CRM_REGISTER(n_)	FM10K_SW_MGMT_REG(0x2100 + 0x2 * (n_))
+#define FM10K_SW_CRM_PERIOD(n_)		FM10K_SW_MGMT_REG(0x2180 + 0x2 * (n_))
+#define FM10K_SW_CRM_PARAM(n_)		FM10K_SW_MGMT_REG(0x2200 + (n_))
+#define FM10K_SW_PLL_PCIE_CTRL		FM10K_SW_MGMT_REG(0x2241)
+#define FM10K_SW_PLL_PCIE_STAT		FM10K_SW_MGMT_REG(0x2242)
+#define FM10K_SW_SBUS_PCIE_CFG		FM10K_SW_MGMT_REG(0x2243)
+#define FM10K_SW_SBUS_PCIE_COMMAND	FM10K_SW_MGMT_REG(0x2244)
+#define FM10K_SW_SBUS_PCIE_REQUEST	FM10K_SW_MGMT_REG(0x2245)
+#define FM10K_SW_SBUS_PCIE_RESPONSE	FM10K_SW_MGMT_REG(0x2246)
+#define FM10K_SW_SBUS_PCIE_SPICO_IN	FM10K_SW_MGMT_REG(0x2247)
+#define FM10K_SW_SBUS_PCIE_SPICO_OUT FM10K_SW_MGMT_REG(0x2248)
+#define FM10K_SW_SBUS_PCIE_IP		FM10K_SW_MGMT_REG(0x2249)
+#define FM10K_SW_SBUS_PCIE_IM		FM10K_SW_MGMT_REG(0x224A)
+#define FM10K_SW_MGMT_SYSTIME_CFG	FM10K_SW_MGMT_REG(0x224C)
+#define FM10K_SW_MGMT_SYSTIME		FM10K_SW_MGMT_REG(0x224E)
+#define FM10K_SW_MGMT_SYSTIME0		FM10K_SW_MGMT_REG(0x2250)
+#define FM10K_SW_SYSTIME_PULSE_(n_)	FM10K_SW_MGMT_REG(0x2252 + (n_))
+#define FM10K_SW_SYSTIME_CAPTURE_LO(n_) FM10K_SW_MGMT_REG(0x2258 + 0x2 * (n_))
+#define FM10K_SW_SYSTIME_CAPTURE_HI(n_) \
+				FM10K_SW_MGMT_REG(0x2258 + 0x2 * (n_) + 0x1)
+#define FM10K_SW_PCIE_XPLL_CTRL		FM10K_SW_MGMT_REG(0x3000)
+#define FM10K_SW_PCIE_CLK_CTRL		FM10K_SW_MGMT_REG(0x3001)
+#define FM10K_SW_PCIE_CLK_CTRL2		FM10K_SW_MGMT_REG(0x3002)
+#define FM10K_SW_PCIE_CLKMON_RATIO_CFG	FM10K_SW_MGMT_REG(0x3003)
+#define FM10K_SW_PCIE_CLKMON_TOLERANCE_CFG	FM10K_SW_MGMT_REG(0x3004)
+#define FM10K_SW_PCIE_CLKMON_DEADLINES_CFG	FM10K_SW_MGMT_REG(0x3005)
+#define FM10K_SW_PCIE_CLK_STAT		FM10K_SW_MGMT_REG(0x3006)
+#define FM10K_SW_PCIE_CLK_IP		FM10K_SW_MGMT_REG(0x3007)
+#define FM10K_SW_PCIE_CLK_IM		FM10K_SW_MGMT_REG(0x3008)
+#define FM10K_SW_PCIE_WARM_RESET_DELAY	FM10K_SW_MGMT_REG(0x3009)
+#define FM10K_SW_EPL_BASE			FM10K_SW_REG_OFF(0x0E0000)
+#define FM10K_SW_EPL_PORT_REG(p_, r_) \
+		(FM10K_SW_EPL_BASE + FM10K_SW_REG_OFF(0x400 * (p_) + (r_)))
+#define FM10K_SW_EPL_LANE_REG(p_, l_, r_) \
+			FM10K_SW_EPL_PORT_REG((p_), 0x80 * (l_) + (r_))
+
+/* EPL enumerated types
+ */
+#define FM10K_SW_EPL_QPL_MODE_XX_XX_XX_XX		0
+#define FM10K_SW_EPL_QPL_MODE_L1_L1_L1_L1		1
+#define FM10K_SW_EPL_QPL_MODE_XX_XX_XX_L4		2
+#define FM10K_SW_EPL_QPL_MODE_XX_XX_L4_XX		3
+#define FM10K_SW_EPL_QPL_MODE_XX_L4_XX_XX		4
+#define FM10K_SW_EPL_QPL_MODE_L4_XX_XX_XX		5
+#define FM10K_SW_EPL_PCS_SEL_DISABLE			0
+#define FM10K_SW_EPL_PCS_SEL_AN_73				1
+#define FM10K_SW_EPL_PCS_SEL_SGMII_10			2
+#define FM10K_SW_EPL_PCS_SEL_SGMII_100			3
+#define FM10K_SW_EPL_PCS_SEL_SGMII_1000			4
+#define FM10K_SW_EPL_PCS_SEL_1000BASEX			5
+#define FM10K_SW_EPL_PCS_SEL_10GBASER			6
+#define FM10K_SW_EPL_PCS_SEL_40GBASER			7
+#define FM10K_SW_EPL_PCS_SEL_100GBASER			8
+
+#define FM10K_SW_LANE_OVERRIDE_NORMAL			0
+#define FM10K_SW_LANE_OVERRIDE_FORCE_GOOD		1
+#define FM10K_SW_LANE_OVERRIDE_FORCE_BAD		2
+
+#define FM10K_SW_TX_MAX_FCS_MODE_PASSTHRU		0
+#define FM10K_SW_TX_MAX_FCS_MODE_PASSSTHRU_CHECK	1
+#define FM10K_SW_TX_MAX_FCS_MODE_REPLACE_GOOD	2
+#define FM10K_SW_TX_MAX_FCS_MODE_REPLACE_BAD	3
+#define FM10K_SW_TX_MAX_FCS_MODE_REPLACE_NORMAL	4
+
+#define FM10K_SW_TX_MAC_DRAIN_MODE_DRAIN_DRAIN	0
+#define FM10K_SW_TX_MAC_DRAIN_MODE_DRAIN_NORMAL	1
+#define FM10K_SW_TX_MAC_DRAIN_MODE_HOLD_NORMAL	2
+#define FM10K_SW_TX_MAC_DRAIN_MODE_HOLD_HOLD	3
+
+#define FM10K_SW_TX_MAC_FAULT_MODE_NORMAL				0
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_IDLE			1
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_LOCAL_FAULT	2
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_REMOTE_FAULT	3
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_LINK_INTERRUPTION	4
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_OK				5
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_ERROR			6
+#define FM10K_SW_TX_MAC_FAULT_MODE_FORCE_USER_VAL		7
+
+#define FM10K_SW_EPL_IP(p_)		FM10K_SW_EPL_PORT_REG((p_), 0x300)
+#define FM10K_SW_EPL_IP_AN_PORT_INTERRUPT_lsb	0
+#define FM10K_SW_EPL_IP_AN_PORT_INTERRUPT_msb	3
+#define FM10K_SW_EPL_IP_AN_PORT_INTERRUPT(n_)	(1 << ((n_) + 0))
+#define FM10K_SW_EPL_IP_LINK_PORT_INTERRUPT_lsb	4
+#define FM10K_SW_EPL_IP_LINK_PORT_INTERRUPT_msb	7
+#define FM10K_SW_EPL_IP_LINK_PORT_INTERRUPT(n_)	(1 << ((n_) + 4))
+#define FM10K_SW_EPL_IP_SERDES_INTERRUPT_lsb	8
+#define FM10K_SW_EPL_IP_SERDES_INTERRUPT_msb	11
+#define FM10K_SW_EPL_IP_SERDES_INTERRUPT(n_)	(1 << ((n_) + 8))
+#define FM10K_SW_EPL_IP_ERROR_INTERRUPT			(1 << 12)
+#define FM10K_SW_EPL_ERROR_IP(p_)	FM10K_SW_EPL_PORT_REG((p_), 0x301)
+#define FM10K_SW_EPL_ERROR_IM(p_)	FM10K_SW_EPL_PORT_REG((p_), 0x302)
+#define FM10K_SW_EPL_ERROR_IM_ALL	FM10K_SW_MASK32(8, 0)
+#define FM10K_SW_EPL_BIST_STATUS(p_) FM10K_SW_EPL_PORT_REG((p_), 0x303)
+#define FM10K_SW_EPL_CFG_A(p_)		FM10K_SW_EPL_PORT_REG((p_), 0x304)
+#define FM10K_SW_EPL_CFG_A_SPEED_UP				(1 << 0)
+#define FM10K_SW_EPL_CFG_A_TIMEOUT_lsb			1
+#define FM10K_SW_EPL_CFG_A_TIMEOUT_msb			6
+#define FM10K_SW_EPL_CFG_A_ACTIVE(p_)			(1 << ((p_) + 7))
+#define FM10K_SW_EPL_CFG_A_ACTIVE_QUAD			(0xf << 7)
+#define FM10K_SW_EPL_CFG_A_SKEW_TOLERANCE_lsb	11
+#define FM10K_SW_EPL_CFG_A_SKEW_TOLERANCE_msb	16
+#define FM10K_SW_EPL_CFG_B(p_)		FM10K_SW_EPL_PORT_REG((p_), 0x305)
+#define FM10K_SW_EPL_CFG_B_PCS_SEL_lsb(p_)		((p_) * 4)
+#define FM10K_SW_EPL_CFG_B_PCS_SEL_msb(p_)		(((p_) * 4) + 3)
+#define FM10K_SW_EPL_CFG_B_QPL_MODE_lsb			16
+#define FM10K_SW_EPL_CFG_B_QPL_MODE_msb			18
+#define FM10K_SW_EPL_LED_STATUS(p_)	FM10K_SW_EPL_PORT_REG((p_), 0x306)
+#define FM10K_SW_EPL_LED_STATUS_PORT_RESET(n_)	(1 << ((n_) * 6 + 0))
+#define FM10K_SW_EPL_LED_STATUS_PORT_LINK_UP(n_)	(1 << ((n_) * 6 + 1))
+#define FM10K_SW_EPL_LED_STATUS_PORT_LOCAL_FAULT(n_) \
+						(1 << ((n_) * 6 + 2))
+#define FM10K_SW_EPL_LED_STATUS_PORT_REMOTE_FAULT(n_) \
+						(1 << ((n_) * 6 + 3))
+#define FM10K_SW_EPL_LED_STATUS_PORT_TRANSMITTING(n_) \
+						(1 << ((n_) * 6 + 4))
+#define FM10K_SW_EPL_LED_STATUS_PORT_RECEIVING(n_)	\
+						(1 << ((n_) * 6 + 5))
+#define FM10K_SW_EPL_FIFO_ERROR_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x307)
+#define FM10K_SW_EPL_TX_FIFO_RD_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x308)
+#define FM10K_SW_EPL_TX_FIFO_WR_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x309)
+#define FM10K_SW_EPL_TX_FIFO_A_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30A)
+#define FM10K_SW_EPL_TX_FIFO_B_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30B)
+#define FM10K_SW_EPL_TX_FIFO_C_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30C)
+#define FM10K_SW_EPL_TX_FIFO_D_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30D)
+#define FM10K_SW_EPL_RX_FIFO_RD_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30E)
+#define FM10K_SW_EPL_RX_FIFO_WR_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x30F)
+#define FM10K_SW_EPL_RX_FIFO_A_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x310)
+#define FM10K_SW_EPL_RX_FIFO_B_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x311)
+#define FM10K_SW_EPL_RX_FIFO_C_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x312)
+#define FM10K_SW_EPL_RX_FIFO_D_STATUS(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x313)
+#define FM10K_SW_PCS_ML_BASER_CFG(p_)		\
+				FM10K_SW_EPL_PORT_REG((p_), 0x314)
+#define FM10K_SW_PCS_ML_BASER_RX_STATUS(p_) \
+				FM10K_SW_EPL_PORT_REG((p_), 0x315)
+#define FM10K_SW_PCS_100GBASER_BIP_0(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x317)
+#define FM10K_SW_PCS_100GBASER_BIP_1(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x318)
+#define FM10K_SW_PCS_100GBASER_BIP_2(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x319)
+#define FM10K_SW_PCS_100GBASER_BIP_3(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31A)
+#define FM10K_SW_PCS_100GBASER_BIP_4(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31B)
+#define FM10K_SW_PCS_100GBASER_BIP_5(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31C)
+#define FM10K_SW_PCS_100GBASER_BIP_6(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31D)
+#define FM10K_SW_PCS_100GBASER_BIP_7(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31E)
+#define FM10K_SW_PCS_100GBASER_BIP_8(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x31F)
+#define FM10K_SW_PCS_100GBASER_BIP_9(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x320)
+#define FM10K_SW_PCS_100GBASER_BIP_10(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x321)
+#define FM10K_SW_PCS_100GBASER_BIP_11(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x322)
+#define FM10K_SW_PCS_100GBASER_BIP_12(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x323)
+#define FM10K_SW_PCS_100GBASER_BIP_13(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x324)
+#define FM10K_SW_PCS_100GBASER_BIP_14(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x325)
+#define FM10K_SW_PCS_100GBASER_BIP_15(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x326)
+#define FM10K_SW_PCS_100GBASER_BIP_16(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x327)
+#define FM10K_SW_PCS_100GBASER_BIP_17(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x328)
+#define FM10K_SW_PCS_100GBASER_BIP_18(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x329)
+#define FM10K_SW_PCS_100GBASER_BIP_19(p_)	\
+				FM10K_SW_EPL_PORT_REG((p_), 0x32A)
+#define FM10K_SW_PCS_100GBASER_BLOCK_LOCK(p_) \
+				FM10K_SW_EPL_PORT_REG((p_), 0x32B)
+#define FM10K_SW_PCS_100GBASER_AMPS_LOCK(p_) \
+				FM10K_SW_EPL_PORT_REG((p_), 0x32C)
+#define FM10K_SW_RS_FEC_UNCORRECTED(p_)		\
+				FM10K_SW_EPL_PORT_REG((p_), 0x33D)
+#define FM10K_SW_RS_FEC_CFG(p_)				\
+				FM10K_SW_EPL_PORT_REG((p_), 0x32E)
+#define FM10K_SW_RS_FEC_STATUS(p_)			\
+				FM10K_SW_EPL_PORT_REG((p_), 0x330)
+#define FM10K_SW_EPL_SYSTIME(p_)			\
+				FM10K_SW_EPL_PORT_REG((p_), 0x331)
+#define FM10K_SW_EPL_SYSTIME0(p_)			\
+				FM10K_SW_EPL_PORT_REG((p_), 0x332)
+#define FM10K_SW_EPL_SYSTIME_CFG(p_)		\
+				FM10K_SW_EPL_PORT_REG((p_), 0x333)
+#define FM10K_SW_PORT_STATUS(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x0)
+#define FM10K_SW_AN_IM(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x1)
+#define FM10K_SW_AN_IM_ALL			FM10K_SW_MASK32(18, 0)
+#define FM10K_SW_LINK_IM(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2)
+#define FM10K_SW_LINK_IM_ALL		FM10K_SW_MASK32(29, 0)
+#define FM10K_SW_AN_IP(p_, l_)		FM10K_SW_EPL_LANE_REG((p_), (l_), 0x3)
+#define FM10K_SW_LINK_IP(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4)
+#define FM10K_SW_MP_CFG(p_, l_)		FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_AN_37_PAGE_RX(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x8)
+#define FM10K_SW_AN_73_PAGE_RX(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0xA)
+#define FM10K_SW_LINK_RULES(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0xC)
+#define FM10K_SW_LINK_RULES_FAULT_TIME_SCALE_UP_lsb		0
+#define FM10K_SW_LINK_RULES_FAULT_TIME_SCALE_UP_msb		3
+#define FM10K_SW_LINK_RULES_FAULT_TICKS_UP_lsb			4
+#define FM10K_SW_LINK_RULES_FAULT_TICKS_UP_msb			8
+#define FM10K_SW_LINK_RULES_FAULT_TIME_SCALE_DOWN_lsb	9
+#define FM10K_SW_LINK_RULES_FAULT_TIME_SCALE_DOWN_msb	12
+#define FM10K_SW_LINK_RULES_FAULT_TICKS_DOWN_lsb		13
+#define FM10K_SW_LINK_RULES_FAULT_TICKS_DOWN_msb		17
+#define FM10K_SW_LINK_RULES_HEARTBEAT_TIME_SCALE_lsb	18
+#define FM10K_SW_LINK_RULES_HEARTBEAT_TIME_SCALE_msb	21
+#define FM10K_SW_MAC_CFG(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x10)
+#define FM10K_SW_MAC_CFG_ARRAY_SIZE		8
+#define FM10K_SW_MAC_CFG_TX_ANTI_BUBBLE_WATERMARK_lsb	0
+#define FM10K_SW_MAC_CFG_TX_ANTI_BUBBLE_WATERMARK_msb	5
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_WATERMARK_lsb		6
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_WATERMARK_msb		9
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_FAST_INC_lsb		10
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_FAST_INC_msb		17
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_SLOW_INC_lsb		18
+#define FM10K_SW_MAC_CFG_TX_RATE_FIFO_SLOW_INC_msb		25
+#define FM10K_SW_MAC_CFG_TX_IDLE_MIN_IFG_BYTES_lsb		26
+#define FM10K_SW_MAC_CFG_TX_IDLE_MIN_IFG_BYTES_msb		31
+#define FM10K_SW_MAC_CFG_TX_CLOCK_COMPENSATION_TIMEOUT_lsb	32
+#define FM10K_SW_MAC_CFG_TX_CLOCK_COMPENSATION_TIMEOUT_msb	47
+#define FM10K_SW_MAC_CFG_TX_CLOCK_COMPENSATION_ENABLE_bit	48
+#define FM10K_SW_MAC_CFG_TX_FAULT_MODE_lsb				49
+#define FM10K_SW_MAC_CFG_TX_FAULT_MODE_msb				51
+#define FM10K_SW_MAC_CFG_TX_PC_ACT_TIME_SCALE_lsb		52
+#define FM10K_SW_MAC_CFG_TX_PC_ACT_TIME_SCALE_msb		55
+#define FM10K_SW_MAC_CFG_TX_PC_ACT_TIMEOUT_lsb			56
+#define FM10K_SW_MAC_CFG_TX_PC_ACT_TIMEOUT_msb			63
+#define FM10K_SW_MAC_CFG_TX_DRAIN_MODE_lsb				64
+#define FM10K_SW_MAC_CFG_TX_DRAIN_MODE_msb				65
+#define FM10K_SW_MAC_CFG_TX_MIN_COLUMNS_lsb				66
+#define FM10K_SW_MAC_CFG_TX_MIN_COLUMNS_msb				71
+#define FM10K_SW_MAC_CFG_TX_SEG_MIN_SPACING_lsb			72
+#define FM10K_SW_MAC_CFG_TX_SEG_MIN_SPACING_msb			83
+#define FM10K_SW_MAC_CFG_TX_SEG_MAX_CREDIT_lsb			84
+#define FM10K_SW_MAC_CFG_TX_SEG_MAX_CREDIT_msb			95
+#define FM10K_SW_MAC_CFG_TX_SEG_SIZE_lsb				96
+#define FM10K_SW_MAC_CFG_TX_SEG_SIZE_msb				107
+#define FM10K_SW_MAC_CFG_TX_LP_IDLE_REQUEST_bit			108
+#define FM10K_SW_MAC_CFG_TX_LPI_AUTOMATIC_bit			109
+#define FM10K_SW_MAC_CFG_TX_LPI_TIMEOUT_lsb				110
+#define FM10K_SW_MAC_CFG_TX_LPI_TIMEOUT_msb				117
+#define FM10K_SW_MAC_CFG_TX_LPI_TIME_SCALE_lsb			118
+#define FM10K_SW_MAC_CFG_TX_LPI_TIME_SCALE_msb			119
+#define FM10K_SW_MAC_CFG_TX_LPI_HOLD_TIMEOUT_lsb		120
+#define FM10K_SW_MAC_CFG_TX_LPI_HOLD_TIMEOUT_msb		127
+#define FM10K_SW_MAC_CFG_TX_LPI_HOLD_TIME_SCALE_lsb		128
+#define FM10K_SW_MAC_CFG_TX_LPI_HOLD_TIME_SCALE_msb		129
+#define FM10K_SW_MAC_CFG_TX_FCS_MODE_lsb				130
+#define FM10K_SW_MAC_CFG_TX_FCS_MODE_msb				132
+#define FM10K_SW_MAC_CFG_TX_OBEY_LINT_bit				133
+#define FM10K_SW_MAC_CFG_TX_IDLE_ENABLE_DIC_bit			134
+#define FM10K_SW_MAC_CFG_CJPAT_ENABLE_bit				135
+#define FM10K_SW_MAC_CFG_RX_MIN_FRAME_LENGTH_lsb		136
+#define FM10K_SW_MAC_CFG_RX_MIN_FRAME_LENGTH_msb		143
+#define FM10K_SW_MAC_CFG_RX_MAX_FRAME_LENGTH_lsb		144
+#define FM10K_SW_MAC_CFG_RX_MAX_FRAME_LENGTH_msb		159
+#define FM10K_SW_MAC_CFG_START_CHAR_D_lsb				160
+#define FM10K_SW_MAC_CFG_START_CHAR_D_msb				167
+#define FM10K_SW_MAC_CFG_IEEE_1588_ENABLE_bit			168
+#define FM10K_SW_MAC_CFG_FCS_START_bit					169
+#define FM10K_SW_MAC_CFG_PREAMBLE_MODE_bit				170
+#define FM10K_SW_MAC_CFG_COUNTER_WRAP_bit				171
+#define FM10K_SW_MAC_CFG_LINK_FAULT_DISABLE_bit			172
+#define FM10K_SW_MAC_CFG_RX_DRAIN_bit					173
+#define FM10K_SW_MAC_CFG_RX_FCS_FORCE_BAD_bit			174
+#define FM10K_SW_MAC_CFG_RX_IGNORE_CODE_ERRORS_bit		175
+#define FM10K_SW_MAC_CFG_RX_IGNORE_UNDERSIZE_ERRORS_bit	176
+#define FM10K_SW_MAC_CFG_RX_IGNORE_OVERSIZE_ERRORS_bit	177
+#define FM10K_SW_MAC_CFG_RX_IGNORE_FCS_ERRORS_bit		178
+#define FM10K_SW_MAC_CFG_RX_IGNORE_PREAMBLE_ERRORS_bit	179
+#define FM10K_SW_MAC_CFG_RX_IGNORE_IFG_ERRORS_bit		180
+#define FM10K_SW_MAC_CFG_ERR_WRITE_lsb					181
+#define FM10K_SW_MAC_CFG_ERR_WRITE_msb					182
+#define FM10K_SW_MAC_CFG_RX_MIN_EVENT_RATE_lsb			183
+#define FM10K_SW_MAC_CFG_RX_MIN_EVENT_RATE_msb			186
+#define FM10K_SW_MAC_CFG_RX_PC_REQUEST_lsb				187
+#define FM10K_SW_MAC_CFG_RX_PC_REQUEST_msb				191
+#define FM10K_SW_MAC_CFG_RX_PC_SEG_SIZE_lsb				192
+#define FM10K_SW_MAC_CFG_RX_PC_SEG_SIZE_msb				196
+#define FM10K_SW_TX_SEQUENCE(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x1A)
+#define FM10K_SW_RX_SEQUENCE(p_, l_)	FM10K_SW_EPL_LANE_REG((p_), (l_), 0x1C)
+#define FM10K_SW_MAC_1588_STATUS(p_, l_) FM10K_SW_EPL_LANE_REG((p_), (l_), 0x1E)
+#define FM10K_SW_WAKE_ERROR_COUNTER(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x20)
+#define FM10K_SW_MAC_OVERSIZE_COUNTER(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x21)
+#define FM10K_SW_MAC_JABBER_COUNTER(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x22)
+#define FM10K_SW_MAC_UNDERSIZE_COUNTER(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x23)
+#define FM10K_SW_MAC_RUNT_COUNTER(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x24)
+#define FM10K_SW_MAC_OVERRUN_COUNTER(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x25)
+#define FM10K_SW_MAC_UNDERRUN_COUNTER(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x26)
+#define FM10K_SW_MAC_CODE_ERROR_COUNTER(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x27)
+#define FM10K_SW_EPL_TX_FRAME_ERROR_COUNTER(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x28)
+#define FM10K_SW_MAC_LINK_COUNTER(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x29)
+#define FM10K_SW_PCS_1000BASEX_CFG(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2A)
+#define FM10K_SW_PCS_1000BASEX_RX_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2B)
+#define FM10K_SW_PCS_1000BASEX_TX_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2C)
+#define FM10K_SW_PCS_10GBASER_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2D)
+#define FM10K_SW_PCS_10GBASER_RX_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2E)
+#define FM10K_SW_PCS_10GBASER_TX_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x2F)
+#define FM10K_SW_AN_37_CFG(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x30)
+#define FM10K_SW_AN_37_TIMER_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x34)
+#define FM10K_SW_AN_37_BASE_PAGE_TX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_AN_37_BASE_PAGE_RX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x8)
+#define FM10K_SW_AN_37_NEXT_PAGE_TX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_AN_37_NEXT_PAGE_RX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x8)
+#define FM10K_SW_SGMII_AN_TIMER_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x34)
+#define FM10K_SW_SGMII_AN_TX_CONFIG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_SGMII_AN_TX_CONFIG_LOOPBACK(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_SGMII_AN_RX_CONFIG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x8)
+#define FM10K_SW_AN_37_STATUS(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x32)
+#define FM10K_SW_AN_73_CFG(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x33)
+#define FM10K_SW_AN_73_TIMER_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x34)
+#define FM10K_SW_AN_73_BASE_PAGE_TX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_AN_73_BASE_PAGE_RX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0xA)
+#define FM10K_SW_AN_73_NEXT_PAGE_TX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x6)
+#define FM10K_SW_AN_73_NEXT_PAGE_RX(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0xA)
+#define FM10K_SW_AN_73_STATUS(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x36)
+#define FM10K_SW_AN_73_TX_LCW(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x38)
+#define FM10K_SW_AN_73_RX_LCW(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x3A)
+#define FM10K_SW_PCSL_CFG(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x3C)
+#define FM10K_SW_PCSL_CFG_SLIP_TIME_lsb			0
+#define FM10K_SW_PCSL_CFG_SLIP_TIME_msb			7
+#define FM10K_SW_PCSL_CFG_RX_BIT_SLIP_ENABLE	(1 << 8)
+#define FM10K_SW_PCSL_CFG_RX_BIT_SLIP_INITIAL	(1 << 9)
+#define FM10K_SW_PCSL_CFG_RX_GB_NARROW			(1 << 10)
+#define FM10K_SW_PCSL_CFG_TX_GB_NARROW			(1 << 11)
+#define FM10K_SW_MP_EEE_CFG(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x40)
+#define FM10K_SW_PCS_1000BASEX_EEE_CFG(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x40)
+#define FM10K_SW_PCS_10GBASER_EEE_CFG(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x40)
+#define FM10K_SW_MP_STATUS(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x44)
+#define FM10K_SW_PCS_40GBASER_RX_BIP_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x44)
+#define FM10K_SW_PCS_10GBASER_RX_BER_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x44)
+#define FM10K_SW_DISPARITY_ERROR_8B10B(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x44)
+#define FM10K_SW_LANE_CFG(p_, l_)				\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x45)
+#define FM10K_SW_LANE_SERDES_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x46)
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x47)
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_OVERRIDE_lsb		0
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_OVERRIDE_msb		1
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_MASK_RX_SIGNAL_OK	(1 << 2)
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_MASK_RX_RDY			(1 << 3)
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_MASK_RX_ACTIVITY		(1 << 4)
+#define FM10K_SW_LANE_ENERGY_DETECT_CFG_ED_MASK_ENERGY_DETECT	(1 << 5)
+#define FM10K_SW_LANE_ACTIVITY_CFG(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x48)
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x49)
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_OVERRIDE_lsb	0
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_OVERRIDE_msb	1
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_MASK_RX_SIGNAL_OK (1 << 2)
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_MASK_RX_RDY		(1 << 3)
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_MASK_RX_ACTIVITY (1 << 4)
+#define FM10K_SW_LANE_SIGNAL_DETECT_CFG_SD_MASK_ENERGY_DETECT (1 << 5)
+#define FM10K_SW_LANE_STATUS(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4A)
+#define FM10K_SW_LANE_SERDES_STATUS(p_, l_) \
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4B)
+#define FM10K_SW_LANE_SERDES_STATUS_ANALOG_TO_CORE_lsb	0
+#define FM10K_SW_LANE_SERDES_STATUS_ANALOG_TO_CORE_msb	7
+#define FM10K_SW_LANE_SERDES_STATUS_CORE_STATUS_lsb		8
+#define FM10K_SW_LANE_SERDES_STATUS_CORE_STATUS_msb		23
+#define FM10K_SW_LANE_SERDES_STATUS_RX_SIGNAL_OK	(1 << 12)
+#define FM10K_SW_LANE_SERDES_STATUS_RX_RDY			(1 << 24)
+#define FM10K_SW_LANE_SERDES_STATUS_TX_RDY			(1 << 25)
+#define FM10K_SW_LANE_SERDES_STATUS_RX_IDLE_DETECT	(1 << 26)
+#define FM10K_SW_LANE_SERDES_STATUS_RX_ACTIVITY		(1 << 27)
+#define FM10K_SW_SERDES_IM(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4C)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_0			(1 << 0)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_1			(1 << 1)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_2			(1 << 2)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_3			(1 << 3)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_4			(1 << 4)
+#define FM10K_SW_SERDES_IM_RX_SIGNAL_OK		\
+				FM10K_SW_SERDES_IM_CORE_STATUS_4
+#define FM10K_SW_SERDES_IM_CORE_STATUS_5			(1 << 5)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_6			(1 << 6)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_7			(1 << 7)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_8			(1 << 8)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_9			(1 << 9)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_10			(1 << 10)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_11			(1 << 11)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_12			(1 << 12)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_13			(1 << 13)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_14			(1 << 14)
+#define FM10K_SW_SERDES_IM_CORE_STATUS_15			(1 << 15)
+#define FM10K_SW_SERDES_IM_TX_RDY				(1 << 16)
+#define FM10K_SW_SERDES_IM_RX_ENERGY_DETECT			(1 << 17)
+#define FM10K_SW_SERDES_IM_RX_SIGNAL_DETECT			(1 << 18)
+#define FM10K_SW_SERDES_IM_RX_RDY				(1 << 19)
+#define FM10K_SW_SERDES_IM_RX_ACTIVITY				(1 << 20)
+#define FM10K_SW_SERDES_IM_RX_IDLE_DETECT			(1 << 21)
+#define FM10K_SW_SERDES_IM_SAI_COMPLETE				(1 << 22)
+#define FM10K_SW_SERDES_IM_SAI_REQUEST_ERROR		(1 << 23)
+#define FM10K_SW_SERDES_IM_TX_CDC_FIFO_U_ERR		(1 << 24)
+#define FM10K_SW_SERDES_IM_TX_CDC_FIFO_ERROR		(1 << 25)
+#define FM10K_SW_SERDES_IM_RX_CDC_FIFO_U_ERR		(1 << 26)
+#define FM10K_SW_SERDES_IM_RX_CDC_FIFO_ERROR		(1 << 27)
+#define FM10K_SW_SERDES_IM_SLIP_REQUEST				(1 << 28)
+#define FM10K_SW_SERDES_IM_ANALOG_IP				(1 << 29)
+#define FM10K_SW_SERDES_IM_ALL				\
+				FM10K_SW_MASK32(29, 0)
+#define FM10K_SW_SERDES_IP(p_, l_)			\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4D)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_0			(1 << 0)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_1			(1 << 1)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_2			(1 << 2)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_3			(1 << 3)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_4			(1 << 4)
+#define FM10K_SW_SERDES_IP_RX_SIGNAL_OK		\
+				FM10K_SW_SERDES_IP_CORE_STATUS_4
+#define FM10K_SW_SERDES_IP_CORE_STATUS_5			(1 << 5)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_6			(1 << 6)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_7			(1 << 7)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_8			(1 << 8)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_9			(1 << 9)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_10			(1 << 10)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_11			(1 << 11)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_12			(1 << 12)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_13			(1 << 13)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_14			(1 << 14)
+#define FM10K_SW_SERDES_IP_CORE_STATUS_15			(1 << 15)
+#define FM10K_SW_SERDES_IP_TX_RDY				(1 << 16)
+#define FM10K_SW_SERDES_IP_RX_ENERGY_DETECT			(1 << 17)
+#define FM10K_SW_SERDES_IP_RX_SIGNAL_DETECT			(1 << 18)
+#define FM10K_SW_SERDES_IP_RX_RDY				(1 << 19)
+#define FM10K_SW_SERDES_IP_RX_ACTIVITY				(1 << 20)
+#define FM10K_SW_SERDES_IP_RX_IDLE_DETECT			(1 << 21)
+#define FM10K_SW_SERDES_IP_SAI_COMPLETE				(1 << 22)
+#define FM10K_SW_SERDES_IP_SAI_REQUEST_ERROR		(1 << 23)
+#define FM10K_SW_SERDES_IP_TX_CDC_FIFO_U_ERR		(1 << 24)
+#define FM10K_SW_SERDES_IP_TX_CDC_FIFO_ERROR		(1 << 25)
+#define FM10K_SW_SERDES_IP_RX_CDC_FIFO_U_ERR		(1 << 26)
+#define FM10K_SW_SERDES_IP_RX_CDC_FIFO_ERROR		(1 << 27)
+#define FM10K_SW_SERDES_IP_SLIP_REQUEST				(1 << 28)
+#define FM10K_SW_SERDES_IP_ANALOG_IP				(1 << 29)
+#define FM10K_SW_SERDES_IP_ALL				\
+				FM10K_SW_MASK32(29, 0)
+#define FM10K_SW_LANE_ANALOG_IM(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4E)
+#define FM10K_SW_LANE_ANALOG_IP(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x4F)
+#define FM10K_SW_LANE_SAI_CFG(p_, l_)		\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x50)
+#define FM10K_SW_LANE_SAI_CFG_CODE_lsb64			0
+#define FM10K_SW_LANE_SAI_CFG_CODE_msb64			15
+#define FM10K_SW_LANE_SAI_CFG_DATA_lsb64			16
+#define FM10K_SW_LANE_SAI_CFG_DATA_msb64			31
+#define FM10K_SW_LANE_SAI_CFG_RESULT_PATTERN_lsb64	32
+#define FM10K_SW_LANE_SAI_CFG_RESULT_PATTERN_msb64	47
+#define FM10K_SW_LANE_SAI_CFG_RESULT_MODE_lsb64		48
+#define FM10K_SW_LANE_SAI_CFG_RESULT_MODE_msb64		49
+#define FM10K_SW_LANE_SAI_CFG_REQUEST				(1ULL << 50)
+#define FM10K_SW_LANE_SAI_STATUS(p_, l_)	\
+				FM10K_SW_EPL_LANE_REG((p_), (l_), 0x52)
+#define FM10K_SW_LANE_SAI_STATUS_RESULT_lsb			0
+#define FM10K_SW_LANE_SAI_STATUS_RESULT_msb			15
+#define FM10K_SW_LANE_SAI_STATUS_COMPLETE			(1 << 16)
+#define FM10K_SW_LANE_SAI_STATUS_ACCESS_REQUEST		(1 << 17)
+#define FM10K_SW_LANE_SAI_STATUS_IN_PROGRESS		(1 << 18)
+#define FM10K_SW_LANE_SAI_STATUS_BUSY				(1 << 19)
+#define FM10K_SW_LANE_SAI_STATUS_REQUEST_ERROR		(1 << 20)
+
+#define FM10K_SW_PORTS_MGMT_BASE		FM10K_SW_REG_OFF(0x0E8000)
+#define FM10K_SW_PORTS_MGMT_REG(wo_)	\
+			(FM10K_SW_PORTS_MGMT_BASE + FM10K_SW_REG_OFF(wo_))
+
+#define FM10K_SW_PLL_EPL_CTRL			FM10K_SW_PORTS_MGMT_REG(0x0)
+#define FM10K_SW_PLL_EPL_STAT			FM10K_SW_PORTS_MGMT_REG(0x1)
+#define FM10K_SW_PLL_FABRIC_CTRL		FM10K_SW_PORTS_MGMT_REG(0x2)
+#define FM10K_SW_PLL_FABRIC_REFDIV_lsb					3
+#define FM10K_SW_PLL_FABRIC_REFDIV_msb					8
+#define FM10K_SW_PLL_FABRIC_FBDIV4_lsb					9
+#define FM10K_SW_PLL_FABRIC_FBDIV4_msb					9
+#define FM10K_SW_PLL_FABRIC_FBDIV255_lsb				10
+#define FM10K_SW_PLL_FABRIC_FBDIV255_msb				17
+#define FM10K_SW_PLL_FABRIC_OUTDIV_lsb					18
+#define FM10K_SW_PLL_FABRIC_OUTDIV_msb					23
+#define FM10K_SW_PLL_FABRIC_STAT		FM10K_SW_PORTS_MGMT_REG(0x3)
+#define FM10K_SW_PLL_FABRIC_LOCK		FM10K_SW_PORTS_MGMT_REG(0x4)
+#define FM10K_SW_PLL_FABRIC_FREQSEL_lsb					4
+#define FM10K_SW_PLL_FABRIC_FREQSEL_msb					7
+#define	FM10K_SW_PLL_FABRIC_FREQSEL_CTRL				0
+#define	FM10K_SW_PLL_FABRIC_FREQSEL_F600				1
+#define	FM10K_SW_PLL_FABRIC_FREQSEL_F500				2
+#define	FM10K_SW_PLL_FABRIC_FREQSEL_F400				3
+#define	FM10K_SW_PLL_FABRIC_FREQSEL_F300				4
+#define FM10K_SW_SBUS_EPL_CFG		FM10K_SW_PORTS_MGMT_REG(0x5)
+#define FM10K_SW_SBUS_EPL_COMMAND	FM10K_SW_PORTS_MGMT_REG(0x6)
+#define FM10K_SW_SBUS_EPL_REQUEST	FM10K_SW_PORTS_MGMT_REG(0x7)
+#define FM10K_SW_SBUS_EPL_RESPONSE	FM10K_SW_PORTS_MGMT_REG(0x8)
+#define FM10K_SW_SBUS_EPL_SPICO_IN	FM10K_SW_PORTS_MGMT_REG(0x9)
+#define FM10K_SW_SBUS_EPL_SPICO_OUT	FM10K_SW_PORTS_MGMT_REG(0xA)
+#define FM10K_SW_SBUS_EPL_IP		FM10K_SW_PORTS_MGMT_REG(0xB)
+#define FM10K_SW_SBUS_EPL_IM		FM10K_SW_PORTS_MGMT_REG(0xC)
+#define FM10K_SW_ETHCLK_CFG(n_)		FM10K_SW_PORTS_MGMT_REG(0xE + (n_))
+#define FM10K_SW_ETHCLK_RATIO(n_)	FM10K_SW_PORTS_MGMT_REG(0x10 + (n_))
+#define FM10K_SW_PM_CLKOBS_CTRL		FM10K_SW_PORTS_MGMT_REG(0x12)
+
+#define FM10K_SW_PCIE_CFG_BASE		FM10K_SW_REG_OFF(0x120000)
+#define FM10K_SW_PCIE_CFG_REG(wo_)	\
+				(FM10K_SW_PCIE_CFG_BASE + FM10K_SW_REG_OFF(wo_))
+
+/*
+ * These register offsets can also be passed to fm10k_read_config(), which
+ * will mask off the upper bits
+ */
+#define FM10K_SW_PCIE_CFG_ID		FM10K_SW_PCIE_CFG_REG(0x0)
+#define FM10K_SW_PCIE_CFG_CMD		FM10K_SW_PCIE_CFG_REG(0x1)
+#define FM10K_SW_PCIE_CFG_1			FM10K_SW_PCIE_CFG_REG(0x2)
+#define FM10K_SW_PCIE_CFG_2			FM10K_SW_PCIE_CFG_REG(0x3)
+#define FM10K_SW_PCIE_CFG_BAR0		FM10K_SW_PCIE_CFG_REG(0x4)
+#define FM10K_SW_PCIE_CFG_BAR1		FM10K_SW_PCIE_CFG_REG(0x5)
+#define FM10K_SW_PCIE_CFG_BAR2		FM10K_SW_PCIE_CFG_REG(0x6)
+#define FM10K_SW_PCIE_CFG_BAR3		FM10K_SW_PCIE_CFG_REG(0x7)
+#define FM10K_SW_PCIE_CFG_BAR4		FM10K_SW_PCIE_CFG_REG(0x8)
+#define FM10K_SW_PCIE_CFG_BAR5		FM10K_SW_PCIE_CFG_REG(0x9)
+#define FM10K_SW_PCIE_CFG_CARDBUS	FM10K_SW_PCIE_CFG_REG(0xA)
+#define FM10K_SW_PCIE_CFG_SUBID		FM10K_SW_PCIE_CFG_REG(0xB)
+#define FM10K_SW_PCIE_CFG_EXP_ROM	FM10K_SW_PCIE_CFG_REG(0xC)
+#define FM10K_SW_PCIE_CFG_CAP_PTR	FM10K_SW_PCIE_CFG_REG(0xD)
+#define FM10K_SW_PCIE_CFG_RSVD		FM10K_SW_PCIE_CFG_REG(0xE)
+#define FM10K_SW_PCIE_CFG_INT		FM10K_SW_PCIE_CFG_REG(0xF)
+#define FM10K_SW_PCIE_CFG_PM_CAP	FM10K_SW_PCIE_CFG_REG(0x10)
+#define FM10K_SW_PCIE_CFG_PM_CTRL	FM10K_SW_PCIE_CFG_REG(0x11)
+#define FM10K_SW_PCIE_CFG_PCIE_CAP	FM10K_SW_PCIE_CFG_REG(0x1C)
+#define FM10K_SW_PCIE_CFG_PCIE_DEV_CAP	FM10K_SW_PCIE_CFG_REG(0x1D)
+#define FM10K_SW_PCIE_CFG_PCIE_DEV_CTRL	FM10K_SW_PCIE_CFG_REG(0x1E)
+#define FM10K_SW_PCIE_CFG_PCIE_LINK_CAP	FM10K_SW_PCIE_CFG_REG(0x1F)
+#define FM10K_SW_PCIE_CFG_PCIE_LINK_CTRL	FM10K_SW_PCIE_CFG_REG(0x20)
+#define FM10K_SW_PCIE_CFG_LINK_SPEED_lsb	16
+#define FM10K_SW_PCIE_CFG_LINK_SPEED_msb	19
+#define FM10K_SW_PCIE_CFG_LINK_SPEED_2P5	1
+#define FM10K_SW_PCIE_CFG_LINK_SPEED_5		2
+#define FM10K_SW_PCIE_CFG_LINK_SPEED_8		3
+#define FM10K_SW_PCIE_CFG_LINK_WIDTH_lsb	20
+#define FM10K_SW_PCIE_CFG_LINK_WIDTH_msb	24
+#define FM10K_SW_PCIE_CFG_PCIE_DEV_CAP2		FM10K_SW_PCIE_CFG_REG(0x25)
+#define FM10K_SW_PCIE_CFG_PCIE_DEV_CTRL2	FM10K_SW_PCIE_CFG_REG(0x26)
+#define FM10K_SW_PCIE_CFG_PCIE_LINK_CTRL2	FM10K_SW_PCIE_CFG_REG(0x28)
+#define FM10K_SW_PCIE_CFG_MSIX_CAP		FM10K_SW_PCIE_CFG_REG(0x2C)
+#define FM10K_SW_PCIE_CFG_MSIX_TABLE_OFFSET FM10K_SW_PCIE_CFG_REG(0x2D)
+#define FM10K_SW_PCIE_CFG_MSIX_PBA		FM10K_SW_PCIE_CFG_REG(0x2E)
+#define FM10K_SW_PCIE_CFG_VPD_CAP		FM10K_SW_PCIE_CFG_REG(0x34)
+#define FM10K_SW_PCIE_CFG_VPD_DATA		FM10K_SW_PCIE_CFG_REG(0x35)
+#define FM10K_SW_PCIE_CFG_AER_HDR		FM10K_SW_PCIE_CFG_REG(0x40)
+#define FM10K_SW_PCIE_CFG_AER_UNERR_STATUS	FM10K_SW_PCIE_CFG_REG(0x41)
+#define FM10K_SW_PCIE_CFG_AER_UNERR_MASK	FM10K_SW_PCIE_CFG_REG(0x42)
+#define FM10K_SW_PCIE_CFG_AER_UNERR_SEVERITY FM10K_SW_PCIE_CFG_REG(0x43)
+#define FM10K_SW_PCIE_CFG_AER_COERR_STATUS	FM10K_SW_PCIE_CFG_REG(0x44)
+#define FM10K_SW_PCIE_CFG_AER_COERR_MASK	FM10K_SW_PCIE_CFG_REG(0x45)
+#define FM10K_SW_PCIE_CFG_AER_CTRL		FM10K_SW_PCIE_CFG_REG(0x46)
+#define FM10K_SW_PCIE_CFG_AER_HEADER_LOG0	FM10K_SW_PCIE_CFG_REG(0x47)
+#define FM10K_SW_PCIE_CFG_AER_HEADER_LOG1	FM10K_SW_PCIE_CFG_REG(0x48)
+#define FM10K_SW_PCIE_CFG_AER_HEADER_LOG2	FM10K_SW_PCIE_CFG_REG(0x49)
+#define FM10K_SW_PCIE_CFG_AER_HEADER_LOG3	FM10K_SW_PCIE_CFG_REG(0x4A)
+#define FM10K_SW_PCIE_CFG_SPD_HDR		FM10K_SW_PCIE_CFG_REG(0x52)
+#define FM10K_SW_PCIE_CFG_SPD_NUMBER_L	FM10K_SW_PCIE_CFG_REG(0x53)
+#define FM10K_SW_PCIE_CFG_SPD_NUMBER_H	FM10K_SW_PCIE_CFG_REG(0x54)
+#define FM10K_SW_PCIE_CFG_ARI_HDR		FM10K_SW_PCIE_CFG_REG(0x56)
+#define FM10K_SW_PCIE_CFG_ARI_CTRL		FM10K_SW_PCIE_CFG_REG(0x57)
+#define FM10K_SW_PCIE_CFG_SPCIE_HDR		FM10K_SW_PCIE_CFG_REG(0x5A)
+#define FM10K_SW_PCIE_CFG_SPCIE_LINK_CTRL3	FM10K_SW_PCIE_CFG_REG(0x5B)
+#define FM10K_SW_PCIE_CFG_SPCIE_ERR_STS		FM10K_SW_PCIE_CFG_REG(0x5C)
+#define FM10K_SW_PCIE_CFG_SPCIE_LINK_EQ01	FM10K_SW_PCIE_CFG_REG(0x5D)
+#define FM10K_SW_PCIE_CFG_SPCIE_LINK_EQ23	FM10K_SW_PCIE_CFG_REG(0x5E)
+#define FM10K_SW_PCIE_CFG_SPCIE_LINK_EQ45	FM10K_SW_PCIE_CFG_REG(0x5F)
+#define FM10K_SW_PCIE_CFG_SPCIE_LINK_EQ67	FM10K_SW_PCIE_CFG_REG(0x60)
+#define FM10K_SW_PCIE_CFG_SRIOV_HDR		FM10K_SW_PCIE_CFG_REG(0x62)
+#define FM10K_SW_PCIE_CFG_SRIOV_CAP		FM10K_SW_PCIE_CFG_REG(0x63)
+#define FM10K_SW_PCIE_CFG_SRIOV_CTRL	FM10K_SW_PCIE_CFG_REG(0x64)
+#define FM10K_SW_PCIE_CFG_SRIOV_CFG		FM10K_SW_PCIE_CFG_REG(0x65)
+#define FM10K_SW_PCIE_CFG_SRIOV_NUM		FM10K_SW_PCIE_CFG_REG(0x66)
+#define FM10K_SW_PCIE_CFG_SRIOV_MAP		FM10K_SW_PCIE_CFG_REG(0x67)
+#define FM10K_SW_PCIE_CFG_SRIOV_DEVID	FM10K_SW_PCIE_CFG_REG(0x69)
+#define FM10K_SW_PCIE_CFG_SRIOV_PAGE_SUP	FM10K_SW_PCIE_CFG_REG(0x69)
+#define FM10K_SW_PCIE_CFG_SRIOV_PAGE_CFG	FM10K_SW_PCIE_CFG_REG(0x6A)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR0	FM10K_SW_PCIE_CFG_REG(0x6B)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR1	FM10K_SW_PCIE_CFG_REG(0x6C)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR2	FM10K_SW_PCIE_CFG_REG(0x6D)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR3	FM10K_SW_PCIE_CFG_REG(0x6E)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR4	FM10K_SW_PCIE_CFG_REG(0x6F)
+#define FM10K_SW_PCIE_CFG_SRIOV_BAR5	FM10K_SW_PCIE_CFG_REG(0x70)
+#define FM10K_SW_PCIE_CFG_SRIOV_MIG		FM10K_SW_PCIE_CFG_REG(0x71)
+#define FM10K_SW_PCIE_CFG_TPH_HDR		FM10K_SW_PCIE_CFG_REG(0x72)
+#define FM10K_SW_PCIE_CFG_TPH_CAP		FM10K_SW_PCIE_CFG_REG(0x73)
+#define FM10K_SW_PCIE_CFG_TPH_CTRL		FM10K_SW_PCIE_CFG_REG(0x74)
+#define FM10K_SW_PCIE_CFG_ACS_HDR		FM10K_SW_PCIE_CFG_REG(0x76)
+#define FM10K_SW_PCIE_CFG_ACS_CAP		FM10K_SW_PCIE_CFG_REG(0x77)
+#define FM10K_SW_PCIE_PORTLOGIC			FM10K_SW_PCIE_CFG_REG(0x1C0)
+#define FM10K_SW_PCIE_PORTLOGIC_LINK_STATE	FM10K_SW_PCIE_CFG_REG(0x1CA)
+
+
+#define FM10K_SW_FFU_BASE		FM10K_SW_REG_OFF(0xC00000)
+#define FM10K_SW_FFU_REG(wo_)	(FM10K_SW_FFU_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_FFU_NUM_SLICES				32
+#define FM10K_SW_FFU_NUM_SCENARIOS			32
+
+/* FFU enumerated types */
+#define FM10K_SW_FFU_MUX_SEL_MAP_DIP_MAP_SIP	0
+#define FM10K_SW_FFU_MUX_SEL_MAP_DMAC_MAP_SMAC	1
+#define FM10K_SW_FFU_MUX_SEL_MAP_PROT_MAP_LENGTH	2
+#define FM10K_SW_FFU_MUX_SEL_MAP_SRC_MAP_TYPE	3
+#define FM10K_SW_FFU_MUX_SEL_USER				4
+#define FM10K_SW_FFU_MUX_SEL_FTYPE_SWPRI		5
+#define FM10K_SW_FFU_MUX_SEL_IPMISC				6
+#define FM10K_SW_FFU_MUX_SEL_TOS				7
+#define FM10K_SW_FFU_MUX_SEL_PROT				8
+#define FM10K_SW_FFU_MUX_SEL_TTL				9
+#define FM10K_SW_FFU_MUX_SEL_SRC_PORT			10
+#define FM10K_SW_FFU_MUX_SEL_VPRI_VID_11_8		11
+#define FM10K_SW_FFU_MUX_SEL_VID_7_0			12
+#define FM10K_SW_FFU_MUX_SEL_RXTAG				13
+#define FM10K_SW_FFU_MUX_SEL_L2_DMAC_15_0		14
+#define FM10K_SW_FFU_MUX_SEL_L2_DMAC_31_16		15
+#define FM10K_SW_FFU_MUX_SEL_L2_DMAC_47_32		16
+#define FM10K_SW_FFU_MUX_SEL_L2_SMAC_15_0		17
+#define FM10K_SW_FFU_MUX_SEL_L2_SMAC_31_16		18
+#define FM10K_SW_FFU_MUX_SEL_L2_SMAC_47_32		19
+#define FM10K_SW_FFU_MUX_SEL_DGLORT				20
+#define FM10K_SW_FFU_MUX_SEL_SGLORT				21
+#define FM10K_SW_FFU_MUX_SEL_VPRI_VID			22
+#define FM10K_SW_FFU_MUX_SEL_VPRI2_VID2			23
+#define FM10K_SW_FFU_MUX_SEL_L2_TYPE			24
+#define FM10K_SW_FFU_MUX_SEL_L4_DST				25
+#define FM10K_SW_FFU_MUX_SEL_L4_SRC				26
+#define FM10K_SW_FFU_MUX_SEL_MAP_L4_DST			27
+#define FM10K_SW_FFU_MUX_SEL_MAP_L4_SRC			28
+#define FM10K_SW_FFU_MUX_SEL_L4A				29
+#define FM10K_SW_FFU_MUX_SEL_L4B				30
+#define FM10K_SW_FFU_MUX_SEL_L4C				31
+#define FM10K_SW_FFU_MUX_SEL_L4D				32
+#define FM10K_SW_FFU_MUX_SEL_MAP_VPRI1_VID1		33
+#define FM10K_SW_FFU_MUX_SEL_L3_DIP_31_0		34
+#define FM10K_SW_FFU_MUX_SEL_L3_DIP_63_32		35
+#define FM10K_SW_FFU_MUX_SEL_L3_DIP_95_64		36
+#define FM10K_SW_FFU_MUX_SEL_L3_DIP_127_96		37
+#define FM10K_SW_FFU_MUX_SEL_L3_SIP_31_0		38
+#define FM10K_SW_FFU_MUX_SEL_L3_SIP_63_32		39
+#define FM10K_SW_FFU_MUX_SEL_L3_SIP_95_64		40
+#define FM10K_SW_FFU_MUX_SEL_L3_SIP_127_96		41
+
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_ARP_INDEX_lsb		0
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_ARP_INDEX_msb		15
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_ARP_COUNT_lsb		16
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_ARP_COUNT_msb		19
+#define FM10K_SW_FFU_SLICE_SRAM_ROUTE_ARP_TYPE_EXP		(1 << 20)
+
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_GLORT_DGLORT_lsb	0
+#define	FM10K_SW_FFU_SLICE_SRAM_ROUTE_GLORT_DGLORT_msb	15
+#define FM10K_SW_FFU_SLICE_SRAM_ROUTE_GLORT_FLOOD_SET	(1 << 20)
+
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_BYTE_MASK_lsb	0
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_BYTE_MASK_msb	7
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_BYTE_DATA_lsb	8
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_BYTE_DATA_msb	15
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_SUB_CMD_lsb	16
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_BITS_SUB_CMD_msb	20
+
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_VLAN_lsb		0
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_VLAN_msb		11
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_PRI_lsb		12
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_PRI_msb		15
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_TX_TAG_lsb		16
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_TX_TAG_msb		17
+#define FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_SET_VPRI		(1 << 18)
+#define FM10K_SW_FFU_SLICE_SRAM_SET_VLAN_SET_PRI		(1 << 19)
+
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_PRI_DSCP_lsb		0
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_PRI_DSCP_msb		5
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_PRI_PRI_lsb			12
+#define	FM10K_SW_FFU_SLICE_SRAM_SET_PRI_PRI_msb			15
+#define FM10K_SW_FFU_SLICE_SRAM_SET_PRI_SET_DSCP		(1 << 17)
+#define FM10K_SW_FFU_SLICE_SRAM_SET_PRI_SET_VPRI		(1 << 18)
+#define FM10K_SW_FFU_SLICE_SRAM_SET_PRI_SET_PRI			(1 << 19)
+
+/* FFU Registers */
+#define FM10K_SW_FFU_SLICE_TCAM(sl_, n_) \
+			FM10K_SW_FFU_REG(0x2000 * (sl_) + 0x4 * (n_))
+#define FM10K_SW_FFU_SLICE_TCAM_ENTRIES					1024
+#define FM10K_SW_FFU_SLICE_TCAM_KEY_lsb64				0
+#define FM10K_SW_FFU_SLICE_TCAM_KEY_msb64				31
+#define FM10K_SW_FFU_SLICE_TCAM_KEY_TOP_lsb64			32
+#define FM10K_SW_FFU_SLICE_TCAM_KEY_TOP_msb64			39
+#define FM10K_SW_FFU_SLICE_SRAM(sl_, n_) \
+			FM10K_SW_FFU_REG(0x1000 + 0x2000 * (sl_) + 0x2 * (n_))
+#define FM10K_SW_FFU_SLICE_SRAM_COMMAND_lsb64			21
+#define FM10K_SW_FFU_SLICE_SRAM_COMMAND_msb64			22
+#define	FM10K_SW_FFU_SLICE_SRAM_COMMAND_ROUTE_ARP		0
+#define	FM10K_SW_FFU_SLICE_SRAM_COMMAND_ROUTE_GLORT		1
+#define	FM10K_SW_FFU_SLICE_SRAM_COMMAND_BIT_SET			2
+#define	FM10K_SW_FFU_SLICE_SRAM_COMMAND_FIELD_SET		3
+#define FM10K_SW_FFU_SLICE_SRAM_COUNTER_INDEX_lsb64		23
+#define FM10K_SW_FFU_SLICE_SRAM_COUNTER_INDEX_msb64		34
+#define FM10K_SW_FFU_SLICE_SRAM_COUNTER_BANK_lsb64		35
+#define FM10K_SW_FFU_SLICE_SRAM_COUNTER_BANK_msb64		36
+#define FM10K_SW_FFU_SLICE_SRAM_PRECEDENCE_lsb64		37
+#define FM10K_SW_FFU_SLICE_SRAM_PRECEDENCE_msb64		39
+#define FM10K_SW_FFU_SLICE_VALID(sl_)	\
+			FM10K_SW_FFU_REG(0x1800 + 0x2000 * (sl_))
+#define FM10K_SW_FFU_SLICE_VALID_SCENARIO(s_)	(1ULL << (s_))
+#define FM10K_SW_FFU_SLICE_VALID_ALL_SCENARIOS	FM10K_SW_MASK32(31, 0)
+#define FM10K_SW_FFU_SLICE_CASCADE_ACTION(sl_)	\
+			FM10K_SW_FFU_REG(0x1804 + 0x2000 * (sl_))
+#define FM10K_SW_FFU_SLICE_CFG(sl_, scen_)		\
+		FM10K_SW_FFU_REG(0x1840 + 0x2 * (scen_) + 0x2000 * (sl_))
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_0_lsb64			0
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_0_msb64			5
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_1_lsb64			6
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_1_msb64			11
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_2_lsb64			12
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_2_msb64			17
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_3_lsb64			18
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_3_msb64			23
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_TOP_lsb64			24
+#define FM10K_SW_FFU_SLICE_CFG_SELECT_TOP_msb64			29
+#define FM10K_SW_FFU_SLICE_CFG_START_COMPARE	(1ULL << 30)
+#define FM10K_SW_FFU_SLICE_CFG_START_ACTION		(1ULL << 31)
+#define FM10K_SW_FFU_SLICE_CFG_VALID_LOW		(1ULL << 32)
+#define FM10K_SW_FFU_SLICE_CFG_VALID_HIGH		(1ULL << 33)
+#define FM10K_SW_FFU_SLICE_CFG_CASE_lsb64				34
+#define FM10K_SW_FFU_SLICE_CFG_CASE_msb64				37
+#define FM10K_SW_FFU_SLICE_CFG_CASE_LOCATION_lsb64		38
+#define FM10K_SW_FFU_SLICE_CFG_CASE_LOCATION_msb64		39
+#define	FM10K_SW_FFU_SLICE_CFG_CASE_LOCATION_NOT_MAPPED      0
+#define	FM10K_SW_FFU_SLICE_CFG_CASE_LOCATION_TOP_LOW_NIBBLE  1
+#define	FM10K_SW_FFU_SLICE_CFG_CASE_LOCATION_TOP_HIGH_NIBBLE 2
+#define FM10K_SW_FFU_MASTER_VALID		FM10K_SW_FFU_REG(0x40000)
+#define FM10K_SW_FFU_MASTER_VALID_SLICE_VALID(s_)  (1ULL << (s_))
+#define FM10K_SW_FFU_MASTER_VALID_ALL_SLICES_VALID FM10K_SW_MASK64(31, 0)
+#define FM10K_SW_FFU_MASTER_VALID_CHUNK_VALID(c_)  (1ULL << ((c_) + 32))
+#define FM10K_SW_FFU_MASTER_VALID_ALL_CHUNKS_VALID FM10K_SW_MASK64(63, 32)
+
+#define FM10K_SW_L2LOOKUP_BASE		FM10K_SW_REG_OFF(0xC80000)
+#define FM10K_SW_L2LOOKUP_REG(wo_)	\
+			(FM10K_SW_L2LOOKUP_BASE + FM10K_SW_REG_OFF(wo_))
+
+#define FM10K_SW_MA_TABLE(t_, n_)	\
+			FM10K_SW_L2LOOKUP_REG(0x10000 * (t_) + 0x4 * (n_))
+#define FM10K_SW_INGRESS_VID_TABLE(v_) \
+			FM10K_SW_L2LOOKUP_REG(0x20000 + 0x4 * (v_))
+#define FM10K_SW_INGRESS_VID_TABLE_ENTRIES				4096
+#define FM10K_SW_INGRESS_VID_TABLE_MEMBERSHIP(l_)		(1ULL << (l_))
+
+/* note these bit positions are relative
+ * to the start of the upper 64-bit word
+ */
+#define FM10K_SW_INGRESS_VID_TABLE_FID_lsb64			(64 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_FID_msb64			(75 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_MST_INDEX_lsb64		(76 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_MST_INDEX_msb64		(83 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_COUNTER_INDEX_lsb64	(84 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_COUNTER_INDEX_msb64	(89 - 64)
+#define FM10K_SW_INGRESS_VID_TABLE_REFLECT		(1ULL << (90 - 64))
+#define FM10K_SW_INGRESS_VID_TABLE_TRAP_IGMP	(1ULL << (91 - 64))
+#define FM10K_SW_EGRESS_VID_TABLE(v_)	\
+			FM10K_SW_L2LOOKUP_REG(0x24000 + 0x4 * (v_))
+#define FM10K_SW_EGRESS_VID_TABLE_ENTRIES				4096
+#define FM10K_SW_EGRESS_VID_TABLE_MEMBERSHIP(l_)		(1ULL << (l_))
+
+/* note these bit positions are relative to
+ * the start of the upper 64-bit word
+ */
+#define FM10K_SW_EGRESS_VID_TABLE_FID_lsb64			(64 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_FID_msb64			(75 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_MST_INDEX_lsb64	(76 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_MST_INDEX_msb64	(83 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_MTU_INDEX_lsb64	(84 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_MTU_INDEX_msb64	(86 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_TRIG_ID_lsb64		(87 - 64)
+#define FM10K_SW_EGRESS_VID_TABLE_TRIG_ID_msb64		(92 - 64)
+#define FM10K_SW_MA_USED_TABLE(t_, n_)	\
+			FM10K_SW_L2LOOKUP_REG(0x28000 + 0x200 * (t_) + (n_))
+#define FM10K_SW_INGRESS_MST_TABLE(t_, n_) \
+		FM10K_SW_L2LOOKUP_REG(0x28400 + 0x200 * (t_) + 0x2 * (n_))
+#define FM10K_SW_INGRESS_MST_TABLE_PORTS_PER_TABLE		24
+#define FM10K_SW_INGRESS_MST_TABLE_STP_STATE_lsb64(l_) \
+		(((l_) % FM10K_SW_INGRESS_MST_TABLE_PORTS_PER_TABLE) * 2)
+#define FM10K_SW_INGRESS_MST_TABLE_STP_STATE_msb64(l_) \
+			(FM10K_SW_INGRESS_MST_TABLE_STP_STATE_lsb64(l_) + 1)
+#define	FM10K_SW_INGRESS_MST_TABLE_STP_STATE_DISABLE	0
+#define	FM10K_SW_INGRESS_MST_TABLE_STP_STATE_LISTENING	1
+#define	FM10K_SW_INGRESS_MST_TABLE_STP_STATE_LEARNING	2
+#define	FM10K_SW_INGRESS_MST_TABLE_STP_STATE_FORWARD	3
+#define FM10K_SW_EGRESS_MST_TABLE(t_)		\
+			FM10K_SW_L2LOOKUP_REG(0x28800 + 0x2 * (t_))
+#define FM10K_SW_EGRESS_MST_TABLE_FORWARDING(l_)	(1ULL << (l_))
+#define FM10K_SW_MA_TABLE_CFG_1		FM10K_SW_L2LOOKUP_REG(0x28A00)
+#define FM10K_SW_MA_TABLE_CFG_2		FM10K_SW_L2LOOKUP_REG(0x28A02)
+#define FM10K_SW_MTU_TABLE(n_)		FM10K_SW_L2LOOKUP_REG(0x28A08 + (n_))
+#define FM10K_SW_IEEE_RESERVED_MAC_ACTION	FM10K_SW_L2LOOKUP_REG(0x28A10)
+#define FM10K_SW_IEEE_RESERVED_MAC_TRAP_PRIORITY FM10K_SW_L2LOOKUP_REG(0x28A14)
+#define FM10K_SW_IEEE_RESERVED_MAC_CFG		FM10K_SW_L2LOOKUP_REG(0x28A16)
+
+
+#define FM10K_SW_GLORT_BASE			FM10K_SW_REG_OFF(0xCE0000)
+#define FM10K_SW_GLORT_REG(wo_)		\
+		(FM10K_SW_GLORT_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_GLORT_CAM_ENTRIES	256
+#define FM10K_SW_GLORT_DEST_TABLE(n_)	FM10K_SW_GLORT_REG(0x0 + 0x2 * (n_))
+#define FM10K_SW_GLORT_DEST_TABLE_MASK_lsb64			0
+#define FM10K_SW_GLORT_DEST_TABLE_MASK_msb64			47
+#define FM10K_SW_GLORT_DEST_TABLE_IP_MCAST_IDX_lsb64	48
+#define FM10K_SW_GLORT_DEST_TABLE_IP_MCAST_IDX_msb64	59
+#define FM10K_SW_GLORT_CAM(n_)		FM10K_SW_GLORT_REG(0x2000 + (n_))
+#define FM10K_SW_GLORT_CAM_MATCH_ANY	0x00000000
+#define FM10K_SW_GLORT_CAM_MATCH_NONE	FM10K_SW_MASK32(31, 0)
+#define FM10K_SW_GLORT_CAM_KEY_lsb			0
+#define FM10K_SW_GLORT_CAM_KEY_msb			15
+#define FM10K_SW_GLORT_CAM_KEY_INVERT_lsb	16
+#define FM10K_SW_GLORT_CAM_KEY_INVERT_msb	31
+#define FM10K_SW_GLORT_RAM(n_)		FM10K_SW_GLORT_REG(0x2200 + 0x2 * (n_))
+#define FM10K_SW_GLORT_RAM_STRICT_lsb64					0
+#define FM10K_SW_GLORT_RAM_STRICT_msb64					1
+#define	FM10K_SW_GLORT_RAM_STRICT_FTYPE					0
+#define	FM10K_SW_GLORT_RAM_STRICT_RSVD					1
+#define	FM10K_SW_GLORT_RAM_STRICT_HASHED				2
+#define	FM10K_SW_GLORT_RAM_STRICT_STRICT				3
+#define FM10K_SW_GLORT_RAM_DEST_INDEX_lsb64				2
+#define FM10K_SW_GLORT_RAM_DEST_INDEX_msb64				13
+#define FM10K_SW_GLORT_RAM_RANGE_SUBIDX_A_lsb64			14
+#define FM10K_SW_GLORT_RAM_RANGE_SUBIDX_A_msb64			21
+#define FM10K_SW_GLORT_RAM_RANGE_SUBIDX_B_lsb64			22
+#define FM10K_SW_GLORT_RAM_RANGE_SUBIDX_B_msb64			29
+#define FM10K_SW_GLORT_RAM_DEST_COUNT_lsb64				30
+#define FM10K_SW_GLORT_RAM_DEST_COUNT_msb64				33
+#define FM10K_SW_GLORT_RAM_HASH_ROTATION		(1ULL << 34)
+
+
+#define FM10K_SW_PARSER_BASE		FM10K_SW_REG_OFF(0xCF0000)
+#define FM10K_SW_PARSER_REG(wo_) \
+			(FM10K_SW_PARSER_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_PARSER_PORT_CFG_1(p_)	\
+					FM10K_SW_PARSER_REG(0x0 + 0x2 * (p_))
+#define FM10K_SW_PARSER_PORT_CFG_1_FTAG		(1ULL << 0)
+#define FM10K_SW_PARSER_PORT_CFG_1_VLAN1_TAG(v_)	(1ULL << (1 + (v_)))
+#define FM10K_SW_PARSER_PORT_CFG_1_VLAN2_TAG(v_)	(1ULL << (5 + (v_)))
+#define FM10K_SW_PARSER_PORT_CFG_1_VLAN2_FIRST		(1ULL << 9)
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VID_lsb		10
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VID_msb		21
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VPRI_lsb		22
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VPRI_msb		25
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VID2_lsb		26
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VID2_msb		37
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VPRI2_lsb	38
+#define FM10K_SW_PARSER_PORT_CFG_1_DEFAULT_VPRI2_msb	41
+#define FM10K_SW_PARSER_PORT_CFG_1_USE_DEFAULT_VLAN	(1ULL << 42)
+#define FM10K_SW_PARSER_PORT_CFG_2(p_)	\
+				FM10K_SW_PARSER_REG(0x80 + 0x2 * (p_))
+#define FM10K_SW_PARSER_PORT_CFG_2_CUSTOM_TAG_1_lsb		0
+#define FM10K_SW_PARSER_PORT_CFG_2_CUSTOM_TAG_1_msb		3
+#define FM10K_SW_PARSER_PORT_CFG_2_CUSTOM_TAG_2_lsb		4
+#define FM10K_SW_PARSER_PORT_CFG_2_CUSTOM_TAG_2_msb		7
+#define FM10K_SW_PARSER_PORT_CFG_2_PARSE_MPLS			(1ULL << 8)
+#define FM10K_SW_PARSER_PORT_CFG_2_STORE_MPLS_lsb		9
+#define FM10K_SW_PARSER_PORT_CFG_2_STORE_MPLS_msb		11
+#define FM10K_SW_PARSER_PORT_CFG_2_PARSE_L3		(1ULL << 12)
+#define FM10K_SW_PARSER_PORT_CFG_2_PARSE_L4		(1ULL << 13)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV4_OPTIONS	(1ULL << 14)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV6_HOP_BY_HOP	(1ULL << 15)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV6_ROUTING	(1ULL << 16)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV6_FRAG		(1ULL << 17)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV6_DEST		(1ULL << 18)
+#define FM10K_SW_PARSER_PORT_CFG_2_FLAG_IPV6_AUTH		(1ULL << 19)
+#define FM10K_SW_PARSER_PORT_CFG_2_DEFAULT_DSCP_lsb		20
+#define FM10K_SW_PARSER_PORT_CFG_2_DEFAULT_DSCP_msb		25
+#define FM10K_SW_PARSER_PORT_CFG_2_DROP_TAGGED			(1ULL << 26)
+#define FM10K_SW_PARSER_PORT_CFG_2_DROP_UNTAGGED		(1ULL << 27)
+#define FM10K_SW_PARSER_PORT_CFG_2_USE_DEFAULT_DSCP		(1ULL << 28)
+#define FM10K_SW_PARSER_PORT_CFG_2_SWITCH_PRI_FROM_VLAN	(1ULL << 29)
+#define FM10K_SW_PARSER_PORT_CFG_2_SWITCH_PRI_FROM_DSCP	(1ULL << 30)
+#define FM10K_SW_PARSER_PORT_CFG_2_SWITCH_PRI_FROM_ISL	(1ULL << 31)
+#define FM10K_SW_PARSER_PORT_CFG_2_SWITCH_PRI_PREFER_DSCP	(1ULL << 32)
+#define FM10K_SW_PARSER_PORT_CFG_3(p_) FM10K_SW_PARSER_REG(0x100 + 0x2 * (p_))
+#define FM10K_SW_PORT_CFG_ISL(p_)      FM10K_SW_PARSER_REG(0x180 + (p_))
+#define FM10K_SW_PORT_CFG_ISL_SGLORT_lsb				0
+#define FM10K_SW_PORT_CFG_ISL_SGLORT_msb				15
+#define FM10K_SW_PORT_CFG_ISL_USR_lsb					16
+#define FM10K_SW_PORT_CFG_ISL_USR_msb					23
+#define FM10K_SW_PORT_CFG_ISL_DEFAULT_PRI_lsb			24
+#define FM10K_SW_PORT_CFG_ISL_DEFAULT_PRI_msb			27
+#define FM10K_SW_PARSER_VLAN_TAG(n_) FM10K_SW_PARSER_REG(0x1C0 + (n_))
+#define FM10K_SW_PARSER_CUSTOM_TAG(n_)	FM10K_SW_PARSER_REG(0x1C4 + (n_))
+#define FM10K_SW_PARSER_MPLS_TAG	FM10K_SW_PARSER_REG(0x1C8)
+#define FM10K_SW_PARSER_DI_CFG(n_)	FM10K_SW_PARSER_REG(0x1D0 + 0x2 * (n_))
+#define FM10K_SW_RX_VPRI_MAP(p_)	FM10K_SW_PARSER_REG(0x200 + 0x2 * (p_))
+#define FM10K_SW_DSCP_PRI_MAP(pri_)	FM10K_SW_PARSER_REG(0x280 + (pri_))
+#define FM10K_SW_VPRI_PRI_MAP(pri_)	FM10K_SW_PARSER_REG(0x2C0 + (pri_))
+
+
+#define FM10K_SW_HANDLER_BASE		FM10K_SW_REG_OFF(0xD50000)
+#define FM10K_SW_HANDLER_REG(wo_) \
+			(FM10K_SW_HANDLER_BASE + FM10K_SW_REG_OFF(wo_))
+
+#define FM10K_SW_SYS_CFG_1			FM10K_SW_HANDLER_REG(0x0)
+#define FM10K_SW_SYS_CFG_1_DROP_PAUSE				(1 << 0)
+#define FM10K_SW_SYS_CFG_1_TRAP_MTU_VIOLATIONS			(1 << 1)
+#define FM10K_SW_SYS_CFG_1_ENABLE_TRAP_PLUS_LOG			(1 << 2)
+#define FM10K_SW_SYS_CFG_1_DROP_INVALID_SMAC			(1 << 3)
+#define FM10K_SW_SYS_CFG_1_DROP_MAC_CTRL_ETHERTYPE		(1 << 4)
+#define FM10K_SW_CPU_MAC			FM10K_SW_HANDLER_REG(0x2)
+#define FM10K_SW_SYS_CFG_ROUTER		FM10K_SW_HANDLER_REG(0x4)
+#define FM10K_SW_L34_HASH_CFG		FM10K_SW_HANDLER_REG(0x5)
+#define FM10K_SW_L34_HASH_CFG_SYMMETRIC					(1 << 0)
+#define FM10K_SW_L34_HASH_CFG_USE_SIP					(1 << 1)
+#define FM10K_SW_L34_HASH_CFG_USE_DIP					(1 << 2)
+#define FM10K_SW_L34_HASH_CFG_USE_PROT					(1 << 3)
+#define FM10K_SW_L34_HASH_CFG_USE_TCP					(1 << 4)
+#define FM10K_SW_L34_HASH_CFG_USE_UDP					(1 << 5)
+#define FM10K_SW_L34_HASH_CFG_USE_PROT1					(1 << 6)
+#define FM10K_SW_L34_HASH_CFG_USE_PROT2					(1 << 7)
+#define FM10K_SW_L34_HASH_CFG_USE_L4SRC					(1 << 8)
+#define FM10K_SW_L34_HASH_CFG_USE_L4DST					(1 << 9)
+#define FM10K_SW_L34_HASH_CFG_ECMP_ROTATION_lsb			10
+#define FM10K_SW_L34_HASH_CFG_ECMP_ROTATION_msb			11
+#define FM10K_SW_L34_HASH_CFG_PROT1_lsb					16
+#define FM10K_SW_L34_HASH_CFG_PROT1_msb					23
+#define FM10K_SW_L34_HASH_CFG_PROT2_lsb					24
+#define FM10K_SW_L34_HASH_CFG_PROT2_msb					31
+#define FM10K_SW_L34_FLOW_HASH_CFG_1 FM10K_SW_HANDLER_REG(0x6)
+#define FM10K_SW_L34_FLOW_HASH_CFG_2 FM10K_SW_HANDLER_REG(0x7)
+#define FM10K_SW_L234_HASH_CFG       FM10K_SW_HANDLER_REG(0x8)
+#define FM10K_SW_L234_HASH_CFG_USE_L2_IF_IP				(1 << 0)
+#define FM10K_SW_L234_HASH_CFG_USE_L34					(1 << 1)
+#define FM10K_SW_L234_HASH_CFG_SYMMETRIC				(1 << 2)
+#define FM10K_SW_L234_HASH_CFG_USE_DMAC					(1 << 3)
+#define FM10K_SW_L234_HASH_CFG_USE_SMAC					(1 << 4)
+#define FM10K_SW_L234_HASH_CFG_USE_TYPE					(1 << 5)
+#define FM10K_SW_L234_HASH_CFG_USE_VPRI					(1 << 6)
+#define FM10K_SW_L234_HASH_CFG_USE_VID					(1 << 8)
+#define FM10K_SW_L234_HASH_CFG_ROTATION_A_lsb			8
+#define FM10K_SW_L234_HASH_CFG_ROTATION_A_msb			9
+#define FM10K_SW_L234_HASH_CFG_ROTATION_B_lsb			10
+#define FM10K_SW_L234_HASH_CFG_ROTATION_B_msb			11
+#define FM10K_SW_CPU_TRAP_MASK_FH	FM10K_SW_HANDLER_REG(0xA)
+#define FM10K_SW_TRAP_GLORT			FM10K_SW_HANDLER_REG(0xC)
+#define FM10K_SW_RX_MIRROR_CFG		FM10K_SW_HANDLER_REG(0xD)
+#define FM10K_SW_LOG_MIRROR_PROFILE	FM10K_SW_HANDLER_REG(0xE)
+#define FM10K_SW_FH_MIRROR_PROFILE_TABLE(n_) FM10K_SW_HANDLER_REG(0x40 + (n_))
+#define FM10K_SW_PORT_CFG_2(p_)		FM10K_SW_HANDLER_REG(0x80 + 0x2 * (p_))
+#define FM10K_SW_PORT_CFG_3(p_)		FM10K_SW_HANDLER_REG(0x100 + (p_))
+#define FM10K_SW_FH_LOOPBACK_SUPPRESS(p_) FM10K_SW_HANDLER_REG(0x140 + (p_))
+#define FM10K_SW_FH_HEAD_IP			FM10K_SW_HANDLER_REG(0x180)
+#define FM10K_SW_FH_HEAD_IM			FM10K_SW_HANDLER_REG(0x182)
+#define FM10K_SW_PARSER_EARLY_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x184)
+#define FM10K_SW_PARSER_LATE_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x185)
+#define FM10K_SW_MAPPER_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x186)
+#define FM10K_SW_FFU_SRAM_CTRL(n_)	FM10K_SW_HANDLER_REG(0x1A0 + 0x4 * (n_))
+#define FM10K_SW_ARP_SRAM_CTRL		FM10K_SW_HANDLER_REG(0x1C0)
+#define FM10K_SW_VLAN_LOOKUP_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x1C1)
+#define FM10K_SW_MA_TABLE_SRAM_CTRL(n_)	FM10K_SW_HANDLER_REG(0x1C4 + 0x2 * (n_))
+#define FM10K_SW_FID_GLORT_LOOKUP_SRAM_CTRL FM10K_SW_HANDLER_REG(0x1C8)
+#define FM10K_SW_GLORT_RAM_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x1CA)
+#define FM10K_SW_GLORT_TABLE_SRAM_CTRL	FM10K_SW_HANDLER_REG(0x1CB)
+#define FM10K_SW_FH_HEAD_OUTPUT_FIFO_SRAM_CTRL FM10K_SW_HANDLER_REG(0x1CC)
+
+
+#define FM10K_SW_LAG_BASE		FM10K_SW_REG_OFF(0xD90000)
+#define FM10K_SW_LAG_REG(wo_)   (FM10K_SW_LAG_BASE + FM10K_SW_REG_OFF(wo_))
+#define	FM10K_SW_LAG_CFG(l_)	FM10K_SW_LAG_REG(l_)
+#define FM10K_SW_LAG_CFG_LAG_SIZE_lsb			0
+#define FM10K_SW_LAG_CFG_LAG_SIZE_msb			3
+#define FM10K_SW_LAG_CFG_INDEX_lsb				4
+#define FM10K_SW_LAG_CFG_INDEX_msb				7
+#define FM10K_SW_LAG_CFG_HASH_ROTATION			(1 << 8)
+#define FM10K_SW_LAG_CFG_IN_LAG					(1 << 9)
+#define	FM10K_SW_CANONICAL_GLORT_CAM(n_) FM10K_SW_LAG_REG((n_) + 0x40)
+#define FM10K_SW_CANONICAL_GLORT_CAM_LAG_GLORT_lsb		0
+#define FM10K_SW_CANONICAL_GLORT_CAM_LAG_GLORT_msb		15
+#define FM10K_SW_CANONICAL_GLORT_CAM_MASK_SIZE_lsb		16
+#define FM10K_SW_CANONICAL_GLORT_CAM_MASK_SIZE_msb		19
+#define FM10K_SW_CANONICAL_GLORT_CAM_PORT_FIELD_SIZE_lsb 20
+#define FM10K_SW_CANONICAL_GLORT_CAM_PORT_FIELD_SIZE_msb 22
+
+
+#define FM10K_SW_RX_STATS_BASE		FM10K_SW_REG_OFF(0xE00000)
+#define FM10K_SW_RX_STATS_REG(wo_) \
+			(FM10K_SW_RX_STATS_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_RX_STATS_BANK(b_, i_) \
+			FM10K_SW_RX_STATS_REG(0x1000 * (b_) + 0x4 * (i_))
+#define FM10K_SW_RX_STATS_BANK_1_INDEX			0
+#define FM10K_SW_RX_STATS_BANK_2_INDEX			1
+#define FM10K_SW_RX_STATS_BANK_3_INDEX			2
+#define FM10K_SW_RX_STATS_BANK_4_INDEX			3
+#define FM10K_SW_RX_STATS_BANK_5_INDEX			4
+#define FM10K_SW_RX_STATS_BANK_6_INDEX			5
+#define FM10K_SW_RX_STATS_BANK_1_NON_IP_L2_UCAST	0
+#define FM10K_SW_RX_STATS_BANK_1_NON_IP_L2_MCAST	1
+#define FM10K_SW_RX_STATS_BANK_1_NON_IP_L2_BCAST	2
+#define FM10K_SW_RX_STATS_BANK_1_IPV4_L2_UCAST		3
+#define FM10K_SW_RX_STATS_BANK_1_IPV4_L2_MCAST		4
+#define FM10K_SW_RX_STATS_BANK_1_IPV4_L2_BCAST		5
+#define FM10K_SW_RX_STATS_BANK_1_IPV6_L2_UCAST		6
+#define FM10K_SW_RX_STATS_BANK_1_IPV6_L2_MCAST		7
+#define FM10K_SW_RX_STATS_BANK_1_IPV6_L2_BCAST		8
+#define FM10K_SW_RX_STATS_BANK_1_IEEE802_3_PAUSE	9
+#define FM10K_SW_RX_STATS_BANK_1_CLASS_BASED_PAUSE	10
+#define FM10K_SW_RX_STATS_BANK_1_FRAMING_ERR		11
+#define FM10K_SW_RX_STATS_BANK_1_FCS_ERR			12
+#define FM10K_SW_RX_STATS_BANK_2_LEN_LT_64			0
+#define FM10K_SW_RX_STATS_BANK_2_LEN_EQ_64			1
+#define FM10K_SW_RX_STATS_BANK_2_LEN_65_127			2
+#define FM10K_SW_RX_STATS_BANK_2_LEN_128_255		3
+#define FM10K_SW_RX_STATS_BANK_2_LEN_256_511		4
+#define FM10K_SW_RX_STATS_BANK_2_LEN_512_1023		5
+#define FM10K_SW_RX_STATS_BANK_2_LEN_1024_1522		6
+#define FM10K_SW_RX_STATS_BANK_2_LEN_1523_2047		7
+#define FM10K_SW_RX_STATS_BANK_2_LEN_2048_4095		8
+#define FM10K_SW_RX_STATS_BANK_2_LEN_4096_8191		9
+#define FM10K_SW_RX_STATS_BANK_2_LEN_8192_10239		10
+#define FM10K_SW_RX_STATS_BANK_2_LEN_GE_10240		11
+#define FM10K_SW_RX_STATS_BANK_3_PRI(p_)			(p_)
+#define FM10K_SW_RX_STATS_BANK_4_FID_FORWARDED		0
+#define FM10K_SW_RX_STATS_BANK_4_FLOOD_FORWARDED	1
+#define FM10K_SW_RX_STATS_BANK_4_SPECIALLY_HANDLED	2
+#define FM10K_SW_RX_STATS_BANK_4_PARSER_ERROR_DROP	3
+#define FM10K_SW_RX_STATS_BANK_4_ECC_ERROR_DROP		4
+#define FM10K_SW_RX_STATS_BANK_4_TRAPPED			5
+#define FM10K_SW_RX_STATS_BANK_4_PAUSE_DROPS		6
+#define FM10K_SW_RX_STATS_BANK_4_STP_DROPS			7
+#define FM10K_SW_RX_STATS_BANK_4_SECURITY_VIOLATIONS 8
+#define FM10K_SW_RX_STATS_BANK_4_VLAN_TAG_DROPS		9
+#define FM10K_SW_RX_STATS_BANK_4_VLAN_INGRESS_DROPS 10
+#define FM10K_SW_RX_STATS_BANK_4_VLAN_EGRESS_DROPS	11
+#define FM10K_SW_RX_STATS_BANK_4_GLORT_MISS_DROPS	12
+#define FM10K_SW_RX_STATS_BANK_4_FFU_DROPS			13
+#define FM10K_SW_RX_STATS_BANK_4_TRIGGER_DROPS		14
+#define FM10K_SW_RX_STATS_BANK_5_POLICER_DROPS		0
+#define FM10K_SW_RX_STATS_BANK_5_TTL_DROPS			1
+#define FM10K_SW_RX_STATS_BANK_5_CM_PRIV_DROPS		2
+#define FM10K_SW_RX_STATS_BANK_5_CM_SMP0_DROPS		3
+#define FM10K_SW_RX_STATS_BANK_5_CM_SMP1_DROPS		4
+#define FM10K_SW_RX_STATS_BANK_5_CM_RX_HOG0_DROPS	5
+#define FM10K_SW_RX_STATS_BANK_5_CM_RX_HOG1_DROPS	6
+#define FM10K_SW_RX_STATS_BANK_5_CM_TX_HOG0_DROPS	7
+#define FM10K_SW_RX_STATS_BANK_5_CM_TX_HOG1_DROPS	8
+#define FM10K_SW_RX_STATS_BANK_5_TRIGGER_REDIRECTS	10
+#define FM10K_SW_RX_STATS_BANK_5_FLOOD_CONTROL_DROPS 11
+#define FM10K_SW_RX_STATS_BANK_5_GLORT_FORWARDED	12
+#define FM10K_SW_RX_STATS_BANK_5_LOOPBACK_SUPP_DROPS 13
+#define FM10K_SW_RX_STATS_BANK_5_OTHER_DROPS		14
+#define FM10K_SW_RX_PORT_STAT(b_, s_, p_, f_) \
+		(FM10K_SW_RX_STATS_BANK(FM10K_SW_RX_STATS_##b_##_INDEX, \
+		16 * (p_) +	FM10K_SW_RX_STATS_##b_##_##s_) + \
+		((f_) ? 0 : FM10K_SW_REG_OFF(2)))
+#define FM10K_SW_RX_STATS_CFG(p_) FM10K_SW_RX_STATS_REG(0x10000 + (p_))
+#define FM10K_SW_RX_STATS_CFG_PER_FRAME_ADJUSTMENT_lsb	0
+#define FM10K_SW_RX_STATS_CFG_PER_FRAME_ADJUSTMENT_msb	7
+#define FM10K_SW_RX_STATS_CFG_ENABLE_ALL_BANKS	0x00003f00
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_1		(1 << 8)
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_2		(1 << 9)
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_3		(1 << 10)
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_4		(1 << 11)
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_5		(1 << 12)
+#define FM10K_SW_RX_STATS_CFG_ENABLE_BANK_6		(1 << 13)
+#define FM10K_SW_RX_STATS_CFG_SWITCH_PRI		(1 << 14)
+
+
+#define FM10K_SW_HANDLER_TAIL_BASE	FM10K_SW_REG_OFF(0xE30000)
+#define FM10K_SW_HANDLER_TAIL_REG(wo_) \
+			(FM10K_SW_HANDLER_TAIL_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_SAF_MATRIX(l_)      FM10K_SW_HANDLER_TAIL_REG(0x2 * (l_))
+#define FM10K_SW_SAF_MATRIX_ENABLE_SNF(l_)	(1ULL << (l_))
+#define FM10K_SW_SAF_MATRIX_ENABLE_SNF_ALL_PORTS    FM10K_SW_MASK64(47, 0)
+#define FM10K_SW_SAF_MATRIX_IGNORE_ERROR			(1ULL << 50)
+#define FM10K_SW_FRAME_TIME_OUT		FM10K_SW_HANDLER_TAIL_REG(0x80)
+#define FM10K_SW_SAF_SRAM_CTRL		FM10K_SW_HANDLER_TAIL_REG(0x81)
+#define FM10K_SW_EGRESS_PAUSE_SRAM_CTRL	FM10K_SW_HANDLER_TAIL_REG(0x82)
+#define FM10K_SW_RX_STATS_SRAM_CTRL		FM10K_SW_HANDLER_TAIL_REG(0x84)
+#define FM10K_SW_POLICER_USAGE_SRAM_CTRL	FM10K_SW_HANDLER_TAIL_REG(0x88)
+#define FM10K_SW_TCN_SRAM_CTRL		FM10K_SW_HANDLER_TAIL_REG(0x8C)
+#define FM10K_SW_FH_TAIL_IP			FM10K_SW_HANDLER_TAIL_REG(0x8D)
+#define FM10K_SW_FH_TAIL_IM			FM10K_SW_HANDLER_TAIL_REG(0x8E)
+#define FM10K_SW_TAIL_PERMIT_MGMT	FM10K_SW_HANDLER_TAIL_REG(0x8F)
+#define FM10K_SW_TAIL_FORCE_IDLE	FM10K_SW_HANDLER_TAIL_REG(0x90)
+
+
+#define FM10K_SW_CM_USAGE_BASE		FM10K_SW_REG_OFF(0xE60000)
+#define FM10K_SW_CM_USAGE_REG(wo_)	\
+			(FM10K_SW_CM_USAGE_BASE + FM10K_SW_REG_OFF(wo_))
+#define FM10K_SW_CM_SWEEPER_SWITCH_PRI_TO_TC FM10K_SW_CM_USAGE_REG(0x0)
+#define FM10K_SW_CM_SWEEPER_TC_TO_SMP	FM10K_SW_CM_USAGE_REG(0x2)
+#define FM10K_SW_CM_TX_TC_PRIVATE_WM(l_, c_) \
+			FM10K_SW_CM_USAGE_REG(0x200 + 0x8 * (l_) + (c_))
+#define FM10K_SW_CM_TX_TC_HOG_WM(l_, c_) \
+			FM10K_SW_CM_USAGE_REG(0x400 + 0x8 * (l_) + (c_))
+#define FM10K_SW_CM_RX_SMP_PAUSE_WM(l_, s_) \
+			FM10K_SW_CM_USAGE_REG(0x600 + 0x2 * (l_) + (s_))
+#define FM10K_SW_CM_RX_SMP_PRIVATE_WM(l_, s_) \
+			FM10K_SW_CM_USAGE_REG(0x680 + 0x2 * (l_) + (s_))
+#define FM10K_SW_CM_RX_SMP_HOG_WM(l_, s_) \
+			FM10K_SW_CM_USAGE_REG(0x700 + 0x2 * (l_) + (s_))
+#define FM10K_SW_CM_PAUSE_RESEND_INTERVAL(l_) \
+			FM10K_SW_CM_USAGE_REG(0x780 + (l_))
+#define FM10K_SW_CM_PAUSE_BASE_FREQ		\
+			FM10K_SW_CM_USAGE_REG(0x7C0)
+#define FM10K_SW_CM_PAUSE_CFG(l_)		\
+			FM10K_SW_CM_USAGE_REG(0x800 + (l_))
+#define FM10K_SW_CM_SHARED_WM(p_)		\
+			FM10K_SW_CM_USAGE_REG(0x840 + (p_))
+#define FM10K_SW_CM_SHARED_SMP_PAUSE_WM(s_)	\
+			FM10K_SW_CM_USAGE_REG(0x850 + (s_))
+#define FM10K_SW_CM_GLOBAL_WM			FM10K_SW_CM_USAGE_REG(0x852)
+#define FM10K_SW_CM_GLOBAL_WM_WATERMARK_lsb		0
+#define FM10K_SW_CM_GLOBAL_WM_WATERMARK_msb		14
+#define FM10K_SW_CM_GLOBAL_CFG			FM10K_SW_CM_USAGE_REG(0x853)
+#define FM10K_SW_CM_GLOBAL_CFG_IFG_PENALTY_lsb	0
+#define FM10K_SW_CM_GLOBAL_CFG_IFG_PENALTY_msb	7
+#define FM10K_SW_CM_GLOBAL_CFG_FORCE_PAUSE_ON	(1 << 8)
+#define FM10K_SW_CM_GLOBAL_CFG_FORCE_PAUSE_OFF	(1 << 9)
+#define FM10K_SW_CM_GLOBAL_CFG_WM_SWEEP_EN		(1 << 10)
+#define FM10K_SW_CM_GLOBAL_CFG_PAUSE_GEN_SWEEP_EN	(1 << 11)
+#define FM10K_SW_CM_GLOBAL_CFG_PAUSE_REC_SWEEP_EN	(1 << 12)
+#define FM10K_SW_CM_GLOBAL_CFG_NUM_SWEEPER_PORTS_lsb	13
+#define FM10K_SW_CM_GLOBAL_CFG_NUM_SWEEPER_PORTS_msb	18
+#define FM10K_SW_CM_TC_PC_MAP(l_)	FM10K_SW_CM_USAGE_REG(0x880 + (l_))
+#define FM10K_SW_CM_PC_SMP_MAP(l_)	FM10K_SW_CM_USAGE_REG(0x8C0 + (l_))
+#define FM10K_SW_CM_SOFTDROP_WM(p_)	FM10K_SW_CM_USAGE_REG(0x900 + (p_))
+#define FM10K_SW_CM_SHARED_SMP_PAUSE_CFG(s_) \
+			FM10K_SW_CM_USAGE_REG(0x910 + 0x2 * (s_))
+#define FM10K_SW_TX_RATE_LIM_CFG(l_, c_)	\
+			FM10K_SW_CM_USAGE_REG(0xA00 + 0x8 * (l_) + (c_))
+#define FM10K_SW_TX_RATE_LIM_USAGE(l_, c_)	\
+			FM10K_SW_CM_USAGE_REG(0xC00 + 0x8 * (l_) + (c_))
+#define FM10K_SW_CM_BSG_MAP(l_)		\
+			FM10K_SW_CM_USAGE_REG(0xE00 + (l_))
+#define FM10K_SW_CM_TX_TC_USAGE(l_, c_)	\
+			FM10K_SW_CM_USAGE_REG(0x1000 + 0x8 * (l_) + (c_))
+#define FM10K_SW_CM_RX_SMP_USAGE(l_, s_) \
+			FM10K_SW_CM_USAGE_REG(0x1200 + 0x2 * (l_) + (s_))
+#define FM10K_SW_MCAST_EPOCH_USAGE(s_) \
+			FM10K_SW_CM_USAGE_REG(0x1280 + (s_))
+#define FM10K_SW_CM_SHARED_SMP_USAGE(s_) \
+			FM10K_SW_CM_USAGE_REG(0x1282 + (s_))
+#define FM10K_SW_CM_SMP_USAGE(s_) \
+			FM10K_SW_CM_USAGE_REG(0x1284 + (s_))
+#define FM10K_SW_CM_GLOBAL_USAGE	FM10K_SW_CM_USAGE_REG(0x1286)
+#define FM10K_SW_CM_PAUSE_GEN_STATE(l_)	FM10K_SW_CM_USAGE_REG(0x12C0 + (l_))
+#define FM10K_SW_CM_PAUSE_RCV_TIMER		FM10K_SW_CM_USAGE_REG(0x1300)
+#define FM10K_SW_CM_PAUSE_RCV_PORT_TIMER(l_) \
+			FM10K_SW_CM_USAGE_REG(0x1340 + (l_))
+
+/* FM10K_SW_CM_EGRESS_PAUSE_COUNT is also
+ * known as FM10K_SW_CM_PAUSE_RCV_STATE
+ */
+#define FM10K_SW_CM_EGRESS_PAUSE_COUNT(l_, dw_) \
+		FM10K_SW_CM_USAGE_REG(0x1400 + 0x4 * (l_) + 0x2 * (dw_))
+
+#define FM10K_SW_MOD_BASE		FM10K_SW_REG_OFF(0xE80000)
+#define FM10K_SW_MOD_REG(wo_)	\
+			(FM10K_SW_MOD_BASE + FM10K_SW_REG_OFF(wo_))
+
+#define FM10K_SW_MOD_MAX_MGMT_WAIT_CYCLE	FM10K_SW_MOD_REG(0xF8)
+#define FM10K_SW_MOD_IP				FM10K_SW_MOD_REG(0x106)
+#define FM10K_SW_MOD_IM				FM10K_SW_MOD_REG(0x108)
+#define FM10K_SW_MOD_SRAM_BIST_OUT	FM10K_SW_MOD_REG(0x10A)
+#define FM10K_SW_MOD_SRAM_ERROR_WRITE	FM10K_SW_MOD_REG(0x10C)
+#define FM10K_SW_MOD_PAUSE_SMAC			FM10K_SW_MOD_REG(0x10E)
+#define FM10K_SW_MOD_ROUTER_SMAC(n_)	FM10K_SW_MOD_REG(0x120 + 0x2 * (n_))
+#define FM10K_SW_MOD_MCAST_VLAN_TABLE(n_)	\
+			FM10K_SW_MOD_REG(0x10000 + 0x2 * (n_))
+#define FM10K_SW_MOD_VLAN_TAG_VID1_MAP(v_)	\
+			FM10K_SW_MOD_REG(0x20000 + 0x2 * (v_))
+#define FM10K_SW_MOD_VID2_MAP(v_)		\
+			FM10K_SW_MOD_REG(0x22000 + 0x2 * (v_))
+#define FM10K_SW_MOD_MIRROR_PROFILE_TABLE(n_) \
+			FM10K_SW_MOD_REG(0x24000 + 0x2 * (n_))
+#define FM10K_SW_MOD_PER_PORT_CFG_1(p_)	\
+			FM10K_SW_MOD_REG(0x24080 + 0x2 * (p_))
+#define FM10K_SW_MOD_PER_PORT_CFG_2(p_)	\
+			FM10K_SW_MOD_REG(0x24100 + 0x2 * (p_))
+#define FM10K_SW_MOD_PER_PORT_CFG_2_MIRROR_TRUNCATION_LEN_lsb64	0
+#define FM10K_SW_MOD_PER_PORT_CFG_2_MIRROR_TRUNCATION_LEN_msb64	5
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_PCP1_UPDATE	(1ULL << 6)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_PCP2_UPDATE	(1ULL << 7)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_DEI1_UPDATE	(1ULL << 8)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_DEI2_UPDATE	(1ULL << 9)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN1_ETYPE_lsb64	10
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN1_ETYPE_msb64	11
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN2_ETYPE_lsb64	12
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN2_ETYPE_msb64	13
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_DMAC_ROUTING	(1ULL << 14)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_SMAC_ROUTING	(1ULL << 15)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_TTL_DECREMENT	(1ULL << 16)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_ENABLE_DSCP_MODIFICATION (1ULL << 17)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_FTAG		(1ULL << 18)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VID2_FIRST	(1ULL << 19)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN_TAGGING_lsb64	20
+#define FM10K_SW_MOD_PER_PORT_CFG_2_VLAN_TAGGING_msb64	22
+#define FM10K_SW_MOD_PER_PORT_CFG_2_TX_PAUSE_PRI_EN_VEC_lsb64 23
+#define FM10K_SW_MOD_PER_PORT_CFG_2_TX_PAUSE_PRI_EN_VEC_msb64 30
+#define FM10K_SW_MOD_PER_PORT_CFG_2_TX_PAUSE_TYPE	(1ULL << 31)
+#define FM10K_SW_MOD_PER_PORT_CFG_2_TX_PAUSE_VALUE_lsb64	32
+#define FM10K_SW_MOD_PER_PORT_CFG_2_TX_PAUSE_VALUE_msb64	47
+#define FM10K_SW_MOD_PER_PORT_CFG_2_MIN_FRAME_SIZE		(1ULL << 48)
+#define FM10K_SW_MOD_VPRI1_MAP(p_)		\
+			FM10K_SW_MOD_REG(0x24180 + 0x2 * (p_))
+#define FM10K_SW_MOD_VPRI2_MAP(p_)		\
+			FM10K_SW_MOD_REG(0x24200 + 0x2 * (p_))
+#define FM10K_SW_MOD_VLAN_ETYPE(n_)		\
+			FM10K_SW_MOD_REG(0x24280 + 0x2 * (n_))
+#define FM10K_SW_MOD_STATS_CFG(p_)		\
+			FM10K_SW_MOD_REG(0x24300 + 0x2 * (p_))
+#define FM10K_SW_MOD_STATS_CFG_ENABLE_GROUP_7	(1 << 0)
+#define FM10K_SW_MOD_STATS_CFG_ENABLE_GROUP_8	(1 << 1)
+#define FM10K_SW_MOD_STATS_BANK_FRAME(b_, i_)	\
+			FM10K_SW_MOD_REG(0x25000 + 0x800 * (b_) + 0x2 * (i_))
+#define FM10K_SW_MOD_STATS_BANK_BYTE(b_, i_)	\
+			FM10K_SW_MOD_REG(0x26000 + 0x800 * (b_) + 0x2 * (i_))
+#define FM10K_SW_MOD_STATS_BANK_7_INDEX					0
+#define FM10K_SW_MOD_STATS_BANK_8_INDEX					1
+#define FM10K_SW_MOD_STATS_BANK_7_L2_UCAST				0
+#define FM10K_SW_MOD_STATS_BANK_7_L2_MCAST				1
+#define FM10K_SW_MOD_STATS_BANK_7_L2_BCAST				2
+#define FM10K_SW_MOD_STATS_BANK_7_TX_ERROR				3
+#define FM10K_SW_MOD_STATS_BANK_7_TIMEOUT_DROP			4
+#define FM10K_SW_MOD_STATS_BANK_7_TX_ERROR_DROP			5
+#define FM10K_SW_MOD_STATS_BANK_7_TX_ECC_DROP			6
+#define FM10K_SW_MOD_STATS_BANK_7_LOOPBACK_DROP			7
+#define FM10K_SW_MOD_STATS_BANK_7_TTL1_DROP				8
+#define FM10K_SW_MOD_STATS_BANK_7_PAUSE					9
+#define FM10K_SW_MOD_STATS_BANK_7_CB_PAUSE				10
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_LT_64				0
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_EQ_64				1
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_65_127			2
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_128_255			3
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_256_511			4
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_512_1023			5
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_1024_1522			6
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_1523_2047			7
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_2048_4095			8
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_4096_8191			9
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_8192_10239		10
+#define FM10K_SW_MOD_STATS_BANK_8_LEN_GE_10240			11
+#define FM10K_SW_TX_PORT_STAT(b_, s_, p_, f_, p1_) \
+		((f_) ? \
+		FM10K_SW_MOD_STATS_BANK_FRAME(FM10K_SW_MOD_STATS_##b_##_INDEX, \
+		16 * (p_) + FM10K_SW_MOD_STATS_##b_##_##s_) : \
+		FM10K_SW_MOD_STATS_BANK_BYTE(FM10K_SW_MOD_STATS_##b_##_INDEX, \
+		16 * (p1_) + FM10K_SW_MOD_STATS_##b_##_##s_))
+
+#define FM10K_SW_SCHED_BASE		FM10K_SW_REG_OFF(0xF00000)
+#define FM10K_SW_SCHED_REG(wo_) \
+			(FM10K_SW_SCHED_BASE + FM10K_SW_REG_OFF(wo_))
+
+/*
+ * Schedule fields for both FM10K_SW_SCHED_RX_SCHEDULE and
+ * FM10K_SW_SCHED_TX_SCHEDULE
+ */
+#define	FM10K_SW_SCHED_SCHEDULE_ENTRY(p_, l_, q_)	\
+		(FM10K_SW_MAKE_REG_FIELD(SCHED_SCHEDULE_PHYS_PORT, (p_)) | \
+		FM10K_SW_MAKE_REG_FIELD(SCHED_SCHEDULE_LOG_PORT, (l_)) | \
+		((q_) ? FM10K_SW_SCHED_SCHEDULE_QUAD : 0))
+#define FM10K_SW_SCHED_SCHEDULE_PHYS_PORT_lsb		0
+#define FM10K_SW_SCHED_SCHEDULE_PHYS_PORT_msb		7
+#define FM10K_SW_SCHED_SCHEDULE_LOG_PORT_lsb		8
+#define FM10K_SW_SCHED_SCHEDULE_LOG_PORT_msb		13
+#define FM10K_SW_SCHED_SCHEDULE_QUAD		(1 << 14)
+#define FM10K_SW_SCHED_SCHEDULE_COLOR		(1 << 15)
+#define FM10K_SW_SCHED_SCHEDULE_IDLE		(1 << 16)
+
+#define FM10K_SW_SCHED_RX_SCHEDULE(p_, n_)	\
+			FM10K_SW_SCHED_REG(0x20000 + 0x200 * (p_) + (n_))
+#define FM10K_SW_SCHED_TX_SCHEDULE(p_, n_)	\
+			FM10K_SW_SCHED_REG(0x20400 + 0x200 * (p_) + (n_))
+#define FM10K_SW_SCHED_SCHEDULE_CTRL	FM10K_SW_SCHED_REG(0x20800)
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_RX_ENABLE	(1 << 0)
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_RX_PAGE	(1 << 1)
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_RX_MAX_INDEX_lsb	2
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_RX_MAX_INDEX_msb	10
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_TX_ENABLE	(1 << 11)
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_TX_PAGE	(1 << 12)
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_TX_MAX_INDEX_lsb	13
+#define FM10K_SW_SCHED_SCHEDULE_CTRL_TX_MAX_INDEX_msb	21
+#define FM10K_SW_SCHED_CONFIG_SRAM_CTRL			\
+			FM10K_SW_SCHED_REG(0x20801)
+#define FM10K_SW_SCHED_SSCHED_RX_PERPORT(l_)	\
+			FM10K_SW_SCHED_REG(0x20840 + (l_))
+#define FM10K_SW_SCHED_SSCHED_RX_PERPORT_NEXT_lsb		0
+#define FM10K_SW_SCHED_SSCHED_RX_PERPORT_NEXT_msb		15
+#define FM10K_SW_SCHED_SSCHED_SRAM_CTRL	FM10K_SW_SCHED_REG(0x30050)
+#define FM10K_SW_SCHED_ESCHED_CFG_1(l_)	FM10K_SW_SCHED_REG(0x30080 + (l_))
+#define FM10K_SW_SCHED_ESCHED_CFG_2(l_)	FM10K_SW_SCHED_REG(0x300C0 + (l_))
+#define FM10K_SW_SCHED_ESCHED_CFG_3(l_)	FM10K_SW_SCHED_REG(0x30100 + (l_))
+#define FM10K_SW_SCHED_MGMT_TIMER_ESCHED	FM10K_SW_SCHED_REG(0x30240)
+#define FM10K_SW_SCHED_ESCHED_SRAM_CTRL	FM10K_SW_SCHED_REG(0x30242)
+#define FM10K_SW_SCHED_FREELIST_INIT	FM10K_SW_SCHED_REG(0x30244)
+#define FM10K_SW_SCHED_FREELIST_INIT_ENTRIES	(24 * 1024)
+#define FM10K_SW_SCHED_FREELIST_INIT_ADDRESS_lsb	0
+#define FM10K_SW_SCHED_FREELIST_INIT_ADDRESS_msb	15
+#define FM10K_SW_SCHED_FREELIST_SRAM_CTRL	FM10K_SW_SCHED_REG(0x30246)
+#define FM10K_SW_SCHED_MONITOR_DRR_Q_PERQ(q_) \
+			FM10K_SW_SCHED_REG(0x30400 + (q_))
+#define FM10K_SW_SCHED_MONITOR_DRR_CFG_PERPORT(l_) \
+			FM10K_SW_SCHED_REG(0x30600 + (l_))
+#define FM10K_SW_SCHED_MGMT_TIMER_MONITOR	FM10K_SW_SCHED_REG(0x30A40)
+#define FM10K_SW_SCHED_MONITOR_SRAM_CTRL	FM10K_SW_SCHED_REG(0x30A41)
+#define FM10K_SW_SCHED_MCAST_LEN_TABLE(n_)	\
+			FM10K_SW_SCHED_REG(0x34000 + (n_))
+#define FM10K_SW_SCHED_MCAST_DEST_TABLE(n_) \
+			FM10K_SW_SCHED_REG(0x38000 + 0x2 * (n_))
+#define FM10K_SW_SCHED_MCAST_LIMITED_SKEW_MULTICAST \
+			FM10K_SW_SCHED_REG(0x3A000)
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS(n_) \
+			FM10K_SW_SCHED_REG(0x60400 + 0x2 * (n_))
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_ENTRIES		8
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_HEAD_PAGE_lsb	0
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_HEAD_PAGE_msb	9
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_TAIL_PAGE_lsb	10
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_TAIL_PAGE_msb	19
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_HEAD_IDX_lsb	20
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_HEAD_IDX_msb	24
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_TAIL_IDX_lsb	25
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_TAIL_IDX_msb	29
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_NEXT_PAGE_lsb	30
+#define FM10K_SW_SCHED_RXQ_STORAGE_POINTERS_NEXT_PAGE_msb	39
+#define FM10K_SW_SCHED_RXQ_FREELIST_INIT	FM10K_SW_SCHED_REG(0x60410)
+#define FM10K_SW_SCHED_RXQ_FREELIST_INIT_ENTRIES		1024
+#define FM10K_SW_SCHED_RXQ_FREELIST_INIT_ADDRESS_lsb	0
+#define FM10K_SW_SCHED_RXQ_FREELIST_INIT_ADDRESS_msb	9
+#define FM10K_SW_SCHED_MGMT_TIMER_RXQ	FM10K_SW_SCHED_REG(0x60412)
+#define FM10K_SW_SCHED_MGMT_TIMER_LG	FM10K_SW_SCHED_REG(0x60413)
+#define FM10K_SW_SCHED_RXQ_SRAM_CTRL	FM10K_SW_SCHED_REG(0x60414)
+#define FM10K_SW_SCHED_TXQ_TAIL0_PERQ(q_)	\
+			FM10K_SW_SCHED_REG(0x60600 + (q_))
+#define FM10K_SW_SCHED_TXQ_TAIL0_PERQ_TAIL_lsb		0
+#define FM10K_SW_SCHED_TXQ_TAIL0_PERQ_TAIL_msb		15
+#define FM10K_SW_SCHED_TXQ_TAIL1_PERQ(q_)	\
+			FM10K_SW_SCHED_REG(0x60800 + (q_))
+#define FM10K_SW_SCHED_TXQ_TAIL1_PERQ_TAIL_lsb		0
+#define FM10K_SW_SCHED_TXQ_TAIL1_PERQ_TAIL_msb		15
+#define FM10K_SW_SCHED_TXQ_HEAD_PERQ(q_)	\
+			FM10K_SW_SCHED_REG(0x60A00 + (q_))
+#define FM10K_SW_SCHED_TXQ_HEAD_PERQ_ENTRIES		384
+#define FM10K_SW_SCHED_TXQ_HEAD_PERQ_HEAD_lsb		0
+#define FM10K_SW_SCHED_TXQ_HEAD_PERQ_HEAD_msb		15
+#define FM10K_SW_SCHED_TXQ_FREELIST_INIT	FM10K_SW_SCHED_REG(0x62000)
+#define FM10K_SW_SCHED_TXQ_FREELIST_INIT_ENTRIES	(24 * 1024)
+#define FM10K_SW_SCHED_TXQ_FREELIST_INIT_ADDRESS_lsb	0
+#define FM10K_SW_SCHED_TXQ_FREELIST_INIT_ADDRESS_msb	15
+#define FM10K_SW_SCHED_TXQ_SRAM_CTRL	FM10K_SW_SCHED_REG(0x62002)
+#define FM10K_SW_SCHED_FIFO_SRAM_CTRL	FM10K_SW_SCHED_REG(0x62004)
+#define FM10K_SW_SCHED_IP		FM10K_SW_SCHED_REG(0x62006)
+#define FM10K_SW_SCHED_IM		FM10K_SW_SCHED_REG(0x62007)
+
+#endif /* _FM10K_REGS_H_ */
diff --git a/drivers/net/fm10k/switch/fm10k_sbus.c b/drivers/net/fm10k/switch/fm10k_sbus.c
new file mode 100644
index 0000000..d7d656e
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_sbus.c
@@ -0,0 +1,292 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#include <rte_malloc.h>
+
+#include <rte_time.h>
+#include <rte_kvargs.h>
+#include <rte_hash.h>
+#include <rte_flow.h>
+#include <rte_flow_driver.h>
+#include <rte_tm_driver.h>
+
+#include "fm10k_debug.h"
+#include "fm10k_regs.h"
+#include "fm10k_sbus.h"
+#include "fm10k_switch.h"
+
+#define FM10K_SW_SBUS_COMMAND_WAIT_LOCK_US_MAX	4
+#define FM10K_SW_SBUS_COMMAND_TIMEOUT_US		500000
+#define FM10K_SW_SBUS_RING_DIVIDER				0x01
+
+static int fm10k_sbus_init(struct fm10k_sbus *);
+static int fm10k_sbus_exec(struct fm10k_sbus *, struct fm10k_sbus_req *);
+static int fm10k_sbus_reset_all(struct fm10k_sbus *);
+static int fm10k_sbus_sbm_reset(struct fm10k_sbus *);
+
+struct fm10k_sbus *
+fm10k_sbus_attach(struct fm10k_switch *sw,
+		const char *name,
+		unsigned int cfg_reg)
+{
+	struct fm10k_sbus *sb;
+	int error;
+
+	FM10K_SW_TRACE("sbus %s: attaching", name);
+
+	sb = (struct fm10k_sbus *)rte_zmalloc
+			("fm10k_sbus", sizeof(struct fm10k_sbus), 0);
+	if (sb == NULL) {
+		FM10K_SW_INFO("sbus %s: failed to allocate context", name);
+		goto fail;
+	}
+
+	sb->sw = sw;
+	sb->name = name;
+	pthread_mutex_init(&sb->lock, NULL);
+
+	sb->cfg_reg = cfg_reg;
+	sb->cmd_reg = cfg_reg + FM10K_SW_REG_OFF(1);
+	sb->req_reg = cfg_reg + FM10K_SW_REG_OFF(2);
+	sb->resp_reg = cfg_reg + FM10K_SW_REG_OFF(3);
+
+	error = fm10k_sbus_init(sb);
+	if (error)
+		goto fail;
+
+	FM10K_SW_TRACE("sbus %s: attach successful", name);
+	return sb;
+fail:
+	if (sb)
+		fm10k_sbus_detach(sb);
+	return NULL;
+}
+
+void
+fm10k_sbus_detach(struct fm10k_sbus *sb)
+{
+	FM10K_SW_TRACE("sbus %s: detaching", sb->name);
+
+	rte_free(sb);
+}
+
+static int
+fm10k_sbus_init(struct fm10k_sbus *sb)
+{
+	uint32_t data;
+	int error;
+
+	error = fm10k_sbus_sbm_reset(sb);
+	if (error)
+		goto done;
+
+	error = fm10k_sbus_reset_all(sb);
+	if (error)
+		goto done;
+
+	/* set clock to REFCLK/2 */
+	error = fm10k_sbus_write(sb, FM10K_SW_SBUS_ADDR_SBUS_CONTROLLER, 0x0a,
+	    FM10K_SW_SBUS_RING_DIVIDER);
+	if (error) {
+		FM10K_SW_ERR("sbus %s: failed to set ring divider", sb->name);
+		goto done;
+	}
+
+	error = fm10k_sbus_read(sb, FM10K_SW_SBUS_ADDR_SBUS_CONTROLLER, 0x0a,
+	    &data);
+	if (error) {
+		FM10K_SW_ERR("sbus %s: failed to read back ring divider",
+				sb->name);
+		goto done;
+	}
+	if (data != FM10K_SW_SBUS_RING_DIVIDER) {
+		FM10K_SW_ERR("sbus %s: ring divider "
+				"verify failed (expected %u, got %u)",
+				sb->name, FM10K_SW_SBUS_RING_DIVIDER, data);
+		error = -1;
+		goto done;
+	}
+
+done:
+	return error;
+}
+
+static int
+fm10k_sbus_exec(struct fm10k_sbus *sb, struct fm10k_sbus_req *req)
+{
+	struct fm10k_switch *sw =  sb->sw;
+	unsigned int total_usecs;
+	unsigned int drop_lock;
+	unsigned int delay_time;
+	int error = 0;
+	uint32_t data;
+	uint8_t expected_result;
+
+	FM10K_SW_SBUS_LOCK(sb);
+
+	FM10K_SW_SWITCH_LOCK(sw);
+	data = fm10k_read_switch_reg(sw, sb->cmd_reg);
+	if (data & FM10K_SW_SBUS_COMMAND_BUSY) {
+		FM10K_SW_INFO("sbus %s: bus busy (0x%08x)",
+		    sb->name, data);
+		error = -1;
+		goto done;
+	}
+
+	switch (req->op) {
+	case FM10K_SW_SBUS_OP_RESET:
+		FM10K_SW_TRACE("sbus %s: RESET dev=0x%02x reg=0x%02x data=0x%08x",
+		    sb->name, req->dev, req->reg, req->data);
+		expected_result = FM10K_SW_SBUS_RESULT_RESET;
+		fm10k_write_switch_reg(sw, sb->req_reg, req->data);
+		break;
+	case FM10K_SW_SBUS_OP_WRITE:
+		FM10K_SW_TRACE("sbus %s: WRITE dev=0x%02x reg=0x%02x data=0x%08x",
+		    sb->name, req->dev, req->reg, req->data);
+		expected_result = FM10K_SW_SBUS_RESULT_WRITE;
+		fm10k_write_switch_reg(sw, sb->req_reg, req->data);
+		break;
+	case FM10K_SW_SBUS_OP_READ:
+		FM10K_SW_TRACE("sbus %s: READ dev=0x%02x reg=0x%02x",
+		    sb->name, req->dev, req->reg);
+		expected_result = FM10K_SW_SBUS_RESULT_READ;
+		req->data = 0;
+		break;
+	default:
+		FM10K_SW_INFO("sbus %s: invalid opcode 0x%02x",
+		    sb->name, req->op);
+		error = -1;
+		goto done;
+	}
+
+	/* Clear the execute bit */
+	fm10k_write_switch_reg(sw, sb->cmd_reg, 0);
+
+	data =
+	    FM10K_SW_MAKE_REG_FIELD(SBUS_COMMAND_OP, req->op) |
+	    FM10K_SW_MAKE_REG_FIELD(SBUS_COMMAND_ADDRESS, req->dev) |
+	    FM10K_SW_MAKE_REG_FIELD(SBUS_COMMAND_REGISTER, req->reg) |
+	    FM10K_SW_SBUS_COMMAND_EXECUTE;
+	fm10k_write_switch_reg(sw, sb->cmd_reg, data);
+	fm10k_write_flush(sw);
+
+	total_usecs = 0;
+	delay_time = 1;
+	drop_lock = 0;
+	do {
+		if (drop_lock)
+			FM10K_SW_SWITCH_UNLOCK(sw);
+		fm10k_udelay(delay_time);
+		if (drop_lock)
+			FM10K_SW_SWITCH_LOCK(sw);
+		total_usecs += delay_time;
+		if (total_usecs >= FM10K_SW_SBUS_COMMAND_WAIT_LOCK_US_MAX) {
+			drop_lock = 1;
+			delay_time <<= 1;
+		}
+
+		data = fm10k_read_switch_reg(sw, sb->cmd_reg);
+		if (!(data & FM10K_SW_SBUS_COMMAND_BUSY)) {
+			if (FM10K_SW_REG_FIELD(data,
+					SBUS_COMMAND_RESULT_CODE)
+					!= expected_result) {
+				FM10K_SW_INFO("sbus %s: expected "
+				    "result code %u, got %u", sb->name,
+				    expected_result,
+				    FM10K_SW_REG_FIELD(data,
+					SBUS_COMMAND_RESULT_CODE));
+				error = -1;
+				goto done;
+			}
+			if (req->op == FM10K_SW_SBUS_OP_READ) {
+				req->data =
+				    fm10k_read_switch_reg(sw, sb->resp_reg);
+				FM10K_SW_TRACE("sbus %s: READ data=0x%02x",
+						sb->name, req->data);
+			}
+			goto done;
+		}
+
+	} while (total_usecs < FM10K_SW_SBUS_COMMAND_TIMEOUT_US);
+
+	error = -1;
+	FM10K_SW_INFO("sbus %s: command timed out after %u us "
+	    "(op=0x%02x dev=0x%02x reg=0x%02x data=0x%08x)", sb->name,
+	    total_usecs, req->op, req->dev, req->reg, req->data);
+
+done:
+	FM10K_SW_SWITCH_UNLOCK(sw);
+	FM10K_SW_SBUS_UNLOCK(sb);
+	return error;
+}
+
+static int
+fm10k_sbus_reset_all(struct fm10k_sbus *sb)
+{
+	struct fm10k_sbus_req req;
+	int error;
+
+	req.op = FM10K_SW_SBUS_OP_RESET;
+	req.dev = FM10K_SW_SBUS_ADDR_BROADCAST;
+	req.reg = 0;
+	req.data = 0;
+
+	error = fm10k_sbus_exec(sb, &req);
+
+	FM10K_SW_TRACE("sbus %s: broadcast reset %s (%d)", sb->name,
+	    error ? "failed" : "succeeded", error);
+
+	return error;
+}
+
+static int
+fm10k_sbus_sbm_reset(struct fm10k_sbus *sb)
+{
+	struct fm10k_sbus_req req;
+	int error;
+
+	req.op = FM10K_SW_SBUS_OP_RESET;
+	req.dev = FM10K_SW_SBUS_ADDR_SPICO;
+	req.reg = 0;
+	req.data = 0;
+
+	error = fm10k_sbus_exec(sb, &req);
+
+	FM10K_SW_TRACE("sbus %s: SBM reset %s (%d)", sb->name,
+	    error ? "failed" : "succeeded", error);
+
+	return error;
+}
+
+int
+fm10k_sbus_read(struct fm10k_sbus *sb, uint8_t dev, uint8_t reg, uint32_t *data)
+{
+	struct fm10k_sbus_req req;
+	int error;
+
+	req.op = FM10K_SW_SBUS_OP_READ;
+	req.dev = dev;
+	req.reg = reg;
+
+	error = fm10k_sbus_exec(sb, &req);
+	*data = error ? 0 : req.data;
+
+	return error;
+}
+
+int
+fm10k_sbus_write(struct fm10k_sbus *sb, uint8_t dev, uint8_t reg, uint32_t data)
+{
+	struct fm10k_sbus_req req;
+	int error;
+
+	req.op = FM10K_SW_SBUS_OP_WRITE;
+	req.dev = dev;
+	req.reg = reg;
+	req.data = data;
+
+	error = fm10k_sbus_exec(sb, &req);
+
+	return error;
+}
diff --git a/drivers/net/fm10k/switch/fm10k_sbus.h b/drivers/net/fm10k/switch/fm10k_sbus.h
new file mode 100644
index 0000000..e67967f
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_sbus.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#ifndef _FM10K_SW_SBUS_H_
+#define _FM10K_SW_SBUS_H_
+
+#include <pthread.h>
+
+
+struct fm10k_sbus {
+	struct fm10k_switch *sw;
+	const char *name;
+	pthread_mutex_t lock;
+	unsigned int cfg_reg;
+	unsigned int cmd_reg;
+	unsigned int req_reg;
+	unsigned int resp_reg;
+};
+
+#define FM10K_SW_SBUS_LOCK(sb_)		pthread_mutex_lock(&((sb_)->lock))
+#define FM10K_SW_SBUS_UNLOCK(sb_)	pthread_mutex_unlock(&((sb_)->lock))
+
+struct fm10k_sbus_req {
+	uint8_t op;
+	uint8_t dev;
+	uint8_t reg;
+	uint32_t data;
+};
+
+
+struct fm10k_sbus *fm10k_sbus_attach(struct fm10k_switch *sw,
+		const char *name, unsigned int cfg_reg);
+void fm10k_sbus_detach(struct fm10k_sbus *sb);
+int fm10k_sbus_read(struct fm10k_sbus *sb,
+		uint8_t dev, uint8_t reg, uint32_t *data);
+int fm10k_sbus_write(struct fm10k_sbus *sb,
+		uint8_t dev, uint8_t reg, uint32_t data);
+
+#endif /* _FM10K_SW_SBUS_H_ */
diff --git a/drivers/net/fm10k/switch/fm10k_switch.h b/drivers/net/fm10k/switch/fm10k_switch.h
new file mode 100644
index 0000000..d69b51c
--- /dev/null
+++ b/drivers/net/fm10k/switch/fm10k_switch.h
@@ -0,0 +1,336 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019   Silicom Ltd. Connectivity Solutions
+ */
+
+#ifndef _FM10K_SW_SWITCH_H_
+#define _FM10K_SW_SWITCH_H_
+
+#include <rte_spinlock.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <semaphore.h>
+
+#include "../fm10k.h"
+#include "fm10k_debug.h"
+#include "fm10k_regs.h"
+
+
+/*
+ * EPL
+ */
+#define FM10K_SW_EXT_PORTS_MAX	4
+
+#define FM10K_SW_EPLS_MAX		9
+#define FM10K_SW_EPLS_SUPPORTED	2
+#define FM10K_SW_EPL_LANES		4
+#define FM10K_SW_EPLS_PEP_MAX	2
+
+/*
+ * PEP
+ */
+#define FM10K_SW_PEP_GROUP_MAX	10
+#define FM10K_SW_LOGICAL_PORTS_MAX	48
+
+#define FM10K_SW_PEPS_MAX		9
+#define FM10K_SW_PEPS_SUPPORTED	4
+#define FM10K_SW_PEP_PORTS_MAX	4
+
+/*
+ * GLORT
+ */
+#define FM10K_SW_GROUP_MAX			10
+#define FM10K_SW_VFS_MAX			64
+#define FM10K_SW_PFS_GLORT_START	0x1000
+#define FM10K_SW_VF_GLORT_START		0x2000
+#define FM10K_SW_MULTI_GLORT_START	0x3000
+#define FM10K_SW_DPORT_MASK(lport) (1ULL << (lport))
+
+
+/*
+ * CONFIG
+ */
+#define FM10K_SW_CONFIG_MAX			1000
+#define FM10K_SW_FFU_RULE_MAX		256
+#define FM10K_SW_FFU_RULE_ITEM_MAX	10
+
+/*
+ * FFU COUNT
+ */
+#define FM10K_SW_FFU_CNT_BANK	3
+#define FM10K_SW_POLICER_LAST	19
+#define FM10K_SW_FFU_CNT_START	(FM10K_SW_POLICER_LAST + 1)
+#define FM10K_SW_FFU_CNT_MAX	100
+
+#define FM10K_SW_PEP_QUEUES_MAX 256
+#define FM10K_SW_VF_QUEUES_MAX	\
+		(FM10K_SW_PEP_QUEUES_MAX - 1) /* Need 1 queue for PF */
+
+#define FM10K_SW_FTAG_SIZE		8
+#define FM10K_SW_PACKET_SIZE_MIN	17
+#define FM10K_SW_PACKET_SIZE_MAX	(15 * 1024)
+#define FM10K_SW_MTU_MAX		\
+	(FM10K_SW_PACKET_SIZE_MAX - ETHER_HDR_LEN - ETHER_VLAN_ENCAP_LEN)
+#define FM10K_SW_SEG_SIZE_MAX	(16 * 1024)
+#define FM10K_SW_TSO_SIZE_MAX	(256 * 1024 - 1)
+
+#define FM10K_SW_MEM_POOL_SEG_SIZE	192
+#define FM10K_SW_MEM_POOL_SEGS_MAX	24576
+#define FM10K_SW_MEM_POOL_SEGS_RSVD	256
+
+
+
+#define FM10K_SW_CARD_ID(v_, d_)	(((v_) << 16) | (d_))
+#define FM10K_SW_CARD(vname_, dname_) \
+		FM10K_SW_CARD_ID(FM10K_SW_VENDOR_ID_##vname_, \
+				FM10K_SW_DEV_ID_##dname_)
+
+/*
+ * All IDs that may appear in the vendor ID or subsystem vendor ID.
+ */
+#define FM10K_SW_VENDOR_ID_INTEL		0x8086
+#define FM10K_SW_VENDOR_ID_SILICOM		0x1374
+#define FM10K_SW_VENDOR_ID_SILICOM_RB	0x1B2E
+
+
+/*
+ * All IDs that may appear in the device ID or subsystem device ID.
+ */
+#define FM10K_SW_DEV_ID_FM10K			0x15a4
+
+/* Silicom cards */
+#define FM10K_SW_DEV_ID_PE310G4DBIR_T			0x01B0
+#define FM10K_SW_DEV_ID_PE310G4DBIR_SRD			0x01B1
+#define FM10K_SW_DEV_ID_PE310G4DBIR_LRD			0x01B2
+#define FM10K_SW_DEV_ID_PE310G4DBIR_ER			0x01B3
+#define FM10K_SW_DEV_ID_PE310G4DBIR_DA			0x01B4
+#define FM10K_SW_DEV_ID_PE340G2DBIR_QS41		0x01B8
+#define FM10K_SW_DEV_ID_PE340G2DBIR_QS43		0x01B9
+#define FM10K_SW_DEV_ID_PE340G2DBIR_QL4			0x01BA
+#define FM10K_SW_DEV_ID_PE3100G2DQIR_QXSL4		0x01C0
+#define FM10K_SW_DEV_ID_PE3100G2DQIR_QXSL4_REV_2	0x01C4
+#define FM10K_SW_DEV_ID_PE3100G2DQIRL_QXSL4		0x01C1
+#define FM10K_SW_DEV_ID_PE3100G2DQIRM_QXSL4		0x01C2
+#define FM10K_SW_DEV_ID_PE325G2DSIR				0x01C8
+
+/*
+ * SWITCH
+ */
+
+struct fm10k_device_info {
+	uint16_t subvendor;
+	uint16_t subdevice;
+	const char *desc;
+	uint8_t num_ext_ports;
+	uint8_t ext_port_speed;
+	uint8_t num_epls;
+	uint8_t num_peps;
+};
+
+
+struct fm10k_i2c;
+struct fm10k_sbus;
+struct fm10k_hw;
+struct fm10k_ext_ports;
+struct fm10k_dpdk_cfg;
+
+struct fm10k_sw_port_map {
+	uint32_t glort;
+	uint16_t logical_port; /* logical port number */
+	uint16_t physical_port; /*  */
+};
+
+struct fm10k_switch {
+	uint32_t *hw_addr;
+	uint32_t *sw_addr;
+	struct fm10k_hw *master_hw;
+	struct fm10k_device_info *info;
+	pthread_mutex_t lock;
+	struct fm10k_i2c *i2c;
+	struct fm10k_sbus *epl_sbus;
+	struct fm10k_ext_ports *ext_ports;
+	sem_t intr_tq;
+	pthread_t intr_task;
+	pthread_t led_task;
+	pthread_t stats_task;
+	uint32_t detaching;
+	uint32_t glort_cam_ram_idx;
+	uint32_t glort_dest_table_idx;
+	uint32_t mcast_dest_table_idx;
+	uint32_t mcast_len_table_idx;
+	uint32_t mcast_vlan_table_idx;
+	uint32_t epl_serdes_code_version_build_id;
+	uint16_t pep_mask; /* mask of non-master peps */
+	uint8_t pepno;
+	uint8_t serdes_loopback;
+	uint8_t epla_no;
+	uint8_t eplb_no;
+	uint8_t mac_addr[6];
+	struct fm10k_dpdk_cfg *dpdk_cfg;
+	struct fm10k_sw_port_map *pep_map;
+	struct fm10k_sw_port_map *epl_map;
+	int inited;
+};
+
+#define FM10K_SW_SWITCH_LOCK(sw_)	pthread_mutex_lock(&((sw_)->lock))
+#define FM10K_SW_SWITCH_UNLOCK(sw_)	pthread_mutex_unlock(&((sw_)->lock))
+
+#define FM10K_SW_HOWMANY(x, y, y1)	(((x) + (y) - 1) / (y1))
+
+
+static inline uint64_t
+fm10k_uptime_us(void)
+{
+	struct timeval tv;
+
+	gettimeofday(&tv, NULL);
+	return ((uint64_t)tv.tv_sec * 1000000 + tv.tv_usec);
+}
+
+
+static inline uint32_t
+fm10k_read_switch_reg(struct fm10k_switch *sw, uint32_t reg)
+{
+	return ((volatile uint32_t *)sw->master_hw->sw_addr)[reg];
+}
+
+static inline uint64_t
+fm10k_read_switch_reg64(struct fm10k_switch *sw, uint32_t reg)
+{
+	uint64_t temp, result;
+
+	result = ((volatile uint32_t *)sw->master_hw->sw_addr)[reg];
+	temp = ((volatile uint32_t *)sw->master_hw->sw_addr)[reg + 1];
+	result |= temp << 32;
+
+	return result;
+}
+
+static inline void
+fm10k_read_switch_array(struct fm10k_switch *sw,
+		uint32_t reg, uint32_t *results, uint32_t count)
+{
+	unsigned int i;
+
+	for (i = 0; i < count; i++)
+		results[i] =
+			((volatile uint32_t *)sw->master_hw->sw_addr)[reg + i];
+}
+
+
+static inline void
+fm10k_write_switch_reg(struct fm10k_switch *sw, uint32_t reg, uint32_t val)
+{
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg] = val;
+}
+
+static inline void
+fm10k_write_switch_reg64(struct fm10k_switch *sw, uint32_t reg, uint64_t val)
+{
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg] = val & 0xffffffff;
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg + 1] = val >> 32;
+}
+
+static inline void
+fm10k_write_switch_reg128(struct fm10k_switch *sw,
+		uint32_t reg, uint64_t val_hi, uint64_t val_lo)
+{
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg] =
+			val_lo & 0xffffffff;
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg + 1] =
+			val_lo >> 32;
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg + 2] =
+			val_hi & 0xffffffff;
+	((volatile uint32_t *)sw->master_hw->sw_addr)[reg + 3] =
+			val_hi >> 32;
+}
+
+static inline void
+fm10k_write_switch_array(struct fm10k_switch *sw,
+		uint32_t reg, uint32_t *data, uint32_t count)
+{
+	unsigned int i;
+
+	for (i = 0; i < count; i++)
+		((volatile uint32_t *)sw->master_hw->sw_addr)[reg + i] =
+				data[i];
+}
+
+static inline uint32_t
+fm10k_write_flush(struct fm10k_switch *sw)
+{
+	return ((volatile uint32_t *)sw->master_hw->hw_addr)[FM10K_SW_CTRL];
+}
+
+static inline void
+fm10k_gpio_output_set(struct fm10k_switch *sw, int gpio_pin, int value)
+{
+	uint32_t data;
+
+	data = fm10k_read_switch_reg(sw, FM10K_SW_GPIO_CFG);
+	data |= 1 << gpio_pin;
+	data &= ~(1 << (gpio_pin + 16));
+
+	/* set gpio output */
+	fm10k_write_switch_reg(sw, FM10K_SW_GPIO_CFG, data);
+
+	/*
+	 * Wait 1 msec (PCA spec specifies reset pulse width = 4 ns and
+	 *  and reset time = 100 ns)
+	 */
+	usec_delay(1000);
+	/* set reset */
+	data = fm10k_read_switch_reg(sw, FM10K_SW_GPIO_DATA);
+	if (value == 0)
+		data &= ~(1 << gpio_pin);
+	else
+		data |= 1 << gpio_pin;
+
+	fm10k_write_switch_reg(sw, FM10K_SW_GPIO_DATA, data);
+}
+
+#define fm10k_udelay	usec_delay
+typedef int eth_fm10k_dev_init_half_func(struct fm10k_hw *hw);
+
+unsigned int fm10k_switch_eplidx_to_eplno
+	(struct fm10k_switch *sw, unsigned int eplidx);
+void fm10k_switch_intr(struct fm10k_hw *hw);
+
+struct fm10k_switch *fm10k_switch_get(void);
+struct fm10k_device_info *fm10k_get_device_info(struct fm10k_hw *hw);
+int fm10k_switch_dpdk_port_start(struct fm10k_hw *hw, void *rte_dev,
+		uint8_t is_pf, bool master, eth_fm10k_dev_init_half_func *func);
+void fm10k_switch_dpdk_port_stop(struct fm10k_hw *hw);
+int fm10k_switch_dpdk_hw_queue_map(struct fm10k_hw *hw,
+		uint16_t queue, uint16_t max_queue,
+		struct fm10k_hw **map_hw, uint16_t *map_queue);
+int fm10k_switch_dpdk_mapped_hw_get(struct fm10k_hw *hw,
+		struct fm10k_hw *hw_list[]);
+int fm10k_switch_dpdk_pf_no_get(struct fm10k_hw *hw);
+int fm10k_switch_dpdk_port_no_get(struct fm10k_hw *hw);
+void *fm10k_switch_dpdk_port_rte_dev_get(struct fm10k_hw *hw);
+struct fm10k_flow_list *
+fm10k_switch_dpdk_port_flow_list_get(struct fm10k_hw *hw);
+void fm10k_switch_dpdk_tx_queue_num_set(struct fm10k_hw *hw, uint8_t num);
+void fm10k_switch_dpdk_rx_queue_num_set(struct fm10k_hw *hw, uint8_t num);
+
+uint32_t fm10k_switch_pf_logical_get(uint8_t pf_no);
+uint32_t fm10k_switch_epl_logical_get(uint8_t epl_no);
+uint32_t fm10k_switch_vf_glort_get(uint8_t vf_no);
+uint32_t fm10k_switch_pf_glort_get(uint8_t pf_no);
+uint32_t fm10k_switch_pfs_glort_get(uint8_t pf1, uint8_t pf2);
+uint32_t fm10k_switch_epl_glort_get(uint8_t epl_no);
+uint32_t fm10k_switch_multi_glort_get(uint8_t pf1, uint8_t pf2,
+		uint16_t vlan1, uint16_t vlan2, bool *p_new);
+
+int fm10k_switch_mirror_set(struct fm10k_hw *hw, u16 dest_port, u16 vlan);
+int fm10k_switch_mirror_reset(struct fm10k_hw *hw);
+
+void fm10k_switch_flowset_switchto(const char *name);
+void fm10k_switch_show_port(void);
+void fm10k_switch_show_ffu(void);
+void fm10k_switch_show_bank(void);
+
+void fm10k_flow_list_init(void *flow_list);
+const struct rte_flow_ops *fm10k_flow_ops_get(void);
+
+#endif
