From: Mohsin Bashir <mohsin.bashr@gmail.com>
To: "illusion.wang" <illusion.wang@nebula-matrix.com>,
dimon.zhao@nebula-matrix.com, alvin.wang@nebula-matrix.com,
sam.chen@nebula-matrix.com, netdev@vger.kernel.org
Cc: andrew+netdev@lunn.ch, corbet@lwn.net, kuba@kernel.org,
linux-doc@vger.kernel.org, lorenzo@kernel.org, pabeni@redhat.com,
horms@kernel.org, vadim.fedorenko@linux.dev,
lukas.bulwahn@redhat.com, edumazet@google.com,
enelsonmoore@gmail.com, skhan@linuxfoundation.org,
hkallweit1@gmail.com, jani.nikula@intel.com,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v10 net-next 06/11] net/nebula-matrix: add common resource implementation
Date: Thu, 2 Apr 2026 02:05:02 -0700 [thread overview]
Message-ID: <8d43c17e-3372-4a26-9010-dea944d14ecb@gmail.com> (raw)
In-Reply-To: <20260401022318.28550-7-illusion.wang@nebula-matrix.com>
On 3/31/26 7:23 PM, illusion.wang wrote:
> The Resource layer processes the entries/data of various modules within
> the processing chip to accomplish specific entry management operations,
> this describes the module business capabilities of the chip and the data
> it manages.
> The resource layer comprises the following sub-modules: common,
> interrupt, and vsi(txrx,queue not contained this time)
>
> This patch provides the common part, including the conversion
> relationships among vsi_id, func_id, eth_id, and pf_id. These
> relationships may be utilized in the upper layer or the resource layer.
>
> Signed-off-by: illusion.wang <illusion.wang@nebula-matrix.com>
> ---
> .../net/ethernet/nebula-matrix/nbl/Makefile | 1 +
> .../nbl/nbl_hw/nbl_hw_leonis/nbl_hw_leonis.c | 55 ++++++
> .../nbl_hw_leonis/nbl_resource_leonis.c | 157 ++++++++++++++++++
> .../nebula-matrix/nbl/nbl_hw/nbl_resource.c | 110 ++++++++++++
> .../nebula-matrix/nbl/nbl_hw/nbl_resource.h | 52 ++++++
> .../nbl/nbl_include/nbl_def_common.h | 15 ++
> .../nbl/nbl_include/nbl_def_resource.h | 16 ++
> .../nbl/nbl_include/nbl_include.h | 8 +
> 8 files changed, 414 insertions(+)
> create mode 100644 drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.c
>
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/Makefile b/drivers/net/ethernet/nebula-matrix/nbl/Makefile
> index c9bc060732e7..b03c20f9988e 100644
> --- a/drivers/net/ethernet/nebula-matrix/nbl/Makefile
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/Makefile
> @@ -8,6 +8,7 @@ nbl-objs += nbl_common/nbl_common.o \
> nbl_hw/nbl_hw_leonis/nbl_hw_leonis.o \
> nbl_hw/nbl_hw_leonis/nbl_resource_leonis.o \
> nbl_hw/nbl_hw_leonis/nbl_hw_leonis_regs.o \
> + nbl_hw/nbl_resource.o \
> nbl_core/nbl_dispatch.o \
> nbl_core/nbl_dev.o \
> nbl_main.o
> 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
> index 83a4dc584f48..4ef0d5989a76 100644
> --- 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
> @@ -9,6 +9,18 @@
> #include <linux/spinlock.h>
> #include "nbl_hw_leonis.h"
>
> +static void nbl_hw_read_mbx_regs(struct nbl_hw_mgt *hw_mgt, u64 reg,
> + u32 *data, u32 len)
> +{
> + u32 i;
> +
> + if (len % 4)
> + return;
> +
> + for (i = 0; i < len / 4; i++)
> + data[i] = nbl_mbx_rd32(hw_mgt, reg + i * sizeof(u32));
> +}
> +
> static void nbl_hw_write_mbx_regs(struct nbl_hw_mgt *hw_mgt, u64 reg,
> const u32 *data, u32 len)
> {
> @@ -130,6 +142,14 @@ static u32 nbl_hw_get_host_pf_mask(struct nbl_hw_mgt *hw_mgt)
> return data;
> }
>
> +static u32 nbl_hw_get_real_bus(struct nbl_hw_mgt *hw_mgt)
> +{
> + u32 data;
> +
> + data = nbl_hw_rd32(hw_mgt, NBL_PCIE_HOST_TL_CFG_BUSDEV);
> + return data >> 5;
> +}
> +
> static void nbl_hw_cfg_mailbox_qinfo(struct nbl_hw_mgt *hw_mgt, u16 func_id,
> u16 bus, u16 devid, u16 function)
> {
> @@ -144,6 +164,36 @@ static void nbl_hw_cfg_mailbox_qinfo(struct nbl_hw_mgt *hw_mgt, u16 func_id,
> (u32 *)&mb_qinfo_map, sizeof(mb_qinfo_map));
> }
>
> +static void nbl_hw_get_board_info(struct nbl_hw_mgt *hw_mgt,
> + struct nbl_board_port_info *board_info)
> +{
> + union nbl_fw_board_cfg_dw3 dw3 = { .info = { 0 } };
> +
> + nbl_hw_read_mbx_regs(hw_mgt, NBL_FW_BOARD_DW3_OFFSET, (u32 *)&dw3,
> + sizeof(dw3));
> + board_info->eth_num = dw3.info.port_num;
> + board_info->eth_speed = dw3.info.port_speed;
> + board_info->p4_version = dw3.info.p4_version;
> +}
> +
> +static u32 nbl_hw_get_fw_eth_num(struct nbl_hw_mgt *hw_mgt)
> +{
> + union nbl_fw_board_cfg_dw3 dw3 = { .info = { 0 } };
> +
> + nbl_hw_read_mbx_regs(hw_mgt, NBL_FW_BOARD_DW3_OFFSET, (u32 *)&dw3,
> + sizeof(dw3));
> + return dw3.info.port_num;
> +}
> +
> +static u32 nbl_hw_get_fw_eth_map(struct nbl_hw_mgt *hw_mgt)
> +{
> + union nbl_fw_board_cfg_dw6 dw6 = { .info = { 0 } };
> +
> + nbl_hw_read_mbx_regs(hw_mgt, NBL_FW_BOARD_DW6_OFFSET, (u32 *)&dw6,
> + sizeof(dw6));
> + return dw6.info.eth_bitmap;
> +}
> +
> static struct nbl_hw_ops hw_ops = {
> .update_mailbox_queue_tail_ptr = nbl_hw_update_mailbox_queue_tail_ptr,
> .config_mailbox_rxq = nbl_hw_config_mailbox_rxq,
> @@ -151,8 +201,13 @@ static struct nbl_hw_ops hw_ops = {
> .stop_mailbox_rxq = nbl_hw_stop_mailbox_rxq,
> .stop_mailbox_txq = nbl_hw_stop_mailbox_txq,
> .get_host_pf_mask = nbl_hw_get_host_pf_mask,
> + .get_real_bus = nbl_hw_get_real_bus,
> +
> .cfg_mailbox_qinfo = nbl_hw_cfg_mailbox_qinfo,
>
> + .get_fw_eth_num = nbl_hw_get_fw_eth_num,
> + .get_fw_eth_map = nbl_hw_get_fw_eth_map,
> + .get_board_info = nbl_hw_get_board_info,
> };
>
> /* Structure starts here, adding an op should not modify anything below */
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_resource_leonis.c b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_resource_leonis.c
> index 355f7ea66b88..00569aa3459a 100644
> --- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_resource_leonis.c
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_hw_leonis/nbl_resource_leonis.c
> @@ -4,9 +4,12 @@
> */
> #include <linux/device.h>
> #include <linux/pci.h>
> +#include <linux/bits.h>
> #include "nbl_resource_leonis.h"
>
> static struct nbl_resource_ops res_ops = {
> + .get_vsi_id = nbl_res_func_id_to_vsi_id,
> + .get_eth_id = nbl_res_get_eth_id,
> };
>
> static struct nbl_resource_mgt *
> @@ -45,8 +48,162 @@ nbl_res_setup_ops(struct device *dev, struct nbl_resource_mgt *res_mgt)
> return res_ops_tbl;
> }
>
> +static int nbl_res_ctrl_dev_setup_eth_info(struct nbl_resource_mgt *res_mgt)
> +{
> + struct nbl_hw_ops *hw_ops = res_mgt->hw_ops_tbl->ops;
> + struct device *dev = res_mgt->common->dev;
> + struct nbl_eth_info *eth_info;
> + u32 eth_bitmap, eth_id;
> + u32 eth_num = 0;
> + int i;
> +
> + eth_info = devm_kzalloc(dev, sizeof(*eth_info), GFP_KERNEL);
> + if (!eth_info)
> + return -ENOMEM;
> +
> + res_mgt->resource_info->eth_info = eth_info;
> +
> + eth_info->eth_num =
> + (u8)hw_ops->get_fw_eth_num(res_mgt->hw_ops_tbl->priv);
> + eth_bitmap = hw_ops->get_fw_eth_map(res_mgt->hw_ops_tbl->priv);
> + /* for 2 eth port board, the eth_id is 0, 2 */
> + for (i = 0; i < NBL_MAX_ETHERNET; i++) {
> + if ((1 << i) & eth_bitmap) {
> + set_bit(i, eth_info->eth_bitmap);
> + eth_info->eth_id[eth_num] = i;
> + eth_info->logic_eth_id[i] = eth_num;
> + eth_num++;
> + }
> + }
> +
> + for (i = 0; i < res_mgt->resource_info->max_pf; i++) {
> + /* if pf_id < eth_num, the pf relate corresponding eth_id*/
nit: /* if pf_id < eth_num, the pf relate corresponding eth_id */
> + if (i < eth_num) {
> + eth_id = eth_info->eth_id[i];
> + eth_info->pf_bitmap[eth_id] |= BIT(i);
> + }
> + /* if pf_id >= eth_num, the pf relate eth 0*/
> + else
> + eth_info->pf_bitmap[0] |= BIT(i);
> + }
> +
> + return 0;
> +}
> +
> +static int nbl_res_ctrl_dev_sriov_info_init(struct nbl_resource_mgt *res_mgt)
> +{
> + struct nbl_hw_ops *hw_ops = res_mgt->hw_ops_tbl->ops;
> + struct nbl_hw_mgt *p = res_mgt->hw_ops_tbl->priv;
> + struct nbl_common_info *common = res_mgt->common;
> + struct nbl_sriov_info *sriov_info;
> + struct device *dev = common->dev;
> + u16 func_id, function;
> +
> + sriov_info = devm_kcalloc(dev, res_mgt->resource_info->max_pf,
> + sizeof(*sriov_info), GFP_KERNEL);
> + if (!sriov_info)
> + return -ENOMEM;
> +
> + res_mgt->resource_info->sriov_info = sriov_info;
> +
> + for (func_id = 0; func_id < res_mgt->resource_info->max_pf; func_id++) {
> + sriov_info = res_mgt->resource_info->sriov_info + func_id;
> + function = common->function + func_id;
> +
> + common->hw_bus = (u8)hw_ops->get_real_bus(p);
Why do we have to write to common->hw_bus in a loop? Can we do it once
outside the loop?
> + sriov_info->bdf = PCI_DEVID(common->hw_bus,
> + PCI_DEVFN(common->devid, function));
> + }
nit: space here
> + return 0;
> +}
> +
> +static int nbl_res_ctrl_dev_vsi_info_init(struct nbl_resource_mgt *res_mgt)
> +{
> + struct nbl_eth_info *eth_info = res_mgt->resource_info->eth_info;
> + struct nbl_common_info *common = res_mgt->common;
> + struct device *dev = common->dev;
> + struct nbl_vsi_info *vsi_info;
> + int i;
> +
> + vsi_info = devm_kcalloc(dev, res_mgt->resource_info->max_pf,
> + sizeof(*vsi_info), GFP_KERNEL);
> + if (!vsi_info)
> + return -ENOMEM;
> +
> + res_mgt->resource_info->vsi_info = vsi_info;
> + /*
> + * case 1 two port(2pf)
> + * pf0,pf1(NBL_VSI_SERV_PF_DATA_TYPE) vsi is 0,512
> +
> + * case 2 four port(4pf)
> + * pf0,pf1,pf2,pf3(NBL_VSI_SERV_PF_DATA_TYPE) vsi is 0,256,512,768
> +
> + */
> +
> + vsi_info->num = eth_info->eth_num;
> + for (i = 0; i < vsi_info->num; i++) {
> + vsi_info->serv_info[i][NBL_VSI_SERV_PF_DATA_TYPE].base_id =
> + i * NBL_VSI_ID_GAP(vsi_info->num);
> + vsi_info->serv_info[i][NBL_VSI_SERV_PF_DATA_TYPE].num = 1;
> + }
nit: space here
> + return 0;
> +}
> +
> +static int nbl_res_init_pf_num(struct nbl_resource_mgt *res_mgt)
> +{
> + struct nbl_hw_ops *hw_ops = res_mgt->hw_ops_tbl->ops;
> + u32 pf_num = 0;
> + u32 pf_mask;
> + int i;
> +
> + pf_mask = hw_ops->get_host_pf_mask(res_mgt->hw_ops_tbl->priv);
> + for (i = 0; i < NBL_MAX_PF; i++) {
> + if (!(pf_mask & (1 << i)))
> + pf_num++;
> + else
> + break;
> + }
> +
> + res_mgt->resource_info->max_pf = pf_num;
> +
> + if (!pf_num)
> + return -1;
Can we have an appropriate error code here instead of raw number? How
about -EINVAL?
> +
> + return 0;
> +}
> +
> +static void nbl_res_init_board_info(struct nbl_resource_mgt *res_mgt)
> +{
> + struct nbl_hw_ops *hw_ops = res_mgt->hw_ops_tbl->ops;
> +
> + hw_ops->get_board_info(res_mgt->hw_ops_tbl->priv,
> + &res_mgt->resource_info->board_info);
> +}
> +
> static int nbl_res_start(struct nbl_resource_mgt *res_mgt)
> {
> + struct nbl_common_info *common = res_mgt->common;
> + int ret = 0;
> +
> + if (common->has_ctrl) {
> + nbl_res_init_board_info(res_mgt);
> +
> + ret = nbl_res_init_pf_num(res_mgt);
> + if (ret)
> + return ret;
> +
> + ret = nbl_res_ctrl_dev_sriov_info_init(res_mgt);
> + if (ret)
> + return ret;
> +
> + ret = nbl_res_ctrl_dev_setup_eth_info(res_mgt);
> + if (ret)
> + return ret;
> +
> + ret = nbl_res_ctrl_dev_vsi_info_init(res_mgt);
> + if (ret)
> + return ret;
> + }
> return 0;
> }
>
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.c b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.c
> new file mode 100644
> index 000000000000..2afec802b0e3
> --- /dev/null
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.c
> @@ -0,0 +1,110 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2025 Nebula Matrix Limited.
> + */
> +
> +#include <linux/pci.h>
> +#include "nbl_resource.h"
> +
> +u16 nbl_res_pfid_to_vsi_id(struct nbl_resource_mgt *res_mgt, int pfid, u16 type)
> +{
> + struct nbl_vsi_info *vsi_info = res_mgt->resource_info->vsi_info;
> + enum nbl_vsi_serv_type dst_type = NBL_VSI_SERV_PF_DATA_TYPE;
> + struct nbl_common_info *common = res_mgt->common;
> + u16 vsi_id = U16_MAX;
> + u32 diff;
> +
> + diff = nbl_common_pf_id_subtraction_mgtpf_id(common, pfid);
> + if (diff == U32_MAX)
> + return vsi_id;
> +
> + if (diff < vsi_info->num) {
> + nbl_res_pf_dev_vsi_type_to_hw_vsi_type(type, &dst_type);
> + vsi_id = vsi_info->serv_info[diff][dst_type].base_id;
> + }
> + if (vsi_id == U16_MAX)
> + pr_err("convert pfid %d to vsi_id(%d) failed!\n", pfid, type);
> + return vsi_id;
> +}
> +
> +u16 nbl_res_func_id_to_vsi_id(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u16 type)
> +{
> + int pfid = func_id;
> +
> + return nbl_res_pfid_to_vsi_id(res_mgt, pfid, type);
> +}
> +
> +int nbl_res_vsi_id_to_pf_id(struct nbl_resource_mgt *res_mgt, u16 vsi_id)
> +{
> + struct nbl_vsi_info *vsi_info = res_mgt->resource_info->vsi_info;
> + struct nbl_common_info *common = res_mgt->common;
> + bool vsi_find = false;
> + u32 pf_id = U32_MAX;
> + int i, j;
> +
> + for (i = 0; i < vsi_info->num; i++) {
> + for (j = 0; j < NBL_VSI_SERV_MAX_TYPE; j++)
> + if (vsi_id >= vsi_info->serv_info[i][j].base_id &&
> + (vsi_id < vsi_info->serv_info[i][j].base_id +
> + vsi_info->serv_info[i][j].num)) {
> + vsi_find = true;
> + break;
> + }
> +
> + if (vsi_find)
> + break;
> + }
> +
> + if (vsi_find) {
> + if (j == NBL_VSI_SERV_PF_DATA_TYPE)
> + pf_id = i + common->mgt_pf;
> + }
> +
> + return pf_id;
So we have a possible case of returning U32_MAX when the return type is int.
> +}
> +
> +int nbl_res_func_id_to_bdf(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u8 *bus, u8 *dev, u8 *function)
> +{
> + struct nbl_common_info *common = res_mgt->common;
> + struct nbl_sriov_info *sriov_info;
> + int pfid = func_id;
> + u8 pf_bus, devfn;
> + u32 diff;
> +
> + diff = nbl_common_pf_id_subtraction_mgtpf_id(common, pfid);
> + if (diff == U32_MAX)
> + return U32_MAX;
> + sriov_info = res_mgt->resource_info->sriov_info + diff;
> + pf_bus = PCI_BUS_NUM(sriov_info->bdf);
> + devfn = sriov_info->bdf & 0xff;
> + *bus = pf_bus;
> + *dev = PCI_SLOT(devfn);
> + *function = PCI_FUNC(devfn);
nit: space here
> + return 0;
> +}
> +
> +void nbl_res_get_eth_id(struct nbl_resource_mgt *res_mgt, u16 vsi_id,
> + u8 *eth_mode, u8 *eth_id, u8 *logic_eth_id)
> +{
> + struct nbl_eth_info *eth_info = res_mgt->resource_info->eth_info;
> + u16 pf_id = nbl_res_vsi_id_to_pf_id(res_mgt, vsi_id);
> +
> + *eth_mode = eth_info->eth_num;
> + if (pf_id < eth_info->eth_num) {
> + *eth_id = eth_info->eth_id[pf_id];
> + *logic_eth_id = pf_id;
> + } else {
> + /* if pf_id >= eth_num, use eth_id 0 */
Perhaps we can elaborate this a little more
> + *eth_id = eth_info->eth_id[0];
> + *logic_eth_id = 0;
> + }
> +}
> +
> +void nbl_res_pf_dev_vsi_type_to_hw_vsi_type(u16 src_type,
> + enum nbl_vsi_serv_type *dst_type)
> +{
> + if (src_type == NBL_VSI_DATA)
> + *dst_type = NBL_VSI_SERV_PF_DATA_TYPE;
> +}
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.h
> index e08b6237da32..51b5b958cde8 100644
> --- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.h
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_hw/nbl_resource.h
> @@ -16,7 +16,48 @@
> #include "../nbl_include/nbl_def_common.h"
> #include "../nbl_core.h"
>
> +struct nbl_resource_mgt;
> +
> +/* --------- INFO ---------- */
> +struct nbl_sriov_info {
> + unsigned int bdf;
> +};
> +
> +struct nbl_eth_info {
> + DECLARE_BITMAP(eth_bitmap, NBL_MAX_ETHERNET);
> + u8 pf_bitmap[NBL_MAX_ETHERNET];
> + u8 eth_num;
> + u8 resv[3];
> + u8 eth_id[NBL_MAX_PF];
> + u8 logic_eth_id[NBL_MAX_PF];
> +};
> +
> +enum nbl_vsi_serv_type {
> + NBL_VSI_SERV_PF_DATA_TYPE,
> + NBL_VSI_SERV_MAX_TYPE,
> +};
> +
> +struct nbl_vsi_serv_info {
> + u16 base_id;
> + u16 num;
> +};
> +
> +struct nbl_vsi_info {
> + u16 num;
> + struct nbl_vsi_serv_info serv_info[NBL_MAX_ETHERNET]
> + [NBL_VSI_SERV_MAX_TYPE];
> +};
> +
> struct nbl_resource_info {
> + /* ctrl-dev owned pfs */
> + DECLARE_BITMAP(func_bitmap, NBL_MAX_FUNC);
> + struct nbl_sriov_info *sriov_info;
> + struct nbl_eth_info *eth_info;
> + struct nbl_vsi_info *vsi_info;
> + u32 base_qid;
> + u32 max_vf_num;
> + u8 max_pf;
> + struct nbl_board_port_info board_info;
> };
>
> struct nbl_resource_mgt {
> @@ -27,4 +68,15 @@ struct nbl_resource_mgt {
> struct nbl_interrupt_mgt *intr_mgt;
> };
>
> +int nbl_res_vsi_id_to_pf_id(struct nbl_resource_mgt *res_mgt, u16 vsi_id);
> +u16 nbl_res_pfid_to_vsi_id(struct nbl_resource_mgt *res_mgt, int pfid,
> + u16 type);
> +u16 nbl_res_func_id_to_vsi_id(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u16 type);
> +int nbl_res_func_id_to_bdf(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u8 *bus, u8 *dev, u8 *function);
> +void nbl_res_get_eth_id(struct nbl_resource_mgt *res_mgt, u16 vsi_id,
> + u8 *eth_mode, u8 *eth_id, u8 *logic_eth_id);
> +void nbl_res_pf_dev_vsi_type_to_hw_vsi_type(u16 src_type,
> + enum nbl_vsi_serv_type *dst_type);
> #endif
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_common.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_common.h
> index 5c532247c852..04ffc1918a46 100644
> --- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_common.h
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_common.h
> @@ -12,6 +12,21 @@
> #include "nbl_include.h"
>
> struct nbl_hash_tbl_mgt;
> +#define NBL_TWO_ETHERNET_PORT 2
> +#define NBL_FOUR_ETHERNET_PORT 4
> +#define NBL_DEFAULT_VSI_ID_GAP 1024
> +#define NBL_TWO_ETHERNET_VSI_ID_GAP 512
> +#define NBL_FOUR_ETHERNET_VSI_ID_GAP 256
> +
> +#define NBL_VSI_ID_GAP(m) \
> + ({ \
> + typeof(m) _m = (m); \
> + _m == NBL_FOUR_ETHERNET_PORT ? \
> + NBL_FOUR_ETHERNET_VSI_ID_GAP : \
> + (_m == NBL_TWO_ETHERNET_PORT ? \
> + NBL_TWO_ETHERNET_VSI_ID_GAP : \
> + NBL_DEFAULT_VSI_ID_GAP); \
> + })
>
> struct nbl_common_info {
> struct pci_dev *pdev;
> diff --git a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_resource.h b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_resource.h
> index 16add7e25eae..249b8f633cee 100644
> --- a/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_resource.h
> +++ b/drivers/net/ethernet/nebula-matrix/nbl/nbl_include/nbl_def_resource.h
> @@ -6,9 +6,25 @@
> #ifndef _NBL_DEF_RESOURCE_H_
> #define _NBL_DEF_RESOURCE_H_
>
> +#include <linux/types.h>
> +
> struct nbl_resource_mgt;
> struct nbl_adapter;
> +
> struct nbl_resource_ops {
> + int (*init_chip_module)(struct nbl_resource_mgt *res_mgt);
> + void (*deinit_chip_module)(struct nbl_resource_mgt *res_mgt);
> +
> + int (*configure_msix_map)(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u16 num_net_msix, u16 num_others_msix,
> + bool net_msix_mask_en);
> + int (*destroy_msix_map)(struct nbl_resource_mgt *res_mgt, u16 func_id);
> + int (*enable_mailbox_irq)(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u16 vector_id, bool enable_msix);
> + u16 (*get_vsi_id)(struct nbl_resource_mgt *res_mgt, u16 func_id,
> + u16 type);
> + void (*get_eth_id)(struct nbl_resource_mgt *res_mgt, u16 vsi_id,
> + u8 *eth_mode, u8 *eth_id, u8 *logic_eth_id);
> };
>
> struct nbl_resource_ops_tbl {
> 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 a01c32f57d84..6a0bf5e8ca32 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
> @@ -17,11 +17,19 @@
> ((_id) == (max) ? 0 : (_id) + 1); \
> })
>
> +#define NBL_MAX_FUNC 520
> +#define NBL_MAX_ETHERNET 4
> +
> enum nbl_product_type {
> NBL_LEONIS_TYPE,
> NBL_PRODUCT_MAX,
> };
>
> +enum {
> + NBL_VSI_DATA = 0,
> + NBL_VSI_MAX,
> +};
> +
> struct nbl_func_caps {
> u32 has_ctrl:1;
> u32 has_net:1;
next prev parent reply other threads:[~2026-04-02 9:05 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-01 2:23 [PATCH v10 net-next 00/11] nbl driver for Nebulamatrix NICs illusion.wang
2026-04-01 2:23 ` [PATCH v10 net-next 01/11] net/nebula-matrix: add minimum nbl build framework illusion.wang
2026-04-01 2:23 ` [PATCH v10 net-next 02/11] net/nebula-matrix: add our driver architecture illusion.wang
2026-04-02 9:02 ` Mohsin Bashir
2026-04-01 2:23 ` [PATCH v10 net-next 03/11] net/nebula-matrix: add chip related definitions illusion.wang
2026-04-01 2:23 ` [PATCH v10 net-next 04/11] net/nebula-matrix: channel msg value and msg struct illusion.wang
2026-04-02 9:03 ` Mohsin Bashir
2026-04-01 2:23 ` [PATCH v10 net-next 05/11] net/nebula-matrix: add channel layer illusion.wang
2026-04-02 9:04 ` Mohsin Bashir
2026-04-01 2:23 ` [PATCH v10 net-next 06/11] net/nebula-matrix: add common resource implementation illusion.wang
2026-04-02 9:05 ` Mohsin Bashir [this message]
2026-04-01 2:23 ` [PATCH v10 net-next 07/11] net/nebula-matrix: add intr " illusion.wang
2026-04-02 9:05 ` Mohsin Bashir
2026-04-01 2:23 ` [PATCH v10 net-next 08/11] net/nebula-matrix: add vsi " illusion.wang
2026-04-02 9:06 ` Mohsin Bashir
2026-04-01 2:23 ` [PATCH v10 net-next 09/11] net/nebula-matrix: add Dispatch layer implementation illusion.wang
2026-04-01 2:23 ` [PATCH v10 net-next 10/11] net/nebula-matrix: add common/ctrl dev init/reinit operation illusion.wang
2026-04-01 2:23 ` [PATCH v10 net-next 11/11] net/nebula-matrix: add common dev start/stop operation illusion.wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8d43c17e-3372-4a26-9010-dea944d14ecb@gmail.com \
--to=mohsin.bashr@gmail.com \
--cc=alvin.wang@nebula-matrix.com \
--cc=andrew+netdev@lunn.ch \
--cc=corbet@lwn.net \
--cc=dimon.zhao@nebula-matrix.com \
--cc=edumazet@google.com \
--cc=enelsonmoore@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=horms@kernel.org \
--cc=illusion.wang@nebula-matrix.com \
--cc=jani.nikula@intel.com \
--cc=kuba@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo@kernel.org \
--cc=lukas.bulwahn@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sam.chen@nebula-matrix.com \
--cc=skhan@linuxfoundation.org \
--cc=vadim.fedorenko@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox