net/bnxt: support flow meter drop counter

This patch adds flow meter drop counter support for Thor.

Signed-off-by: Jay Ding <jay.ding@broadcom.com>
Reviewed-by: Farah Smith <farah.smith@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
Jay Ding 2021-09-20 13:12:04 +05:30 committed by Ajit Khaparde
parent dfc65c77c0
commit 998b9639df
6 changed files with 66 additions and 34 deletions

View File

@ -104,10 +104,11 @@
#define CFA_RESOURCE_TYPE_P58_WC_FKB 0x12UL
/* VEB TCAM */
#define CFA_RESOURCE_TYPE_P58_VEB_TCAM 0x13UL
/* Metadata */
#define CFA_RESOURCE_TYPE_P58_METADATA 0x14UL
/* Meter drop counter */
#define CFA_RESOURCE_TYPE_P58_METER_DROP_CNT 0x15UL
#define CFA_RESOURCE_TYPE_P58_LAST CFA_RESOURCE_TYPE_P58_METER_DROP_CNT
#define CFA_RESOURCE_TYPE_P58_LAST CFA_RESOURCE_TYPE_P58_METER_DROP_CNT
/* Multicast Group */
#define CFA_RESOURCE_TYPE_P45_MCG 0x0UL

View File

@ -283,9 +283,9 @@ enum tf_tbl_type {
TF_TBL_TYPE_ACT_MODIFY_32B,
/** TH 64B Modify Record */
TF_TBL_TYPE_ACT_MODIFY_64B,
/** (Future) Meter Profiles */
/** Meter Profiles */
TF_TBL_TYPE_METER_PROF,
/** (Future) Meter Instance */
/** Meter Instance */
TF_TBL_TYPE_METER_INST,
/** Wh+/SR/Th Mirror Config */
TF_TBL_TYPE_MIRROR_CONFIG,
@ -301,6 +301,8 @@ enum tf_tbl_type {
TF_TBL_TYPE_EM_FKB,
/** TH WC Flexible Key builder */
TF_TBL_TYPE_WC_FKB,
/** Meter Drop Counter */
TF_TBL_TYPE_METER_DROP_CNT,
/* External */
@ -2194,6 +2196,8 @@ enum tf_global_config_type {
TF_TUNNEL_ENCAP, /**< Tunnel Encap Config(TECT) */
TF_ACTION_BLOCK, /**< Action Block Config(ABCR) */
TF_COUNTER_CFG, /**< Counter Configuration (CNTRS_CTRL) */
TF_METER_CFG, /**< Meter Config(ACTP4_FMTCR) */
TF_METER_INTERVAL_CFG, /**< Meter Interval Config(FMTCR_INTERVAL) */
TF_GLOBAL_CFG_TYPE_MAX
};

View File

@ -43,6 +43,7 @@ const char *tf_resource_str_p58[CFA_RESOURCE_TYPE_P58_LAST + 1] = {
[CFA_RESOURCE_TYPE_P58_EM_FKB] = "em_fkb ",
[CFA_RESOURCE_TYPE_P58_WC_FKB] = "wc_fkb ",
[CFA_RESOURCE_TYPE_P58_VEB_TCAM] = "veb ",
[CFA_RESOURCE_TYPE_P58_METADATA] = "metadata",
};
/**

View File

@ -75,10 +75,18 @@ struct tf_rm_element_cfg tf_tbl_p58[TF_TBL_TYPE_MAX] = {
TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER,
0, 0, 0
},
[TF_TBL_TYPE_METER_DROP_CNT] = {
TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METER_DROP_CNT,
0, 0, 0
},
[TF_TBL_TYPE_MIRROR_CONFIG] = {
TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_MIRROR,
0, 0, 0
},
[TF_TBL_TYPE_METADATA] = {
TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P58_METADATA,
0, 0, 0
},
/* Policy - ARs in bank 1 */
[TF_TBL_TYPE_FULL_ACT_RECORD] = {
.cfg_type = TF_RM_ELEM_CFG_HCAPI_BA_PARENT,
@ -194,5 +202,11 @@ struct tf_global_cfg_cfg tf_global_cfg_p58[TF_GLOBAL_CFG_TYPE_MAX] = {
[TF_COUNTER_CFG] = {
TF_GLOBAL_CFG_CFG_HCAPI, TF_COUNTER_CFG
},
[TF_METER_CFG] = {
TF_GLOBAL_CFG_CFG_HCAPI, TF_METER_CFG
},
[TF_METER_INTERVAL_CFG] = {
TF_GLOBAL_CFG_CFG_HCAPI, TF_METER_INTERVAL_CFG
},
};
#endif /* _TF_DEVICE_P58_H_ */

View File

@ -374,23 +374,28 @@ tf_tbl_set(struct tf *tfp,
}
}
/* Verify that the entry has been previously allocated */
aparms.rm_db = tbl_db->tbl_db[parms->dir];
aparms.subtype = parms->type;
TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift);
/* Do not check meter drop counter because it is not allocated
* resources
*/
if (parms->type != TF_TBL_TYPE_METER_DROP_CNT) {
/* Verify that the entry has been previously allocated */
aparms.rm_db = tbl_db->tbl_db[parms->dir];
aparms.subtype = parms->type;
TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift);
aparms.allocated = &allocated;
rc = tf_rm_is_allocated(&aparms);
if (rc)
return rc;
aparms.allocated = &allocated;
rc = tf_rm_is_allocated(&aparms);
if (rc)
return rc;
if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) {
TFP_DRV_LOG(ERR,
"%s, Invalid or not allocated index, type:%d, idx:%d\n",
tf_dir_2_str(parms->dir),
parms->type,
parms->idx);
return -EINVAL;
if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) {
TFP_DRV_LOG(ERR,
"%s, Invalid or not allocated index, type:%d, idx:%d\n",
tf_dir_2_str(parms->dir),
parms->type,
parms->idx);
return -EINVAL;
}
}
/* Set the entry */
@ -477,23 +482,28 @@ tf_tbl_get(struct tf *tfp,
}
}
/* Verify that the entry has been previously allocated */
aparms.rm_db = tbl_db->tbl_db[parms->dir];
aparms.subtype = parms->type;
TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift);
/* Do not check meter drop counter because it is not allocated
* resources.
*/
if (parms->type != TF_TBL_TYPE_METER_DROP_CNT) {
/* Verify that the entry has been previously allocated */
aparms.rm_db = tbl_db->tbl_db[parms->dir];
aparms.subtype = parms->type;
TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift);
aparms.allocated = &allocated;
rc = tf_rm_is_allocated(&aparms);
if (rc)
return rc;
aparms.allocated = &allocated;
rc = tf_rm_is_allocated(&aparms);
if (rc)
return rc;
if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) {
TFP_DRV_LOG(ERR,
"%s, Invalid or not allocated index, type:%d, idx:%d\n",
tf_dir_2_str(parms->dir),
parms->type,
parms->idx);
return -EINVAL;
if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) {
TFP_DRV_LOG(ERR,
"%s, Invalid or not allocated index, type:%d, idx:%d\n",
tf_dir_2_str(parms->dir),
parms->type,
parms->idx);
return -EINVAL;
}
}
/* Set the entry */

View File

@ -112,6 +112,8 @@ tf_tbl_type_2_str(enum tf_tbl_type tbl_type)
return "WC Flexible Key Builder";
case TF_TBL_TYPE_EXT:
return "External";
case TF_TBL_TYPE_METER_DROP_CNT:
return "Meter drop counter";
default:
return "Invalid tbl type";
}