]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
octeontx2-af: npc: cn20k: Fix bank value
authorRatheesh Kannoth <rkannoth@marvell.com>
Wed, 29 Apr 2026 02:27:18 +0000 (07:57 +0530)
committerJakub Kicinski <kuba@kernel.org>
Fri, 1 May 2026 01:50:16 +0000 (18:50 -0700)
For X4 keys its loop reused the bank parameter as the loop counter, so bank
no longer reflected the caller's bank after the loop and the control flow
was hard to follow.

Program NPC_AF_CN20K_MCAMEX_BANKX_CFG_EXT directly in
npc_cn20k_config_mcam_entry(): one CFG write for X2 using the computed
bank, and one CFG write per bank inside the X4 action loop. Enable the
entry at the end with npc_cn20k_enable_mcam_entry(..., true) instead of
embedding the enable bit in bank_cfg via the removed helper.

Cc: Suman Ghosh <sumang@marvell.com>
Fixes: 4e527f1e5c15 ("octeontx2-af: npc: cn20k: Add new mailboxes for CN20K silicon")
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
Link: https://patch.msgid.link/20260429022722.1110289-7-rkannoth@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c

index 112c37c190b13d26ec732343dd041dba2ba246cc..4773277fd4098830d21027be14cc7be885e41c0a 100644 (file)
@@ -1045,34 +1045,6 @@ static void npc_cn20k_config_kw_x4(struct rvu *rvu, struct npc_mcam *mcam,
                                       kw, req_kw_type);
 }
 
-static void
-npc_cn20k_set_mcam_bank_cfg(struct rvu *rvu, int blkaddr, int mcam_idx,
-                           int bank, u8 kw_type, bool enable, u8 hw_prio)
-{
-       struct npc_mcam *mcam = &rvu->hw->mcam;
-       u64 bank_cfg;
-
-       bank_cfg = (u64)hw_prio << 24;
-       if (enable)
-               bank_cfg |= 0x1;
-
-       if (kw_type == NPC_MCAM_KEY_X2) {
-               rvu_write64(rvu, blkaddr,
-                           NPC_AF_CN20K_MCAMEX_BANKX_CFG_EXT(mcam_idx, bank),
-                           bank_cfg);
-               return;
-       }
-
-       /* For NPC_MCAM_KEY_X4 keys, both the banks
-        * need to be programmed with the same value.
-        */
-       for (bank = 0; bank < mcam->banks_per_entry; bank++) {
-               rvu_write64(rvu, blkaddr,
-                           NPC_AF_CN20K_MCAMEX_BANKX_CFG_EXT(mcam_idx, bank),
-                           bank_cfg);
-       }
-}
-
 int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
                                u8 intf, struct cn20k_mcam_entry *entry,
                                bool enable, u8 hw_prio, u8 req_kw_type)
@@ -1080,6 +1052,7 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
        struct npc_mcam *mcam = &rvu->hw->mcam;
        int mcam_idx = index % mcam->banksize;
        int bank = index / mcam->banksize;
+       u64 bank_cfg = (u64)hw_prio << 24;
        int kw = 0;
        u8 kw_type;
 
@@ -1119,41 +1092,50 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
                            NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
                                                                  bank, 1),
                            entry->vtag_action);
-               goto set_cfg;
-       }
 
-       /* Clear mcam entry to avoid writes being suppressed by NPC */
-       npc_clear_x2_entry(rvu, blkaddr, 0, mcam_idx);
-       npc_clear_x2_entry(rvu, blkaddr, 1, mcam_idx);
-
-       npc_cn20k_config_kw_x4(rvu, mcam, blkaddr,
-                              mcam_idx, intf, entry,
-                              kw_type, req_kw_type);
-       for (bank = 0; bank < mcam->banks_per_entry; bank++) {
-               /* Set 'action' */
+               /* Set HW priority */
                rvu_write64(rvu, blkaddr,
-                           NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
-                                                                 bank, 0),
-                           entry->action);
+                           NPC_AF_CN20K_MCAMEX_BANKX_CFG_EXT(mcam_idx, bank),
+                           bank_cfg);
 
-               /* Set TAG 'action' */
-               rvu_write64(rvu, blkaddr,
-                           NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
-                                                                 bank, 1),
-                           entry->vtag_action);
+       } else {
+               /* Clear mcam entry to avoid writes being suppressed by NPC */
+               npc_clear_x2_entry(rvu, blkaddr, 0, mcam_idx);
+               npc_clear_x2_entry(rvu, blkaddr, 1, mcam_idx);
 
-               /* Set 'action2' for inline receive */
-               rvu_write64(rvu, blkaddr,
-                           NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
-                                                                 bank, 2),
-                           entry->action2);
+               npc_cn20k_config_kw_x4(rvu, mcam, blkaddr,
+                                      mcam_idx, intf, entry,
+                                      kw_type, req_kw_type);
+               for (bank = 0; bank < mcam->banks_per_entry; bank++) {
+                       /* Set 'action' */
+                       rvu_write64(rvu, blkaddr,
+                                   NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
+                                                                         bank, 0),
+                                   entry->action);
+
+                       /* Set TAG 'action' */
+                       rvu_write64(rvu, blkaddr,
+                                   NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
+                                                                         bank, 1),
+                                   entry->vtag_action);
+
+                       /* Set 'action2' for inline receive */
+                       rvu_write64(rvu, blkaddr,
+                                   NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
+                                                                         bank, 2),
+                                   entry->action2);
+
+                       /* Set HW priority */
+                       rvu_write64(rvu, blkaddr,
+                                   NPC_AF_CN20K_MCAMEX_BANKX_CFG_EXT(mcam_idx, bank),
+                                   bank_cfg);
+               }
        }
 
-set_cfg:
        /* TODO: */
        /* PF installing VF rule */
-       npc_cn20k_set_mcam_bank_cfg(rvu, blkaddr, mcam_idx, bank,
-                                   kw_type, enable, hw_prio);
+       if (npc_cn20k_enable_mcam_entry(rvu, blkaddr, index, enable))
+               return -EINVAL;
 
        return 0;
 }