[v4,1/2] common/cnxk: add telemetry endpoints to npa

Message ID 0a4a33e9c3cf4b5739a7edceedfd16435da94a59.1629997400.git.gmuthukrishn@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series cnxk: enable npa and mempool telemetry |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Gowrishankar Muthukrishnan Aug. 26, 2021, 5:15 p.m. UTC
  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 | 227 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   4 +
 drivers/common/cnxk/roc_platform.h       |   9 +
 4 files changed, 266 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
  

Comments

Bruce Richardson Aug. 26, 2021, 6:06 p.m. UTC | #1
On Thu, Aug 26, 2021 at 10:45:10PM +0530, Gowrishankar Muthukrishnan wrote:
> 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 | 227 +++++++++++++++++++++++
>  drivers/common/cnxk/meson.build          |   4 +
>  drivers/common/cnxk/roc_platform.h       |   9 +
>  4 files changed, 266 insertions(+)
>  create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
>  create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
> 
<snip>
> diff --git a/drivers/common/cnxk/meson.build b/drivers/common/cnxk/meson.build
> index 6a7849f31c..3cc9a2ff37 100644
> --- a/drivers/common/cnxk/meson.build
> +++ b/drivers/common/cnxk/meson.build
> @@ -60,5 +60,9 @@ sources = files(
>  # Security common code
>  sources += files('cnxk_security.c')
>  
> +# Telemetry common code
> +sources += files('cnxk_telemetry_npa.c')
> +
>  includes += include_directories('../../bus/pci')
>  includes += include_directories('../../../lib/net')
> +includes += include_directories('../../../lib/telemetry')

Rather than giving the include directories, I'd recommend using "deps"
variable to specify a direct dependency on those libraries. This should
probably be:

deps += ['bus_pci', 'net', 'telemetry']

Using these as dependencies means that the header paths will be added
automatically, and the libraries linked against too if any functions from
those are used by the code in this lib.

Regards,
/Bruce
  
Gowrishankar Muthukrishnan Aug. 27, 2021, 6:43 a.m. UTC | #2
> >  includes += include_directories('../../bus/pci')
> >  includes += include_directories('../../../lib/net')
> > +includes += include_directories('../../../lib/telemetry')
> 
> Rather than giving the include directories, I'd recommend using "deps"
> variable to specify a direct dependency on those libraries. This should probably
> be:
> 
> deps += ['bus_pci', 'net', 'telemetry']
> 
> Using these as dependencies means that the header paths will be added
> automatically, and the libraries linked against too if any functions from those
> are used by the code in this lib.
> 

Ack. Thanks Bruce.

Regards,
Gowrishankar
> Regards,
> /Bruce
  

Patch

diff --git a/drivers/common/cnxk/cnxk_telemetry.h b/drivers/common/cnxk/cnxk_telemetry.h
new file mode 100644
index 0000000000..1461fd893f
--- /dev/null
+++ b/drivers/common/cnxk/cnxk_telemetry.h
@@ -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
index 0000000000..1c2c2cd106
--- /dev/null
+++ b/drivers/common/cnxk/cnxk_telemetry_npa.c
@@ -0,0 +1,227 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+#include <rte_telemetry.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 (rte_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 (rte_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 __rte_unused,
+			 const char *params __rte_unused,
+			 struct rte_tel_data *d)
+{
+	plt_tel_data_start_dict(d);
+	cnxk_tel_npa(d);
+	return 0;
+}
+
+static int
+cnxk_npa_tel_handle_info_x(const char *cmd, const char *params,
+			   struct rte_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;
+}
+
+RTE_INIT(cnxk_telemetry_npa_init)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/npa/info", cnxk_npa_tel_handle_info,
+		"Returns npa information. Takes no parameters");
+
+	rte_telemetry_register_cmd(
+		"/cnxk/npa/aura/info", cnxk_npa_tel_handle_info_x,
+		"Returns npa aura information. Parameters: aura_id");
+
+	rte_telemetry_register_cmd(
+		"/cnxk/npa/pool/info", cnxk_npa_tel_handle_info_x,
+		"Returns npa pool information. Parameters: pool_id");
+}
diff --git a/drivers/common/cnxk/meson.build b/drivers/common/cnxk/meson.build
index 6a7849f31c..3cc9a2ff37 100644
--- a/drivers/common/cnxk/meson.build
+++ b/drivers/common/cnxk/meson.build
@@ -60,5 +60,9 @@  sources = files(
 # Security common code
 sources += files('cnxk_security.c')
 
+# Telemetry common code
+sources += files('cnxk_telemetry_npa.c')
+
 includes += include_directories('../../bus/pci')
 includes += include_directories('../../../lib/net')
+includes += include_directories('../../../lib/telemetry')
diff --git a/drivers/common/cnxk/roc_platform.h b/drivers/common/cnxk/roc_platform.h
index 285b24b82d..57b1229bb8 100644
--- a/drivers/common/cnxk/roc_platform.h
+++ b/drivers/common/cnxk/roc_platform.h
@@ -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"
 
@@ -139,6 +140,14 @@ 
 
 #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
+
 /* Log */
 extern int cnxk_logtype_base;
 extern int cnxk_logtype_mbox;