Hi Gowrishankar,
Some comments inline.
> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Gowrishankar
> Muthukrishnan
> Sent: Wednesday, September 29, 2021 12:25 PM
> To: dev@dpdk.org
> Cc: Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Kiran Kumar
> Kokkilagadda <kirankumark@marvell.com>; Nithin Kumar Dabilpuram
> <ndabilpuram@marvell.com>; Sunil Kumar Kori <skori@marvell.com>; Satha
> Koteswara Rao Kottidi <skoteshwar@marvell.com>; Ashwin Sekhar
> Thalakalath Kottilveetil <asekhar@marvell.com>; Pavan Nikhilesh
> Bhagavatula <pbhagavatula@marvell.com>; Gowrishankar Muthukrishnan
> <gmuthukrishn@marvell.com>
> Subject: [EXT] [dpdk-dev] [v9 1/4] common/cnxk: add telemetry endpoints to
> npa
>
> External Email
>
> ----------------------------------------------------------------------
> Add telemetry endpoints to npa.
>
> Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
> ---
> drivers/common/cnxk/cnxk_telemetry.h | 26 +++
> drivers/common/cnxk/cnxk_telemetry_npa.c | 224
> +++++++++++++++++++++++
> drivers/common/cnxk/meson.build | 6 +-
> drivers/common/cnxk/roc_platform.h | 12 ++
> 4 files changed, 266 insertions(+), 2 deletions(-) create mode 100644
> drivers/common/cnxk/cnxk_telemetry.h
> create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
>
[...]
> +static int
> +cnxk_tel_npa(struct plt_tel_data *d)
> +{
> + struct npa_lf *lf;
> + int aura_cnt = 0;
> + uint32_t i;
> +
> + lf = idev_npa_obj_get();
> + if (lf == NULL)
> + return NPA_ERR_DEVICE_NOT_BOUNDED;
> +
> + for (i = 0; i < lf->nr_pools; i++) {
> + if (plt_bitmap_get(lf->npa_bmp, i))
> + continue;
> + aura_cnt++;
> + }
> +
> + plt_tel_data_add_dict_ptr(d, "npa", lf);
> + plt_tel_data_add_dict_int(d, "pf", dev_get_pf(lf->pf_func));
> + plt_tel_data_add_dict_int(d, "vf", dev_get_vf(lf->pf_func));
> + plt_tel_data_add_dict_int(d, "aura_cnt", aura_cnt);
> +
> + CNXK_TEL_DICT_PTR(d, lf, pci_dev);
Can we print PCI BDF string in place of its handle.
> + CNXK_TEL_DICT_PTR(d, lf, npa_bmp);
> + CNXK_TEL_DICT_PTR(d, lf, npa_bmp_mem);
> + CNXK_TEL_DICT_PTR(d, lf, npa_qint_mem);
> + CNXK_TEL_DICT_PTR(d, lf, intr_handle);
Handles can be avoided, just a suggestion no strong objection against it.
> + CNXK_TEL_DICT_PTR(d, lf, mbox);
> + CNXK_TEL_DICT_PTR(d, lf, base);
> + CNXK_TEL_DICT_INT(d, lf, stack_pg_ptrs);
> + CNXK_TEL_DICT_INT(d, lf, stack_pg_bytes);
> + CNXK_TEL_DICT_INT(d, lf, npa_msixoff);
> + CNXK_TEL_DICT_INT(d, lf, nr_pools);
> + CNXK_TEL_DICT_INT(d, lf, pf_func);
> + CNXK_TEL_DICT_INT(d, lf, aura_sz);
> + CNXK_TEL_DICT_INT(d, lf, qints);
> +
> + return 0;
> +
[...]
> +static int
> +cnxk_npa_tel_handle_info(const char *cmd __plt_unused,
> + const char *params __plt_unused,
> + struct plt_tel_data *d)
> +{
> + plt_tel_data_start_dict(d);
> + return cnxk_tel_npa(d);
> +}
> +
> +static int
> +cnxk_npa_tel_handle_info_x(const char *cmd, const char *params,
> + struct plt_tel_data *d)
> +{
> + int id, rc;
> +
> + if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> + return -1;
> +
> + id = atoi(params);
Please avoid using atoi as it obsolete. atoi() function is subsumed by strtol(), problem with atoi is
it does not perform any error checking.
> + plt_tel_data_start_dict(d);
> +
> + if (strstr(cmd, "aura/info"))
> + rc = cnxk_tel_npa_aura(id, d);
> + else
> + rc = cnxk_tel_npa_pool(id, d);
> +
> + return rc;
> +}
> +
> +PLT_INIT(cnxk_telemetry_npa_init)
> +{
> + plt_telemetry_register_cmd(
> + "/cnxk/npa/info", cnxk_npa_tel_handle_info,
> + "Returns npa information. Takes no parameters");
> +
> + plt_telemetry_register_cmd(
> + "/cnxk/npa/aura/info", cnxk_npa_tel_handle_info_x,
> + "Returns npa aura information. Parameters: aura_id");
Can we also add a list command "/cnxk/npa/aura/list" something similar to
"/ethdev/list" so its easy to know for what all aura ids "/cnxk/npa/aura/info"
can be used.
> +
> + plt_telemetry_register_cmd(
> + "/cnxk/npa/pool/info", cnxk_npa_tel_handle_info_x,
Same, pool/list if possible.
> + "Returns npa pool information. Parameters: pool_id"); }
> diff --git a/drivers/common/cnxk/meson.build
Thanks
Harman
new file mode 100644
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2021 Marvell.
+ */
+
+#ifndef __CNXK_TELEMETRY_H_
+#define __CNXK_TELEMETRY_H_
+
+#define CNXK_TEL_STR(s) #s
+#define CNXK_TEL_STR_PREFIX(s, p) CNXK_TEL_STR(p##s)
+#define CNXK_TEL_DICT_INT(d, p, s, ...) \
+ plt_tel_data_add_dict_int(d, CNXK_TEL_STR_PREFIX(s, __VA_ARGS__), \
+ (p)->s)
+#define CNXK_TEL_DICT_PTR(d, p, s, ...) \
+ plt_tel_data_add_dict_ptr(d, CNXK_TEL_STR_PREFIX(s, __VA_ARGS__), \
+ (void *)(p)->s)
+#define CNXK_TEL_DICT_BF_PTR(d, p, s, ...) \
+ plt_tel_data_add_dict_ptr(d, CNXK_TEL_STR_PREFIX(s, __VA_ARGS__), \
+ (void *)(uint64_t)(p)->s)
+#define CNXK_TEL_DICT_U64(d, p, s, ...) \
+ plt_tel_data_add_dict_u64(d, CNXK_TEL_STR_PREFIX(s, __VA_ARGS__), \
+ (p)->s)
+#define CNXK_TEL_DICT_STR(d, p, s, ...) \
+ plt_tel_data_add_dict_string(d, CNXK_TEL_STR_PREFIX(s, __VA_ARGS__), \
+ (p)->s)
+
+#endif /* __CNXK_TELEMETRY_H_ */
new file mode 100644
@@ -0,0 +1,224 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+static int
+cnxk_tel_npa(struct plt_tel_data *d)
+{
+ struct npa_lf *lf;
+ int aura_cnt = 0;
+ uint32_t i;
+
+ lf = idev_npa_obj_get();
+ if (lf == NULL)
+ return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+ for (i = 0; i < lf->nr_pools; i++) {
+ if (plt_bitmap_get(lf->npa_bmp, i))
+ continue;
+ aura_cnt++;
+ }
+
+ plt_tel_data_add_dict_ptr(d, "npa", lf);
+ plt_tel_data_add_dict_int(d, "pf", dev_get_pf(lf->pf_func));
+ plt_tel_data_add_dict_int(d, "vf", dev_get_vf(lf->pf_func));
+ plt_tel_data_add_dict_int(d, "aura_cnt", aura_cnt);
+
+ CNXK_TEL_DICT_PTR(d, lf, pci_dev);
+ CNXK_TEL_DICT_PTR(d, lf, npa_bmp);
+ CNXK_TEL_DICT_PTR(d, lf, npa_bmp_mem);
+ CNXK_TEL_DICT_PTR(d, lf, npa_qint_mem);
+ CNXK_TEL_DICT_PTR(d, lf, intr_handle);
+ CNXK_TEL_DICT_PTR(d, lf, mbox);
+ CNXK_TEL_DICT_PTR(d, lf, base);
+ CNXK_TEL_DICT_INT(d, lf, stack_pg_ptrs);
+ CNXK_TEL_DICT_INT(d, lf, stack_pg_bytes);
+ CNXK_TEL_DICT_INT(d, lf, npa_msixoff);
+ CNXK_TEL_DICT_INT(d, lf, nr_pools);
+ CNXK_TEL_DICT_INT(d, lf, pf_func);
+ CNXK_TEL_DICT_INT(d, lf, aura_sz);
+ CNXK_TEL_DICT_INT(d, lf, qints);
+
+ return 0;
+}
+
+static int
+cnxk_tel_npa_aura(int aura_id, struct plt_tel_data *d)
+{
+ __io struct npa_aura_s *aura;
+ struct npa_aq_enq_req *req;
+ struct npa_aq_enq_rsp *rsp;
+ struct npa_lf *lf;
+ int rc;
+
+ lf = idev_npa_obj_get();
+ if (lf == NULL)
+ return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+ if (plt_bitmap_get(lf->npa_bmp, aura_id))
+ return -1;
+
+ req = mbox_alloc_msg_npa_aq_enq(lf->mbox);
+ if (!req) {
+ plt_err("Failed to alloc aq enq for npa");
+ return -1;
+ }
+
+ req->aura_id = aura_id;
+ req->ctype = NPA_AQ_CTYPE_AURA;
+ req->op = NPA_AQ_INSTOP_READ;
+
+ rc = mbox_process_msg(lf->mbox, (void *)&rsp);
+ if (rc) {
+ plt_err("Failed to get pool(%d) context", aura_id);
+ return rc;
+ }
+
+ aura = &rsp->aura;
+ CNXK_TEL_DICT_PTR(d, aura, pool_addr, w0_);
+ CNXK_TEL_DICT_INT(d, aura, ena, w1_);
+ CNXK_TEL_DICT_INT(d, aura, pool_caching, w1_);
+ CNXK_TEL_DICT_INT(d, aura, pool_way_mask, w1_);
+ CNXK_TEL_DICT_INT(d, aura, avg_con, w1_);
+ CNXK_TEL_DICT_INT(d, aura, pool_drop_ena, w1_);
+ CNXK_TEL_DICT_INT(d, aura, aura_drop_ena, w1_);
+ CNXK_TEL_DICT_INT(d, aura, bp_ena, w1_);
+ CNXK_TEL_DICT_INT(d, aura, aura_drop, w1_);
+ CNXK_TEL_DICT_INT(d, aura, avg_level, w1_);
+ CNXK_TEL_DICT_U64(d, aura, count, w2_);
+ CNXK_TEL_DICT_INT(d, aura, nix0_bpid, w2_);
+ CNXK_TEL_DICT_INT(d, aura, nix1_bpid, w2_);
+ CNXK_TEL_DICT_U64(d, aura, limit, w3_);
+ CNXK_TEL_DICT_INT(d, aura, bp, w3_);
+ CNXK_TEL_DICT_INT(d, aura, fc_ena, w3_);
+ CNXK_TEL_DICT_INT(d, aura, fc_up_crossing, w3_);
+ CNXK_TEL_DICT_INT(d, aura, fc_stype, w3_);
+ CNXK_TEL_DICT_INT(d, aura, fc_hyst_bits, w3_);
+ CNXK_TEL_DICT_INT(d, aura, fc_addr, w4_);
+ CNXK_TEL_DICT_INT(d, aura, pool_drop, w5_);
+ CNXK_TEL_DICT_INT(d, aura, update_time, w5_);
+ CNXK_TEL_DICT_INT(d, aura, err_int, w5_);
+ CNXK_TEL_DICT_INT(d, aura, err_int_ena, w5_);
+ CNXK_TEL_DICT_INT(d, aura, thresh_int, w5_);
+ CNXK_TEL_DICT_INT(d, aura, thresh_int_ena, w5_);
+ CNXK_TEL_DICT_INT(d, aura, thresh_up, w5_);
+ CNXK_TEL_DICT_INT(d, aura, thresh_qint_idx, w5_);
+ CNXK_TEL_DICT_INT(d, aura, err_qint_idx, w5_);
+ CNXK_TEL_DICT_U64(d, aura, thresh, w6_);
+
+ return 0;
+}
+
+static int
+cnxk_tel_npa_pool(int pool_id, struct plt_tel_data *d)
+{
+ __io struct npa_pool_s *pool;
+ struct npa_aq_enq_req *req;
+ struct npa_aq_enq_rsp *rsp;
+ struct npa_lf *lf;
+ int rc;
+
+ lf = idev_npa_obj_get();
+ if (lf == NULL)
+ return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+ if (plt_bitmap_get(lf->npa_bmp, pool_id))
+ return -1;
+
+ req = mbox_alloc_msg_npa_aq_enq(lf->mbox);
+ if (!req) {
+ plt_err("Failed to alloc aq enq for npa");
+ return -1;
+ }
+
+ req->aura_id = pool_id;
+ req->ctype = NPA_AQ_CTYPE_POOL;
+ req->op = NPA_AQ_INSTOP_READ;
+
+ rc = mbox_process_msg(lf->mbox, (void *)&rsp);
+ if (rc) {
+ plt_err("Failed to get pool(%d) context", pool_id);
+ return rc;
+ }
+
+ pool = &rsp->pool;
+ CNXK_TEL_DICT_PTR(d, pool, stack_base, w0_);
+ CNXK_TEL_DICT_INT(d, pool, ena, w1_);
+ CNXK_TEL_DICT_INT(d, pool, nat_align, w1_);
+ CNXK_TEL_DICT_INT(d, pool, stack_caching, w1_);
+ CNXK_TEL_DICT_INT(d, pool, stack_way_mask, w1_);
+ CNXK_TEL_DICT_INT(d, pool, buf_offset, w1_);
+ CNXK_TEL_DICT_INT(d, pool, buf_size, w1_);
+ CNXK_TEL_DICT_INT(d, pool, stack_max_pages, w2_);
+ CNXK_TEL_DICT_INT(d, pool, stack_pages, w2_);
+ CNXK_TEL_DICT_INT(d, pool, op_pc, w3_);
+ CNXK_TEL_DICT_INT(d, pool, stack_offset, w4_);
+ CNXK_TEL_DICT_INT(d, pool, shift, w4_);
+ CNXK_TEL_DICT_INT(d, pool, avg_level, w4_);
+ CNXK_TEL_DICT_INT(d, pool, avg_con, w4_);
+ CNXK_TEL_DICT_INT(d, pool, fc_ena, w4_);
+ CNXK_TEL_DICT_INT(d, pool, fc_stype, w4_);
+ CNXK_TEL_DICT_INT(d, pool, fc_hyst_bits, w4_);
+ CNXK_TEL_DICT_INT(d, pool, fc_up_crossing, w4_);
+ CNXK_TEL_DICT_INT(d, pool, update_time, w4_);
+ CNXK_TEL_DICT_PTR(d, pool, fc_addr, w5_);
+ CNXK_TEL_DICT_PTR(d, pool, ptr_start, w6_);
+ CNXK_TEL_DICT_PTR(d, pool, ptr_end, w7_);
+ CNXK_TEL_DICT_INT(d, pool, err_int, w8_);
+ CNXK_TEL_DICT_INT(d, pool, err_int_ena, w8_);
+ CNXK_TEL_DICT_INT(d, pool, thresh_int, w8_);
+ CNXK_TEL_DICT_INT(d, pool, thresh_int_ena, w8_);
+ CNXK_TEL_DICT_INT(d, pool, thresh_up, w8_);
+ CNXK_TEL_DICT_INT(d, pool, thresh_qint_idx, w8_);
+ CNXK_TEL_DICT_INT(d, pool, err_qint_idx, w8_);
+
+ return 0;
+}
+
+static int
+cnxk_npa_tel_handle_info(const char *cmd __plt_unused,
+ const char *params __plt_unused,
+ struct plt_tel_data *d)
+{
+ plt_tel_data_start_dict(d);
+ return cnxk_tel_npa(d);
+}
+
+static int
+cnxk_npa_tel_handle_info_x(const char *cmd, const char *params,
+ struct plt_tel_data *d)
+{
+ int id, rc;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -1;
+
+ id = atoi(params);
+ plt_tel_data_start_dict(d);
+
+ if (strstr(cmd, "aura/info"))
+ rc = cnxk_tel_npa_aura(id, d);
+ else
+ rc = cnxk_tel_npa_pool(id, d);
+
+ return rc;
+}
+
+PLT_INIT(cnxk_telemetry_npa_init)
+{
+ plt_telemetry_register_cmd(
+ "/cnxk/npa/info", cnxk_npa_tel_handle_info,
+ "Returns npa information. Takes no parameters");
+
+ plt_telemetry_register_cmd(
+ "/cnxk/npa/aura/info", cnxk_npa_tel_handle_info_x,
+ "Returns npa aura information. Parameters: aura_id");
+
+ plt_telemetry_register_cmd(
+ "/cnxk/npa/pool/info", cnxk_npa_tel_handle_info_x,
+ "Returns npa pool information. Parameters: pool_id");
+}
@@ -64,5 +64,7 @@ sources = files(
# Security common code
sources += files('cnxk_security.c')
-includes += include_directories('../../bus/pci')
-includes += include_directories('../../../lib/net')
+# Telemetry common code
+sources += files('cnxk_telemetry_npa.c')
+
+deps += ['bus_pci', 'net', 'telemetry']
@@ -19,6 +19,7 @@
#include <rte_pci.h>
#include <rte_spinlock.h>
#include <rte_string_fns.h>
+#include <rte_telemetry.h>
#include "roc_bits.h"
@@ -51,6 +52,7 @@
#define PLT_CACHE_LINE_SIZE RTE_CACHE_LINE_SIZE
#define BITMASK_ULL GENMASK_ULL
#define PLT_ALIGN_CEIL RTE_ALIGN_CEIL
+#define PLT_INIT RTE_INIT
/** Divide ceil */
#define PLT_DIV_CEIL(x, y) \
@@ -63,6 +65,7 @@
#define __plt_cache_aligned __rte_cache_aligned
#define __plt_always_inline __rte_always_inline
#define __plt_packed __rte_packed
+#define __plt_unused __rte_unused
#define __roc_api __rte_internal
#define plt_iova_t rte_iova_t
@@ -142,6 +145,15 @@
#define plt_strlcpy rte_strlcpy
+#define plt_tel_data rte_tel_data
+#define plt_tel_data_start_dict rte_tel_data_start_dict
+#define plt_tel_data_add_dict_int rte_tel_data_add_dict_int
+#define plt_tel_data_add_dict_ptr(d, n, v) \
+ rte_tel_data_add_dict_u64(d, n, (uint64_t)v)
+#define plt_tel_data_add_dict_string rte_tel_data_add_dict_string
+#define plt_tel_data_add_dict_u64 rte_tel_data_add_dict_u64
+#define plt_telemetry_register_cmd rte_telemetry_register_cmd
+
/* Log */
extern int cnxk_logtype_base;
extern int cnxk_logtype_mbox;