[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251223035113.31122-4-illusion.wang@nebula-matrix.com>
Date: Tue, 23 Dec 2025 11:50:26 +0800
From: "illusion.wang" <illusion.wang@...ula-matrix.com>
To: dimon.zhao@...ula-matrix.com,
illusion.wang@...ula-matrix.com,
alvin.wang@...ula-matrix.com,
sam.chen@...ula-matrix.com,
netdev@...r.kernel.org
Cc: linux-kernel@...r.kernel.org (open list)
Subject: [PATCH v1 net-next 03/15] net/nebula-matrix: add HW layer definitions and implementation
add HW layer related definitions and product ops
Signed-off-by: illusion.wang <illusion.wang@...ula-matrix.com>
Change-Id: I18e1b62b94b4348abc3cbbe936fc5e4590c27a93
---
.../net/ethernet/nebula-matrix/nbl/Makefile | 3 +-
.../net/ethernet/nebula-matrix/nbl/nbl_core.h | 11 +
.../nebula-matrix/nbl/nbl_hw/nbl_hw.h | 184 ++
.../nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c | 168 ++
.../nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.h | 1842 +++++++++++++++++
.../nebula-matrix/nbl/nbl_hw/nbl_hw_reg.h | 187 ++
.../nbl/nbl_include/nbl_def_hw.h | 26 +
.../nbl/nbl_include/nbl_include.h | 64 +
.../net/ethernet/nebula-matrix/nbl/nbl_main.c | 14 +-
9 files changed, 2496 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw.h
create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c
create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.h
create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_reg.h
create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_hw.h
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/Makefile b/drivers/net/ethernet/nebula-matrix/nbl/Makefile
index 7717efab0b01..723ac077aef3 100644
--- a/drivers/net/ethernet/nebula-matrix/nbl/Makefile
+++ b/drivers/net/ethernet/nebula-matrix/nbl/Makefile
@@ -4,7 +4,8 @@
obj-$(CONFIG_NBL_CORE) := nbl_core.o
-nbl_core-objs += nbl_main.o
+nbl_core-objs += nbl_hw/nbl_hw_leonis/nbl_hw_leonis.o \
+ nbl_main.o
# Do not modify include path, unless you are adding a new file which needs some headers in its
# direct upper directory (see the exception part in below).
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_core.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_core.h
index f28fe8058c75..0a76b6f66d5e 100644
--- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_core.h
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_core.h
@@ -7,12 +7,16 @@
#ifndef _NBL_CORE_H_
#define _NBL_CORE_H_
#include "nbl_product_base.h"
+#include "nbl_def_hw.h"
#include "nbl_def_common.h"
#define NBL_ADAPTER_TO_PDEV(adapter) ((adapter)->pdev)
#define NBL_ADAPTER_TO_DEV(adapter) (&((adapter)->pdev->dev))
#define NBL_ADAPTER_TO_COMMON(adapter) (&((adapter)->common))
#define NBL_ADAPTER_TO_RPDUCT_BASE_OPS(adapter) ((adapter)->product_base_ops)
+
+#define NBL_ADAPTER_TO_HW_MGT(adapter) ((adapter)->core.hw_mgt)
+#define NBL_ADAPTER_TO_HW_OPS_TBL(adapter) ((adapter)->intf.hw_ops_tbl)
#define NBL_CAP_SET_BIT(loc) (1 << (loc))
#define NBL_CAP_TEST_BIT(val, loc) (((val) >> (loc)) & 0x1)
@@ -48,9 +52,16 @@ enum nbl_adapter_state {
};
struct nbl_interface {
+ struct nbl_hw_ops_tbl *hw_ops_tbl;
};
struct nbl_core {
+ void *hw_mgt;
+ void *res_mgt;
+ void *disp_mgt;
+ void *serv_mgt;
+ void *dev_mgt;
+ void *chan_mgt;
};
struct nbl_adapter {
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw.h
new file mode 100644
index 000000000000..52a14f1dbf12
--- /dev/null
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw.h
@@ -0,0 +1,184 @@
+/* SPDX-License-Identifier: GPL-2.0*/
+/*
+ * Copyright (c) 2025 Nebula Matrix Limited.
+ * Author:
+ */
+
+#ifndef _NBL_HW_H_
+#define _NBL_HW_H_
+
+#include "nbl_include.h"
+
+#define NBL_MAX_ETHERNET (4)
+
+#define NBL_PT_PP0 0
+#define NBL_PT_LEN 3
+#define NBL_TCAM_TABLE_LEN (64)
+#define NBL_MCC_ID_INVALID U16_MAX
+#define NBL_KT_BYTE_LEN 40
+#define NBL_KT_BYTE_HALF_LEN 20
+
+#define NBL_EM0_PT_HW_UP_TUNNEL_L2 0
+#define NBL_EM0_PT_HW_UP_L2 1
+#define NBL_EM0_PT_HW_DOWN_L2 2
+#define NBL_EM0_PT_HW_UP_LLDP_LACP 3
+#define NBL_EM0_PT_PMD_ND_UPCALL 4
+#define NBL_EM0_PT_HW_L2_UP_MULTI_MCAST 5
+#define NBL_EM0_PT_HW_L3_UP_MULTI_MCAST 6
+#define NBL_EM0_PT_HW_L2_DOWN_MULTI_MCAST 7
+#define NBL_EM0_PT_HW_L3_DOWN_MULTI_MCAST 8
+#define NBL_EM0_PT_HW_DPRBAC_IPV4 9
+#define NBL_EM0_PT_HW_DPRBAC_IPV6 10
+#define NBL_EM0_PT_HW_UL4S_IPV4 11
+#define NBL_EM0_PT_HW_UL4S_IPV6 12
+
+#define NBL_PP0_PROFILE_ID_MIN (0)
+#define NBL_PP0_PROFILE_ID_MAX (15)
+#define NBL_PP1_PROFILE_ID_MIN (16)
+#define NBL_PP1_PROFILE_ID_MAX (31)
+#define NBL_PP2_PROFILE_ID_MIN (32)
+#define NBL_PP2_PROFILE_ID_MAX (47)
+#define NBL_PP_PROFILE_NUM (16)
+
+#define NBL_QID_MAP_TABLE_ENTRIES (4096)
+#define NBL_EPRO_PF_RSS_RET_TBL_DEPTH (4096)
+#define NBL_EPRO_RSS_RET_TBL_DEPTH (8192 * 2)
+#define NBL_EPRO_RSS_ENTRY_SIZE_UNIT (16)
+
+#define NBL_EPRO_PF_RSS_RET_TBL_COUNT (512)
+#define NBL_EPRO_PF_RSS_ENTRY_SIZE (5)
+
+#define NBL_EPRO_RSS_ENTRY_MAX_COUNT (512)
+#define NBL_EPRO_RSS_ENTRY_MAX_SIZE (4)
+
+#define NBL_EPRO_RSS_SK_SIZE 40
+#define NBL_EPRO_RSS_PER_KEY_SIZE 8
+#define NBL_EPRO_RSS_KEY_NUM (NBL_EPRO_RSS_SK_SIZE / NBL_EPRO_RSS_PER_KEY_SIZE)
+
+enum {
+ NBL_HT0,
+ NBL_HT1,
+ NBL_HT_MAX,
+};
+
+enum {
+ NBL_KT_HALF_MODE,
+ NBL_KT_FULL_MODE,
+};
+
+#pragma pack(1)
+union nbl_action_data {
+ union dport_act {
+ struct {
+ /* port_type = SET_DPORT_TYPE_ETH_LAG, set the eth and lag field. */
+ u16 dport_info:10;
+ u16 dport_type:2;
+ #define FWD_DPORT_TYPE_ETH (0)
+ #define FWD_DPORT_TYPE_LAG (1)
+ #define FWD_DPORT_TYPE_VSI (2)
+ u16 dport_id:4;
+ #define FWD_DPORT_ID_HOST_TLS (0)
+ #define FWD_DPORT_ID_ECPU_TLS (1)
+ #define FWD_DPORT_ID_HOST_RDMA (2)
+ #define FWD_DPORT_ID_ECPU_RDMA (3)
+ #define FWD_DPORT_ID_EMP (4)
+ #define FWD_DPORT_ID_BMC (5)
+ #define FWD_DPORT_ID_LOOP_BACK (7)
+ #define FWD_DPORT_ID_ETH0 (8)
+ #define FWD_DPORT_ID_ETH1 (9)
+ #define FWD_DPORT_ID_ETH2 (10)
+ #define FWD_DPORT_ID_ETH3 (11)
+ } fwd_dport;
+
+ struct {
+ /* port_type = SET_DPORT_TYPE_ETH_LAG, set the eth and lag field. */
+ u16 eth_id:2;
+ u16 lag_id:2;
+ u16 eth_vld:1;
+ u16 lag_vld:1;
+ u16 rsv:4;
+ u16 port_type:2;
+ u16 next_stg_sel:2;
+ u16 upcall_flag:2;
+ } down;
+
+ struct {
+ /* port_type = SET_DPORT_TYPE_VSI_HOST and SET_DPORT_TYPE_VSI_ECPU,
+ * set the port_id field as the vsi_id.
+ * port_type = SET_DPORT_TYPE_SP_PORT, set the port_id as the defined
+ * PORT_TYPE_SP_*.
+ */
+ u16 port_id:10;
+ #define PORT_TYPE_SP_DROP (0x3FF)
+ #define PORT_TYPE_SP_GLB_LB (0x3FE)
+ #define PORT_TYPE_SP_BMC (0x3FD)
+ #define PORT_TYPE_SP_EMP (0x3FC)
+ u16 port_type:2;
+ #define SET_DPORT_TYPE_VSI_HOST (0)
+ #define SET_DPORT_TYPE_VSI_ECPU (1)
+ #define SET_DPORT_TYPE_ETH_LAG (2)
+ #define SET_DPORT_TYPE_SP_PORT (3)
+ u16 next_stg_sel:2;
+ #define NEXT_STG_SEL_NONE (0)
+ #define NEXT_STG_SEL_ACL_S0 (1)
+ #define NEXT_STG_SEL_EPRO (2)
+ #define NEXT_STG_SEL_BYPASS (3)
+ u16 upcall_flag:2;
+ #define AUX_KEEP_FWD_TYPE (0)
+ #define AUX_FWD_TYPE_NML_FWD (1)
+ #define AUX_FWD_TYPE_UPCALL (2)
+ } up;
+ } dport;
+
+ struct dqueue_act {
+ u16 que_id:11;
+ u16 rsv:5;
+ } dqueue;
+
+ struct mcc_id_act {
+ u16 mcc_id:13;
+ u16 pri:1;
+ #define NBL_MCC_PRI_HIGH (0)
+ #define NBL_MCC_PRI_LOW (1)
+ uint32_t rsv:2;
+ } mcc_idx;
+
+ struct set_aux_act {
+ u16 nstg_val:4;
+ u16 nstg_vld:1;
+ u16 ftype_val:3;
+ u16 ftype_vld:1;
+ u16 pkt_cos_val:3;
+ u16 pcos_vld:1;
+ u16 rsv:1;
+ #define NBL_SET_AUX_CLR_FLG (0)
+ #define NBL_SET_AUX_SET_FLG (1)
+ #define NBL_SET_AUX_SET_AUX (2)
+ u16 sub_id:2;
+ } set_aux;
+
+ u16 data;
+};
+
+#pragma pack()
+
+#define SFF8636_TRANSMIT_FIBER_850nm_VCSEL (0x0)
+#define SFF8636_TRANSMIT_FIBER_1310nm_VCSEL (0x1)
+#define SFF8636_TRANSMIT_FIBER_1550nm_VCSEL (0x2)
+#define SFF8636_TRANSMIT_FIBER_1310nm_FP (0x3)
+#define SFF8636_TRANSMIT_FIBER_1310nm_DFB (0x4)
+#define SFF8636_TRANSMIT_FIBER_1550nm_DFB (0x5)
+#define SFF8636_TRANSMIT_FIBER_1310nm_EML (0x6)
+#define SFF8636_TRANSMIT_FIBER_1550nm_EML (0x7)
+#define SFF8636_TRANSMIT_FIBER_OTHER (0x8)
+#define SFF8636_TRANSMIT_FIBER_1490nm_DFB (0x9)
+#define SFF8636_TRANSMIT_COPPER_UNEQUA (0xa)
+#define SFF8636_TRANSMIT_COPPER_PASSIVE_EQUALIZED (0xb)
+#define SFF8636_TRANSMIT_COPPER_NEAR_FAR_END (0xc)
+#define SFF8636_TRANSMIT_COPPER_FAR_END (0xd)
+#define SFF8636_TRANSMIT_COPPER_NEAR_END (0xe)
+#define SFF8636_TRANSMIT_COPPER_LINEAR_ACTIVE (0xf)
+
+#define NBL_SPORT_ETH_OFFSET 8
+
+#endif
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c
new file mode 100644
index 000000000000..5c33d4ead957
--- /dev/null
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c
@@ -0,0 +1,168 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2025 Nebula Matrix Limited.
+ * Author:
+ */
+
+#include "nbl_hw_leonis.h"
+
+static struct nbl_hw_ops hw_ops = {
+};
+
+/* Structure starts here, adding an op should not modify anything below */
+static int nbl_hw_setup_hw_mgt(struct nbl_common_info *common,
+ struct nbl_hw_mgt_leonis **hw_mgt_leonis)
+{
+ struct device *dev;
+
+ dev = NBL_COMMON_TO_DEV(common);
+ *hw_mgt_leonis = devm_kzalloc(dev, sizeof(struct nbl_hw_mgt_leonis), GFP_KERNEL);
+ if (!*hw_mgt_leonis)
+ return -ENOMEM;
+
+ NBL_HW_MGT_TO_COMMON(&(*hw_mgt_leonis)->hw_mgt) = common;
+
+ return 0;
+}
+
+static void nbl_hw_remove_hw_mgt(struct nbl_common_info *common,
+ struct nbl_hw_mgt_leonis **hw_mgt_leonis)
+{
+ struct device *dev;
+
+ dev = NBL_COMMON_TO_DEV(common);
+ devm_kfree(dev, *hw_mgt_leonis);
+ *hw_mgt_leonis = NULL;
+}
+
+static int nbl_hw_setup_ops(struct nbl_common_info *common, struct nbl_hw_ops_tbl **hw_ops_tbl,
+ struct nbl_hw_mgt_leonis *hw_mgt_leonis)
+{
+ struct device *dev;
+
+ dev = NBL_COMMON_TO_DEV(common);
+ *hw_ops_tbl = devm_kzalloc(dev, sizeof(struct nbl_hw_ops_tbl), GFP_KERNEL);
+ if (!*hw_ops_tbl)
+ return -ENOMEM;
+
+ NBL_HW_OPS_TBL_TO_OPS(*hw_ops_tbl) = &hw_ops;
+ NBL_HW_OPS_TBL_TO_PRIV(*hw_ops_tbl) = hw_mgt_leonis;
+
+ return 0;
+}
+
+static void nbl_hw_remove_ops(struct nbl_common_info *common, struct nbl_hw_ops_tbl **hw_ops_tbl)
+{
+ struct device *dev;
+
+ dev = NBL_COMMON_TO_DEV(common);
+ devm_kfree(dev, *hw_ops_tbl);
+ *hw_ops_tbl = NULL;
+}
+
+int nbl_hw_init_leonis(void *p, struct nbl_init_param *param)
+{
+ struct nbl_adapter *adapter = (struct nbl_adapter *)p;
+ struct nbl_common_info *common;
+ struct pci_dev *pdev;
+ struct nbl_hw_mgt_leonis **hw_mgt_leonis;
+ struct nbl_hw_mgt *hw_mgt;
+ struct nbl_hw_ops_tbl **hw_ops_tbl;
+ int bar_mask;
+ int ret = 0;
+
+ common = NBL_ADAPTER_TO_COMMON(adapter);
+ hw_mgt_leonis = (struct nbl_hw_mgt_leonis **)&NBL_ADAPTER_TO_HW_MGT(adapter);
+ hw_ops_tbl = &NBL_ADAPTER_TO_HW_OPS_TBL(adapter);
+ pdev = NBL_COMMON_TO_PDEV(common);
+
+ ret = nbl_hw_setup_hw_mgt(common, hw_mgt_leonis);
+ if (ret)
+ goto setup_mgt_fail;
+
+ hw_mgt = &(*hw_mgt_leonis)->hw_mgt;
+ bar_mask = BIT(NBL_MEMORY_BAR) | BIT(NBL_MAILBOX_BAR);
+ ret = pci_request_selected_regions(pdev, bar_mask, NBL_DRIVER_NAME);
+ if (ret) {
+ dev_err(&pdev->dev, "Request memory bar and mailbox bar failed, err = %d\n", ret);
+ goto request_bar_region_fail;
+ }
+
+ if (param->caps.has_ctrl) {
+ hw_mgt->hw_addr = ioremap(pci_resource_start(pdev, NBL_MEMORY_BAR),
+ pci_resource_len(pdev, NBL_MEMORY_BAR) -
+ NBL_RDMA_NOTIFY_OFF);
+ if (!hw_mgt->hw_addr) {
+ dev_err(&pdev->dev, "Memory bar ioremap failed\n");
+ ret = -EIO;
+ goto ioremap_err;
+ }
+ hw_mgt->hw_size = pci_resource_len(pdev, NBL_MEMORY_BAR) - NBL_RDMA_NOTIFY_OFF;
+ } else {
+ hw_mgt->hw_addr = ioremap(pci_resource_start(pdev, NBL_MEMORY_BAR),
+ NBL_RDMA_NOTIFY_OFF);
+ if (!hw_mgt->hw_addr) {
+ dev_err(&pdev->dev, "Memory bar ioremap failed\n");
+ ret = -EIO;
+ goto ioremap_err;
+ }
+ hw_mgt->hw_size = NBL_RDMA_NOTIFY_OFF;
+ }
+
+ hw_mgt->notify_offset = 0;
+ hw_mgt->mailbox_bar_hw_addr = pci_ioremap_bar(pdev, NBL_MAILBOX_BAR);
+ if (!hw_mgt->mailbox_bar_hw_addr) {
+ dev_err(&pdev->dev, "Mailbox bar ioremap failed\n");
+ ret = -EIO;
+ goto mailbox_ioremap_err;
+ }
+
+ spin_lock_init(&hw_mgt->reg_lock);
+ hw_mgt->should_lock = true;
+
+ ret = nbl_hw_setup_ops(common, hw_ops_tbl, *hw_mgt_leonis);
+ if (ret)
+ goto setup_ops_fail;
+
+ (*hw_mgt_leonis)->ro_enable = pcie_relaxed_ordering_enabled(pdev);
+
+ return 0;
+
+setup_ops_fail:
+ iounmap(hw_mgt->mailbox_bar_hw_addr);
+mailbox_ioremap_err:
+ iounmap(hw_mgt->hw_addr);
+ioremap_err:
+ pci_release_selected_regions(pdev, bar_mask);
+request_bar_region_fail:
+ nbl_hw_remove_hw_mgt(common, hw_mgt_leonis);
+setup_mgt_fail:
+ return ret;
+}
+
+void nbl_hw_remove_leonis(void *p)
+{
+ struct nbl_adapter *adapter = (struct nbl_adapter *)p;
+ struct nbl_common_info *common;
+ struct nbl_hw_mgt_leonis **hw_mgt_leonis;
+ struct nbl_hw_ops_tbl **hw_ops_tbl;
+ struct pci_dev *pdev;
+ u8 __iomem *hw_addr;
+ u8 __iomem *mailbox_bar_hw_addr;
+ int bar_mask = BIT(NBL_MEMORY_BAR) | BIT(NBL_MAILBOX_BAR);
+
+ common = NBL_ADAPTER_TO_COMMON(adapter);
+ hw_mgt_leonis = (struct nbl_hw_mgt_leonis **)&NBL_ADAPTER_TO_HW_MGT(adapter);
+ hw_ops_tbl = &NBL_ADAPTER_TO_HW_OPS_TBL(adapter);
+ pdev = NBL_COMMON_TO_PDEV(common);
+
+ hw_addr = (*hw_mgt_leonis)->hw_mgt.hw_addr;
+ mailbox_bar_hw_addr = (*hw_mgt_leonis)->hw_mgt.mailbox_bar_hw_addr;
+
+ iounmap(mailbox_bar_hw_addr);
+ iounmap(hw_addr);
+ pci_release_selected_regions(pdev, bar_mask);
+ nbl_hw_remove_hw_mgt(common, hw_mgt_leonis);
+
+ nbl_hw_remove_ops(common, hw_ops_tbl);
+}
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.h
new file mode 100644
index 000000000000..905b197e6633
--- /dev/null
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.h
@@ -0,0 +1,1842 @@
+/* SPDX-License-Identifier: GPL-2.0*/
+/*
+ * Copyright (c) 2025 Nebula Matrix Limited.
+ * Author:
+ */
+
+#ifndef _NBL_HW_LEONIS_H_
+#define _NBL_HW_EONIS_H_
+
+#include "nbl_core.h"
+#include "nbl_hw.h"
+#include "nbl_hw_reg.h"
+
+#define NBL_NOTIFY_DELAY_MAX_TIME_FOR_REGS 300 /* 300us for palladium,5us for s2c */
+
+#define NBL_DRAIN_WAIT_TIMES (30000)
+
+/* ---------- FEM ---------- */
+#define NBL_FEM_INT_STATUS (NBL_PPE_FEM_BASE + 0x00000000)
+#define NBL_FEM_INT_MASK (NBL_PPE_FEM_BASE + 0x00000004)
+#define NBL_FEM_INIT_START (NBL_PPE_FEM_BASE + 0x00000180)
+#define NBL_FEM_KT_ACC_DATA (NBL_PPE_FEM_BASE + 0x00000348)
+#define NBL_FEM_INSERT_SEARCH0_CTRL (NBL_PPE_FEM_BASE + 0x00000500)
+#define NBL_FEM_INSERT_SEARCH0_ACK (NBL_PPE_FEM_BASE + 0x00000504)
+#define NBL_FEM_INSERT_SEARCH0_DATA (NBL_PPE_FEM_BASE + 0x00000508)
+#define KT_MASK_LEN32_ACTION_INFO (0x0)
+#define KT_MASK_LEN12_ACTION_INFO (0xFFFFF000)
+#define NBL_FEM_SEARCH_KEY_LEN 44
+#define NBL_HW_DUMMY_REG (0x1300904)
+
+#define HT_PORT0_BANK_SEL (0b01100000)
+#define HT_PORT1_BANK_SEL (0b00011000)
+#define HT_PORT2_BANK_SEL (0b00000111)
+#define KT_PORT0_BANK_SEL (0b11100000)
+#define KT_PORT1_BANK_SEL (0b00011000)
+#define KT_PORT2_BANK_SEL (0b00000111)
+#define AT_PORT0_BANK_SEL (0b000000000000)
+#define AT_PORT1_BANK_SEL (0b111110000000)
+#define AT_PORT2_BANK_SEL (0b000001111111)
+#define HT_PORT0_BTM 2
+#define HT_PORT1_BTM 6
+#define HT_PORT2_BTM 16
+#define NBL_1BIT 1
+#define NBL_8BIT 8
+#define NBL_16BIT 16
+
+#define NBL_FEM_HT_BANK_SEL_BITMAP (NBL_PPE_FEM_BASE + 0x00000200)
+#define NBL_FEM_KT_BANK_SEL_BITMAP (NBL_PPE_FEM_BASE + 0x00000204)
+#define NBL_FEM_AT_BANK_SEL_BITMAP (NBL_PPE_FEM_BASE + 0x00000208)
+#define NBL_FEM_AT_BANK_SEL_BITMAP2 (NBL_PPE_FEM_BASE + 0x0000020C)
+
+#define NBL_EM_PT_MASK_LEN_0 (0xFFFFFFFF)
+#define NBL_EM_PT_MASK_LEN_64 (0x0000FFFF)
+#define NBL_EM_PT_MASK_LEN_96 (0x000000FF)
+#define NBL_EM_PT_MASK1_LEN_0 (0xFFFFFFFF)
+#define NBL_EM_PT_MASK1_LEN_4 (0x7FFFFFFF)
+#define NBL_EM_PT_MASK1_LEN_12 (0x1FFFFFFF)
+#define NBL_EM_PT_MASK1_LEN_20 (0x07FFFFFF)
+#define NBL_EM_PT_MASK1_LEN_28 (0x01FFFFFF)
+#define NBL_EM_PT_MASK1_LEN_32 (0x00FFFFFF)
+#define NBL_EM_PT_MASK1_LEN_76 (0x00001FFF)
+#define NBL_EM_PT_MASK1_LEN_112 (0x0000000F)
+#define NBL_EM_PT_MASK1_LEN_116 (0x00000007)
+#define NBL_EM_PT_MASK1_LEN_124 (0x00000001)
+#define NBL_EM_PT_MASK1_LEN_128 (0x0)
+#define NBL_EM_PT_MASK2_LEN_28 (0x000007FF)
+#define NBL_EM_PT_MASK2_LEN_36 (0x000001FF)
+#define NBL_EM_PT_MASK2_LEN_44 (0x0000007F)
+#define NBL_EM_PT_MASK2_LEN_52 (0x0000001F)
+#define NBL_EM_PT_MASK2_LEN_60 (0x00000007)
+#define NBL_EM_PT_MASK2_LEN_68 (0x00000001)
+#define NBL_EM_PT_MASK2_LEN_72 (0x00000010)
+#define NBL_EM_PT_MASK2_SEC_72 (0x00000000)
+
+#define NBL_KT_HW_L2_DW_LEN 40
+
+#define NBL_ACL_VSI_PF_UPCALL 9
+#define NBL_ACL_ETH_PF_UPCALL 8
+#define NBL_ACL_INDIRECT_ACCESS_WRITE (0)
+#define NBL_ACL_INDIRECT_ACCESS_READ (1)
+#define NBL_ETH_BASE_IDX 8
+#define NBL_VSI_BASE_IDX 0
+#define NBL_PF_MAX_NUM 4
+#define NBL_ACL_TCAM_UPCALL_IDX 15
+
+#define NBL_GET_PF_ETH_ID(idx) ((idx) + NBL_ETH_BASE_IDX)
+#define NBL_GET_PF_VSI_ID(idx) ((idx) * 256)
+#define NBL_ACL_GET_ACTION_DATA(act_buf, act_data) (act_data = (act_buf) & 0x3fffff)
+#define NBL_ACL_FLUSH_FLOW_BTM 0x7fff
+#define NBL_ACL_FLUSH_UPCALL_BTM 0x8000
+
+#define NBL_ACL_TCAM_DATA_X(t) (NBL_PPE_ACL_BASE + 0x00000904 + ((t) * 8))
+#define NBL_ACL_TCAM_DATA_Y(t) (NBL_PPE_ACL_BASE + 0x00000990 + ((t) * 8))
+
+struct nbl_acl_tcam_common_data_u {
+ u8 data[5];
+ u8 rsv[3];
+};
+
+/* ---------- MCC ---------- */
+#define NBL_MCC_MODULE (0x00B44000)
+#define NBL_MCC_LEAF_NODE_TABLE(i) \
+ (NBL_MCC_MODULE + 0x00010000 + (i) * sizeof(struct nbl_mcc_tbl))
+#pragma pack(1)
+
+struct nbl_fem_int_mask {
+ u32 rsv0:2;
+ u32 fifo_ovf_err:1;
+ u32 fifo_udf_err:1;
+ u32 cif_err:1;
+ u32 rsv1:1;
+ u32 cfg_err:1;
+ u32 data_ucor_err:1;
+ u32 bank_cflt_err:1;
+ u32 rsv2:23;
+};
+
+union nbl_fem_ht_acc_ctrl_u {
+ struct nbl_fem_ht_acc_ctrl {
+ u32 bucket_id:2; /* used for choose entry's hash-bucket */
+ u32 entry_id:14; /* used for choose hash-bucket's entry */
+ u32 ht_id:1; /* 0:HT0, 1:HT1 */
+#define NBL_ACC_HT0 (0)
+#define NBL_ACC_HT1 (1)
+ u32 port:2; /* 0:pp0 1:pp1 2:pp2 */
+ u32 rsv:10;
+ u32 access_size:1; /* 0:32bit 1:128bit,read support 128 */
+#define NBL_ACC_SIZE_32B (0)
+#define NBL_ACC_SIZE_128B (1)
+ u32 rw:1; /* 1:read 0:write */
+#define NBL_ACC_MODE_READ (1)
+#define NBL_ACC_MODE_WRITE (0)
+ u32 start:1; /* enable indirect access */
+ } info;
+#define NBL_FEM_HT_ACC_CTRL_TBL_WIDTH (sizeof(struct nbl_fem_ht_acc_ctrl))
+ u8 data[NBL_FEM_HT_ACC_CTRL_TBL_WIDTH];
+};
+
+#define NBL_FEM_HT_ACC_CTRL (NBL_PPE_FEM_BASE + 0x00000300)
+
+union nbl_fem_ht_acc_data_u {
+ struct nbl_fem_ht_acc_data {
+ u32 kt_index:17;
+ u32 hash:14;
+ u32 vld:1;
+ } info;
+#define NBL_FEM_HT_ACC_DATA_TBL_WIDTH (sizeof(struct nbl_fem_ht_acc_data))
+ u8 data[NBL_FEM_HT_ACC_DATA_TBL_WIDTH];
+};
+
+#define NBL_FEM_HT_ACC_DATA (NBL_PPE_FEM_BASE + 0x00000308)
+
+union nbl_fem_ht_acc_ack_u {
+ struct nbl_fem_ht_acc_ack {
+ u32 done:1; /* indirect access is finished */
+ u32 status:1; /* indirect access is error */
+ u32 rsv:30;
+ } info;
+#define NBL_FEM_HT_ACC_ACK_TBL_WIDTH (sizeof(struct nbl_fem_ht_acc_ack))
+ u8 data[NBL_FEM_HT_ACC_ACK_TBL_WIDTH];
+};
+
+#define NBL_FEM_HT_ACC_ACK (NBL_PPE_FEM_BASE + 0x00000304)
+
+union nbl_fem_kt_acc_ctrl_u {
+ struct nbl_fem_kt_acc_ctrl {
+ u32 addr:17; /* kt-index */
+ u32 rsv:12;
+ u32 access_size:1;
+#define NBL_ACC_SIZE_160B (0)
+#define NBL_ACC_SIZE_320B (1)
+ u32 rw:1; /* 1:read 0:write */
+ u32 start:1; /* enable ,indirect access */
+ } info;
+#define NBL_FEM_KT_ACC_CTRL_TBL_WIDTH (sizeof(struct nbl_fem_kt_acc_ctrl))
+ u8 data[NBL_FEM_KT_ACC_CTRL_TBL_WIDTH];
+};
+
+#define NBL_FEM_KT_ACC_CTRL (NBL_PPE_FEM_BASE + 0x00000340)
+
+union nbl_fem_kt_acc_ack_u {
+ struct nbl_fem_kt_acc_ack {
+ u32 done:1; /* indirect access is finished */
+ u32 status:1; /* indirect access is error */
+ u32 rsv:30;
+ } info;
+#define NBL_FEM_KT_ACC_ACK_TBL_WIDTH (sizeof(struct nbl_fem_kt_acc_ack))
+ u8 data[NBL_FEM_KT_ACC_ACK_TBL_WIDTH];
+};
+
+#define NBL_FEM_KT_ACC_ACK (NBL_PPE_FEM_BASE + 0x00000344)
+
+union nbl_search_ctrl_u {
+ struct nbl_search_ctrl {
+ u32 rsv:31;
+ u32 start:1;
+ } info;
+#define NBL_SEARCH_CTRL_WIDTH (sizeof(struct nbl_search_ctrl))
+ u8 data[NBL_SEARCH_CTRL_WIDTH];
+};
+
+union nbl_search_ack_u {
+ struct nbl_search_ack {
+ u32 done:1;
+ u32 status:1;
+ u32 rsv:30;
+ } info;
+#define NBL_SEARCH_ACK_WIDTH (sizeof(struct nbl_search_ack))
+ u8 data[NBL_SEARCH_ACK_WIDTH];
+};
+
+#define NBL_FEM_EM0_TCAM_TABLE_ADDR (0xa0b000)
+#define NBL_FEM_EM_TCAM_TABLE_DEPTH (64)
+#define NBL_FEM_EM_TCAM_TABLE_WIDTH (256)
+
+union fem_em_tcam_table_u {
+ struct fem_em_tcam_table {
+ u32 key[5]; /* [159:0] Default:0x0 RW */
+ u32 key_vld:1; /* [160] Default:0x0 RW */
+ u32 key_size:1; /* [161] Default:0x0 RW */
+ u32 rsv:30; /* [191:162] Default:0x0 RO */
+ u32 rsv1[2]; /* [255:192] Default:0x0 RO */
+ } info;
+ u32 data[NBL_FEM_EM_TCAM_TABLE_WIDTH / 32];
+ u8 hash_key[sizeof(struct fem_em_tcam_table)];
+};
+
+#define NBL_FEM_EM_TCAM_TABLE_REG(r, t) (NBL_FEM_EM0_TCAM_TABLE_ADDR + 0x1000 * (r) + \
+ (NBL_FEM_EM_TCAM_TABLE_WIDTH / 8) * (t))
+
+#define NBL_FEM_EM0_AD_TABLE_ADDR (0xa08000)
+#define NBL_FEM_EM_AD_TABLE_DEPTH (64)
+#define NBL_FEM_EM_AD_TABLE_WIDTH (512)
+
+union fem_em_ad_table_u {
+ struct fem_em_ad_table {
+ u32 action0:22; /* [21:0] Default:0x0 RW */
+ u32 action1:22; /* [43:22] Default:0x0 RW */
+ u32 action2:22; /* [65:44] Default:0x0 RW */
+ u32 action3:22; /* [87:66] Default:0x0 RW */
+ u32 action4:22; /* [109:88] Default:0x0 RW */
+ u32 action5:22; /* [131:110] Default:0x0 RW */
+ u32 action6:22; /* [153:132] Default:0x0 RW */
+ u32 action7:22; /* [175:154] Default:0x0 RW */
+ u32 action8:22; /* [197:176] Default:0x0 RW */
+ u32 action9:22; /* [219:198] Default:0x0 RW */
+ u32 action10:22; /* [241:220] Default:0x0 RW */
+ u32 action11:22; /* [263:242] Default:0x0 RW */
+ u32 action12:22; /* [285:264] Default:0x0 RW */
+ u32 action13:22; /* [307:286] Default:0x0 RW */
+ u32 action14:22; /* [329:308] Default:0x0 RW */
+ u32 action15:22; /* [351:330] Default:0x0 RW */
+ u32 rsv[5]; /* [511:352] Default:0x0 RO */
+ } info;
+ u32 data[NBL_FEM_EM_AD_TABLE_WIDTH / 32];
+ u8 hash_key[sizeof(struct fem_em_ad_table)];
+};
+
+#define NBL_FEM_EM_AD_TABLE_REG(r, t) (NBL_FEM_EM0_AD_TABLE_ADDR + 0x1000 * (r) + \
+ (NBL_FEM_EM_AD_TABLE_WIDTH / 8) * (t))
+
+#define NBL_FLOW_TCAM_TOTAL_LEN 32
+#define NBL_FLOW_AD_TOTAL_LEN 64
+
+struct nbl_mcc_tbl {
+ u32 dport_act:16;
+ u32 dqueue_act:11;
+ u32 dqueue_en:1;
+ u32 dqueue_rsv:4;
+ u32 stateid_act:11;
+ u32 stateid_filter:1;
+ u32 flowid_filter:1;
+ u32 stateid_rsv:3;
+ u32 next_pntr:13;
+ u32 tail:1;
+ u32 vld:1;
+ u32 rsv:1;
+};
+
+union nbl_fem_ht_size_table_u {
+ struct nbl_fem_ht_size_table {
+ u32 pp0_size:5;
+ u32 rsv0:3;
+ u32 pp1_size:5;
+ u32 rsv1:3;
+ u32 pp2_size:5;
+ u32 rsv2:11;
+ } info;
+#define NBL_FEM_HT_SIZE_TBL_WIDTH (sizeof(struct nbl_fem_ht_size_table))
+ u8 data[NBL_FEM_HT_SIZE_TBL_WIDTH];
+};
+
+#define NBL_FEM_HT_SIZE_REG (NBL_PPE_FEM_BASE + 0x0000011c)
+
+#define NBL_FEM0_PROFILE_TABLE(t) (NBL_PPE_FEM_BASE + 0x00001000 + \
+ (NBL_FEM_PROFILE_TBL_WIDTH) * (t))
+
+/* ---------- REG BASE ADDR ---------- */
+#define NBL_LB_PCIEX16_TOP_BASE (0x01500000)
+/* PPE modules base addr */
+#define NBL_PPE_FEM_BASE (0x00a04000)
+#define NBL_PPE_IPRO_BASE (0x00b04000)
+#define NBL_PPE_PP0_BASE (0x00b14000)
+#define NBL_PPE_PP1_BASE (0x00b24000)
+#define NBL_PPE_PP2_BASE (0x00b34000)
+#define NBL_PPE_MCC_BASE (0x00b44000)
+#define NBL_PPE_ACL_BASE (0x00b64000)
+#define NBL_PPE_CAP_BASE (0x00e64000)
+#define NBL_PPE_EPRO_BASE (0x00e74000)
+#define NBL_PPE_DPRBAC_BASE (0x00904000)
+#define NBL_PPE_UPRBAC_BASE (0x0000C000)
+/* Interface modules base addr */
+#define NBL_INTF_HOST_PCOMPLETER_BASE (0x00f08000)
+#define NBL_INTF_HOST_PADPT_BASE (0x00f4c000)
+#define NBL_INTF_HOST_CTRLQ_BASE (0x00f8c000)
+#define NBL_INTF_HOST_VDPA_NET_BASE (0x00f98000)
+#define NBL_INTF_HOST_CMDQ_BASE (0x00fa0000)
+#define NBL_INTF_HOST_MAILBOX_BASE (0x00fb0000)
+#define NBL_INTF_HOST_PCIE_BASE (0X01504000)
+#define NBL_INTF_HOST_PCAP_BASE (0X015a4000)
+/* DP modules base addr */
+#define NBL_DP_URMUX_BASE (0x00008000)
+#define NBL_DP_UPRBAC_BASE (0x0000C000)
+#define NBL_DP_UPA_BASE (0x0008C000)
+#define NBL_DP_USTORE_BASE (0x00104000)
+#define NBL_DP_UPMEM_BASE (0x00108000)
+#define NBL_DP_UBM_BASE (0x0010c000)
+#define NBL_DP_UQM_BASE (0x00114000)
+#define NBL_DP_USTAT_BASE (0x0011c000)
+#define NBL_DP_UPED_BASE (0x0015c000)
+#define NBL_DP_UCAR_BASE (0x00e84000)
+#define NBL_DP_UL4S_BASE (0x00204000)
+#define NBL_DP_UVN_BASE (0x00244000)
+#define NBL_DP_DSCH_BASE (0x00404000)
+#define NBL_DP_SHAPING_BASE (0x00504000)
+#define NBL_DP_DVN_BASE (0x00514000)
+#define NBL_DP_DL4S_BASE (0x00614000)
+#define NBL_DP_DRMUX_BASE (0x00654000)
+#define NBL_DP_DSTORE_BASE (0x00704000)
+#define NBL_DP_DPMEM_BASE (0x00708000)
+#define NBL_DP_DBM_BASE (0x0070c000)
+#define NBL_DP_DQM_BASE (0x00714000)
+#define NBL_DP_DSTAT_BASE (0x0071c000)
+#define NBL_DP_DPED_BASE (0x0075c000)
+#define NBL_DP_DPA_BASE (0x0085c000)
+#define NBL_DP_DPRBAC_BASE (0x00904000)
+#define NBL_DP_DDMUX_BASE (0x00984000)
+#define NBL_DP_LB_DDP_BUF_BASE (0x00000000)
+#define NBL_DP_LB_DDP_OUT_BASE (0x00000000)
+#define NBL_DP_LB_DDP_DIST_BASE (0x00000000)
+#define NBL_DP_LB_DDP_IN_BASE (0x00000000)
+#define NBL_DP_LB_UDP_BUF_BASE (0x00000000)
+#define NBL_DP_LB_UDP_OUT_BASE (0x00000000)
+#define NBL_DP_LB_UDP_DIST_BASE (0x00000000)
+#define NBL_DP_LB_UDP_IN_BASE (0x00000000)
+#define NBL_DP_DL4S_BASE (0x00614000)
+#define NBL_DP_UL4S_BASE (0x00204000)
+
+/* -------- LB -------- */
+#define NBL_LB_PF_CONFIGSPACE_SELECT_OFFSET (0x81100000)
+#define NBL_LB_PF_CONFIGSPACE_SELECT_STRIDE (0x00100000)
+#define NBL_LB_PF_CONFIGSPACE_BASE_ADDR (NBL_LB_PCIEX16_TOP_BASE + 0x00024000)
+#define NBL_LB_PCIEX16_TOP_AHB (NBL_LB_PCIEX16_TOP_BASE + 0x00000020)
+
+#define NBL_SRIOV_CAPS_OFFSET (0x140)
+
+/* -------- MAILBOX BAR2 ----- */
+#define NBL_MAILBOX_NOTIFY_ADDR (0x00000000)
+#define NBL_MAILBOX_BAR_REG (0x00000000)
+#define NBL_MAILBOX_QINFO_CFG_RX_TABLE_ADDR (0x10)
+#define NBL_MAILBOX_QINFO_CFG_TX_TABLE_ADDR (0x20)
+#define NBL_MAILBOX_QINFO_CFG_DBG_TABLE_ADDR (0x30)
+
+/* -------- ADMINQ BAR2 ----- */
+#define NBL_ADMINQ_NOTIFY_ADDR (0x40)
+#define NBL_ADMINQ_QINFO_CFG_RX_TABLE_ADDR (0x50)
+#define NBL_ADMINQ_QINFO_CFG_TX_TABLE_ADDR (0x60)
+#define NBL_ADMINQ_QINFO_CFG_DBG_TABLE_ADDR (0x78)
+#define NBL_ADMINQ_MSIX_MAP_TABLE_ADDR (0x80)
+
+/* -------- MAILBOX -------- */
+
+/* mailbox BAR qinfo_cfg_dbg_table */
+struct nbl_mailbox_qinfo_cfg_dbg_tbl {
+ u16 rx_drop;
+ u16 rx_get;
+ u16 tx_drop;
+ u16 tx_out;
+ u16 rx_hd_ptr;
+ u16 tx_hd_ptr;
+ u16 rx_tail_ptr;
+ u16 tx_tail_ptr;
+};
+
+/* mailbox BAR qinfo_cfg_table */
+struct nbl_mailbox_qinfo_cfg_table {
+ u32 queue_base_addr_l;
+ u32 queue_base_addr_h;
+ u32 queue_size_bwind:4;
+ u32 rsv1:28;
+ u32 queue_rst:1;
+ u32 queue_en:1;
+ u32 dif_err:1;
+ u32 ptr_err:1;
+ u32 rsv2:28;
+};
+
+/* -------- ADMINQ -------- */
+
+struct nbl_adminq_qinfo_map_table {
+ u32 function:3;
+ u32 devid:5;
+ u32 bus:8;
+ u32 msix_idx:13;
+ u32 msix_idx_valid:1;
+ u32 rsv:2;
+};
+
+/* adminq BAR qinfo_cfg_dbg_table */
+struct nbl_adminq_qinfo_cfg_dbg_tbl {
+ u16 rx_hd_ptr;
+ u16 tx_hd_ptr;
+ u16 rx_tail_ptr;
+ u16 tx_tail_ptr;
+};
+
+/* -------- MAILBOX BAR0 ----- */
+/* mailbox qinfo_map_table */
+#define NBL_MAILBOX_QINFO_MAP_REG_ARR(func_id) \
+ (NBL_INTF_HOST_MAILBOX_BASE + 0x00001000 + \
+ (func_id) * sizeof(struct nbl_mailbox_qinfo_map_table))
+
+/* MAILBOX qinfo_map_table */
+struct nbl_mailbox_qinfo_map_table {
+ u32 function:3;
+ u32 devid:5;
+ u32 bus:8;
+ u32 msix_idx:13;
+ u32 msix_idx_valid:1;
+ u32 rsv:2;
+};
+
+/* -------- HOST_PCIE -------- */
+#define NBL_PCIE_HOST_K_PF_MASK_REG (NBL_INTF_HOST_PCIE_BASE + 0x00001004)
+#define NBL_PCIE_HOST_K_PF_FID(pf_id) \
+ (NBL_INTF_HOST_PCIE_BASE + 0x0000106C + 4 * (pf_id))
+#define NBL_PCIE_HOST_TL_CFG_BUSDEV (NBL_INTF_HOST_PCIE_BASE + 0x11040)
+
+/* -------- HOST_PADPT -------- */
+#define NBL_HOST_PADPT_HOST_CFG_FC_PD_DN (NBL_INTF_HOST_PADPT_BASE + 0x00000160)
+#define NBL_HOST_PADPT_HOST_CFG_FC_PH_DN (NBL_INTF_HOST_PADPT_BASE + 0x00000164)
+#define NBL_HOST_PADPT_HOST_CFG_FC_NPH_DN (NBL_INTF_HOST_PADPT_BASE + 0x0000016C)
+#define NBL_HOST_PADPT_HOST_CFG_FC_CPLH_UP (NBL_INTF_HOST_PADPT_BASE + 0x00000170)
+/* host_padpt host_msix_info */
+#define NBL_PADPT_ABNORMAL_MSIX_VEC (NBL_INTF_HOST_PADPT_BASE + 0x00000200)
+#define NBL_PADPT_ABNORMAL_TIMEOUT (NBL_INTF_HOST_PADPT_BASE + 0x00000204)
+#define NBL_PADPT_HOST_MSIX_INFO_REG_ARR(vector_id) \
+ (NBL_INTF_HOST_PADPT_BASE + 0x00010000 + (vector_id) * sizeof(struct nbl_host_msix_info))
+/* host_padpt host_vnet_qinfo */
+#define NBL_PADPT_HOST_VNET_QINFO_REG_ARR(queue_id) \
+ (NBL_INTF_HOST_PADPT_BASE + 0x00008000 + (queue_id) * sizeof(struct nbl_host_vnet_qinfo))
+
+struct nbl_host_msix_info {
+ u32 intrl_pnum:16;
+ u32 intrl_rate:16;
+ u32 function:3;
+ u32 devid:5;
+ u32 bus:8;
+ u32 valid:1;
+ u32 msix_mask_en:1;
+ u32 rsv:14;
+};
+
+struct nbl_abnormal_msix_vector {
+ u32 idx:16;
+ u32 vld:1;
+ u32 rsv:15;
+};
+
+/* host_padpt host_vnet_qinfo */
+struct nbl_host_vnet_qinfo {
+ u32 function_id:3;
+ u32 device_id:5;
+ u32 bus_id:8;
+ u32 msix_idx:13;
+ u32 msix_idx_valid:1;
+ u32 log_en:1;
+ u32 valid:1;
+ u32 tph_en:1;
+ u32 ido_en:1;
+ u32 rlo_en:1;
+ u32 rsv0:29;
+};
+
+struct nbl_msix_notify {
+ u32 glb_msix_idx:13;
+ u32 rsv1:3;
+ u32 mask:1;
+ u32 rsv2:15;
+};
+
+/* -------- HOST_PCOMPLETER -------- */
+/* pcompleter_host pcompleter_host_virtio_qid_map_table */
+#define NBL_PCOMPLETER_QID_MAP_REG_ARR(select, i) \
+ (NBL_INTF_HOST_PCOMPLETER_BASE + 0x00010000 + \
+ (select) * NBL_QID_MAP_TABLE_ENTRIES * sizeof(struct nbl_virtio_qid_map_table) + \
+ (i) * sizeof(struct nbl_virtio_qid_map_table))
+#define NBL_PCOMPLETER_FUNCTION_MSIX_MAP_REG_ARR(i) \
+ (NBL_INTF_HOST_PCOMPLETER_BASE + 0x00004000 + (i) * sizeof(struct nbl_function_msix_map))
+#define NBL_PCOMPLETER_HOST_MSIX_FID_TABLE(i) \
+ (NBL_INTF_HOST_PCOMPLETER_BASE + 0x0003a000 + \
+ (i) * sizeof(struct nbl_pcompleter_host_msix_fid_table))
+#define NBL_PCOMPLETER_INT_STATUS (NBL_INTF_HOST_PCOMPLETER_BASE + 0x00000000)
+#define NBL_PCOMPLETER_TLP_OUT_DROP_CNT (NBL_INTF_HOST_PCOMPLETER_BASE + 0x00002430)
+
+/* pcompleter_host pcompleter_host_virtio_table_ready */
+#define NBL_PCOMPLETER_QUEUE_TABLE_READY_REG \
+ (NBL_INTF_HOST_PCOMPLETER_BASE + 0x0000110C)
+/* pcompleter_host pcompleter_host_virtio_table_select */
+#define NBL_PCOMPLETER_QUEUE_TABLE_SELECT_REG \
+ (NBL_INTF_HOST_PCOMPLETER_BASE + 0x00001110)
+
+#define NBL_PCOMPLETER_MSIX_NOTIRY_OFFSET (0x1020)
+
+#define NBL_REG_WRITE_MAX_TRY_TIMES 2
+
+/* pcompleter_host virtio_qid_map_table */
+struct nbl_virtio_qid_map_table {
+ u32 local_qid:9;
+ u32 notify_addr_l:23;
+ u32 notify_addr_h;
+ u32 global_qid:12;
+ u32 ctrlq_flag:1;
+ u32 rsv1:19;
+ u32 rsv2;
+};
+
+struct nbl_pcompleter_host_msix_fid_table {
+ u32 fid:10;
+ u32 vld:1;
+ u32 rsv:21;
+};
+
+struct nbl_function_msix_map {
+ u64 msix_map_base_addr;
+ u32 function:3;
+ u32 devid:5;
+ u32 bus:8;
+ u32 valid:1;
+ u32 rsv0:15;
+ u32 rsv1;
+};
+
+struct nbl_queue_table_select {
+ u32 select:1;
+ u32 rsv:31;
+};
+
+struct nbl_queue_table_ready {
+ u32 ready:1;
+ u32 rsv:31;
+};
+
+/* IPRO ipro_queue_tbl */
+struct nbl_ipro_queue_tbl {
+ u32 vsi_id:10;
+ u32 vsi_en:1;
+ u32 rsv:21;
+};
+
+/* -------- HOST_PCAP -------- */
+#define NBL_HOST_PCAP_TX_CAP_EN (NBL_INTF_HOST_PCAP_BASE + 0x00000200)
+#define NBL_HOST_PCAP_TX_CAP_STORE (NBL_INTF_HOST_PCAP_BASE + 0x00000204)
+#define NBL_HOST_PCAP_TX_CAP_STALL (NBL_INTF_HOST_PCAP_BASE + 0x00000208)
+#define NBL_HOST_PCAP_RX_CAP_EN (NBL_INTF_HOST_PCAP_BASE + 0x00000800)
+#define NBL_HOST_PCAP_RX_CAP_STORE (NBL_INTF_HOST_PCAP_BASE + 0x00000804)
+#define NBL_HOST_PCAP_RX_CAP_STALL (NBL_INTF_HOST_PCAP_BASE + 0x00000808)
+
+/* ---------- DPED ---------- */
+#define NBL_DPED_VLAN_OFFSET (NBL_DP_DPED_BASE + 0x000003F4)
+#define NBL_DPED_DSCP_OFFSET_0 (NBL_DP_DPED_BASE + 0x000003F8)
+#define NBL_DPED_DSCP_OFFSET_1 (NBL_DP_DPED_BASE + 0x000003FC)
+
+/* DPED dped_hw_edt_prof */
+#define NBL_DPED_HW_EDT_PROF_TABLE(i) \
+ (NBL_DP_DPED_BASE + 0x00001000 + (i) * sizeof(struct ped_hw_edit_profile))
+/* DPED dped_l4_ck_cmd_40 */
+
+/* DPED hw_edt_prof/ UPED hw_edt_prof */
+struct ped_hw_edit_profile {
+ u32 l4_len:2;
+#define NBL_PED_L4_LEN_MDY_CMD_0 (0)
+#define NBL_PED_L4_LEN_MDY_CMD_1 (1)
+#define NBL_PED_L4_LEN_MDY_DISABLE (2)
+ u32 l3_len:2;
+#define NBL_PED_L3_LEN_MDY_CMD_0 (0)
+#define NBL_PED_L3_LEN_MDY_CMD_1 (1)
+#define NBL_PED_L3_LEN_MDY_DISABLE (2)
+ u32 l4_ck:3;
+#define NBL_PED_L4_CKSUM_CMD_0 (0)
+#define NBL_PED_L4_CKSUM_CMD_1 (1)
+#define NBL_PED_L4_CKSUM_CMD_2 (2)
+#define NBL_PED_L4_CKSUM_CMD_3 (3)
+#define NBL_PED_L4_CKSUM_CMD_4 (4)
+#define NBL_PED_L4_CKSUM_CMD_5 (5)
+#define NBL_PED_L4_CKSUM_CMD_6 (6)
+#define NBL_PED_L4_CKSUM_DISABLE (7)
+ u32 l3_ck:1;
+#define NBL_PED_L3_CKSUM_ENABLE (1)
+#define NBL_PED_L3_CKSUM_DISABLE (0)
+ u32 l4_ck_zero_free:1;
+#define NBL_PED_L4_CKSUM_ZERO_FREE_ENABLE (1)
+#define NBL_PED_L4_CKSUM_ZERO_FREE_DISABLE (0)
+ u32 rsv:23;
+};
+
+struct nbl_ped_hw_edit_profile_cfg {
+ u32 table_id;
+ struct ped_hw_edit_profile edit_prf;
+};
+
+/* ---------- UPED ---------- */
+/* UPED uped_hw_edt_prof */
+#define NBL_UPED_HW_EDT_PROF_TABLE(i) \
+ (NBL_DP_UPED_BASE + 0x00001000 + (i) * sizeof(struct ped_hw_edit_profile))
+
+/* --------- SHAPING --------- */
+#define NBL_SHAPING_NET_TIMMING_ADD_ADDR (NBL_DP_SHAPING_BASE + 0x00000300)
+#define NBL_SHAPING_NET(i) \
+ (NBL_DP_SHAPING_BASE + 0x00001800 + (i) * sizeof(struct nbl_shaping_net))
+
+/* cir 1, bandwidth 1kB/s in protol environment */
+/* cir 1, bandwidth 1Mb/s */
+#define NBL_LR_LEONIS_SYS_CLK 15000.0 /* 0105tag Khz */
+#define NBL_LR_LEONIS_NET_SHAPING_CYCLE_MAX 25
+#define NBL_LR_LEONIS_NET_SHAPING_DPETH 600
+#define NBL_LR_LEONIS_NET_BUCKET_DEPTH 9600
+
+#define NBL_SHAPING_DPORT_25G_RATE 0x61A8
+#define NBL_SHAPING_DPORT_HALF_25G_RATE 0x30D4
+
+#define NBL_SHAPING_DPORT_100G_RATE 0x1A400
+#define NBL_SHAPING_DPORT_HALF_100G_RATE 0xD200
+
+#define NBL_UCAR_MAX_BUCKET_DEPTH 524287
+
+#define NBL_DSTORE_DROP_XOFF_TH 0xC8
+#define NBL_DSTORE_DROP_XON_TH 0x64
+
+#define NBL_DSTORE_DROP_XOFF_TH_100G 0x1F4
+#define NBL_DSTORE_DROP_XON_TH_100G 0x12C
+
+#define NBL_DSTORE_DROP_XOFF_TH_BOND_MAIN 0x180
+#define NBL_DSTORE_DROP_XON_TH_BOND_MAIN 0x180
+
+#define NBL_DSTORE_DROP_XOFF_TH_BOND_OTHER 0x64
+#define NBL_DSTORE_DROP_XON_TH_BOND_OTHER 0x64
+
+#define NBL_DSTORE_DROP_XOFF_TH_100G_BOND_MAIN 0x2D5
+#define NBL_DSTORE_DROP_XON_TH_100G_BOND_MAIN 0x2BC
+
+#define NBL_DSTORE_DROP_XOFF_TH_100G_BOND_OTHER 0x145
+#define NBL_DSTORE_DROP_XON_TH_100G_BOND_OTHER 0x12C
+
+#define NBL_DSTORE_DISC_BP_TH (NBL_DP_DSTORE_BASE + 0x00000630)
+
+struct dstore_disc_bp_th {
+ u32 xoff_th:10;
+ u32 rsv1:6;
+ u32 xon_th:10;
+ u32 rsv:5;
+ u32 en:1;
+};
+
+struct nbl_shaping_net_timming_add {
+ u32 cycle_max:12; /* [11:0] Default:0x8 RW */
+ u32 rsv1:4; /* [15:12] Default:0x0 RO */
+ u32 depth:12; /* [27:16] Default:0x258 RW */
+ u32 rsv:4; /* [31:28] Default:0x0 RO */
+};
+
+/* DSCH dsch_vn_sha2net_map_tbl */
+struct dsch_vn_sha2net_map_tbl {
+ u32 vld:1;
+ u32 reserve:31;
+};
+
+/* DSCH dsch_vn_net2sha_map_tbl */
+struct dsch_vn_net2sha_map_tbl {
+ u32 vld:1;
+ u32 reserve:31;
+};
+
+#define NBL_NET_SHAPING_RDMA_BASE_ID (448)
+
+struct dsch_psha_en {
+ u32 en:4;
+ u32 rsv:28;
+};
+
+/* SHAPING shaping_net */
+struct nbl_shaping_net {
+ u32 valid:1;
+ u32 depth:19;
+ u32 cir:19;
+ u32 pir:19;
+ u32 cbs:21;
+ u32 pbs:21;
+ u32 rsv:28;
+};
+
+struct nbl_shaping_dport {
+ u32 valid:1;
+ u32 depth:19;
+ u32 cir:19;
+ u32 pir:19;
+ u32 cbs:21;
+ u32 pbs:21;
+ u32 rsv:28;
+};
+
+struct nbl_shaping_dvn_dport {
+ u32 valid:1;
+ u32 depth:19;
+ u32 cir:19;
+ u32 pir:19;
+ u32 cbs:21;
+ u32 pbs:21;
+ u32 rsv:28;
+};
+
+/* ---------- DSCH ---------- */
+/* DSCH vn_host_qid_max */
+#define NBL_DSCH_NOTIFY_BITMAP_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00003000 + (i) * BYTES_PER_DWORD)
+#define NBL_DSCH_FLY_BITMAP_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00004000 + (i) * BYTES_PER_DWORD)
+#define NBL_DSCH_PORT_MAP_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00005000 + (i) * sizeof(struct nbl_port_map))
+/* DSCH dsch_vn_q2tc_cfg_tbl */
+#define NBL_DSCH_VN_Q2TC_CFG_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00010000 + (i) * sizeof(struct dsch_vn_q2tc_cfg_tbl))
+/* DSCH dsch_vn_n2g_cfg_tbl */
+#define NBL_DSCH_VN_N2G_CFG_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00060000 + (i) * sizeof(struct dsch_vn_n2g_cfg_tbl))
+/* DSCH dsch_vn_g2p_cfg_tbl */
+#define NBL_DSCH_VN_G2P_CFG_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00064000 + (i) * sizeof(struct dsch_vn_g2p_cfg_tbl))
+/* DSCH dsch_vn_tc_wgt_cfg_tbl */
+#define NBL_DSCH_VN_TC_WGT_CFG_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00068000 + (i) * sizeof(union dsch_vn_tc_wgt_cfg_tbl_u))
+/* DSCH dsch_vn_sha2net_map_tbl */
+#define NBL_DSCH_VN_SHA2NET_MAP_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00070000 + (i) * sizeof(struct dsch_vn_sha2net_map_tbl))
+/* DSCH dsch_vn_net2sha_map_tbl */
+#define NBL_DSCH_VN_NET2SHA_MAP_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00074000 + (i) * sizeof(struct dsch_vn_net2sha_map_tbl))
+/* DSCH dsch_vn_tc_q_list_tbl */
+#define NBL_DSCH_VN_TC_Q_LIST_TABLE_REG_ARR(i) \
+ (NBL_DP_DSCH_BASE + 0x00040000 + (i) * sizeof(struct dsch_vn_tc_q_list_tbl))
+/* DSCH dsch maxqid */
+#define NBL_DSCH_HOST_QID_MAX (NBL_DP_DSCH_BASE + 0x00000118)
+#define NBL_DSCH_VN_QUANTA_ADDR (NBL_DP_DSCH_BASE + 0x00000134)
+#define NBL_DSCH_INT_STATUS (NBL_DP_DSCH_BASE + 0x00000000)
+#define NBL_DSCH_RDMA_OTHER_ABN (NBL_DP_DSCH_BASE + 0x00000080)
+#define NBL_DSCH_RDMA_OTHER_ABN_BIT (0x4000)
+#define NBL_DSCH_RDMA_DPQM_DB_LOST (2)
+
+#define NBL_MAX_QUEUE_ID (0x7ff)
+#define NBL_HOST_QUANTA (0x8000)
+#define NBL_ECPU_QUANTA (0x1000)
+
+/* DSCH dsch_vn_q2tc_cfg_tbl */
+struct dsch_vn_q2tc_cfg_tbl {
+ u32 tcid:13;
+ u32 rsv:18;
+ u32 vld:1;
+};
+
+/* DSCH dsch_vn_n2g_cfg_tbl */
+struct dsch_vn_n2g_cfg_tbl {
+ u32 grpid:8;
+ u32 rsv:23;
+ u32 vld:1;
+};
+
+/* DSCH dsch_vn_tc_qlist_tbl */
+struct dsch_vn_tc_q_list_tbl {
+ u32 nxt:11;
+ u32 reserve:18;
+ u32 regi:1;
+ u32 fly:1;
+ u32 vld:1;
+};
+
+/* DSCH dsch_vn_g2p_cfg_tbl */
+struct dsch_vn_g2p_cfg_tbl {
+ u32 port:3;
+ u32 rsv:28;
+ u32 vld:1;
+};
+
+/* DSCH dsch_vn_tc_wgt_cfg_tbl */
+union dsch_vn_tc_wgt_cfg_tbl_u {
+ struct dsch_vn_tc_wgt_cfg_tbl {
+ u8 tc0_wgt;
+ u8 tc1_wgt;
+ u8 tc2_wgt;
+ u8 tc3_wgt;
+ u8 tc4_wgt;
+ u8 tc5_wgt;
+ u8 tc6_wgt;
+ u8 tc7_wgt;
+ } info;
+#define NBL_DSCH_VN_TC_WGT_CFG_TBL_WIDTH (sizeof(struct dsch_vn_tc_wgt_cfg_tbl))
+ u8 data[NBL_DSCH_VN_TC_WGT_CFG_TBL_WIDTH];
+};
+
+struct dsch_vn_quanta {
+ u32 h_qua:16;
+ u32 e_qua:16;
+};
+
+/* ---------- DVN ---------- */
+
+struct nbl_dvn_stat_cnt {
+ u32 dvn_desc_fwd_cnt:16;
+ u32 rsv0:16;
+ u32 dvn_desc_drop_cnt:16;
+ u32 rsv1:16;
+ u32 dvn_pkt_fwd_cnt:16;
+ u32 rsv2:16;
+ u32 dvn_pkt_drop_cnt:16;
+ u32 rsv3:16;
+ u32 rsv4[4];
+};
+
+/* DVN dvn_queue_table */
+#define NBL_DVN_QUEUE_TABLE_ARR(i) \
+ (NBL_DP_DVN_BASE + 0x00020000 + (i) * sizeof(struct dvn_queue_table))
+#define NBL_DVN_QUEUE_CXT_TABLE_ARR(i) \
+ (NBL_DP_DVN_BASE + 0x00030000 + (i) * sizeof(struct dvn_queue_context))
+#define NBL_DVN_STAT_CNT(i) (NBL_DP_DVN_BASE + 0x00040000 + (i) * sizeof(struct nbl_dvn_stat_cnt))
+/* DVN dvn_queue_reset */
+#define NBL_DVN_QUEUE_RESET_REG (NBL_DP_DVN_BASE + 0x00000400)
+/* DVN dvn_queue_reset_done */
+#define NBL_DVN_QUEUE_RESET_DONE_REG (NBL_DP_DVN_BASE + 0x00000404)
+#define NBL_DVN_ECPU_QUEUE_NUM (NBL_DP_DVN_BASE + 0x0000041C)
+#define NBL_DVN_DESCREQ_NUM_CFG (NBL_DP_DVN_BASE + 0x00000430)
+#define NBL_DVN_DESC_WR_MERGE_TIMEOUT (NBL_DP_DVN_BASE + 0x00000480)
+#define NBL_DVN_DIF_REQ_RD_RO_FLAG (NBL_DP_DVN_BASE + 0x0000045C)
+#define NBL_DVN_INT_STATUS (NBL_DP_DVN_BASE + 0x00000000)
+#define NBL_DVN_DESC_DIF_ERR_CNT (NBL_DP_DVN_BASE + 0x0000003C)
+#define NBL_DVN_DESC_DIF_ERR_INFO (NBL_DP_DVN_BASE + 0x00000038)
+#define NBL_DVN_PKT_DIF_ERR_INFO (NBL_DP_DVN_BASE + 0x00000030)
+#define NBL_DVN_PKT_DIF_ERR_CNT (NBL_DP_DVN_BASE + 0x00000034)
+#define NBL_DVN_ERR_QUEUE_ID_GET (NBL_DP_DVN_BASE + 0x0000040C)
+#define NBL_DVN_BACK_PRESSURE_MASK (NBL_DP_DVN_BASE + 0x00000464)
+#define NBL_DVN_DESCRD_L2_UNAVAIL_CNT (NBL_DP_DVN_BASE + 0x00000A1C)
+#define NBL_DVN_DESCRD_L2_NOAVAIL_CNT (NBL_DP_DVN_BASE + 0x00000A20)
+
+#define DEFAULT_DVN_DESCREQ_NUMCFG (0x00080014)
+#define DEFAULT_DVN_100G_DESCREQ_NUMCFG (0x00080020)
+
+#define NBL_DVN_INT_PKT_DIF_ERR (4)
+#define DEFAULT_DVN_DESC_WR_MERGE_TIMEOUT_MAX (0x3FF)
+
+#define NBL_DVN_INT_DESC_DIF_ERR (5)
+
+struct nbl_dvn_descreq_num_cfg {
+ u32 avring_cfg_num:1; /* spilit ring descreq_num 0:8,1:16 */
+ u32 rsv0:3;
+ u32 packed_l1_num:3; /* packet ring descreq_num 0:8,1:12,2:16;3:20,4:24,5:26;6:32,7:32 */
+ u32 rsv1:25;
+};
+
+struct nbl_dvn_desc_wr_merge_timeout {
+ u32 cfg_cycle:10;
+ u32 rsv:22;
+};
+
+struct nbl_dvn_dif_req_rd_ro_flag {
+ u32 rd_desc_ro_en:1;
+ u32 rd_data_ro_en:1;
+ u32 rd_avring_ro_en:1;
+ u32 rsv:29;
+};
+
+/* DVN dvn_queue_table */
+struct dvn_queue_table {
+ u64 dvn_used_baddr;
+ u64 dvn_avail_baddr;
+ u64 dvn_queue_baddr;
+ u32 dvn_queue_size:4;
+ u32 dvn_queue_type:1;
+ u32 dvn_queue_en:1;
+ u32 dvn_extend_header_en:1;
+ u32 dvn_interleave_seg_disable:1;
+ u32 dvn_seg_disable:1;
+ u32 rsv0:23;
+ u32 rsv1:32;
+};
+
+/* DVN dvn_queue_context */
+struct dvn_queue_context {
+ u32 dvn_descrd_num:3;
+ u32 dvn_firstdescid:16;
+ u32 dvn_firstdesc:16;
+ u32 dvn_indirect_len:6;
+ u64 dvn_indirect_addr:64;
+ u32 dvn_indirect_next:5;
+ u32 dvn_l1_ring_read:16;
+ u32 dvn_avail_ring_read:16;
+ u32 dvn_ring_wrap_counter:1;
+ u32 dvn_lso_id:10;
+ u32 dvn_avail_ring_idx:16;
+ u32 dvn_used_ring_idx:16;
+ u32 dvn_indirect_left:1;
+ u32 dvn_desc_left:1;
+ u32 dvn_lso_flag:1;
+ u32 dvn_descrd_disable:1;
+ u32 dvn_queue_err:1;
+ u32 dvn_lso_drop:1;
+ u32 dvn_protected_bit:1;
+ u64 reserve;
+};
+
+/* DVN dvn_queue_reset */
+struct nbl_dvn_queue_reset {
+ u32 dvn_queue_index:11;
+ u32 vld:1;
+ u32 rsv:20;
+};
+
+/* DVN dvn_queue_reset_done */
+struct nbl_dvn_queue_reset_done {
+ u32 flag:1;
+ u32 rsv:31;
+};
+
+/* DVN dvn_desc_dif_err_info */
+struct dvn_desc_dif_err_info {
+ u32 queue_id:11;
+ u32 rsv:21;
+};
+
+struct dvn_pkt_dif_err_info {
+ u32 queue_id:11;
+ u32 rsv:21;
+};
+
+struct dvn_err_queue_id_get {
+ u32 pkt_flag:1;
+ u32 desc_flag:1;
+ u32 rsv:30;
+};
+
+struct dvn_back_pressure_mask {
+ u32 l4s_flag:1;
+ u32 dsch_flag:1;
+ u32 dstore_port0_flag:1;
+ u32 dstore_port1_flag:1;
+ u32 dstore_port2_flag:1;
+ u32 dstore_port3_flag:1;
+ u32 rsv:26;
+};
+
+/* ---------- UVN ---------- */
+/* UVN uvn_queue_table */
+#define NBL_UVN_QUEUE_TABLE_ARR(i) \
+ (NBL_DP_UVN_BASE + 0x00010000 + (i) * sizeof(struct uvn_queue_table))
+/* UVN uvn_queue_cxt */
+#define NBL_UVN_QUEUE_CXT_TABLE_ARR(i) \
+ (NBL_DP_UVN_BASE + 0x00020000 + (i) * sizeof(struct uvn_queue_cxt))
+/* UVN uvn_desc_cxt */
+#define NBL_UVN_DESC_CXT_TABLE_ARR(i) \
+ (NBL_DP_UVN_BASE + 0x00028000 + (i) * sizeof(struct uvn_desc_cxt))
+/* UVN uvn_queue_reset */
+#define NBL_UVN_QUEUE_RESET_REG (NBL_DP_UVN_BASE + 0x00000200)
+/* UVN uvn_queue_reset_done */
+#define NBL_UVN_QUEUE_RESET_DONE_REG (NBL_DP_UVN_BASE + 0x00000408)
+#define NBL_UVN_STATIS_PKT_DROP(i) (NBL_DP_UVN_BASE + 0x00038000 + (i) * sizeof(u32))
+#define NBL_UVN_INT_STATUS (NBL_DP_UVN_BASE + 0x00000000)
+#define NBL_UVN_QUEUE_ERR_INFO (NBL_DP_UVN_BASE + 0x00000034)
+#define NBL_UVN_QUEUE_ERR_CNT (NBL_DP_UVN_BASE + 0x00000038)
+#define NBL_UVN_DESC_RD_WAIT (NBL_DP_UVN_BASE + 0x0000020C)
+#define NBL_UVN_QUEUE_ERR_MASK (NBL_DP_UVN_BASE + 0x00000224)
+#define NBL_UVN_ECPU_QUEUE_NUM (NBL_DP_UVN_BASE + 0x0000023C)
+#define NBL_UVN_DESC_WR_TIMEOUT (NBL_DP_UVN_BASE + 0x00000214)
+#define NBL_UVN_DIF_DELAY_REQ (NBL_DP_UVN_BASE + 0x000010D0)
+#define NBL_UVN_DIF_DELAY_TIME (NBL_DP_UVN_BASE + 0x000010D4)
+#define NBL_UVN_DIF_DELAY_MAX (NBL_DP_UVN_BASE + 0x000010D8)
+#define NBL_UVN_DESC_PRE_DESC_REQ_NULL (NBL_DP_UVN_BASE + 0x000012C8)
+#define NBL_UVN_DESC_PRE_DESC_REQ_LACK (NBL_DP_UVN_BASE + 0x000012CC)
+#define NBL_UVN_DESC_RD_ENTRY (NBL_DP_UVN_BASE + 0x000012D0)
+#define NBL_UVN_DESC_RD_DROP_DESC_LACK (NBL_DP_UVN_BASE + 0x000012E0)
+#define NBL_UVN_DIF_REQ_RO_FLAG (NBL_DP_UVN_BASE + 0x00000250)
+#define NBL_UVN_DESC_PREFETCH_INIT (NBL_DP_UVN_BASE + 0x00000204)
+#define NBL_UVN_DESC_WR_TIMEOUT_4US (0x960)
+#define NBL_UVN_DESC_PREFETCH_NUM (4)
+
+#define NBL_UVN_INT_QUEUE_ERR (5)
+
+struct uvn_dif_req_ro_flag {
+ u32 avail_rd:1;
+ u32 desc_rd:1;
+ u32 pkt_wr:1;
+ u32 desc_wr:1;
+ u32 rsv:28;
+};
+
+/* UVN uvn_queue_table */
+struct uvn_queue_table {
+ u64 used_baddr;
+ u64 avail_baddr;
+ u64 queue_baddr;
+ u32 queue_size_mask_pow:4;
+ u32 queue_type:1;
+ u32 queue_enable:1;
+ u32 extend_header_en:1;
+ u32 guest_csum_en:1;
+ u32 half_offload_en:1;
+ u32 rsv0:23;
+ u32 rsv1:32;
+};
+
+/* uvn uvn_queue_cxt */
+struct uvn_queue_cxt {
+ u32 queue_head:16;
+ u32 wrap_count:1;
+ u32 queue_err:1;
+ u32 prefetch_null_cnt:2;
+ u32 ntf_finish:1;
+ u32 spnd_flag:1;
+ u32 reserve0:10;
+ u32 avail_idx:16;
+ u32 avail_idx_spnd_flag:1;
+ u32 reserve1:15;
+ u32 reserve2[2];
+};
+
+/* uvn uvn_queue_reset */
+struct nbl_uvn_queue_reset {
+ u32 index:11;
+ u32 rsv0:5;
+ u32 vld:1;
+ u32 rsv1:15;
+};
+
+/* uvn uvn_queue_reset_done */
+struct nbl_uvn_queue_reset_done {
+ u32 flag:1;
+ u32 rsv:31;
+};
+
+/* uvn uvn_desc_cxt */
+struct uvn_desc_cxt {
+ u32 cache_head:9;
+ u32 reserve0:7;
+ u32 cache_tail:9;
+ u32 reserve1:7;
+ u32 cache_pref_num_prev:9;
+ u32 reserve2:7;
+ u32 cache_pref_num_post:9;
+ u32 reserve3:7;
+ u32 cache_head_byte:30;
+ u32 reserve4:2;
+ u32 cache_tail_byte:30;
+ u32 reserve5:2;
+};
+
+struct uvn_desc_wr_timeout {
+ u32 num:15;
+ u32 mask:1;
+ u32 rsv:16;
+};
+
+struct uvn_queue_err_info {
+ u32 queue_id:11;
+ u32 type:5;
+ u32 rsv:16;
+};
+
+struct uvn_queue_err_mask {
+ u32 rsv0:1;
+ u32 buffer_len_err:1;
+ u32 next_err:1;
+ u32 indirect_err:1;
+ u32 split_err:1;
+ u32 dif_err:1;
+ u32 rsv1:26;
+};
+
+struct uvn_desc_prefetch_init {
+ u32 num:8;
+ u32 rsv1:8;
+ u32 sel:1;
+ u32 rsv:15;
+};
+
+/* -------- USTORE -------- */
+#define NBL_USTORE_PKT_LEN_ADDR (NBL_DP_USTORE_BASE + 0x00000108)
+#define NBL_USTORE_PORT_FC_TH_REG_ARR(port_id) \
+ (NBL_DP_USTORE_BASE + 0x00000134 + (port_id) * sizeof(struct nbl_ustore_port_fc_th))
+#define NBL_USTORE_COS_FC_TH_REG_ARR(cos_id) \
+ (NBL_DP_USTORE_BASE + 0x00000200 + (cos_id) * sizeof(struct nbl_ustore_cos_fc_th))
+#define NBL_USTORE_PORT_DROP_TH_REG_ARR(port_id) \
+ (NBL_DP_USTORE_BASE + 0x00000150 + (port_id) * sizeof(struct nbl_ustore_port_drop_th))
+#define NBL_USTORE_BUF_TOTAL_DROP_PKT (NBL_DP_USTORE_BASE + 0x000010A8)
+#define NBL_USTORE_BUF_TOTAL_TRUN_PKT (NBL_DP_USTORE_BASE + 0x000010AC)
+#define NBL_USTORE_BUF_PORT_DROP_PKT(eth_id) \
+ (NBL_DP_USTORE_BASE + 0x00002500 + (eth_id) * sizeof(u32))
+#define NBL_USTORE_BUF_PORT_TRUN_PKT(eth_id) \
+ (NBL_DP_USTORE_BASE + 0x00002540 + (eth_id) * sizeof(u32))
+
+#define NBL_USTORE_SIGNLE_ETH_DROP_TH 0xC80
+#define NBL_USTORE_DUAL_ETH_DROP_TH 0x640
+#define NBL_USTORE_QUAD_ETH_DROP_TH 0x320
+
+/* USTORE pkt_len */
+struct ustore_pkt_len {
+ u32 min:7;
+ u32 rsv:8;
+ u32 min_chk_en:1;
+ u32 max:14;
+ u32 rsv2:1;
+ u32 max_chk_len:1;
+};
+
+/* USTORE port_fc_th */
+struct nbl_ustore_port_fc_th {
+ u32 xoff_th:12;
+ u32 rsv1:4;
+ u32 xon_th:12;
+ u32 rsv2:2;
+ u32 fc_set:1;
+ u32 fc_en:1;
+};
+
+/* USTORE cos_fc_th */
+struct nbl_ustore_cos_fc_th {
+ u32 xoff_th:12;
+ u32 rsv1:4;
+ u32 xon_th:12;
+ u32 rsv2:2;
+ u32 fc_set:1;
+ u32 fc_en:1;
+};
+
+#define NBL_MAX_USTORE_COS_FC_TH (4080)
+
+/* USTORE port_drop_th */
+struct nbl_ustore_port_drop_th {
+ u32 disc_th:12;
+ u32 rsv:19;
+ u32 en:1;
+};
+
+/* ---------- UL4S ---------- */
+#define NBL_UL4S_SCH_PAD_ADDR (NBL_DP_UL4S_BASE + 0x000006c4)
+
+/* UL4S ul4s_sch_pad */
+struct ul4s_sch_pad {
+ u32 en:1;
+ u32 clr:1;
+ u32 rsv:30;
+};
+
+/* --------- DSTAT --------- */
+#define NBL_DSTAT_VSI_STAT(vsi_id) \
+ (NBL_DP_DSTAT_BASE + 0x00008000 + (vsi_id) * sizeof(struct nbl_dstat_vsi_stat))
+
+struct nbl_dstat_vsi_stat {
+ u32 fwd_byte_cnt_low;
+ u32 fwd_byte_cnt_high;
+ u32 fwd_pkt_cnt_low;
+ u32 fwd_pkt_cnt_high;
+};
+
+/* --------- USTAT --------- */
+#define NBL_USTAT_VSI_STAT(vsi_id) \
+ (NBL_DP_USTAT_BASE + 0x00008000 + (vsi_id) * sizeof(struct nbl_ustat_vsi_stat))
+
+struct nbl_ustat_vsi_stat {
+ u32 fwd_byte_cnt_low;
+ u32 fwd_byte_cnt_high;
+ u32 fwd_pkt_cnt_low;
+ u32 fwd_pkt_cnt_high;
+};
+
+/* ---------- IPRO ---------- */
+/* ipro module related macros */
+#define NBL_IPRO_MODULE (0xB04000)
+/* ipro queue tbl */
+#define NBL_IPRO_QUEUE_TBL(i) \
+ (NBL_IPRO_MODULE + 0x00004000 + (i) * sizeof(struct nbl_ipro_queue_tbl))
+#define NBL_IPRO_UP_SPORT_TABLE(i) \
+ (NBL_IPRO_MODULE + 0x00007000 + (i) * sizeof(struct nbl_ipro_upsport_tbl))
+#define NBL_IPRO_DN_SRC_PORT_TABLE(i) \
+ (NBL_PPE_IPRO_BASE + 0x00008000 + (i) * sizeof(struct nbl_ipro_dn_src_port_tbl))
+
+enum nbl_fwd_type_e {
+ NBL_FWD_TYPE_NORMAL = 0,
+ NBL_FWD_TYPE_CPU_ASSIGNED = 1,
+ NBL_FWD_TYPE_UPCALL = 2,
+ NBL_FWD_TYPE_SRC_MIRROR = 3,
+ NBL_FWD_TYPE_OTHER_MIRROR = 4,
+ NBL_FWD_TYPE_MNG = 5,
+ NBL_FWD_TYPE_GLB_LB = 6,
+ NBL_FWD_TYPE_DROP = 7,
+ NBL_FWD_TYPE_MAX = 8,
+};
+
+/* IPRO dn_src_port_tbl */
+struct nbl_ipro_dn_src_port_tbl {
+ u32 entry_vld:1;
+ u32 mirror_en:1;
+ u32 mirror_pr:2;
+ u32 mirror_id:4;
+ u32 vlan_layer_num_1:2;
+ u32 hw_flow:1;
+ u32 mtu_sel:4;
+ u32 addr_check_en:1;
+ u32 smac_low:16;
+ u32 smac_high;
+ u32 dqueue:11;
+ u32 dqueue_en:1;
+ u32 dqueue_pri:2;
+ u32 set_dport_pri:2;
+ union nbl_action_data set_dport;
+ u32 set_dport_en:1;
+ u32 proc_done:1;
+ u32 not_used_1:6;
+ u32 rsv:24;
+};
+
+/* IPRO up sport tab */
+struct nbl_ipro_upsport_tbl {
+ u32 entry_vld:1;
+ u32 vlan_layer_num_0:2;
+ u32 vlan_layer_num_1:2;
+ u32 lag_vld:1;
+ u32 lag_id:2;
+ u32 hw_flow:1;
+ u32 mirror_en:1;
+ u32 mirror_pr:2;
+ u32 mirror_id:4;
+ u32 dqueue_pri:2;
+ u32 set_dport_pri:2;
+ u32 dqueue:11;
+ u32 dqueue_en:1;
+ union nbl_action_data set_dport;
+ u32 set_dport_en:1;
+ u32 proc_done:1;
+ u32 car_en:1;
+ u32 car_pr:2;
+ u32 car_id:10;
+ u32 rsv:1;
+};
+
+struct nbl_ipro_mtu_sel {
+ u32 mtu_1:16; /* [15:0] Default:0x0 RW */
+ u32 mtu_0:16; /* [31:16] Default:0x0 RW */
+};
+
+/* ---------- EPRO ---------- */
+#define NBL_EPRO_INT_STATUS (NBL_PPE_EPRO_BASE + 0x00000000)
+#define NBL_EPRO_INT_MASK (NBL_PPE_EPRO_BASE + 0x00000004)
+#define NBL_EPRO_RSS_KEY_REG (NBL_PPE_EPRO_BASE + 0x00000400)
+#define NBL_EPRO_MIRROR_ACT_PRI_REG (NBL_PPE_EPRO_BASE + 0x00000234)
+#define NBL_EPRO_ACTION_FILTER_TABLE(i) (NBL_PPE_EPRO_BASE + 0x00001900 + \
+ sizeof(struct nbl_epro_action_filter_tbl) * (i))
+/* epro epro_ept table */
+#define NBL_EPRO_EPT_TABLE(i) \
+ (NBL_PPE_EPRO_BASE + 0x00001800 + (i) * sizeof(struct nbl_epro_ept_tbl))
+/* epro epro_vpt table */
+#define NBL_EPRO_VPT_TABLE(i) \
+ (NBL_PPE_EPRO_BASE + 0x00004000 + (i) * sizeof(struct nbl_epro_vpt_tbl))
+/* epro epro_rss_pt table */
+#define NBL_EPRO_RSS_PT_TABLE(i) \
+ (NBL_PPE_EPRO_BASE + 0x00002000 + (i) * sizeof(struct nbl_epro_rss_pt_tbl))
+/* epro epro_rss_ret table */
+#define NBL_EPRO_RSS_RET_TABLE(i) \
+ (NBL_PPE_EPRO_BASE + 0x00008000 + (i) * sizeof(struct nbl_epro_rss_ret_tbl))
+/* epro epro_sch_cos_map table */
+#define NBL_EPRO_SCH_COS_MAP_TABLE(i, j) \
+ (NBL_PPE_EPRO_BASE + 0x00000640 + ((i) * 0x20) + (j) * sizeof(struct nbl_epro_cos_map))
+/* epro epro_port_pri_mdf_en */
+#define NBL_EPRO_PORT_PRI_MDF_EN (NBL_PPE_EPRO_BASE + 0x000006E0)
+/* epro epro_act_sel_en */
+#define NBL_EPRO_ACT_SEL_EN_REG \
+ (NBL_PPE_EPRO_BASE + 0x00000214)
+/* epro epro_kgen_ft table */
+#define NBL_EPRO_KGEN_FT_TABLE(i) \
+ (NBL_PPE_EPRO_BASE + 0x00001980 + (i) * sizeof(struct nbl_epro_kgen_ft_tbl))
+
+struct nbl_epro_int_mask {
+ u32 fatal_err:1;
+ u32 fifo_uflw_err:1;
+ u32 fifo_dflw_err:1;
+ u32 cif_err:1;
+ u32 input_err:1;
+ u32 cfg_err:1;
+ u32 data_ucor_err:1;
+ u32 bank_cor_err:1;
+ u32 rsv2:24;
+};
+
+struct nbl_epro_rss_key {
+ u64 key0;
+ u64 key1;
+ u64 key2;
+ u64 key3;
+ u64 key4;
+};
+
+struct nbl_epro_mirror_act_pri {
+ u32 car_idx_pri:2;
+ u32 dqueue_pri:2;
+ u32 dport_pri:2;
+ u32 rsv:26;
+};
+
+/* EPRO epro_rss_ret table */
+struct nbl_epro_rss_ret_tbl {
+ u32 dqueue0:11;
+ u32 vld0:1;
+ u32 rsv0:4;
+ u32 dqueue1:11;
+ u32 vld1:1;
+ u32 rsv1:4;
+};
+
+/* EPRO epro_rss_pt table */
+struct nbl_epro_rss_pt_tbl {
+ u32 entry_size:3;
+#define NBL_EPRO_RSS_ENTRY_SIZE_16 (0)
+#define NBL_EPRO_RSS_ENTRY_SIZE_32 (1)
+#define NBL_EPRO_RSS_ENTRY_SIZE_64 (2)
+#define NBL_EPRO_RSS_ENTRY_SIZE_128 (3)
+#define NBL_EPRO_RSS_ENTRY_SIZE_256 (4)
+ u32 offset1:14;
+ u32 offset1_vld:1;
+ u32 offset0:14;
+ u32 offset0_vld:1;
+ u32 vld:1;
+ u32 rsv:30;
+};
+
+/*EPRO sch cos map*/
+struct nbl_epro_cos_map {
+ u32 pkt_cos:3;
+ u32 dscp:6;
+ u32 rsv:23;
+};
+
+/* EPRO epro_port_pri_mdf_en */
+struct nbl_epro_port_pri_mdf_en_cfg {
+ u32 eth0:1;
+ u32 eth1:1;
+ u32 eth2:1;
+ u32 eth3:1;
+ u32 loop:1;
+ u32 rsv:27;
+};
+
+enum nbl_md_action_id_e {
+ NBL_MD_ACTION_NONE = 0,
+ NBL_MD_ACTION_CLEAR_FLAG = 1,
+ NBL_MD_ACTION_SET_FLAG = NBL_MD_ACTION_CLEAR_FLAG,
+ NBL_MD_ACTION_SET_FWD = NBL_MD_ACTION_CLEAR_FLAG,
+ NBL_MD_ACTION_FLOWID0 = 2,
+ NBL_MD_ACTION_FLOWID1 = 3,
+ NBL_MD_ACTION_RSSIDX = 4,
+ NBL_MD_ACTION_PORT_CARIDX = 5,
+ NBL_MD_ACTION_FLOW_CARIDX = 6,
+ NBL_MD_ACTION_TABLE_INDEX = 7,
+ NBL_MD_ACTION_MIRRIDX = 8,
+ NBL_MD_ACTION_DPORT = 9,
+ NBL_MD_ACTION_SET_DPORT = NBL_MD_ACTION_DPORT,
+ NBL_MD_ACTION_DQUEUE = 10,
+ NBL_MD_ACTION_MCIDX = 13,
+ NBL_MD_ACTION_VNI0 = 14,
+ NBL_MD_ACTION_VNI1 = 15,
+ NBL_MD_ACTION_STAT_IDX = 16,
+ NBL_MD_ACTION_PRBAC_IDX = 17,
+ NBL_MD_ACTION_L4S_IDX = NBL_MD_ACTION_PRBAC_IDX,
+ NBL_MD_ACTION_DP_HASH0 = 19,
+ NBL_MD_ACTION_DP_HASH1 = 20,
+ NBL_MD_ACTION_MDF_PRI = 21,
+
+ NBL_MD_ACTION_MDF_V4_SIP = 32,
+ NBL_MD_ACTION_MDF_V4_DIP = 33,
+ NBL_MD_ACTION_MDF_V6_SIP = 34,
+ NBL_MD_ACTION_MDF_V6_DIP = 35,
+ NBL_MD_ACTION_MDF_DPORT = 36,
+ NBL_MD_ACTION_MDF_SPORT = 37,
+ NBL_MD_ACTION_MDF_DMAC = 38,
+ NBL_MD_ACTION_MDF_SMAC = 39,
+ NBL_MD_ACTION_MDF_V4_DSCP_ECN = 40,
+ NBL_MD_ACTION_MDF_V6_DSCP_ECN = 41,
+ NBL_MD_ACTION_MDF_V4_TTL = 42,
+ NBL_MD_ACTION_MDF_V6_HOPLIMIT = 43,
+ NBL_MD_ACTION_DEL_O_VLAN = 44,
+ NBL_MD_ACTION_DEL_I_VLAN = 45,
+ NBL_MD_ACTION_MDF_O_VLAN = 46,
+ NBL_MD_ACTION_MDF_I_VLAN = 47,
+ NBL_MD_ACTION_ADD_O_VLAN = 48,
+ NBL_MD_ACTION_ADD_I_VLAN = 49,
+ NBL_MD_ACTION_ENCAP_TNL = 50,
+ NBL_MD_ACTION_DECAP_TNL = 51,
+ NBL_MD_ACTION_MDF_TNL_SPORT = 52,
+};
+
+/* EPRO action filter table */
+struct nbl_epro_action_filter_tbl {
+ u64 filter_mask;
+};
+
+#define NBL_EPRO_LAG_MAX (4)
+#define NBL_EPRO_EPT_LAG_OFFSET (4)
+
+/* EPRO epr_ept table */
+struct nbl_epro_ept_tbl {
+ u32 cvlan:16;
+ u32 svlan:16;
+ u32 fwd:1;
+#define NBL_EPRO_FWD_TYPE_DROP (0)
+#define NBL_EPRO_FWD_TYPE_NORMAL (1)
+ u32 mirror_en:1;
+ u32 mirror_id:4;
+ u32 pop_i_vlan:1;
+ u32 pop_o_vlan:1;
+ u32 push_i_vlan:1;
+ u32 push_o_vlan:1;
+ u32 replace_i_vlan:1;
+ u32 replace_o_vlan:1;
+ u32 lag_alg_sel:2;
+#define NBL_EPRO_LAG_ALG_L2_HASH (0)
+#define NBL_EPRO_LAG_ALG_L23_HASH (1)
+#define NBL_EPRO_LAG_ALG_LINUX_L34_HASH (2)
+#define NBL_EPRO_LAG_ALG_DPDK_L34_HASH (3)
+ u32 lag_port_btm:4;
+ u32 lag_l2_protect_en:1;
+ u32 pfc_sch_cos_default:3;
+ u32 pfc_mode:1;
+ u32 vld:1;
+ u32 rsv:8;
+};
+
+/* EPRO epro_vpt table */
+struct nbl_epro_vpt_tbl {
+ u32 cvlan:16;
+ u32 svlan:16;
+ u32 fwd:1;
+#define NBL_EPRO_FWD_TYPE_DROP (0)
+#define NBL_EPRO_FWD_TYPE_NORMAL (1)
+ u32 mirror_en:1;
+ u32 mirror_id:4;
+ u32 car_en:1;
+ u32 car_id:10;
+ u32 pop_i_vlan:1;
+ u32 pop_o_vlan:1;
+ u32 push_i_vlan:1;
+ u32 push_o_vlan:1;
+ u32 replace_i_vlan:1;
+ u32 replace_o_vlan:1;
+ u32 rss_alg_sel:1;
+#define NBL_EPRO_RSS_ALG_TOEPLITZ_HASH (0)
+#define NBL_EPRO_RSS_ALG_CRC32 (1)
+ u32 rss_key_type_ipv4:1;
+#define NBL_EPRO_RSS_KEY_TYPE_IPV4_L3 (0)
+#define NBL_EPRO_RSS_KEY_TYPE_IPV4_L4 (1)
+ u32 rss_key_type_ipv6:1;
+#define NBL_EPRO_RSS_KEY_TYPE_IPV6_L3 (0)
+#define NBL_EPRO_RSS_KEY_TYPE_IPV6_L4 (1)
+ u32 vld:1;
+ u32 rsv:5;
+};
+
+/* UPA upa_pri_sel_conf */
+#define NBL_UPA_PRI_SEL_CONF_TABLE(id) (NBL_DP_UPA_BASE + 0x00000230 + \
+ ((id) * sizeof(struct nbl_upa_pri_sel_conf)))
+#define NBL_UPA_PRI_CONF_TABLE(id) (NBL_DP_UPA_BASE + 0x00002000 + \
+ ((id) * sizeof(struct nbl_upa_pri_conf)))
+
+/* UPA pri_sel_conf */
+struct nbl_upa_pri_sel_conf {
+ u32 pri_sel:5;
+ u32 pri_default:3;
+ u32 pri_disen:1;
+ u32 rsv:23;
+};
+
+/* UPA pri_conf_table */
+struct nbl_upa_pri_conf {
+ u32 pri0:4;
+ u32 pri1:4;
+ u32 pri2:4;
+ u32 pri3:4;
+ u32 pri4:4;
+ u32 pri5:4;
+ u32 pri6:4;
+ u32 pri7:4;
+};
+
+#define NBL_DQM_RXMAC_TX_PORT_BP_EN (NBL_DP_DQM_BASE + 0x00000660)
+#define NBL_DQM_RXMAC_TX_COS_BP_EN (NBL_DP_DQM_BASE + 0x00000664)
+#define NBL_DQM_RXMAC_RX_PORT_BP_EN (NBL_DP_DQM_BASE + 0x00000670)
+#define NBL_DQM_RX_PORT_BP_EN (NBL_DP_DQM_BASE + 0x00000610)
+#define NBL_DQM_RX_COS_BP_EN (NBL_DP_DQM_BASE + 0x00000614)
+
+/* DQM rxmac_tx_port_bp_en */
+struct nbl_dqm_rxmac_tx_port_bp_en_cfg {
+ u32 eth0:1;
+ u32 eth1:1;
+ u32 eth2:1;
+ u32 eth3:1;
+ u32 rsv:28;
+};
+
+/* DQM rxmac_tx_cos_bp_en */
+struct nbl_dqm_rxmac_tx_cos_bp_en_cfg {
+ u32 eth0:8;
+ u32 eth1:8;
+ u32 eth2:8;
+ u32 eth3:8;
+};
+
+#define NBL_UQM_QUE_TYPE (NBL_DP_UQM_BASE + 0x0000013c)
+#define NBL_UQM_RX_COS_BP_EN (NBL_DP_UQM_BASE + 0x00000614)
+#define NBL_UQM_TX_COS_BP_EN (NBL_DP_UQM_BASE + 0x00000604)
+
+#define NBL_UQM_DROP_PKT_CNT (NBL_DP_UQM_BASE + 0x000009C0)
+#define NBL_UQM_DROP_PKT_SLICE_CNT (NBL_DP_UQM_BASE + 0x000009C4)
+#define NBL_UQM_DROP_PKT_LEN_ADD_CNT (NBL_DP_UQM_BASE + 0x000009C8)
+#define NBL_UQM_DROP_HEAD_PNTR_ADD_CNT (NBL_DP_UQM_BASE + 0x000009CC)
+#define NBL_UQM_DROP_WEIGHT_ADD_CNT (NBL_DP_UQM_BASE + 0x000009D0)
+#define NBL_UQM_PORT_DROP_PKT_CNT (NBL_DP_UQM_BASE + 0x000009D4)
+#define NBL_UQM_PORT_DROP_PKT_SLICE_CNT (NBL_DP_UQM_BASE + 0x000009F4)
+#define NBL_UQM_PORT_DROP_PKT_LEN_ADD_CNT (NBL_DP_UQM_BASE + 0x00000A14)
+#define NBL_UQM_PORT_DROP_HEAD_PNTR_ADD_CNT (NBL_DP_UQM_BASE + 0x00000A34)
+#define NBL_UQM_PORT_DROP_WEIGHT_ADD_CNT (NBL_DP_UQM_BASE + 0x00000A54)
+#define NBL_UQM_FWD_DROP_CNT (NBL_DP_UQM_BASE + 0x00000A80)
+#define NBL_UQM_DPORT_DROP_CNT (NBL_DP_UQM_BASE + 0x00000B74)
+
+#define NBL_UQM_PORT_DROP_DEPTH 6
+#define NBL_UQM_DPORT_DROP_DEPTH 16
+
+struct nbl_uqm_que_type {
+ u32 bp_drop:1;
+ u32 rsv:31;
+};
+
+/* UQM rx_cos_bp_en */
+struct nbl_uqm_rx_cos_bp_en_cfg {
+ u32 vld_l;
+ u32 vld_h:16;
+};
+
+/* UQM rx_port_bp_en */
+struct nbl_uqm_rx_port_bp_en_cfg {
+ u32 l4s_h:1;
+ u32 l4s_e:1;
+ u32 rdma_h:1;
+ u32 rdma_e:1;
+ u32 emp:1;
+ u32 loopback:1;
+ u32 rsv:26;
+};
+
+/* UQM tx_cos_bp_en */
+struct nbl_uqm_tx_cos_bp_en_cfg {
+ u32 vld_l;
+ u32 vld_h:8;
+};
+
+#pragma pack()
+
+/* ---------- TOP ---------- */
+/* lb_top_ctrl_crg_cfg crg_cfg */
+#define NBL_TOP_CTRL_MODULE (0x01300000)
+#define NBL_TOP_CTRL_INT_STATUS (NBL_TOP_CTRL_MODULE + 0X0000)
+#define NBL_TOP_CTRL_INT_MASK (NBL_TOP_CTRL_MODULE + 0X0004)
+#define NBL_TOP_CTRL_LB_CLK (NBL_TOP_CTRL_MODULE + 0X0100)
+#define NBL_TOP_CTRL_LB_RST (NBL_TOP_CTRL_MODULE + 0X0104)
+#define NBL_TOP_CTRL_TVSENSOR0 (NBL_TOP_CTRL_MODULE + 0X0254)
+#define NBL_TOP_CTRL_SOFT_DEF0 (NBL_TOP_CTRL_MODULE + 0x0430)
+#define NBL_TOP_CTRL_SOFT_DEF1 (NBL_TOP_CTRL_MODULE + 0x0434)
+#define NBL_TOP_CTRL_SOFT_DEF2 (NBL_TOP_CTRL_MODULE + 0x0438)
+#define NBL_TOP_CTRL_SOFT_DEF3 (NBL_TOP_CTRL_MODULE + 0x043c)
+#define NBL_TOP_CTRL_SOFT_DEF4 (NBL_TOP_CTRL_MODULE + 0x0440)
+#define NBL_TOP_CTRL_SOFT_DEF5 (NBL_TOP_CTRL_MODULE + 0x0444)
+#define NBL_TOP_CTRL_VERSION_INFO (NBL_TOP_CTRL_MODULE + 0X0900)
+#define NBL_TOP_CTRL_VERSION_DATE (NBL_TOP_CTRL_MODULE + 0X0904)
+
+#define NBL_FW_HEARTBEAT_PONG NBL_TOP_CTRL_SOFT_DEF1
+
+#define NBL_TOP_CTRL_RDMA_LB_RST BIT(10)
+#define NBL_TOP_CTRL_RDMA_LB_CLK BIT(10)
+
+/* temperature threshold1 */
+#define NBL_LEONIS_TEMP_MAX (105)
+/* temperature threshold2 */
+#define NBL_LEONIS_TEMP_CRIT (115)
+
+#define NBL_ACT_DATA_BITS (16)
+
+#define NBL_CMDQ_DIF_MODE_VALUE (2)
+#define NBL_CMDQ_DELAY_200US (200)
+#define NBL_CMDQ_DELAY_300US (300)
+#define NBL_CMDQ_RESET_MAX_WAIT (30)
+#define NBL_CMD_NOTIFY_ADDR (0x00001000)
+#define NBL_ACL_RD_RETRY (50000)
+#define NBL_ACL_RD_WAIT_100US (100)
+#define NBL_ACL_RD_WAIT_200US (200)
+#define NBL_ACL_CPU_WRITE (0)
+#define NBL_ACL_CPU_READ (1)
+
+/* the capacity of storing acl-items in all tcams */
+#define NBL_ACL_ITEM_CAP (1536)
+#define NBL_ACL_KEY_WIDTH (120)
+#define NBL_ACL_ITEM6_CAP (512)
+#define NBL_ACL_KEY6_WIDTH (240)
+#define NBL_ACL_TCAM_DEPTH (512)
+#define NBL_ACL_S1_PROFILE_ID (0)
+#define NBL_ACL_S2_PROFILE_ID (1)
+#define NBL_ACL_TCAM_CNT (16)
+#define NBL_ACL_TCAM_HALF (8)
+#define NBL_ACL_TCAM_DEPTH (512)
+#define NBL_ACL_TCAM_BITS (40)
+#define NBL_ACL_HALF_TCAMS_BITS (320)
+#define NBL_ACL_HALF_TCAMS_BYTES (40)
+#define NBL_ACL_ALL_TCAMS_BITS (640)
+#define NBL_ACL_ALL_TCAMS_BYTES (80)
+#define NBL_ACL_ACT_RAM_CNT (4)
+
+#define NBL_FEM_TCAM_MAX_NUM (64)
+
+#define RTE_ETHER_TYPE_VLAN 0x8100
+#define RTE_ETHER_TYPE_QINQ 0x88A8
+#define RTE_ETHER_TYPE_QINQ1 0x9100
+#define RTE_ETHER_TYPE_QINQ2 0x9200
+#define NBL_BYTES_IN_REG (4)
+#define NBL_CMDQ_HI_DWORD(x) ((u32)(((x) >> 32) & 0xFFFFFFFF))
+#define NBL_CMDQ_LO_DWORD(x) ((u32)(x) & 0xFFFFFFFF)
+#define NBL_FEM_INIT_START_KERN (0xFE)
+#define NBL_FEM_INIT_START_VALUE (0x3E)
+#define NBL_PED_VSI_TYPE_ETH_BASE (1027)
+#define NBL_DPED_VLAN_TYPE_PORT_NUM (1031)
+#define NBL_CHAN_REG_MAX_LEN (32)
+#define NBL_EPRO_RSS_KEY_32 (0x6d5a6d5a)
+
+#define NBL_SHAPING_GRP_TIMMING_ADD_ADDR (0x504400)
+#define NBL_SHAPING_GRP_ADDR (0x504800)
+#define NBL_SHAPING_GRP_DWLEN (4)
+#define NBL_SHAPING_GRP_REG(r) (NBL_SHAPING_GRP_ADDR + \
+ (NBL_SHAPING_GRP_DWLEN * 4) * (r))
+#define NBL_DSCH_VN_SHA2GRP_MAP_TBL_ADDR (0x47c000)
+#define NBL_DSCH_VN_SHA2GRP_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_VN_SHA2GRP_MAP_TBL_REG(r) (NBL_DSCH_VN_SHA2GRP_MAP_TBL_ADDR + \
+ (NBL_DSCH_VN_SHA2GRP_MAP_TBL_DWLEN * 4) * (r))
+#define NBL_DSCH_VN_GRP2SHA_MAP_TBL_ADDR (0x480000)
+#define NBL_DSCH_VN_GRP2SHA_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_VN_GRP2SHA_MAP_TBL_REG(r) (NBL_DSCH_VN_GRP2SHA_MAP_TBL_ADDR + \
+ (NBL_DSCH_VN_GRP2SHA_MAP_TBL_DWLEN * 4) * (r))
+#define NBL_SHAPING_DPORT_TIMMING_ADD_ADDR (0x504504)
+#define NBL_SHAPING_DPORT_ADDR (0x504700)
+#define NBL_SHAPING_DPORT_DWLEN (4)
+#define NBL_SHAPING_DPORT_REG(r) (NBL_SHAPING_DPORT_ADDR + \
+ (NBL_SHAPING_DPORT_DWLEN * 4) * (r))
+#define NBL_SHAPING_DVN_DPORT_ADDR (0x504750)
+#define NBL_SHAPING_DVN_DPORT_DWLEN (4)
+#define NBL_SHAPING_DVN_DPORT_REG(r) (NBL_SHAPING_DVN_DPORT_ADDR + \
+ (NBL_SHAPING_DVN_DPORT_DWLEN * 4) * (r))
+#define NBL_SHAPING_RDMA_DPORT_ADDR (0x5047a0)
+#define NBL_SHAPING_RDMA_DPORT_DWLEN (4)
+#define NBL_SHAPING_RDMA_DPORT_REG(r) (NBL_SHAPING_RDMA_DPORT_ADDR + \
+ (NBL_SHAPING_RDMA_DPORT_DWLEN * 4) * (r))
+#define NBL_DSCH_PSHA_EN_ADDR (0x404314)
+#define NBL_SHAPING_NET_ADDR (0x505800)
+#define NBL_SHAPING_NET_DWLEN (4)
+#define NBL_SHAPING_NET_REG(r) (NBL_SHAPING_NET_ADDR + \
+ (NBL_SHAPING_NET_DWLEN * 4) * (r))
+#define NBL_DSCH_VN_SHA2NET_MAP_TBL_ADDR (0x474000)
+#define NBL_DSCH_VN_SHA2NET_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_VN_SHA2NET_MAP_TBL_REG(r) (NBL_DSCH_VN_SHA2NET_MAP_TBL_ADDR + \
+ (NBL_DSCH_VN_SHA2NET_MAP_TBL_DWLEN * 4) * (r))
+#define NBL_DSCH_VN_NET2SHA_MAP_TBL_ADDR (0x478000)
+#define NBL_DSCH_VN_NET2SHA_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_VN_NET2SHA_MAP_TBL_REG(r) (NBL_DSCH_VN_NET2SHA_MAP_TBL_ADDR + \
+ (NBL_DSCH_VN_NET2SHA_MAP_TBL_DWLEN * 4) * (r))
+
+#define NBL_DSCH_RDMA_SHA2NET_MAP_TBL_ADDR (0x49c000)
+#define NBL_DSCH_RDMA_SHA2NET_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_RDMA_SHA2NET_MAP_TBL_REG(r) (NBL_DSCH_RDMA_SHA2NET_MAP_TBL_ADDR + \
+ (NBL_DSCH_RDMA_SHA2NET_MAP_TBL_DWLEN * 4) * (r))
+#define NBL_DSCH_RDMA_NET2SHA_MAP_TBL_ADDR (0x494000)
+#define NBL_DSCH_RDMA_NET2SHA_MAP_TBL_DWLEN (1)
+#define NBL_DSCH_RDMA_NET2SHA_MAP_TBL_REG(r) (NBL_DSCH_RDMA_NET2SHA_MAP_TBL_ADDR + \
+ (NBL_DSCH_RDMA_NET2SHA_MAP_TBL_DWLEN * 4) * (r))
+
+/* Mailbox bar hw register offset begin */
+#define NBL_FW_HEARTBEAT_PING 0x84
+#define NBL_FW_BOARD_CONFIG 0x200
+#define NBL_FW_BOARD_DW3_OFFSET (NBL_FW_BOARD_CONFIG + 12)
+#define NBL_FW_BOARD_DW6_OFFSET (NBL_FW_BOARD_CONFIG + 24)
+#define NBL_ETH_REP_INFO_BASE (1024)
+
+/* Mailbox bar hw register offset end */
+
+enum nbl_ethdev_repr_flag {
+ NBL_ETHDEV_VIRTIO_REP = 0,
+ NBL_ETHDEV_ETH_REP,
+ NBL_ETHDEV_PF_REP,
+ NBL_ETHDEV_INVALID_REP,
+};
+
+enum nbl_ped_vlan_type_e {
+ INNER_VLAN_TYPE,
+ OUTER_VLAN_TYPE,
+};
+
+enum nbl_ped_vlan_tpid_e {
+ PED_VLAN_TYPE_8100 = 0,
+ PED_VLAN_TYPE_88A8 = 1,
+ PED_VLAN_TYPE_9100 = 2,
+ PED_VLAN_TYPE_9200 = 3,
+ PED_VLAN_TYPE_NUM = 4,
+};
+
+enum nbl_error_code_e {
+ NBL_ERROR_CODE_NONE = 0,
+ NBL_ERROR_CODE_VLAN = 1,
+ NBL_ERROR_CODE_L3_HEAD_LEN = 2,
+ NBL_ERROR_CODE_L3_PLD_LEN = 3,
+ NBL_ERROR_CODE_L3_CHKSUM = 4,
+ NBL_ERROR_CODE_L4_CHKSUM = 5,
+ NBL_ERROR_CODE_TTL_HOPLIMT = 6,
+ NBL_ERROR_CODE_ESP_AUTH_FAIL = 7,
+ NBL_ERROR_CODE_ESP_BAD_FAIL = 8,
+ NBL_ERROR_CODE_PA_RECG_FAIL = 9,
+ NBL_ERROR_CODE_DN_SMAC = 10,
+ NBL_ERROR_CODE_TOTAL_NUM = 16,
+};
+
+enum nbl_epro_act_pri_e {
+ EPRO_ACT_MIRRORIDX_PRI = 3,
+ EPRO_ACT_CARIDX_PRI = 3,
+ EPRO_ACT_DQUEUE_PRI = 3,
+ EPRO_ACT_DPORT_PRI = 3,
+ EPRO_ACT_POP_IVLAN_PRI = 3,
+ EPRO_ACT_POP_OVLAN_PRI = 3,
+ EPRO_ACT_REPLACE_IVLAN_PRI = 3,
+ EPRO_ACT_REPLACE_OVLAN_PRI = 3,
+ EPRO_ACT_PUSH_IVLAN_PRI = 3,
+ EPRO_ACT_PUSH_OVLAN_PRI = 3,
+ EPRO_ACT_OUTER_SPORT_MDF_PRI = 3,
+ EPRO_ACT_PRI_MDF_PRI = 3,
+ EPRO_ACT_DP_HASH0_PRI = 3,
+ EPRO_ACT_DP_HASH1_PRI = 3,
+};
+
+enum nbl_epro_mirror_act_pri_e {
+ EPRO_MIRROR_ACT_CARIDX_PRI = 3,
+ EPRO_MIRROR_ACT_DQUEUE_PRI = 3,
+ EPRO_MIRROR_ACT_DPORT_PRI = 3,
+};
+
+union nbl_ped_port_vlan_type_u {
+ struct ped_port_vlan_type {
+ u32 o_vlan_sel:2;
+ u32 i_vlan_sel:2;
+ u32 rsv:28;
+ } __packed info;
+#define NBL_PED_PORT_VLAN_TYPE_TABLE_WIDTH (sizeof(struct ped_port_vlan_type) \
+ / sizeof(u32))
+ u32 data[NBL_PED_PORT_VLAN_TYPE_TABLE_WIDTH];
+};
+
+#define NBL_ACL_ACTION_RAM_TBL(r, i) (NBL_ACL_BASE + 0x00002000 + 0x2000 * (r) + \
+ (NBL_ACL_ACTION_RAM0_DWLEN * 4 * (i)))
+#define NBL_DPED_MIR_CMD_0_TABLE(t) (NBL_DPED_MIR_CMD_00_ADDR + \
+ (NBL_DPED_MIR_CMD_00_DWLEN * 2 * (t)))
+#define NBL_SET_DPORT(upcall_flag, nxtstg_sel, port_type, port_id) \
+ ((upcall_flag) << 14 | (nxtstg_sel) << 12 | (port_type) << 10 | (port_id))
+
+#define MAX_RSS_LEN (100)
+#define NBL_RSS_FUNC_TYPE "rss_func_type="
+enum rss_func_type {
+ NBL_SYM_TOEPLITZ_INT = 0,
+ NBL_XOR_INT,
+ NBL_INVALID_FUNC_TYPE
+};
+
+#define NBL_XOR "xor"
+#define NBL_SYM_TOEPLITZ "sym_toeplitz"
+#define NBL_RSS_KEY_TYPE "rss_key_type"
+
+enum rss_field_type {
+ NBL_KEY_IPV4_L3_INT = 0,
+ NBL_KEY_IPV4_L4_INT,
+ NBL_KEY_IPV6_L3_INT,
+ NBL_KEY_IPV6_L4_INT,
+ NBL_KEY_AUTO,
+};
+
+#define NBL_KEY_IPV4_L3 "ipv4"
+#define NBL_KEY_IPV4_L4 "ipv4_l4"
+#define NBL_KEY_IPV6_L3 "ipv6"
+#define NBL_KEY_IPV6_L4 "ipv6_l4"
+
+#define RSS_SPLIT_STR_NUM 2
+#define NBL_KEY_IP4_L4_RSS_BIT 1
+#define NBL_KEY_IP6_L4_RSS_BIT 2
+
+union nbl_fw_board_cfg_dw3 {
+ struct board_cfg_dw3 {
+ u32 port_type:1;
+ u32 port_num:7;
+ u32 port_speed:2;
+ u32 gpio_type:3;
+ u32 p4_version:1; /* 0: low version; 1: high version */
+ u32 rsv:18;
+ } __packed info;
+ u32 data;
+};
+
+union nbl_fw_board_cfg_dw6 {
+ struct board_cfg_dw6 {
+ u8 lane_bitmap;
+ u8 eth_bitmap;
+ u16 rsv;
+ } __packed info;
+ u32 data;
+};
+
+#define NBL_LEONIS_QUIRKS_OFFSET (0x00000140)
+
+#define NBL_LEONIS_ILLEGAL_REG_VALUE (0xDEADBEEF)
+
+#endif
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_reg.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_reg.h
new file mode 100644
index 000000000000..3f11f60643fa
--- /dev/null
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_reg.h
@@ -0,0 +1,187 @@
+/* SPDX-License-Identifier: GPL-2.0*/
+/*
+ * Copyright (c) 2025 Nebula Matrix Limited.
+ * Author:
+ */
+
+#ifndef _NBL_HW_REG_H_
+#define _NBL_HW_REG_H_
+
+#include "nbl_core.h"
+
+#define NBL_HW_MGT_TO_COMMON(hw_mgt) ((hw_mgt)->common)
+#define NBL_HW_MGT_TO_DEV(hw_mgt) NBL_COMMON_TO_DEV(NBL_HW_MGT_TO_COMMON(hw_mgt))
+#define NBL_MEMORY_BAR (0)
+#define NBL_MAILBOX_BAR (2)
+#define NBL_RDMA_NOTIFY_OFF (8192)
+
+struct nbl_hw_mgt {
+ struct nbl_common_info *common;
+ u8 __iomem *hw_addr;
+ u8 __iomem *mailbox_bar_hw_addr;
+ u64 notify_offset;
+ u32 version;
+ u32 hw_size;
+ spinlock_t reg_lock; /* Protect reg access */
+ bool should_lock;
+ u8 resv[3];
+ enum nbl_hw_status hw_status;
+};
+
+#define NBL_DELAY_MIN_TIME_FOR_REGS 400 /* 200us for palladium,3us for s2c */
+#define NBL_DELAY_MAX_TIME_FOR_REGS 500 /* 300us for palladium,5us for s2c */
+
+static inline __maybe_unused u32 rd32(u8 __iomem *addr, u64 reg)
+{
+ return readl(addr + (reg));
+}
+
+static inline __maybe_unused void wr32_barrier(u8 __iomem *addr, u64 reg, u32 value)
+{
+ writel((value), (addr + (reg)));
+}
+
+static inline __maybe_unused void nbl_hw_read_regs(struct nbl_hw_mgt *hw_mgt, u64 reg,
+ u8 *data, u32 len)
+{
+ u32 size = len / 4;
+ u32 i = 0;
+
+ if (len % 4)
+ return;
+
+ if (hw_mgt->hw_status) {
+ for (i = 0; i < size; i++)
+ *(u32 *)(data + i * sizeof(u32)) = U32_MAX;
+ }
+
+ if (size > 1 && hw_mgt->should_lock)
+ spin_lock(&hw_mgt->reg_lock);
+
+ for (i = 0; i < size; i++)
+ *(u32 *)(data + i * sizeof(u32)) = rd32(hw_mgt->hw_addr, reg + i * sizeof(u32));
+
+ if (size > 1 && hw_mgt->should_lock)
+ spin_unlock(&hw_mgt->reg_lock);
+}
+
+static inline __maybe_unused void nbl_hw_write_regs(struct nbl_hw_mgt *hw_mgt,
+ u64 reg, const u8 *data, u32 len)
+{
+ u32 size = len / 4;
+ u32 i = 0;
+
+ if (len % 4)
+ return;
+
+ if (hw_mgt->hw_status)
+ return;
+
+ if (size > 1 && hw_mgt->should_lock)
+ spin_lock(&hw_mgt->reg_lock);
+
+ for (i = 0; i < size; i++)
+ /* Used for emu, make sure that we won't write too frequently */
+ wr32_barrier(hw_mgt->hw_addr, reg + i * sizeof(u32),
+ *(u32 *)(data + i * sizeof(u32)));
+
+ if (size > 1 && hw_mgt->should_lock)
+ spin_unlock(&hw_mgt->reg_lock);
+}
+
+static inline __maybe_unused void nbl_hw_write_be_regs(struct nbl_hw_mgt *hw_mgt,
+ u64 reg, const u8 *data, u32 len)
+{
+ u32 size = len / 4;
+ u32 i = 0;
+ u32 data_le;
+
+ if (len % 4)
+ return;
+
+ if (size > 1 && hw_mgt->should_lock)
+ spin_lock(&hw_mgt->reg_lock);
+
+ for (i = 0; i < size; i++) {
+ data_le = swab32(*(u32 *)(data + i * sizeof(u32)));
+ /* Used for emu, make sure that we won't write too frequently */
+ wr32_barrier(hw_mgt->hw_addr, reg + i * sizeof(u32), data_le);
+ }
+
+ data_le = rd32(hw_mgt->hw_addr, 0x0);
+ if (size > 1 && hw_mgt->should_lock)
+ spin_unlock(&hw_mgt->reg_lock);
+}
+
+static __maybe_unused void nbl_hw_wr32(struct nbl_hw_mgt *hw_mgt, u64 reg, u32 value)
+{
+ if (hw_mgt->hw_status)
+ return;
+
+ /* Used for emu, make sure that we won't write too frequently */
+ wr32_barrier(hw_mgt->hw_addr, reg, value);
+}
+
+static __maybe_unused u32 nbl_hw_rd32(struct nbl_hw_mgt *hw_mgt, u64 reg)
+{
+ if (hw_mgt->hw_status)
+ return U32_MAX;
+
+ return rd32(hw_mgt->hw_addr, reg);
+}
+
+static __maybe_unused void nbl_mbx_wr32(void *priv, u64 reg, u32 value)
+{
+ struct nbl_hw_mgt *hw_mgt = (struct nbl_hw_mgt *)priv;
+
+ if (hw_mgt->hw_status)
+ return;
+
+ writel((value), ((hw_mgt)->mailbox_bar_hw_addr + (reg)));
+}
+
+static __maybe_unused u32 nbl_mbx_rd32(void *priv, u64 reg)
+{
+ struct nbl_hw_mgt *hw_mgt = (struct nbl_hw_mgt *)priv;
+
+ if (hw_mgt->hw_status)
+ return U32_MAX;
+
+ return readl((hw_mgt)->mailbox_bar_hw_addr + (reg));
+}
+
+static __maybe_unused void nbl_hw_read_mbx_regs(struct nbl_hw_mgt *hw_mgt,
+ u64 reg, u8 *data, u32 len)
+{
+ u32 i = 0;
+
+ if (len % 4)
+ return;
+
+ for (i = 0; i < len / 4; i++)
+ *(u32 *)(data + i * sizeof(u32)) = nbl_mbx_rd32(hw_mgt, reg + i * sizeof(u32));
+}
+
+static __maybe_unused void nbl_hw_write_mbx_regs(struct nbl_hw_mgt *hw_mgt,
+ u64 reg, const u8 *data, u32 len)
+{
+ u32 i = 0;
+
+ if (len % 4)
+ return;
+
+ for (i = 0; i < len / 4; i++)
+ /* Used for emu, make sure that we won't write too frequently */
+ nbl_mbx_wr32(hw_mgt, reg + i * sizeof(u32),
+ *(u32 *)(data + i * sizeof(u32)));
+}
+
+/* Mgt structure for each product.
+ * Every indivisual mgt must have the common mgt as its first member, and contains its unique
+ * data structure in the reset of it.
+ */
+struct nbl_hw_mgt_leonis {
+ struct nbl_hw_mgt hw_mgt;
+ bool ro_enable;
+};
+#endif
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_hw.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_hw.h
new file mode 100644
index 000000000000..f3ec609e2ffa
--- /dev/null
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_hw.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0*/
+/*
+ * Copyright (c) 2025 Nebula Matrix Limited.
+ * Author:
+ */
+
+#ifndef _NBL_DEF_HW_H_
+#define _NBL_DEF_HW_H_
+
+#include "nbl_include.h"
+
+#define NBL_HW_OPS_TBL_TO_OPS(hw_ops_tbl) ((hw_ops_tbl)->ops)
+#define NBL_HW_OPS_TBL_TO_PRIV(hw_ops_tbl) ((hw_ops_tbl)->priv)
+
+struct nbl_hw_ops {
+};
+
+struct nbl_hw_ops_tbl {
+ struct nbl_hw_ops *ops;
+ void *priv;
+};
+
+int nbl_hw_init_leonis(void *p, struct nbl_init_param *param);
+void nbl_hw_remove_leonis(void *p);
+
+#endif
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_include.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_include.h
index 0bceb682b824..f9430d894b04 100644
--- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_include.h
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_include.h
@@ -53,6 +53,12 @@ enum nbl_product_type {
NBL_PRODUCT_MAX,
};
+enum nbl_hw_status {
+ NBL_HW_NOMAL,
+ NBL_HW_FATAL_ERR, /* Most hw module is not work nomal exclude pcie/emp */
+ NBL_HW_STATUS_MAX,
+};
+
struct nbl_func_caps {
u32 has_ctrl:1;
u32 has_net:1;
@@ -69,4 +75,62 @@ struct nbl_init_param {
bool pci_using_dac;
};
+struct nbl_vnet_queue_info_param {
+ u32 function_id;
+ u32 device_id;
+ u32 bus_id;
+ u32 msix_idx;
+ u32 msix_idx_valid;
+ u32 valid;
+};
+
+struct nbl_ustore_stats {
+ u64 rx_drop_packets;
+ u64 rx_trun_packets;
+};
+
+struct nbl_notify_param {
+ u16 notify_qid;
+ u16 tail_ptr;
+};
+
+enum nbl_port_mode {
+ NBL_PORT_NRZ_NORSFEC,
+ NBL_PORT_NRZ_544,
+ NBL_PORT_NRZ_528,
+ NBL_PORT_PAM4_544,
+ NBL_PORT_MODE_MAX,
+};
+
+#define NBL_ACL_TCAM_KEY_LEN 5
+#define NBL_ACL_TCAM_KEY_MAX 16
+
+struct nbl_acl_tcam_key_param {
+ u8 data[NBL_ACL_TCAM_KEY_LEN];
+} __packed;
+
+struct nbl_acl_tcam_param {
+ union nbl_acl_tcam_info {
+ struct nbl_acl_tcam_key_param key[NBL_ACL_TCAM_KEY_MAX];
+ u8 data[NBL_ACL_TCAM_KEY_LEN * NBL_ACL_TCAM_KEY_MAX];
+ } info;
+ u8 len;
+};
+
+enum nbl_abnormal_event_module {
+ NBL_ABNORMAL_EVENT_DVN = 0,
+ NBL_ABNORMAL_EVENT_UVN,
+ NBL_ABNORMAL_EVENT_MAX,
+};
+
+struct nbl_abnormal_details {
+ bool abnormal;
+ u16 qid;
+ u16 vsi_id;
+};
+
+struct nbl_abnormal_event_info {
+ struct nbl_abnormal_details details[NBL_ABNORMAL_EVENT_MAX];
+ u32 other_abnormal_info;
+};
#endif
diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_main.c b/drivers/net/ethernet/nebula-matrix/nbl/nbl_main.c
index b690bac3d306..f7669d361ef4 100644
--- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_main.c
+++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_main.c
@@ -9,8 +9,8 @@
static struct nbl_product_base_ops nbl_product_base_ops[NBL_PRODUCT_MAX] = {
{
- .hw_init = NULL,
- .hw_remove = NULL,
+ .hw_init = nbl_hw_init_leonis,
+ .hw_remove = nbl_hw_remove_leonis,
.res_init = NULL,
.res_remove = NULL,
.chan_init = NULL,
@@ -30,6 +30,7 @@ struct nbl_adapter *nbl_core_init(struct pci_dev *pdev, struct nbl_init_param *p
struct nbl_adapter *adapter;
struct nbl_common_info *common;
struct nbl_product_base_ops *product_base_ops;
+ int ret = 0;
if (!pdev)
return NULL;
@@ -57,7 +58,15 @@ struct nbl_adapter *nbl_core_init(struct pci_dev *pdev, struct nbl_init_param *p
nbl_core_setup_product_ops(adapter, param, &product_base_ops);
+ /* every product's hw/chan/res layer has a great difference, so call their own init ops */
+ ret = product_base_ops->hw_init(adapter, param);
+ if (ret)
+ goto hw_init_fail;
+
return adapter;
+hw_init_fail:
+ devm_kfree(&pdev->dev, adapter);
+ return NULL;
}
void nbl_core_remove(struct nbl_adapter *adapter)
@@ -71,6 +80,7 @@ void nbl_core_remove(struct nbl_adapter *adapter)
dev = NBL_ADAPTER_TO_DEV(adapter);
product_base_ops = NBL_ADAPTER_TO_RPDUCT_BASE_OPS(adapter);
+ product_base_ops->hw_remove(adapter);
devm_kfree(dev, adapter);
}
--
2.43.0
Powered by blists - more mailing lists