@@ -1814,6 +1814,73 @@ roc_nix_inl_ctx_write(struct roc_nix *roc_nix, void *sa_dptr, void *sa_cptr,
return -ENOTSUP;
}
+static inline int
+nix_inl_dev_cpt_lf_stats_get(struct roc_nix *roc_nix, struct roc_nix_cpt_lf_stats *stats,
+ uint16_t idx)
+{
+ struct idev_cfg *idev = idev_get_cfg();
+ struct nix_inl_dev *inl_dev = NULL;
+ struct roc_cpt_lf *lf = NULL;
+
+ PLT_SET_USED(roc_nix);
+ if (idev)
+ inl_dev = idev->nix_inl_dev;
+
+ if (inl_dev && inl_dev->attach_cptlf) {
+ if (idx >= inl_dev->nb_cptlf) {
+ plt_err("Invalid idx: %u total lfs: %d\n", idx, inl_dev->nb_cptlf);
+ return -EINVAL;
+ }
+ lf = &inl_dev->cpt_lf[idx];
+ } else {
+ plt_err("No CPT LF(s) are found for Inline Device\n");
+ return -EINVAL;
+ }
+ stats->enc_pkts = plt_read64(lf->rbase + CPT_LF_CTX_ENC_PKT_CNT);
+ stats->enc_bytes = plt_read64(lf->rbase + CPT_LF_CTX_ENC_BYTE_CNT);
+ stats->dec_pkts = plt_read64(lf->rbase + CPT_LF_CTX_DEC_PKT_CNT);
+ stats->dec_bytes = plt_read64(lf->rbase + CPT_LF_CTX_DEC_BYTE_CNT);
+
+ return 0;
+}
+
+static inline int
+nix_eth_dev_cpt_lf_stats_get(struct roc_nix *roc_nix, struct roc_nix_cpt_lf_stats *stats,
+ uint16_t idx)
+{
+ struct roc_cpt_lf *lf;
+ struct nix *nix;
+
+ if (!roc_nix)
+ return -EINVAL;
+ nix = roc_nix_to_nix_priv(roc_nix);
+ if (idx >= nix->nb_cpt_lf) {
+ plt_err("Invalid idx: %u total lfs: %d\n", idx, nix->nb_cpt_lf);
+ return -EINVAL;
+ }
+ lf = &nix->cpt_lf_base[idx];
+ stats->enc_pkts = plt_read64(lf->rbase + CPT_LF_CTX_ENC_PKT_CNT);
+ stats->enc_bytes = plt_read64(lf->rbase + CPT_LF_CTX_ENC_BYTE_CNT);
+ stats->dec_pkts = plt_read64(lf->rbase + CPT_LF_CTX_DEC_PKT_CNT);
+ stats->dec_bytes = plt_read64(lf->rbase + CPT_LF_CTX_DEC_BYTE_CNT);
+
+ return 0;
+}
+
+int
+roc_nix_inl_cpt_lf_stats_get(struct roc_nix *roc_nix, enum roc_nix_cpt_lf_stats_type type,
+ struct roc_nix_cpt_lf_stats *stats, uint16_t idx)
+{
+ switch (type) {
+ case ROC_NIX_CPT_LF_STATS_INL_DEV:
+ return nix_inl_dev_cpt_lf_stats_get(roc_nix, stats, idx);
+ case ROC_NIX_CPT_LF_STATS_ETHDEV:
+ return nix_eth_dev_cpt_lf_stats_get(roc_nix, stats, idx);
+ default:
+ return -EINVAL;
+ }
+}
+
int
roc_nix_inl_ts_pkind_set(struct roc_nix *roc_nix, bool ts_ena, bool inb_inl_dev)
{
@@ -112,6 +112,13 @@ struct roc_nix_inl_dev_q {
int32_t fc_addr_sw;
} __plt_cache_aligned;
+struct roc_nix_cpt_lf_stats {
+ uint64_t enc_pkts;
+ uint64_t enc_bytes;
+ uint64_t dec_pkts;
+ uint64_t dec_bytes;
+};
+
/* NIX Inline Device API */
int __roc_api roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev);
int __roc_api roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev);
@@ -187,4 +194,12 @@ void __roc_api roc_nix_inl_outb_cpt_lfs_dump(struct roc_nix *roc_nix, FILE *file
uint64_t __roc_api roc_nix_inl_eng_caps_get(struct roc_nix *roc_nix);
void *__roc_api roc_nix_inl_dev_qptr_get(uint8_t qid);
+enum roc_nix_cpt_lf_stats_type {
+ ROC_NIX_CPT_LF_STATS_INL_DEV,
+ ROC_NIX_CPT_LF_STATS_KERNEL,
+ ROC_NIX_CPT_LF_STATS_ETHDEV = 2,
+};
+int __roc_api roc_nix_inl_cpt_lf_stats_get(struct roc_nix *roc_nix,
+ enum roc_nix_cpt_lf_stats_type type,
+ struct roc_nix_cpt_lf_stats *stats, uint16_t idx);
#endif /* _ROC_NIX_INL_H_ */
@@ -267,6 +267,7 @@ INTERNAL {
roc_nix_inl_meta_pool_cb_register;
roc_nix_inl_custom_meta_pool_cb_register;
roc_nix_inb_mode_set;
+ roc_nix_inl_cpt_lf_stats_get;
roc_nix_inl_dev_qptr_get;
roc_nix_inl_outb_fini;
roc_nix_inl_outb_init;
@@ -311,6 +311,17 @@ rte_pmd_cnxk_inl_dev_qptr_get(void)
return roc_nix_inl_dev_qptr_get(0);
}
+int
+rte_pmd_cnxk_cpt_q_stats_get(uint16_t portid, enum rte_pmd_cnxk_cpt_q_stats_type type,
+ struct rte_pmd_cnxk_cpt_q_stats *stats, uint16_t idx)
+{
+ struct rte_eth_dev *eth_dev = &rte_eth_devices[portid];
+ struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+
+ return roc_nix_inl_cpt_lf_stats_get(&dev->nix, (enum roc_nix_cpt_lf_stats_type)type,
+ (struct roc_nix_cpt_lf_stats *)stats, idx);
+}
+
union rte_pmd_cnxk_ipsec_hw_sa *
rte_pmd_cnxk_hw_session_base_get(uint16_t portid, bool inb)
{
@@ -47,6 +47,30 @@ enum rte_pmd_cnxk_sec_action_alg {
RTE_PMD_CNXK_SEC_ACTION_ALG4,
};
+/** CPT queue type for obtaining queue hardware statistics. */
+enum rte_pmd_cnxk_cpt_q_stats_type {
+ /** Type to get Inline Device LF(s) statistics */
+ RTE_PMD_CNXK_CPT_Q_STATS_INL_DEV,
+ /** Type to get Inline Inbound LF which is attached to kernel device
+ * statistics.
+ */
+ RTE_PMD_CNXK_CPT_Q_STATS_KERNEL,
+ /** Type to get CPT LF which is attached to ethdev statistics */
+ RTE_PMD_CNXK_CPT_Q_STATS_ETHDEV = 2,
+};
+
+/** CPT queue hardware statistics */
+struct rte_pmd_cnxk_cpt_q_stats {
+ /** Encrypted packet count */
+ uint64_t enc_pkts;
+ /** Encrypted byte count */
+ uint64_t enc_bytes;
+ /** Decrypted packet count */
+ uint64_t dec_pkts;
+ /** Decrypted byte count */
+ uint64_t dec_bytes;
+};
+
struct rte_pmd_cnxk_sec_action {
/** Used as lookup result for ALG3 */
uint32_t sa_index;
@@ -613,4 +637,23 @@ __rte_experimental
uint16_t rte_pmd_cnxk_inl_dev_submit(struct rte_pmd_cnxk_inl_dev_q *qptr, void *inst,
uint16_t nb_inst);
+/**
+ * Retrieves the hardware statistics of a given port and stats type.
+ *
+ * @param portid
+ * Port identifier of Ethernet device.
+ * @param type
+ * The type of hardware statistics to retrieve, as defined in the
+ * ``enum rte_pmd_cnxk_cpt_q_stats_type``.
+ * @param stats
+ * Pointer where the retrieved statistics will be stored.
+ * @param idx
+ * The index of the queue of a given type.
+ *
+ * @return
+ * 0 upon success, a negative errno value otherwise.
+ */
+__rte_experimental
+int rte_pmd_cnxk_cpt_q_stats_get(uint16_t portid, enum rte_pmd_cnxk_cpt_q_stats_type type,
+ struct rte_pmd_cnxk_cpt_q_stats *stats, uint16_t idx);
#endif /* _PMD_CNXK_H_ */
@@ -10,6 +10,7 @@ EXPERIMENTAL {
rte_pmd_cnxk_hw_sa_write;
# added in 23.11
+ rte_pmd_cnxk_cpt_q_stats_get;
rte_pmd_cnxk_hw_session_base_get;
rte_pmd_cnxk_inl_dev_qptr_get;
rte_pmd_cnxk_inl_dev_submit;