Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

octeontx2-af: Knobs for NPC default rule counters

Add devlink knobs to enable/disable counters on NPC
default rule entries.

Sample command to enable default rule counters:
devlink dev param set <dev> name npc_def_rule_cntr value true cmode runtime

Sample command to read the counter:
cat /sys/kernel/debug/cn10k/npc/mcam_rules

Signed-off-by: Linu Cherian <lcherian@marvell.com>
Link: https://patch.msgid.link/20241105125620.2114301-3-lcherian@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Linu Cherian and committed by
Jakub Kicinski
70a7434b ca122473

+77
+2
drivers/net/ethernet/marvell/octeontx2/af/rvu.h
··· 525 525 struct mutex alias_lock; /* Serialize bar2 alias access */ 526 526 int vfs; /* Number of VFs attached to RVU */ 527 527 u16 vf_devid; /* VF devices id */ 528 + bool def_rule_cntr_en; 528 529 int nix_blkaddr[MAX_NIX_BLKS]; 529 530 530 531 /* Mbox */ ··· 990 989 void npc_read_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam, 991 990 int blkaddr, u16 src, struct mcam_entry *entry, 992 991 u8 *intf, u8 *ena); 992 + int npc_config_cntr_default_entries(struct rvu *rvu, bool enable); 993 993 bool is_cgx_config_permitted(struct rvu *rvu, u16 pcifunc); 994 994 bool is_mac_feature_supported(struct rvu *rvu, int pf, int feature); 995 995 u32 rvu_cgx_get_fifolen(struct rvu *rvu);
+32
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
··· 1238 1238 RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU, 1239 1239 RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT, 1240 1240 RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE, 1241 + RVU_AF_DEVLINK_PARAM_ID_NPC_DEF_RULE_CNTR_ENABLE, 1241 1242 RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF, 1242 1243 }; 1243 1244 ··· 1359 1358 return 0; 1360 1359 } 1361 1360 1361 + static int rvu_af_dl_npc_def_rule_cntr_get(struct devlink *devlink, u32 id, 1362 + struct devlink_param_gset_ctx *ctx) 1363 + { 1364 + struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1365 + struct rvu *rvu = rvu_dl->rvu; 1366 + 1367 + ctx->val.vbool = rvu->def_rule_cntr_en; 1368 + 1369 + return 0; 1370 + } 1371 + 1372 + static int rvu_af_dl_npc_def_rule_cntr_set(struct devlink *devlink, u32 id, 1373 + struct devlink_param_gset_ctx *ctx, 1374 + struct netlink_ext_ack *extack) 1375 + { 1376 + struct rvu_devlink *rvu_dl = devlink_priv(devlink); 1377 + struct rvu *rvu = rvu_dl->rvu; 1378 + int err; 1379 + 1380 + err = npc_config_cntr_default_entries(rvu, ctx->val.vbool); 1381 + if (!err) 1382 + rvu->def_rule_cntr_en = ctx->val.vbool; 1383 + 1384 + return err; 1385 + } 1386 + 1362 1387 static int rvu_af_dl_nix_maxlf_get(struct devlink *devlink, u32 id, 1363 1388 struct devlink_param_gset_ctx *ctx) 1364 1389 { ··· 1471 1444 rvu_af_dl_npc_mcam_high_zone_percent_get, 1472 1445 rvu_af_dl_npc_mcam_high_zone_percent_set, 1473 1446 rvu_af_dl_npc_mcam_high_zone_percent_validate), 1447 + DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NPC_DEF_RULE_CNTR_ENABLE, 1448 + "npc_def_rule_cntr", DEVLINK_PARAM_TYPE_BOOL, 1449 + BIT(DEVLINK_PARAM_CMODE_RUNTIME), 1450 + rvu_af_dl_npc_def_rule_cntr_get, 1451 + rvu_af_dl_npc_def_rule_cntr_set, NULL), 1474 1452 DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF, 1475 1453 "nix_maxlf", DEVLINK_PARAM_TYPE_U16, 1476 1454 BIT(DEVLINK_PARAM_CMODE_RUNTIME),
+43
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
··· 2691 2691 npc_mcam_set_bit(mcam, entry_idx); 2692 2692 } 2693 2693 2694 + int npc_config_cntr_default_entries(struct rvu *rvu, bool enable) 2695 + { 2696 + struct npc_mcam *mcam = &rvu->hw->mcam; 2697 + struct npc_install_flow_rsp rsp; 2698 + struct rvu_npc_mcam_rule *rule; 2699 + int blkaddr; 2700 + 2701 + blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0); 2702 + if (blkaddr < 0) 2703 + return -EINVAL; 2704 + 2705 + mutex_lock(&mcam->lock); 2706 + list_for_each_entry(rule, &mcam->mcam_rules, list) { 2707 + if (!is_mcam_entry_enabled(rvu, mcam, blkaddr, rule->entry)) 2708 + continue; 2709 + if (!rule->default_rule) 2710 + continue; 2711 + if (enable && !rule->has_cntr) { /* Alloc and map new counter */ 2712 + __rvu_mcam_add_counter_to_rule(rvu, rule->owner, 2713 + rule, &rsp); 2714 + if (rsp.counter < 0) { 2715 + dev_err(rvu->dev, 2716 + "%s: Failed to allocate cntr for default rule (err=%d)\n", 2717 + __func__, rsp.counter); 2718 + break; 2719 + } 2720 + npc_map_mcam_entry_and_cntr(rvu, mcam, blkaddr, 2721 + rule->entry, rsp.counter); 2722 + /* Reset counter before use */ 2723 + rvu_write64(rvu, blkaddr, 2724 + NPC_AF_MATCH_STATX(rule->cntr), 0x0); 2725 + } 2726 + 2727 + /* Free and unmap counter */ 2728 + if (!enable && rule->has_cntr) 2729 + __rvu_mcam_remove_counter_from_rule(rvu, rule->owner, 2730 + rule); 2731 + } 2732 + mutex_unlock(&mcam->lock); 2733 + 2734 + return 0; 2735 + } 2736 + 2694 2737 int rvu_mbox_handler_npc_mcam_alloc_entry(struct rvu *rvu, 2695 2738 struct npc_mcam_alloc_entry_req *req, 2696 2739 struct npc_mcam_alloc_entry_rsp *rsp)