common/cnxk: support telemetry for network pool allocator
authorGowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
Tue, 19 Oct 2021 11:27:24 +0000 (16:57 +0530)
committerJerin Jacob <jerinj@marvell.com>
Tue, 19 Oct 2021 16:36:27 +0000 (18:36 +0200)
Add telemetry endpoints to NPA.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
drivers/common/cnxk/cnxk_telemetry.h [new file with mode: 0644]
drivers/common/cnxk/cnxk_telemetry_npa.c [new file with mode: 0644]
drivers/common/cnxk/meson.build
drivers/common/cnxk/roc_platform.h

diff --git a/drivers/common/cnxk/cnxk_telemetry.h b/drivers/common/cnxk/cnxk_telemetry.h
new file mode 100644 (file)
index 0000000..1461fd8
--- /dev/null
@@ -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_ */
diff --git a/drivers/common/cnxk/cnxk_telemetry_npa.c b/drivers/common/cnxk/cnxk_telemetry_npa.c
new file mode 100644 (file)
index 0000000..ae515df
--- /dev/null
@@ -0,0 +1,260 @@
+/* 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_STR(d, lf->pci_dev, name, pcidev_);
+       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, 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_aura_list(const char *cmd __plt_unused,
+                             const char *params __plt_unused,
+                             struct plt_tel_data *d)
+{
+       struct npa_lf *lf;
+       int i;
+
+       lf = idev_npa_obj_get();
+       if (lf == NULL)
+               return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+       plt_tel_data_start_array(d, PLT_TEL_INT_VAL);
+
+       for (i = 0; i < (int)lf->nr_pools; i++)
+               if (!plt_bitmap_get(lf->npa_bmp, i))
+                       rte_tel_data_add_array_int(d, i);
+
+       return 0;
+}
+
+static int
+cnxk_npa_tel_handle_pool_list(const char *cmd, const char *params,
+                             struct plt_tel_data *d)
+{
+       /* In current implementation, aura and pool ID mapped 1:1 */
+       return cnxk_npa_tel_handle_aura_list(cmd, params, 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 = strtol(params, NULL, 10);
+       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/list", cnxk_npa_tel_handle_aura_list,
+               "Returns list of npa aura id. 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/list", cnxk_npa_tel_handle_pool_list,
+               "Returns list of npa pool id. Takes no parameters");
+
+       plt_telemetry_register_cmd(
+               "/cnxk/npa/pool/info", cnxk_npa_tel_handle_info_x,
+               "Returns npa pool information. Parameters: pool_id");
+}
index 32d3ad5..f8292bd 100644 (file)
@@ -72,3 +72,8 @@ includes += include_directories('../../bus/pci')
 includes += include_directories('../../../lib/net')
 includes += include_directories('../../../lib/ethdev')
 includes += include_directories('../../../lib/meter')
+
+# Telemetry common code
+sources += files('cnxk_telemetry_npa.c')
+
+deps += ['bus_pci', 'net', 'telemetry']
index 3a586d3..b24b11f 100644 (file)
@@ -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
 
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_INT_VAL              RTE_TEL_INT_VAL
+#define plt_tel_data                 rte_tel_data
+#define plt_tel_data_start_array     rte_tel_data_start_array
+#define plt_tel_data_add_array_int   rte_tel_data_add_array_int
+#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;