bnxt_en: Introduce rss ctx structure, alloc/free functions
authorPavan Chebbi <pavan.chebbi@broadcom.com>
Mon, 25 Mar 2024 22:28:55 +0000 (15:28 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Mar 2024 05:34:40 +0000 (22:34 -0700)
Add struct bnxt_rss_ctx, related storage lists, required
defines, and its alloc/free functions.

Later patches will use them in order to support multiple
RSS contexts.

Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240325222902.220712-6-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 3f5d7c81a281762465bf5e7e6c5b39427386c891..0ede267904ad2ce93be8eada2439eb8f845fd8f4 100644 (file)
@@ -9925,6 +9925,53 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
        return rc;
 }
 
+void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
+                         bool all)
+{
+       if (!all)
+               return;
+
+       list_del(&rss_ctx->list);
+       bp->num_rss_ctx--;
+       clear_bit(rss_ctx->index, bp->rss_ctx_bmap);
+       kfree(rss_ctx);
+}
+
+struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp)
+{
+       struct bnxt_rss_ctx *rss_ctx = NULL;
+
+       rss_ctx = kzalloc(sizeof(*rss_ctx), GFP_KERNEL);
+       if (rss_ctx) {
+               rss_ctx->vnic.rss_ctx = rss_ctx;
+               list_add_tail(&rss_ctx->list, &bp->rss_ctx_list);
+               bp->num_rss_ctx++;
+       }
+       return rss_ctx;
+}
+
+void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all)
+{
+       struct bnxt_rss_ctx *rss_ctx, *tmp;
+
+       list_for_each_entry_safe(rss_ctx, tmp, &bp->rss_ctx_list, list)
+               bnxt_del_one_rss_ctx(bp, rss_ctx, all);
+
+       if (all)
+               bitmap_free(bp->rss_ctx_bmap);
+}
+
+static void bnxt_init_multi_rss_ctx(struct bnxt *bp)
+{
+       bp->rss_ctx_bmap = bitmap_zalloc(BNXT_RSS_CTX_BMAP_LEN, GFP_KERNEL);
+       if (bp->rss_ctx_bmap) {
+               /* burn index 0 since we cannot have context 0 */
+               __set_bit(0, bp->rss_ctx_bmap);
+               INIT_LIST_HEAD(&bp->rss_ctx_list);
+               bp->rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX;
+       }
+}
+
 /* Allow PF, trusted VFs and VFs with default VLAN to be in promiscuous mode */
 static bool bnxt_promisc_ok(struct bnxt *bp)
 {
@@ -14612,6 +14659,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)
        unregister_netdev(dev);
        bnxt_free_l2_filters(bp, true);
        bnxt_free_ntp_fltrs(bp, true);
+       if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
+               bnxt_clear_rss_ctxs(bp, true);
        clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
        /* Flush any pending tasks */
        cancel_work_sync(&bp->sp_task);
@@ -15223,6 +15272,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        INIT_LIST_HEAD(&bp->usr_fltr_list);
 
+       if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
+               bnxt_init_multi_rss_ctx(bp);
+
        rc = register_netdev(dev);
        if (rc)
                goto init_err_cleanup;
@@ -15243,6 +15295,8 @@ init_err_dl:
        bnxt_clear_int_mode(bp);
 
 init_err_pci_clean:
+       if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
+               bnxt_clear_rss_ctxs(bp, true);
        bnxt_hwrm_func_drv_unrgtr(bp);
        bnxt_free_hwrm_resources(bp);
        bnxt_hwmon_uninit(bp);
index 81460a96c0dd84e248c2a1d7d742840197d1e7d1..4d3104c26cfaa57003b50176c1c7b35cace28a95 100644 (file)
@@ -1256,9 +1256,21 @@ struct bnxt_vnic_info {
 #define BNXT_VNIC_UCAST_FLAG   8
 #define BNXT_VNIC_RFS_NEW_RSS_FLAG     0x10
 #define BNXT_VNIC_NTUPLE_FLAG          0x20
+#define BNXT_VNIC_RSSCTX_FLAG          0x40
+       struct bnxt_rss_ctx     *rss_ctx;
        u32             vnic_id;
 };
 
+struct bnxt_rss_ctx {
+       struct list_head list;
+       struct bnxt_vnic_info vnic;
+       u16     *rss_indir_tbl;
+       u8      index;
+};
+
+#define BNXT_MAX_ETH_RSS_CTX   32
+#define BNXT_RSS_CTX_BMAP_LEN  (BNXT_MAX_ETH_RSS_CTX + 1)
+
 struct bnxt_hw_rings {
        int tx;
        int rx;
@@ -2228,6 +2240,9 @@ struct bnxt {
        /* grp_info indexed by completion ring index */
        struct bnxt_ring_grp_info       *grp_info;
        struct bnxt_vnic_info   *vnic_info;
+       struct list_head        rss_ctx_list;
+       unsigned long           *rss_ctx_bmap;
+       u32                     num_rss_ctx;
        int                     nr_vnics;
        u16                     *rss_indir_tbl;
        u16                     rss_indir_tbl_entries;
@@ -2242,6 +2257,7 @@ struct bnxt {
 #define BNXT_RSS_CAP_AH_V6_RSS_CAP             BIT(5)
 #define BNXT_RSS_CAP_ESP_V4_RSS_CAP            BIT(6)
 #define BNXT_RSS_CAP_ESP_V6_RSS_CAP            BIT(7)
+#define BNXT_RSS_CAP_MULTI_RSS_CTX             BIT(8)
 
        u8                      rss_hash_key[HW_HASH_KEY_SIZE];
        u8                      rss_hash_key_valid:1;
@@ -2341,6 +2357,10 @@ struct bnxt {
 #define BNXT_SUPPORTS_NTUPLE_VNIC(bp)  \
        (BNXT_PF(bp) && ((bp)->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3))
 
+#define BNXT_SUPPORTS_MULTI_RSS_CTX(bp)                                \
+       (BNXT_PF(bp) && BNXT_SUPPORTS_NTUPLE_VNIC(bp) &&        \
+        ((bp)->rss_cap & BNXT_RSS_CAP_MULTI_RSS_CTX))
+
        u32                     hwrm_spec_code;
        u16                     hwrm_cmd_seq;
        u16                     hwrm_cmd_kong_seq;
@@ -2723,6 +2743,10 @@ int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
 int bnxt_hwrm_func_qcaps(struct bnxt *bp);
 int bnxt_hwrm_fw_set_time(struct bnxt *);
 int bnxt_hwrm_vnic_rss_cfg_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic);
+void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
+                         bool all);
+struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp);
+void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all);
 int bnxt_open_nic(struct bnxt *, bool, bool);
 int bnxt_half_open_nic(struct bnxt *bp);
 void bnxt_half_close_nic(struct bnxt *bp);
index 1d240a27455a553d3c3f0f8289299423de0daf8e..771833b1900dcd3c311be3947abd8329b6011303 100644 (file)
@@ -969,6 +969,8 @@ static int bnxt_set_channels(struct net_device *dev,
        }
 
        bnxt_clear_usr_fltrs(bp, true);
+       if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
+               bnxt_clear_rss_ctxs(bp, false);
        if (netif_running(dev)) {
                if (BNXT_PF(bp)) {
                        /* TODO CHIMP_FW: Send message to all VF's