Skip to contentSkip to conversation

common/cnxk: enable npa telemetry

PATCH Superseded Gowrishankar Muthukrishnan 10 participants 121 messages Jul 29, 2021 – Nov 4, 2021 Page 1 of 2

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

cover common/cnxk: enable npa telemetry

This patch series enables telemetry in NPA LF of cnxk.

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value test/telemetry: add unit tests for pointer value common/cnxk: add telemetry endpoints to npa

 app/test/test_telemetry_data.c           | 124 +++++++++++++
 app/test/test_telemetry_json.c           |  28 ++-
 drivers/common/cnxk/cnxk_telemetry.h     |  23 +++
 drivers/common/cnxk/cnxk_telemetry_npa.c | 227 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   4 +
 drivers/common/cnxk/roc_platform.h       |   8 +
 lib/telemetry/rte_telemetry.h            |  37 +++-
 lib/telemetry/telemetry.c                |  21 ++-
 lib/telemetry/telemetry_data.c           |  40 +++-
 lib/telemetry/telemetry_data.h           |   2 +
 lib/telemetry/telemetry_json.h           |  31 ++++
 lib/telemetry/version.map                |   2 +
 12 files changed, 533 insertions(+), 14 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
Signature · 1 line
2.25.1
#1 lore raw

PATCH 1/3 telemetry: enable storing pointer value

At present, value of pointer variable or address can only be stored in u64 type which is slightly not human readable, hence this patch is. It adds telemetry support to store pointer value, which is stringified.

---
 lib/telemetry/rte_telemetry.h  | 37 ++++++++++++++++++++++++++++++-
 lib/telemetry/telemetry.c      | 21 ++++++++++++++++--
 lib/telemetry/telemetry_data.c | 40 ++++++++++++++++++++++++++++++----
 lib/telemetry/telemetry_data.h |  2 ++
 lib/telemetry/telemetry_json.h | 31 ++++++++++++++++++++++++++
 lib/telemetry/version.map      |  2 ++
 6 files changed, 126 insertions(+), 7 deletions(-)
lib/telemetry/rte_telemetry.h +36 -1
index 8776998b54..4c453d35d7 100644
@@ -46,7 +46,8 @@ enum rte_tel_value_type {
 	RTE_TEL_STRING_VAL, /** a string value */
 	RTE_TEL_INT_VAL,    /** a signed 32-bit int value */
 	RTE_TEL_U64_VAL,    /** an unsigned 64-bit int value */
-	RTE_TEL_CONTAINER, /** a container struct */
+	RTE_TEL_CONTAINER,  /** a container struct */
+	RTE_TEL_PTR_VAL,    /** a pointer value */
 };
 
 /**
@@ -137,6 +138,22 @@ __rte_experimental
 int
 rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);
 
+/**
+ * Add a pointer value to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_PTR_VAL as the type parameter.
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param x
+ *   The pointer value to be returned in the array
+ * @return
+ *   0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x);
+
 /**
  * Add a container to an array. A container is an existing telemetry data
  * array. The array the container is to be added to must have been started by
@@ -213,6 +230,24 @@ int
 rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 		const char *name, uint64_t val);
 
+/**
+ * Add a pointer value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param name
+ *   The name the value is to be stored under in the dict
+ * @param val
+ *   The pointer value to be stored in the dict
+ * @return
+ *   0 on success, negative errno on error, E2BIG on string truncation of name.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr);
+
 /**
  * Add a container to a dictionary. A container is an existing telemetry data
  * array. The dict the container is to be added to must have been started by
lib/telemetry/telemetry.c +19 -2
index 8665db8d03..5842b28740 100644
@@ -157,8 +157,10 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 	size_t used = 0;
 	unsigned int i;
 
-	if (d->type != RTE_TEL_ARRAY_U64 && d->type != RTE_TEL_ARRAY_INT
-			&& d->type != RTE_TEL_ARRAY_STRING)
+	if (d->type != RTE_TEL_ARRAY_U64
+		&& d->type != RTE_TEL_ARRAY_INT
+		&& d->type != RTE_TEL_ARRAY_PTR
+		&& d->type != RTE_TEL_ARRAY_STRING)
 		return snprintf(out_buf, buf_len, "null");
 
 	used = rte_tel_json_empty_array(out_buf, buf_len, 0);
@@ -167,6 +169,11 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 			used = rte_tel_json_add_array_u64(out_buf,
 				buf_len, used,
 				d->data.array[i].u64val);
+	if (d->type == RTE_TEL_ARRAY_PTR)
+		for (i = 0; i < d->data_len; i++)
+			used = rte_tel_json_add_array_ptr(out_buf,
+				buf_len, used,
+				d->data.array[i].ptrval);
 	if (d->type == RTE_TEL_ARRAY_INT)
 		for (i = 0; i < d->data_len; i++)
 			used = rte_tel_json_add_array_int(out_buf,
@@ -226,6 +233,11 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 						buf_len, used,
 						v->name, v->value.u64val);
 				break;
+			case RTE_TEL_PTR_VAL:
+				used = rte_tel_json_add_obj_ptr(cb_data_buf,
+						buf_len, used,
+						v->name, v->value.ptrval);
+				break;
 			case RTE_TEL_CONTAINER:
 			{
 				char temp[buf_len];
@@ -248,6 +260,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 	case RTE_TEL_ARRAY_STRING:
 	case RTE_TEL_ARRAY_INT:
 	case RTE_TEL_ARRAY_U64:
+	case RTE_TEL_ARRAY_PTR:
 	case RTE_TEL_ARRAY_CONTAINER:
 		prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":",
 				MAX_CMD_LEN, cmd);
@@ -269,6 +282,10 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 				used = rte_tel_json_add_array_u64(cb_data_buf,
 						buf_len, used,
 						d->data.array[i].u64val);
+			else if (d->type == RTE_TEL_ARRAY_PTR)
+				used = rte_tel_json_add_array_ptr(cb_data_buf,
+						buf_len, used,
+						d->data.array[i].ptrval);
 			else if (d->type == RTE_TEL_ARRAY_CONTAINER) {
 				char temp[buf_len];
 				const struct container *rec_data =
lib/telemetry/telemetry_data.c +36 -4
index 77b0fe09a5..9384f48589 100644
@@ -15,6 +15,7 @@ rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)
 			RTE_TEL_ARRAY_INT,    /* RTE_TEL_INT_VAL = 1 */
 			RTE_TEL_ARRAY_U64,    /* RTE_TEL_u64_VAL = 2 */
 			RTE_TEL_ARRAY_CONTAINER, /* RTE_TEL_CONTAINER = 3 */
+			RTE_TEL_ARRAY_PTR,    /* RTE_TEL_PTR_VAL = 4 */
 	};
 	d->type = array_types[type];
 	d->data_len = 0;
@@ -75,6 +76,17 @@ rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x)
 	return 0;
 }
 
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x)
+{
+	if (d->type != RTE_TEL_ARRAY_PTR)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+		return -ENOSPC;
+	d->data.array[d->data_len++].ptrval = x;
+	return 0;
+}
+
 int
 rte_tel_data_add_array_container(struct rte_tel_data *d,
 		struct rte_tel_data *val, int keep)
@@ -82,7 +94,8 @@ rte_tel_data_add_array_container(struct rte_tel_data *d,
 	if (d->type != RTE_TEL_ARRAY_CONTAINER ||
 			(val->type != RTE_TEL_ARRAY_U64
 			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+			&& val->type != RTE_TEL_ARRAY_STRING
+			&& val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
 		return -ENOSPC;
@@ -147,15 +160,34 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
 }
 
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr)
+{
+	struct tel_dict_entry *e = &d->data.dict[d->data_len];
+	if (d->type != RTE_TEL_DICT)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+		return -ENOSPC;
+
+	d->data_len++;
+	e->type = RTE_TEL_PTR_VAL;
+	e->value.ptrval = ptr;
+	const size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}
+
 int
 rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,
 		struct rte_tel_data *val, int keep)
 {
 	struct tel_dict_entry *e = &d->data.dict[d->data_len];
 
-	if (d->type != RTE_TEL_DICT || (val->type != RTE_TEL_ARRAY_U64
-			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+	if (d->type != RTE_TEL_DICT ||
+		(val->type != RTE_TEL_ARRAY_U64
+		 && val->type != RTE_TEL_ARRAY_INT
+		 && val->type != RTE_TEL_ARRAY_STRING
+		 && val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
 		return -ENOSPC;
lib/telemetry/telemetry_data.h +2 -0
index adb84a09f1..bb361e3bcc 100644
@@ -16,6 +16,7 @@ enum tel_container_types {
 	RTE_TEL_ARRAY_INT,    /** array of signed, 32-bit int values */
 	RTE_TEL_ARRAY_U64,    /** array of unsigned 64-bit int values */
 	RTE_TEL_ARRAY_CONTAINER, /** array of container structs */
+	RTE_TEL_ARRAY_PTR,    /** array of pointer values */
 };
 
 struct container {
@@ -31,6 +32,7 @@ union tel_value {
 	char sval[RTE_TEL_MAX_STRING_LEN];
 	int ival;
 	uint64_t u64val;
+	void *ptrval;
 	struct container container;
 };
 
lib/telemetry/telemetry_json.h +31 -0
index ad270b9b30..96762fc267 100644
@@ -102,6 +102,19 @@ rte_tel_json_add_array_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/* Appends a pointer value into the JSON array in the provided buffer. */
+static inline int
+rte_tel_json_add_array_ptr(char *buf, const int len, const int used,
+		void *ptr)
+{
+	int ret, end = used - 1; /* strip off final delimiter */
+	if (used <= 2) /* assume empty, since minimum is '[]' */
+		return __json_snprintf(buf, len, "[\"%p\"]", ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",\"%p\"]", ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /*
  * Add a new element with raw JSON value to the JSON array stored in the
  * provided buffer.
@@ -136,6 +149,24 @@ rte_tel_json_add_obj_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/**
+ * Add a new element with uint64_t value to the JSON object stored in the
+ * provided buffer.
+ */
+static inline int
+rte_tel_json_add_obj_ptr(char *buf, const int len, const int used,
+		const char *name, void *ptr)
+{
+	int ret, end = used - 1;
+	if (used <= 2) /* assume empty, since minimum is '{}' */
+		return __json_snprintf(buf, len, "{\"%s\":\"%p\"}", name,
+				ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",\"%s\":\"%p\"}",
+			name, ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /**
  * Add a new element with int value to the JSON object stored in the
  * provided buffer.
lib/telemetry/version.map +2 -0
index bde80ce29b..d919340bc6 100644
@@ -5,10 +5,12 @@ EXPERIMENTAL {
 	rte_tel_data_add_array_int;
 	rte_tel_data_add_array_string;
 	rte_tel_data_add_array_u64;
+	rte_tel_data_add_array_ptr;
 	rte_tel_data_add_dict_container;
 	rte_tel_data_add_dict_int;
 	rte_tel_data_add_dict_string;
 	rte_tel_data_add_dict_u64;
+	rte_tel_data_add_dict_ptr;
 	rte_tel_data_alloc;
 	rte_tel_data_free;
 	rte_tel_data_start_array;
Signature · 1 line
2.25.1
#5 lore raw

PATCH 2/3 test/telemetry: add unit tests for pointer value

In reply to Gowrishankar Muthukrishnan

Adding tests to evaluate pointer value in array and dict.

---
 app/test/test_telemetry_data.c | 124 +++++++++++++++++++++++++++++++++
 app/test/test_telemetry_json.c |  28 ++++++--
 2 files changed, 145 insertions(+), 7 deletions(-)
app/test/test_telemetry_data.c +124 -0
index f34d691265..59f68f135a 100644
@@ -301,6 +301,126 @@ test_array_with_array_u64_values(void)
 	return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}");
 }
 
+static int
+test_case_array_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[120];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_PTR_VAL);
+
+	i = sprintf(exp, "{\"/test\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "\"%p\",", p);
+		rte_tel_data_add_array_ptr(&response_data, p);
+	}
+
+	sprintf(exp + i - 1, "]}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_case_add_dict_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char name[8], exp[160];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		sprintf(name, "dict_%d", j);
+		i += sprintf(exp + i, "\"%s\":\"%p\",", name, p);
+		rte_tel_data_add_dict_ptr(&response_data, name, p);
+	}
+
+	sprintf(exp + i - 1, "}}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_dict_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{\"dict_0\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "\"%p\",", p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],\"dict_1\":[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "\"%p\",", p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]}}");
+	rte_tel_data_add_dict_container(&response_data, "dict_0",
+								child_data, 0);
+	rte_tel_data_add_dict_container(&response_data, "dict_1",
+								child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_array_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
+
+	i = sprintf(exp, "{\"/test\":[[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "\"%p\",", p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "\"%p\",", p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]]}");
+
+	rte_tel_data_add_array_container(&response_data, child_data, 0);
+	rte_tel_data_add_array_container(&response_data, child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
 static int
 connect_to_socket(void)
 {
@@ -350,13 +470,17 @@ test_telemetry_data(void)
 
 	test_case test_cases[] = {test_case_array_string,
 			test_case_array_int, test_case_array_u64,
+			test_case_array_ptr,
 			test_case_add_dict_int, test_case_add_dict_u64,
+			test_case_add_dict_ptr,
 			test_case_add_dict_string,
 			test_dict_with_array_int_values,
 			test_dict_with_array_u64_values,
+			test_dict_with_array_ptr_values,
 			test_dict_with_array_string_values,
 			test_array_with_array_int_values,
 			test_array_with_array_u64_values,
+			test_array_with_array_ptr_values,
 			test_array_with_array_string_values };
 
 	rte_telemetry_register_cmd(REQUEST_CMD, test_cb, "Test");
app/test/test_telemetry_json.c +21 -7
index 790181d316..3e8e60638c 100644
@@ -11,18 +11,22 @@
 static int
 test_basic_array(void)
 {
-	const char *expected = "[\"meaning of life\",42]";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
 
 	printf("%s: ", __func__);
 	used = rte_tel_json_empty_array(buf, sizeof(buf), used);
 	if (used != 2 || strcmp(buf, "[]"))
 		return -1;
 
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected, "[\"meaning of life\",42,\"%p\"]", p);
+
 	used = rte_tel_json_add_array_string(buf, sizeof(buf), used,
 		"meaning of life");
-	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, 42);
+	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, n);
+	used = rte_tel_json_add_array_ptr(buf, sizeof(buf), used, p);
 
 	printf("buf = '%s', expected = '%s'\n", buf, expected);
 	if (used != (int)strlen(expected))
@@ -33,14 +37,24 @@ test_basic_array(void)
 static int
 test_basic_obj(void)
 {
-	const char *expected = "{\"weddings\":4,\"funerals\":1}";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
+
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected,
+			"{\"weddings\":4,\"funerals\":1,"
+			"\"address\":\"%p\",\"reset\":\"(nil)\"}", p);
 
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"weddings", 4);
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"funerals", 1);
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"address", p);
+	p = NULL;
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"reset", p);
 
 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
 	if (used != (int)strlen(expected))
Signature · 1 line
2.25.1
#6 lore raw

PATCH 3/3 common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to npa.

---
 drivers/common/cnxk/cnxk_telemetry.h     |  23 +++
 drivers/common/cnxk/cnxk_telemetry_npa.c | 227 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   4 +
 drivers/common/cnxk/roc_platform.h       |   8 +
 4 files changed, 262 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
drivers/common/cnxk/cnxk_telemetry.h new file +23 -0
new file mode 100644
index 0000000000..9ac1487020
@@ -0,0 +1,23 @@
+/* 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)
+
+#endif /* __CNXK_TELEMETRY_H_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +227 -0

227 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -0
index 6a7849f31c..3cc9a2ff37 100644
@@ -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')
drivers/common/cnxk/roc_platform.h +8 -0
index 285b24b82d..9fcaee8254 100644
@@ -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,13 @@
 
 #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    rte_tel_data_add_dict_ptr
+#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;
Signature · 1 line
2.25.1
#2 lore raw

Re: [dpdk-dev] [v1, 1/3] telemetry: enable storing pointer value

In reply to Gowrishankar Muthukrishnan
Quoted 7 lines · Gowrishankar Muthukrishnan

At present, value of pointer variable or address can only be stored in u64 type which is slightly not human readable, hence this patch is. It adds telemetry support to store pointer value, which is stringified.

---

I'm a little curious as to the usefulness of having a pointer value in telemetry output? How would a telemetry user be expected to use pointer information returned? Printing pointers seems something more useful for a debugging or tracing interface than a telemetry one.

Regards,
/Bruce

#3 lore raw

Re: [dpdk-dev] [EXT] Re: [v1, 1/3] telemetry: enable storing pointer value

Hi Bruce,

Quoted 5 lines

I'm a little curious as to the usefulness of having a pointer value in telemetry output? How would a telemetry user be expected to use pointer information returned? Printing pointers seems something more useful for a debugging or tracing interface than a telemetry one.

Thanks for the quick review. I enabled _ptr API keeping few things in mind:

1. User need to explicitly type cast pointer value (ie address) to uint64_t which otherwise can cause compiler warning (Wint-conversion). Although u64 is large enough for holding address as value, type casting is problematic for non-64 bit machines (eg 32 bit). One other option is to use uintptr_t as a holder.

2. With this API, code walk could be easier as user can interpret the accessed data better (ie ptr is address value). _ptr API is meant for pointer variables, though it is up to user to choose.

3. Also while debugging telemetry date using script like usertools/dpdk-telemetry.py, perceiving address as hex is quicker than same as u64.

Answering on returned data, user needs to convert stringified hex to pointer value.

Regards,
Gowrishankar

#7 lore raw

v2 cover common/cnxk: enable npa telemetry

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in NPA LF of cnxk.

v2:
* using uintptr_t to encode pointer value in json.

*** BLURB HERE ***

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value test/telemetry: add unit tests for pointer value common/cnxk: add telemetry endpoints to npa

 app/test/test_telemetry_data.c           | 124 +++++++++++++
 app/test/test_telemetry_json.c           |  28 ++-
 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       |   8 +
 lib/telemetry/rte_telemetry.h            |  37 +++-
 lib/telemetry/telemetry.c                |  21 ++-
 lib/telemetry/telemetry_data.c           |  40 +++-
 lib/telemetry/telemetry_data.h           |   2 +
 lib/telemetry/telemetry_json.h           |  31 ++++
 lib/telemetry/version.map                |   2 +
 12 files changed, 536 insertions(+), 14 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
Signature · 1 line
2.25.1
#8 lore raw

PATCH v2 1/3 telemetry: enable storing pointer value

At present, value of pointer variable or address is stored in u64 type which may not properly work in non64 bit arch. Hence, this patch adds new API to store it in void*. JSON encoding is after converting to uintptr_t so, address value is correctly casted as per arch as well. Once JSON5 support is available at JSON clients, hex value of address can be encoded instead of uintptr_t.

---
 lib/telemetry/rte_telemetry.h  | 37 ++++++++++++++++++++++++++++++-
 lib/telemetry/telemetry.c      | 21 ++++++++++++++++--
 lib/telemetry/telemetry_data.c | 40 ++++++++++++++++++++++++++++++----
 lib/telemetry/telemetry_data.h |  2 ++
 lib/telemetry/telemetry_json.h | 31 ++++++++++++++++++++++++++
 lib/telemetry/version.map      |  2 ++
 6 files changed, 126 insertions(+), 7 deletions(-)
lib/telemetry/rte_telemetry.h +36 -1
index 8776998b54..6a420f918c 100644
@@ -46,7 +46,8 @@ enum rte_tel_value_type {
 	RTE_TEL_STRING_VAL, /** a string value */
 	RTE_TEL_INT_VAL,    /** a signed 32-bit int value */
 	RTE_TEL_U64_VAL,    /** an unsigned 64-bit int value */
-	RTE_TEL_CONTAINER, /** a container struct */
+	RTE_TEL_CONTAINER,  /** a container struct */
+	RTE_TEL_PTR_VAL,    /** a pointer value */
 };
 
 /**
@@ -137,6 +138,22 @@ __rte_experimental
 int
 rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);
 
+/**
+ * Add a pointer value to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_PTR_VAL as the type parameter.
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param x
+ *   The pointer value to be returned in the array
+ * @return
+ *   0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x);
+
 /**
  * Add a container to an array. A container is an existing telemetry data
  * array. The array the container is to be added to must have been started by
@@ -213,6 +230,24 @@ int
 rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 		const char *name, uint64_t val);
 
+/**
+ * Add a pointer value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param name
+ *   The name the value is to be stored under in the dict
+ * @param ptr
+ *   The pointer value to be stored in the dict
+ * @return
+ *   0 on success, negative errno on error, E2BIG on string truncation of name.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr);
+
 /**
  * Add a container to a dictionary. A container is an existing telemetry data
  * array. The dict the container is to be added to must have been started by
lib/telemetry/telemetry.c +19 -2
index 8665db8d03..5842b28740 100644
@@ -157,8 +157,10 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 	size_t used = 0;
 	unsigned int i;
 
-	if (d->type != RTE_TEL_ARRAY_U64 && d->type != RTE_TEL_ARRAY_INT
-			&& d->type != RTE_TEL_ARRAY_STRING)
+	if (d->type != RTE_TEL_ARRAY_U64
+		&& d->type != RTE_TEL_ARRAY_INT
+		&& d->type != RTE_TEL_ARRAY_PTR
+		&& d->type != RTE_TEL_ARRAY_STRING)
 		return snprintf(out_buf, buf_len, "null");
 
 	used = rte_tel_json_empty_array(out_buf, buf_len, 0);
@@ -167,6 +169,11 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 			used = rte_tel_json_add_array_u64(out_buf,
 				buf_len, used,
 				d->data.array[i].u64val);
+	if (d->type == RTE_TEL_ARRAY_PTR)
+		for (i = 0; i < d->data_len; i++)
+			used = rte_tel_json_add_array_ptr(out_buf,
+				buf_len, used,
+				d->data.array[i].ptrval);
 	if (d->type == RTE_TEL_ARRAY_INT)
 		for (i = 0; i < d->data_len; i++)
 			used = rte_tel_json_add_array_int(out_buf,
@@ -226,6 +233,11 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 						buf_len, used,
 						v->name, v->value.u64val);
 				break;
+			case RTE_TEL_PTR_VAL:
+				used = rte_tel_json_add_obj_ptr(cb_data_buf,
+						buf_len, used,
+						v->name, v->value.ptrval);
+				break;
 			case RTE_TEL_CONTAINER:
 			{
 				char temp[buf_len];
@@ -248,6 +260,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 	case RTE_TEL_ARRAY_STRING:
 	case RTE_TEL_ARRAY_INT:
 	case RTE_TEL_ARRAY_U64:
+	case RTE_TEL_ARRAY_PTR:
 	case RTE_TEL_ARRAY_CONTAINER:
 		prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":",
 				MAX_CMD_LEN, cmd);
@@ -269,6 +282,10 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 				used = rte_tel_json_add_array_u64(cb_data_buf,
 						buf_len, used,
 						d->data.array[i].u64val);
+			else if (d->type == RTE_TEL_ARRAY_PTR)
+				used = rte_tel_json_add_array_ptr(cb_data_buf,
+						buf_len, used,
+						d->data.array[i].ptrval);
 			else if (d->type == RTE_TEL_ARRAY_CONTAINER) {
 				char temp[buf_len];
 				const struct container *rec_data =
lib/telemetry/telemetry_data.c +36 -4
index 77b0fe09a5..9384f48589 100644
@@ -15,6 +15,7 @@ rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)
 			RTE_TEL_ARRAY_INT,    /* RTE_TEL_INT_VAL = 1 */
 			RTE_TEL_ARRAY_U64,    /* RTE_TEL_u64_VAL = 2 */
 			RTE_TEL_ARRAY_CONTAINER, /* RTE_TEL_CONTAINER = 3 */
+			RTE_TEL_ARRAY_PTR,    /* RTE_TEL_PTR_VAL = 4 */
 	};
 	d->type = array_types[type];
 	d->data_len = 0;
@@ -75,6 +76,17 @@ rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x)
 	return 0;
 }
 
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x)
+{
+	if (d->type != RTE_TEL_ARRAY_PTR)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+		return -ENOSPC;
+	d->data.array[d->data_len++].ptrval = x;
+	return 0;
+}
+
 int
 rte_tel_data_add_array_container(struct rte_tel_data *d,
 		struct rte_tel_data *val, int keep)
@@ -82,7 +94,8 @@ rte_tel_data_add_array_container(struct rte_tel_data *d,
 	if (d->type != RTE_TEL_ARRAY_CONTAINER ||
 			(val->type != RTE_TEL_ARRAY_U64
 			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+			&& val->type != RTE_TEL_ARRAY_STRING
+			&& val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
 		return -ENOSPC;
@@ -147,15 +160,34 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
 }
 
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr)
+{
+	struct tel_dict_entry *e = &d->data.dict[d->data_len];
+	if (d->type != RTE_TEL_DICT)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+		return -ENOSPC;
+
+	d->data_len++;
+	e->type = RTE_TEL_PTR_VAL;
+	e->value.ptrval = ptr;
+	const size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}
+
 int
 rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,
 		struct rte_tel_data *val, int keep)
 {
 	struct tel_dict_entry *e = &d->data.dict[d->data_len];
 
-	if (d->type != RTE_TEL_DICT || (val->type != RTE_TEL_ARRAY_U64
-			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+	if (d->type != RTE_TEL_DICT ||
+		(val->type != RTE_TEL_ARRAY_U64
+		 && val->type != RTE_TEL_ARRAY_INT
+		 && val->type != RTE_TEL_ARRAY_STRING
+		 && val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
 		return -ENOSPC;
lib/telemetry/telemetry_data.h +2 -0
index adb84a09f1..bb361e3bcc 100644
@@ -16,6 +16,7 @@ enum tel_container_types {
 	RTE_TEL_ARRAY_INT,    /** array of signed, 32-bit int values */
 	RTE_TEL_ARRAY_U64,    /** array of unsigned 64-bit int values */
 	RTE_TEL_ARRAY_CONTAINER, /** array of container structs */
+	RTE_TEL_ARRAY_PTR,    /** array of pointer values */
 };
 
 struct container {
@@ -31,6 +32,7 @@ union tel_value {
 	char sval[RTE_TEL_MAX_STRING_LEN];
 	int ival;
 	uint64_t u64val;
+	void *ptrval;
 	struct container container;
 };
 
lib/telemetry/telemetry_json.h +31 -0
index ad270b9b30..3e4f026b44 100644
@@ -102,6 +102,19 @@ rte_tel_json_add_array_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/* Appends a pointer value into the JSON array in the provided buffer. */
+static inline int
+rte_tel_json_add_array_ptr(char *buf, const int len, const int used,
+		void *ptr)
+{
+	int ret, end = used - 1; /* strip off final delimiter */
+	if (used <= 2) /* assume empty, since minimum is '[]' */
+		return __json_snprintf(buf, len, "[%ld]", (uintptr_t)ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",%ld]", (uintptr_t)ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /*
  * Add a new element with raw JSON value to the JSON array stored in the
  * provided buffer.
@@ -136,6 +149,24 @@ rte_tel_json_add_obj_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/**
+ * Add a new element with uint64_t value to the JSON object stored in the
+ * provided buffer.
+ */
+static inline int
+rte_tel_json_add_obj_ptr(char *buf, const int len, const int used,
+		const char *name, void *ptr)
+{
+	int ret, end = used - 1;
+	if (used <= 2) /* assume empty, since minimum is '{}' */
+		return __json_snprintf(buf, len, "{\"%s\":%ld}", name,
+				(uintptr_t)ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",\"%s\":%ld}", name,
+				(uintptr_t)ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /**
  * Add a new element with int value to the JSON object stored in the
  * provided buffer.
lib/telemetry/version.map +2 -0
index bde80ce29b..d919340bc6 100644
@@ -5,10 +5,12 @@ EXPERIMENTAL {
 	rte_tel_data_add_array_int;
 	rte_tel_data_add_array_string;
 	rte_tel_data_add_array_u64;
+	rte_tel_data_add_array_ptr;
 	rte_tel_data_add_dict_container;
 	rte_tel_data_add_dict_int;
 	rte_tel_data_add_dict_string;
 	rte_tel_data_add_dict_u64;
+	rte_tel_data_add_dict_ptr;
 	rte_tel_data_alloc;
 	rte_tel_data_free;
 	rte_tel_data_start_array;
Signature · 1 line
2.25.1
#9 lore raw

PATCH v2 2/3 test/telemetry: add unit tests for pointer value

In reply to Gowrishankar Muthukrishnan

Adding tests to evaluate pointer value in array and dict.

---
 app/test/test_telemetry_data.c | 124 +++++++++++++++++++++++++++++++++
 app/test/test_telemetry_json.c |  28 ++++++--
 2 files changed, 145 insertions(+), 7 deletions(-)
app/test/test_telemetry_data.c +124 -0
index f34d691265..2823cd0984 100644
@@ -301,6 +301,126 @@ test_array_with_array_u64_values(void)
 	return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}");
 }
 
+static int
+test_case_array_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[120];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_PTR_VAL);
+
+	i = sprintf(exp, "{\"/test\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%ld,", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(&response_data, p);
+	}
+
+	sprintf(exp + i - 1, "]}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_case_add_dict_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char name[8], exp[160];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		sprintf(name, "dict_%d", j);
+		i += sprintf(exp + i, "\"%s\":%ld,", name, (uintptr_t)p);
+		rte_tel_data_add_dict_ptr(&response_data, name, p);
+	}
+
+	sprintf(exp + i - 1, "}}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_dict_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{\"dict_0\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%ld,", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],\"dict_1\":[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "%ld,", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]}}");
+	rte_tel_data_add_dict_container(&response_data, "dict_0",
+								child_data, 0);
+	rte_tel_data_add_dict_container(&response_data, "dict_1",
+								child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_array_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
+
+	i = sprintf(exp, "{\"/test\":[[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%ld,", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "%ld,", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]]}");
+
+	rte_tel_data_add_array_container(&response_data, child_data, 0);
+	rte_tel_data_add_array_container(&response_data, child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
 static int
 connect_to_socket(void)
 {
@@ -350,13 +470,17 @@ test_telemetry_data(void)
 
 	test_case test_cases[] = {test_case_array_string,
 			test_case_array_int, test_case_array_u64,
+			test_case_array_ptr,
 			test_case_add_dict_int, test_case_add_dict_u64,
+			test_case_add_dict_ptr,
 			test_case_add_dict_string,
 			test_dict_with_array_int_values,
 			test_dict_with_array_u64_values,
+			test_dict_with_array_ptr_values,
 			test_dict_with_array_string_values,
 			test_array_with_array_int_values,
 			test_array_with_array_u64_values,
+			test_array_with_array_ptr_values,
 			test_array_with_array_string_values };
 
 	rte_telemetry_register_cmd(REQUEST_CMD, test_cb, "Test");
app/test/test_telemetry_json.c +21 -7
index 790181d316..4177c77dd0 100644
@@ -11,18 +11,22 @@
 static int
 test_basic_array(void)
 {
-	const char *expected = "[\"meaning of life\",42]";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
 
 	printf("%s: ", __func__);
 	used = rte_tel_json_empty_array(buf, sizeof(buf), used);
 	if (used != 2 || strcmp(buf, "[]"))
 		return -1;
 
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected, "[\"meaning of life\",42,%ld]", (uintptr_t)p);
+
 	used = rte_tel_json_add_array_string(buf, sizeof(buf), used,
 		"meaning of life");
-	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, 42);
+	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, n);
+	used = rte_tel_json_add_array_ptr(buf, sizeof(buf), used, p);
 
 	printf("buf = '%s', expected = '%s'\n", buf, expected);
 	if (used != (int)strlen(expected))
@@ -33,14 +37,24 @@ test_basic_array(void)
 static int
 test_basic_obj(void)
 {
-	const char *expected = "{\"weddings\":4,\"funerals\":1}";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
+
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected,
+			"{\"weddings\":4,\"funerals\":1,"
+			"\"address\":%ld,\"reset\":0}", (uintptr_t)p);
 
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"weddings", 4);
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"funerals", 1);
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"address", p);
+	p = NULL;
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"reset", p);
 
 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
 	if (used != (int)strlen(expected))
Signature · 1 line
2.25.1
#10 lore raw

PATCH v2 3/3 common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to npa.

---
 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       |   8 +
 4 files changed, 265 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..5e69f78d2e
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +227 -0

227 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -0
index 6a7849f31c..3cc9a2ff37 100644
@@ -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')
drivers/common/cnxk/roc_platform.h +8 -0
index 285b24b82d..9fcaee8254 100644
@@ -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,13 @@
 
 #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    rte_tel_data_add_dict_ptr
+#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;
Signature · 1 line
2.25.1
#4 lore raw

Re: [dpdk-dev] [EXT] Re: [v1, 1/3] telemetry: enable storing pointer value

In reply to Gowrishankar Muthukrishnan
Quoted 22 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan
Sent: Friday, July 30, 2021 5:38 PM
To: Bruce Richardson <[email protected]>
Cc: [email protected]; [email protected]; Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>
Subject: RE: [EXT] Re: [dpdk-dev] [v1, 1/3] telemetry: enable storing pointer value

Hi Bruce,

Quoted 5 lines

I'm a little curious as to the usefulness of having a pointer value in telemetry output? How would a telemetry user be expected to use pointer information returned? Printing pointers seems something more useful for a debugging or tracing interface than a telemetry one.

Quoted 8 lines

Thanks for the quick review. I enabled _ptr API keeping few things in mind:

1. User need to explicitly type cast pointer value (ie address) to uint64_t which otherwise can cause compiler warning (Wint-conversion). Although u64 is large enough for holding address as value, type casting is problematic for non-64 bit machines (eg 32 bit). One other option is to use uintptr_t as a holder.

Please check [v2].
I modified json encoding to uintptr instead of stringified hex as in current patch. I think, this is better approach as pointer value is stored more correctly (void *) as well as retrieved in JSON following uintptr_t cast. Also I think, this is architecture compliant approach rather than assuming pointer address is always 64 bit (and what if 128 bit comes alive - who knows when). Aim is to leave _ptr api architecture compliance anytime.

Quoted 4 lines

2. With this API, code walk could be easier as user can interpret the accessed data better (ie ptr is address value). _ptr API is meant for pointer variables, though it is up to user to choose.

With above uintptr_t as encoded value, it does not change the client handling as client would consume it as its architecture supported value (uint64_t). One advantage of having this API is to support JSON5 compliance hex address once decided so in future.

Quoted 6 lines

3. Also while debugging telemetry date using script like usertools/dpdk- telemetry.py,
perceiving address as hex is quicker than same as u64.

Answering on returned data, user needs to convert stringified hex to pointer value.

With uintptr_t value (in new patch), no change is needed in client side.

Please suggest.
Thanks,
Gowrishankar

Quoted 3 lines

Regards,
Gowrishankar

#11 lore raw

v3 cover common/cnxk: enable npa telemetry

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in NPA LF of cnxk.

v3:
- fixed format specifier for uintptr_t

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value test/telemetry: add unit tests for pointer value common/cnxk: add telemetry endpoints to npa

 app/test/test_telemetry_data.c           | 125 +++++++++++++
 app/test/test_telemetry_json.c           |  29 ++-
 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       |   8 +
 lib/telemetry/rte_telemetry.h            |  37 +++-
 lib/telemetry/telemetry.c                |  21 ++-
 lib/telemetry/telemetry_data.c           |  40 +++-
 lib/telemetry/telemetry_data.h           |   2 +
 lib/telemetry/telemetry_json.h           |  32 ++++
 lib/telemetry/version.map                |   2 +
 12 files changed, 539 insertions(+), 14 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
Signature · 1 line
2.25.1
#12 lore raw

PATCH v3 1/3 telemetry: enable storing pointer value

At present, value of pointer variable or address is stored in u64 type which may not properly work in non64 bit arch. Hence, this patch adds new API to store it in void*. JSON encoding is after converting to uintptr_t so, address value is correctly casted as per arch as well. Once JSON5 support is available at JSON clients, hex value of address can be encoded instead of uintptr_t.

---
 lib/telemetry/rte_telemetry.h  | 37 ++++++++++++++++++++++++++++++-
 lib/telemetry/telemetry.c      | 21 ++++++++++++++++--
 lib/telemetry/telemetry_data.c | 40 ++++++++++++++++++++++++++++++----
 lib/telemetry/telemetry_data.h |  2 ++
 lib/telemetry/telemetry_json.h | 32 +++++++++++++++++++++++++++
 lib/telemetry/version.map      |  2 ++
 6 files changed, 127 insertions(+), 7 deletions(-)
lib/telemetry/rte_telemetry.h +36 -1
index 8776998b54..6a420f918c 100644
@@ -46,7 +46,8 @@ enum rte_tel_value_type {
 	RTE_TEL_STRING_VAL, /** a string value */
 	RTE_TEL_INT_VAL,    /** a signed 32-bit int value */
 	RTE_TEL_U64_VAL,    /** an unsigned 64-bit int value */
-	RTE_TEL_CONTAINER, /** a container struct */
+	RTE_TEL_CONTAINER,  /** a container struct */
+	RTE_TEL_PTR_VAL,    /** a pointer value */
 };
 
 /**
@@ -137,6 +138,22 @@ __rte_experimental
 int
 rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);
 
+/**
+ * Add a pointer value to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_PTR_VAL as the type parameter.
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param x
+ *   The pointer value to be returned in the array
+ * @return
+ *   0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x);
+
 /**
  * Add a container to an array. A container is an existing telemetry data
  * array. The array the container is to be added to must have been started by
@@ -213,6 +230,24 @@ int
 rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 		const char *name, uint64_t val);
 
+/**
+ * Add a pointer value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ *   The data structure passed to the callback
+ * @param name
+ *   The name the value is to be stored under in the dict
+ * @param ptr
+ *   The pointer value to be stored in the dict
+ * @return
+ *   0 on success, negative errno on error, E2BIG on string truncation of name.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr);
+
 /**
  * Add a container to a dictionary. A container is an existing telemetry data
  * array. The dict the container is to be added to must have been started by
lib/telemetry/telemetry.c +19 -2
index 8665db8d03..5842b28740 100644
@@ -157,8 +157,10 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 	size_t used = 0;
 	unsigned int i;
 
-	if (d->type != RTE_TEL_ARRAY_U64 && d->type != RTE_TEL_ARRAY_INT
-			&& d->type != RTE_TEL_ARRAY_STRING)
+	if (d->type != RTE_TEL_ARRAY_U64
+		&& d->type != RTE_TEL_ARRAY_INT
+		&& d->type != RTE_TEL_ARRAY_PTR
+		&& d->type != RTE_TEL_ARRAY_STRING)
 		return snprintf(out_buf, buf_len, "null");
 
 	used = rte_tel_json_empty_array(out_buf, buf_len, 0);
@@ -167,6 +169,11 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)
 			used = rte_tel_json_add_array_u64(out_buf,
 				buf_len, used,
 				d->data.array[i].u64val);
+	if (d->type == RTE_TEL_ARRAY_PTR)
+		for (i = 0; i < d->data_len; i++)
+			used = rte_tel_json_add_array_ptr(out_buf,
+				buf_len, used,
+				d->data.array[i].ptrval);
 	if (d->type == RTE_TEL_ARRAY_INT)
 		for (i = 0; i < d->data_len; i++)
 			used = rte_tel_json_add_array_int(out_buf,
@@ -226,6 +233,11 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 						buf_len, used,
 						v->name, v->value.u64val);
 				break;
+			case RTE_TEL_PTR_VAL:
+				used = rte_tel_json_add_obj_ptr(cb_data_buf,
+						buf_len, used,
+						v->name, v->value.ptrval);
+				break;
 			case RTE_TEL_CONTAINER:
 			{
 				char temp[buf_len];
@@ -248,6 +260,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 	case RTE_TEL_ARRAY_STRING:
 	case RTE_TEL_ARRAY_INT:
 	case RTE_TEL_ARRAY_U64:
+	case RTE_TEL_ARRAY_PTR:
 	case RTE_TEL_ARRAY_CONTAINER:
 		prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":",
 				MAX_CMD_LEN, cmd);
@@ -269,6 +282,10 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
 				used = rte_tel_json_add_array_u64(cb_data_buf,
 						buf_len, used,
 						d->data.array[i].u64val);
+			else if (d->type == RTE_TEL_ARRAY_PTR)
+				used = rte_tel_json_add_array_ptr(cb_data_buf,
+						buf_len, used,
+						d->data.array[i].ptrval);
 			else if (d->type == RTE_TEL_ARRAY_CONTAINER) {
 				char temp[buf_len];
 				const struct container *rec_data =
lib/telemetry/telemetry_data.c +36 -4
index 77b0fe09a5..9384f48589 100644
@@ -15,6 +15,7 @@ rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)
 			RTE_TEL_ARRAY_INT,    /* RTE_TEL_INT_VAL = 1 */
 			RTE_TEL_ARRAY_U64,    /* RTE_TEL_u64_VAL = 2 */
 			RTE_TEL_ARRAY_CONTAINER, /* RTE_TEL_CONTAINER = 3 */
+			RTE_TEL_ARRAY_PTR,    /* RTE_TEL_PTR_VAL = 4 */
 	};
 	d->type = array_types[type];
 	d->data_len = 0;
@@ -75,6 +76,17 @@ rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x)
 	return 0;
 }
 
+int
+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x)
+{
+	if (d->type != RTE_TEL_ARRAY_PTR)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+		return -ENOSPC;
+	d->data.array[d->data_len++].ptrval = x;
+	return 0;
+}
+
 int
 rte_tel_data_add_array_container(struct rte_tel_data *d,
 		struct rte_tel_data *val, int keep)
@@ -82,7 +94,8 @@ rte_tel_data_add_array_container(struct rte_tel_data *d,
 	if (d->type != RTE_TEL_ARRAY_CONTAINER ||
 			(val->type != RTE_TEL_ARRAY_U64
 			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+			&& val->type != RTE_TEL_ARRAY_STRING
+			&& val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
 		return -ENOSPC;
@@ -147,15 +160,34 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d,
 	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
 }
 
+int
+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,
+		const char *name, void *ptr)
+{
+	struct tel_dict_entry *e = &d->data.dict[d->data_len];
+	if (d->type != RTE_TEL_DICT)
+		return -EINVAL;
+	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+		return -ENOSPC;
+
+	d->data_len++;
+	e->type = RTE_TEL_PTR_VAL;
+	e->value.ptrval = ptr;
+	const size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}
+
 int
 rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,
 		struct rte_tel_data *val, int keep)
 {
 	struct tel_dict_entry *e = &d->data.dict[d->data_len];
 
-	if (d->type != RTE_TEL_DICT || (val->type != RTE_TEL_ARRAY_U64
-			&& val->type != RTE_TEL_ARRAY_INT
-			&& val->type != RTE_TEL_ARRAY_STRING))
+	if (d->type != RTE_TEL_DICT ||
+		(val->type != RTE_TEL_ARRAY_U64
+		 && val->type != RTE_TEL_ARRAY_INT
+		 && val->type != RTE_TEL_ARRAY_STRING
+		 && val->type != RTE_TEL_ARRAY_PTR))
 		return -EINVAL;
 	if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
 		return -ENOSPC;
lib/telemetry/telemetry_data.h +2 -0
index adb84a09f1..bb361e3bcc 100644
@@ -16,6 +16,7 @@ enum tel_container_types {
 	RTE_TEL_ARRAY_INT,    /** array of signed, 32-bit int values */
 	RTE_TEL_ARRAY_U64,    /** array of unsigned 64-bit int values */
 	RTE_TEL_ARRAY_CONTAINER, /** array of container structs */
+	RTE_TEL_ARRAY_PTR,    /** array of pointer values */
 };
 
 struct container {
@@ -31,6 +32,7 @@ union tel_value {
 	char sval[RTE_TEL_MAX_STRING_LEN];
 	int ival;
 	uint64_t u64val;
+	void *ptrval;
 	struct container container;
 };
 
lib/telemetry/telemetry_json.h +32 -0
index ad270b9b30..b41329902f 100644
@@ -102,6 +102,20 @@ rte_tel_json_add_array_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/* Appends a pointer value into the JSON array in the provided buffer. */
+static inline int
+rte_tel_json_add_array_ptr(char *buf, const int len, const int used, void *ptr)
+{
+	int ret, end = used - 1; /* strip off final delimiter */
+	if (used <= 2)		 /* assume empty, since minimum is '[]' */
+		return __json_snprintf(buf, len, "[%" PRIuPTR "]",
+				       (uintptr_t)ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",%" PRIuPTR "]",
+			      (uintptr_t)ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /*
  * Add a new element with raw JSON value to the JSON array stored in the
  * provided buffer.
@@ -136,6 +150,24 @@ rte_tel_json_add_obj_u64(char *buf, const int len, const int used,
 	return ret == 0 ? used : end + ret;
 }
 
+/**
+ * Add a new element with uint64_t value to the JSON object stored in the
+ * provided buffer.
+ */
+static inline int
+rte_tel_json_add_obj_ptr(char *buf, const int len, const int used,
+			 const char *name, void *ptr)
+{
+	int ret, end = used - 1;
+	if (used <= 2) /* assume empty, since minimum is '{}' */
+		return __json_snprintf(buf, len, "{\"%s\":%" PRIuPTR "}", name,
+				       (uintptr_t)ptr);
+
+	ret = __json_snprintf(buf + end, len - end, ",\"%s\":%" PRIuPTR "}",
+			      name, (uintptr_t)ptr);
+	return ret == 0 ? used : end + ret;
+}
+
 /**
  * Add a new element with int value to the JSON object stored in the
  * provided buffer.
lib/telemetry/version.map +2 -0
index bde80ce29b..d919340bc6 100644
@@ -5,10 +5,12 @@ EXPERIMENTAL {
 	rte_tel_data_add_array_int;
 	rte_tel_data_add_array_string;
 	rte_tel_data_add_array_u64;
+	rte_tel_data_add_array_ptr;
 	rte_tel_data_add_dict_container;
 	rte_tel_data_add_dict_int;
 	rte_tel_data_add_dict_string;
 	rte_tel_data_add_dict_u64;
+	rte_tel_data_add_dict_ptr;
 	rte_tel_data_alloc;
 	rte_tel_data_free;
 	rte_tel_data_start_array;
Signature · 1 line
2.25.1
#13 lore raw

PATCH v3 2/3 test/telemetry: add unit tests for pointer value

In reply to Gowrishankar Muthukrishnan

Adding tests to evaluate pointer value in array and dict.

---
 app/test/test_telemetry_data.c | 125 +++++++++++++++++++++++++++++++++
 app/test/test_telemetry_json.c |  29 ++++++--
 2 files changed, 147 insertions(+), 7 deletions(-)
app/test/test_telemetry_data.c +125 -0
index f34d691265..2351ae5193 100644
@@ -301,6 +301,127 @@ test_array_with_array_u64_values(void)
 	return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}");
 }
 
+static int
+test_case_array_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[120];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_PTR_VAL);
+
+	i = sprintf(exp, "{\"/test\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%" PRIuPTR ",", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(&response_data, p);
+	}
+
+	sprintf(exp + i - 1, "]}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_case_add_dict_ptr(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char name[8], exp[160];
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		sprintf(name, "dict_%d", j);
+		i += sprintf(exp + i, "\"%s\":%" PRIuPTR ",", name,
+					 (uintptr_t)p);
+		rte_tel_data_add_dict_ptr(&response_data, name, p);
+	}
+
+	sprintf(exp + i - 1, "}}");
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_dict_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_dict(&response_data);
+
+	i = sprintf(exp, "{\"/test\":{\"dict_0\":[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%" PRIuPTR ",", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],\"dict_1\":[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "%" PRIuPTR ",", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]}}");
+	rte_tel_data_add_dict_container(&response_data, "dict_0",
+								child_data, 0);
+	rte_tel_data_add_dict_container(&response_data, "dict_1",
+								child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
+static int
+test_array_with_array_ptr_values(void)
+{
+	int *p, i, j, a[] = {1, 2, 3, 4, 5};
+	char exp[256];
+
+	struct rte_tel_data *child_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data, RTE_TEL_PTR_VAL);
+
+	struct rte_tel_data *child_data2 = rte_tel_data_alloc();
+	rte_tel_data_start_array(child_data2, RTE_TEL_PTR_VAL);
+
+	memset(&response_data, 0, sizeof(response_data));
+	memset(exp, 0, sizeof(exp));
+	rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
+
+	i = sprintf(exp, "{\"/test\":[[");
+	for (j = 0; j < 5; j++) {
+		p = &a[j];
+		i += sprintf(exp + i, "%" PRIuPTR ",", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data, p);
+	}
+
+	i += sprintf(exp + i - 1, "],[");
+	for (j = 5; j > 0; j--) {
+		p = &a[j - 1];
+		i += sprintf(exp + i - 1, "%" PRIuPTR ",", (uintptr_t)p);
+		rte_tel_data_add_array_ptr(child_data2, p);
+	}
+
+	sprintf(exp + i - 2, "]]}");
+
+	rte_tel_data_add_array_container(&response_data, child_data, 0);
+	rte_tel_data_add_array_container(&response_data, child_data2, 0);
+
+	return TEST_OUTPUT(exp);
+}
+
 static int
 connect_to_socket(void)
 {
@@ -350,13 +471,17 @@ test_telemetry_data(void)
 
 	test_case test_cases[] = {test_case_array_string,
 			test_case_array_int, test_case_array_u64,
+			test_case_array_ptr,
 			test_case_add_dict_int, test_case_add_dict_u64,
+			test_case_add_dict_ptr,
 			test_case_add_dict_string,
 			test_dict_with_array_int_values,
 			test_dict_with_array_u64_values,
+			test_dict_with_array_ptr_values,
 			test_dict_with_array_string_values,
 			test_array_with_array_int_values,
 			test_array_with_array_u64_values,
+			test_array_with_array_ptr_values,
 			test_array_with_array_string_values };
 
 	rte_telemetry_register_cmd(REQUEST_CMD, test_cb, "Test");
app/test/test_telemetry_json.c +22 -7
index 790181d316..68dc81c9cd 100644
@@ -11,18 +11,23 @@
 static int
 test_basic_array(void)
 {
-	const char *expected = "[\"meaning of life\",42]";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
 
 	printf("%s: ", __func__);
 	used = rte_tel_json_empty_array(buf, sizeof(buf), used);
 	if (used != 2 || strcmp(buf, "[]"))
 		return -1;
 
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected, "[\"meaning of life\",42,%" PRIuPTR "]",
+			(uintptr_t)p);
+
 	used = rte_tel_json_add_array_string(buf, sizeof(buf), used,
 		"meaning of life");
-	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, 42);
+	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, n);
+	used = rte_tel_json_add_array_ptr(buf, sizeof(buf), used, p);
 
 	printf("buf = '%s', expected = '%s'\n", buf, expected);
 	if (used != (int)strlen(expected))
@@ -33,14 +38,24 @@ test_basic_array(void)
 static int
 test_basic_obj(void)
 {
-	const char *expected = "{\"weddings\":4,\"funerals\":1}";
-	char buf[1024];
-	int used = 0;
+	char buf[1024], expected[80];
+	int used = 0, n = 42, *p;
+
+	p = &n;
+	memset(expected, 0, sizeof(expected));
+	sprintf(expected,
+			"{\"weddings\":4,\"funerals\":1,"
+			"\"address\":%" PRIuPTR ",\"reset\":0}", (uintptr_t)p);
 
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"weddings", 4);
 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
 		"funerals", 1);
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"address", p);
+	p = NULL;
+	used = rte_tel_json_add_obj_ptr(buf, sizeof(buf), used,
+		"reset", p);
 
 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
 	if (used != (int)strlen(expected))
Signature · 1 line
2.25.1
#14 lore raw

PATCH v3 3/3 common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to npa.

---
 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       |   8 +
 4 files changed, 265 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +227 -0

227 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -0
index 6a7849f31c..3cc9a2ff37 100644
@@ -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')
drivers/common/cnxk/roc_platform.h +8 -0
index 285b24b82d..ec17dac6fe 100644
@@ -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,13 @@
 
 #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    rte_tel_data_add_dict_ptr
+#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;
Signature · 1 line
2.25.1
#15 lore raw
In reply to Gowrishankar Muthukrishnan

Hi Gowrishankar,

Quoted 34 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Tuesday 3 August 2021 09:06
To: [email protected]
Cc: Richardson, Bruce <[email protected]>; Power, Ciara <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Gowrishankar Muthukrishnan <[email protected]>
Subject: [v3, 0/3] common/cnxk: enable npa telemetry

This patch series enables telemetry in NPA LF of cnxk.

v3:
- fixed format specifier for uintptr_t

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value
test/telemetry: add unit tests for pointer value
common/cnxk: add telemetry endpoints to npa

app/test/test_telemetry_data.c           | 125 +++++++++++++
app/test/test_telemetry_json.c           |  29 ++-
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       |   8 +
lib/telemetry/rte_telemetry.h            |  37 +++-
lib/telemetry/telemetry.c                |  21 ++-
lib/telemetry/telemetry_data.c           |  40 +++-
lib/telemetry/telemetry_data.h           |   2 +
lib/telemetry/telemetry_json.h           |  32 ++++
lib/telemetry/version.map                |   2 +
12 files changed, 539 insertions(+), 14 deletions(-)  create mode 100644
Quoted 5 lines

drivers/common/cnxk/cnxk_telemetry.h
create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c

--
2.25.1

I am still unsure exactly what the use case is here - why are we choosing to publish the pointer values through telemetry rather than using a debug log for example? Maybe I am missing something here.

Thanks,
Ciara

#16 lore raw

Hi Ciara,

Quoted 53 lines

-----Original Message-----
From: Power, Ciara <[email protected]>
Sent: Wednesday, August 11, 2021 9:30 PM
To: Gowrishankar Muthukrishnan <[email protected]>; [email protected]
Cc: Richardson, Bruce <[email protected]>; Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>
Subject: [EXT] RE: [v3, 0/3] common/cnxk: enable npa telemetry

External Email

----------------------------------------------------------------------
Hi Gowrishankar,

Quoted 37 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Tuesday 3 August 2021 09:06
To: [email protected]
Cc: Richardson, Bruce <[email protected]>; Power, Ciara <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Gowrishankar Muthukrishnan <[email protected]>
Subject: [v3, 0/3] common/cnxk: enable npa telemetry

This patch series enables telemetry in NPA LF of cnxk.

v3:
- fixed format specifier for uintptr_t

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value
test/telemetry: add unit tests for pointer value
common/cnxk: add telemetry endpoints to npa

app/test/test_telemetry_data.c           | 125 +++++++++++++
app/test/test_telemetry_json.c           |  29 ++-
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       |   8 +
lib/telemetry/rte_telemetry.h            |  37 +++-
lib/telemetry/telemetry.c                |  21 ++-
lib/telemetry/telemetry_data.c           |  40 +++-
lib/telemetry/telemetry_data.h           |   2 +
lib/telemetry/telemetry_json.h           |  32 ++++
lib/telemetry/version.map                |   2 +
12 files changed, 539 insertions(+), 14 deletions(-)  create mode

100644 drivers/common/cnxk/cnxk_telemetry.h
create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c

Quoted 6 lines
Quoted 2 lines

--
2.25.1

I am still unsure exactly what the use case is here - why are we choosing to publish the pointer values through telemetry rather than using a debug log for example?

Pointer values are useful sometimes for more debugging through telemetry, hence this proposal. As I mentioned in v1 thread, this is architecture compliant approach rather than assuming pointer value is always 64 bit, when there is need to use pointer value in current telemetry path.

Thanks,
Gowrishankar

Quoted 4 lines

Maybe I am missing something here.

Thanks,
Ciara

#17 lore raw

Hi,
Please let me know if any other info is required.

Thanks,
Gowrishankar

Quoted 90 lines

-----Original Message-----
From: dev <[email protected]> On Behalf Of Gowrishankar Muthukrishnan
Sent: Wednesday, August 11, 2021 9:49 PM
To: Power, Ciara <[email protected]>; [email protected]
Cc: Richardson, Bruce <[email protected]>; Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>
Subject: [EXT] Re: [dpdk-dev] [v3, 0/3] common/cnxk: enable npa telemetry

External Email

----------------------------------------------------------------------
Hi Ciara,

Quoted 54 lines

-----Original Message-----
From: Power, Ciara <[email protected]>
Sent: Wednesday, August 11, 2021 9:30 PM
To: Gowrishankar Muthukrishnan <[email protected]>; [email protected]
Cc: Richardson, Bruce <[email protected]>; Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>
Subject: [EXT] RE: [v3, 0/3] common/cnxk: enable npa telemetry

External Email

----------------------------------------------------------------------
Hi Gowrishankar,

Quoted 37 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Tuesday 3 August 2021 09:06
To: [email protected]
Cc: Richardson, Bruce <[email protected]>; Power, Ciara <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Gowrishankar Muthukrishnan <[email protected]>
Subject: [v3, 0/3] common/cnxk: enable npa telemetry

This patch series enables telemetry in NPA LF of cnxk.

v3:
- fixed format specifier for uintptr_t

Gowrishankar Muthukrishnan (3):
telemetry: enable storing pointer value
test/telemetry: add unit tests for pointer value
common/cnxk: add telemetry endpoints to npa

app/test/test_telemetry_data.c           | 125 +++++++++++++
app/test/test_telemetry_json.c           |  29 ++-
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       |   8 +
lib/telemetry/rte_telemetry.h            |  37 +++-
lib/telemetry/telemetry.c                |  21 ++-
lib/telemetry/telemetry_data.c           |  40 +++-
lib/telemetry/telemetry_data.h           |   2 +
lib/telemetry/telemetry_json.h           |  32 ++++
lib/telemetry/version.map                |   2 +
12 files changed, 539 insertions(+), 14 deletions(-)  create mode

100644 drivers/common/cnxk/cnxk_telemetry.h
create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c

Quoted 6 lines
Quoted 2 lines

--
2.25.1

I am still unsure exactly what the use case is here - why are we choosing to publish the pointer values through telemetry rather than using a debug log for example?

Pointer values are useful sometimes for more debugging through telemetry, hence this proposal.
As I mentioned in v1 thread, this is architecture compliant approach rather than assuming pointer value is always 64 bit, when there is need to use pointer value in current telemetry path.

Thanks,
Gowrishankar

Quoted 4 lines

Maybe I am missing something here.

Thanks,
Ciara

#18 lore raw
In reply to Gowrishankar Muthukrishnan

11/08/2021 18:18, Gowrishankar Muthukrishnan:

Quoted 3 lines

From: Power, Ciara <[email protected]>

Quoted 2 lines

From: Gowrishankar Muthukrishnan <[email protected]>

Quoted 1 line

telemetry: enable storing pointer value

[...]

Quoted 7 lines
Quoted 3 lines

I am still unsure exactly what the use case is here - why are we choosing to publish the pointer values through telemetry rather than using a debug log for example?

Pointer values are useful sometimes for more debugging through telemetry, hence this proposal. As I mentioned in v1 thread, this is architecture compliant approach rather than assuming pointer value is always 64 bit, when there is need to use pointer value in current telemetry path.

Why using telemetry for debugging?
I agree with Ciara, debug log is more appropriate. You can also use the tracing framework.

#19 lore raw

Hi Thomas,

Quoted 6 lines

[...]

Quoted 5 lines
Quoted 3 lines

I am still unsure exactly what the use case is here - why are we choosing to publish the pointer values through telemetry rather than using a debug log for example?

Pointer values are useful sometimes for more debugging through telemetry,

Quoted 9 lines

hence this proposal.

Quoted 2 lines

As I mentioned in v1 thread, this is architecture compliant approach rather than assuming pointer value is always 64 bit, when there is need to use

pointer value in current telemetry path.

Why using telemetry for debugging?
I agree with Ciara, debug log is more appropriate. You can also use the tracing framework.

In addition to getting status/stats, we are using this library for remote debugging as this is the only mechanism available in DPDK now. For an instance, accessing data from a pointer address through a root privileged tool. We can internally type cast them to u64 as well but thought of standardizing the conversion through library API instead in case it is useful in other platforms too.

If it does not seem more useful for now, I will take another approach on type casting the values internally in our driver (and avoiding library patch). Please share your thoughts.

Thanks,
Gowrishankar

#20 lore raw

v4 cover cnxk: enable npa and mempool telemetry

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in NPA LF and mempool driver of cnxk.

v4:
- added mempool driver endpoints.
- removed lib/telemetry changes to include _ptr api.

Gowrishankar Muthukrishnan (2):
common/cnxk: add telemetry endpoints to npa
mempool/cnxk: add telemetry end points

 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 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++
 drivers/mempool/cnxk/meson.build              |   1 +
 6 files changed, 367 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
Signature · 1 line
2.25.1
#21 lore raw

PATCH v4 1/2 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 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
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +227 -0

227 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -0
index 6a7849f31c..3cc9a2ff37 100644
@@ -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')
drivers/common/cnxk/roc_platform.h +9 -0
index 285b24b82d..57b1229bb8 100644
@@ -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;
Signature · 1 line
2.25.1
#24 lore raw

PATCH v4 2/2 mempool/cnxk: add telemetry end points

In reply to Gowrishankar Muthukrishnan

Adding telemetry end points to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |   1 +
 2 files changed, 101 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +100 -0
new file mode 100644
index 0000000000..690f557f62
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_tel_handle_list(const char *cmd __rte_unused,
+			const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	CNXK_TEL_DICT_STR(info->d, mp, name);
+	CNXK_TEL_DICT_INT(info->d, mp, pool_id);
+	CNXK_TEL_DICT_INT(info->d, mp, flags);
+	CNXK_TEL_DICT_INT(info->d, mp, socket_id);
+	CNXK_TEL_DICT_INT(info->d, mp, size);
+	CNXK_TEL_DICT_INT(info->d, mp, cache_size);
+	CNXK_TEL_DICT_INT(info->d, mp, elt_size);
+	CNXK_TEL_DICT_INT(info->d, mp, header_size);
+	CNXK_TEL_DICT_INT(info->d, mp, trailer_size);
+	CNXK_TEL_DICT_INT(info->d, mp, private_data_size);
+	CNXK_TEL_DICT_INT(info->d, mp, ops_index);
+	CNXK_TEL_DICT_INT(info->d, mp, populated_size);
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+
+	mz = mp->mz;
+	CNXK_TEL_DICT_STR(info->d, mz, name, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, iova, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, addr, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, len, mz_);
+	CNXK_TEL_DICT_U64(info->d, mz, hugepage_sz, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, socket_id, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, flags, mz_);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -1;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/list", mempool_tel_handle_list,
+		"Returns list of available mempools. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#22 lore raw

Re: [dpdk-dev] [v4, 1/2] common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan
Quoted 12 lines · Gowrishankar Muthukrishnan

Add telemetry endpoints to npa.

---
 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>

Quoted 5 lines
drivers/common/cnxk/meson.build +0 -0
index 6a7849f31c..3cc9a2ff37 100644

drivers/common/cnxk/meson.build sources = files( · line 68

Quoted 9 lines
drivers/common/cnxk/meson.build +4 -0
@@ -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

#25 lore raw

v5 cover cnxk: enable npa and mempool telemetry

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in NPA LF and mempool driver of cnxk.

v5:
- fixed meson.build files to use deps.

Gowrishankar Muthukrishnan (2):
common/cnxk: add telemetry endpoints to npa
mempool/cnxk: add telemetry end points

 drivers/common/cnxk/cnxk_telemetry.h          |  26 ++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 227 ++++++++++++++++++
 drivers/common/cnxk/meson.build               |   6 +-
 drivers/common/cnxk/roc_platform.h            |   9 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++
 drivers/mempool/cnxk/meson.build              |   3 +-
 6 files changed, 368 insertions(+), 3 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
Signature · 1 line
2.25.1
#26 lore raw

PATCH v5 1/2 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 drivers/common/cnxk/cnxk_telemetry.h     |  26 +++
 drivers/common/cnxk/cnxk_telemetry_npa.c | 227 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   6 +-
 drivers/common/cnxk/roc_platform.h       |   9 +
 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
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +227 -0

227 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -2
index 6a7849f31c..6fdb5451cb 100644
@@ -60,5 +60,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']
drivers/common/cnxk/roc_platform.h +9 -0
index 285b24b82d..57b1229bb8 100644
@@ -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;
Signature · 1 line
2.25.1
#27 lore raw

PATCH v5 2/2 mempool/cnxk: add telemetry end points

In reply to Gowrishankar Muthukrishnan

Adding telemetry end points to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |   3 +-
 2 files changed, 102 insertions(+), 1 deletion(-)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +100 -0
new file mode 100644
index 0000000000..690f557f62
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_tel_handle_list(const char *cmd __rte_unused,
+			const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	CNXK_TEL_DICT_STR(info->d, mp, name);
+	CNXK_TEL_DICT_INT(info->d, mp, pool_id);
+	CNXK_TEL_DICT_INT(info->d, mp, flags);
+	CNXK_TEL_DICT_INT(info->d, mp, socket_id);
+	CNXK_TEL_DICT_INT(info->d, mp, size);
+	CNXK_TEL_DICT_INT(info->d, mp, cache_size);
+	CNXK_TEL_DICT_INT(info->d, mp, elt_size);
+	CNXK_TEL_DICT_INT(info->d, mp, header_size);
+	CNXK_TEL_DICT_INT(info->d, mp, trailer_size);
+	CNXK_TEL_DICT_INT(info->d, mp, private_data_size);
+	CNXK_TEL_DICT_INT(info->d, mp, ops_index);
+	CNXK_TEL_DICT_INT(info->d, mp, populated_size);
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+
+	mz = mp->mz;
+	CNXK_TEL_DICT_STR(info->d, mz, name, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, iova, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, addr, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, len, mz_);
+	CNXK_TEL_DICT_U64(info->d, mz, hugepage_sz, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, socket_id, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, flags, mz_);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -1;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/list", mempool_tel_handle_list,
+		"Returns list of available mempools. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +2 -1
index e28a9e044d..7834a19118 100644
@@ -11,8 +11,9 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
 
-deps += ['eal', 'mbuf', 'kvargs', 'bus_pci', 'common_cnxk', 'mempool']
+deps += ['eal', 'mbuf', 'kvargs', 'bus_pci', 'common_cnxk', 'mempool', 'telemetry']
Signature · 1 line
2.25.1
#23 lore raw

Re: [dpdk-dev] [EXT] Re: [v4, 1/2] common/cnxk: add telemetry endpoints to npa

In reply to Bruce Richardson
Quoted 8 lines
Quoted 3 lines

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:

Quoted 6 lines

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

Quoted 2 lines

Regards,
/Bruce

#28 lore raw

v6 cover cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry for cnxk in the following:
- NPA LF
- Mempool driver
- NIX LF
- Ethdev driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")

v6:
- Added nix and ethdev endpoints.

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
mempool/cnxk: add telemetry end points
common/cnxk: add telemetry endpoints to nix
net/cnxk: add telemetry endpoing to ethdev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 852 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 225 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  17 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      | 148 +++
 drivers/net/cnxk/meson.build                  |   1 +
 12 files changed, 1398 insertions(+), 6 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
Signature · 1 line
2.25.1
#29 lore raw

PATCH v6 1/4 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 drivers/common/cnxk/cnxk_telemetry.h     |  26 +++
 drivers/common/cnxk/cnxk_telemetry_npa.c | 225 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   6 +-
 drivers/common/cnxk/roc_platform.h       |  12 ++
 4 files changed, 267 insertions(+), 2 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +225 -0

225 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -2
index cd19ad29c1..f0a1c9f115 100644
@@ -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']
drivers/common/cnxk/roc_platform.h +12 -0
index 241655b334..57073d62aa 100644
@@ -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;
Signature · 1 line
2.25.1
#30 lore raw

PATCH v6 2/4 mempool/cnxk: add telemetry end points

In reply to Gowrishankar Muthukrishnan

Adding telemetry end points to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |   1 +
 2 files changed, 101 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +100 -0
new file mode 100644
index 0000000000..690f557f62
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_tel_handle_list(const char *cmd __rte_unused,
+			const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	CNXK_TEL_DICT_STR(info->d, mp, name);
+	CNXK_TEL_DICT_INT(info->d, mp, pool_id);
+	CNXK_TEL_DICT_INT(info->d, mp, flags);
+	CNXK_TEL_DICT_INT(info->d, mp, socket_id);
+	CNXK_TEL_DICT_INT(info->d, mp, size);
+	CNXK_TEL_DICT_INT(info->d, mp, cache_size);
+	CNXK_TEL_DICT_INT(info->d, mp, elt_size);
+	CNXK_TEL_DICT_INT(info->d, mp, header_size);
+	CNXK_TEL_DICT_INT(info->d, mp, trailer_size);
+	CNXK_TEL_DICT_INT(info->d, mp, private_data_size);
+	CNXK_TEL_DICT_INT(info->d, mp, ops_index);
+	CNXK_TEL_DICT_INT(info->d, mp, populated_size);
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+
+	mz = mp->mz;
+	CNXK_TEL_DICT_STR(info->d, mz, name, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, iova, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, addr, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, len, mz_);
+	CNXK_TEL_DICT_U64(info->d, mz, hugepage_sz, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, socket_id, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, flags, mz_);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -1;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/list", mempool_tel_handle_list,
+		"Returns list of available mempools. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#31 lore raw

PATCH v6 3/4 common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to nix.

---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 852 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  17 +-
 drivers/common/cnxk/roc_platform.h       |   3 +
 6 files changed, 882 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
drivers/common/cnxk/cnxk_telemetry_nix.c new file +852 -0
new file mode 100644
index 0000000000..5f9e3f3a77
@@ -0,0 +1,852 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node);
+static struct nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *), 0);
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *), 0);
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *), 0);
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->rqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char *params,
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	cnxk_tel_nix(node->nix, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+	return 0;
+
+exit:
+	return -1;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id");
+}
drivers/common/cnxk/meson.build +2 -1
index f0a1c9f115..fe7a95b526 100644
@@ -65,6 +65,7 @@ sources = files(
 sources += files('cnxk_security.c')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry']
drivers/common/cnxk/roc_nix.c +3 -0
index 3ab954e94d..17beb1a736 100644
@@ -178,6 +178,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;
 }
@@ -413,6 +415,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +9 -0
index 2cd5a72347..ba639791ce 100644
@@ -424,4 +424,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base, uint64_t *data, uint16_t qints,
 int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix);
+void nix_tel_node_del(struct roc_nix *roc_nix);
+int nix_tel_node_add_rq(struct roc_nix_rq *rq);
+int nix_tel_node_add_cq(struct roc_nix_cq *cq);
+int nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +13 -4
index 8fbb13ecbd..3631a2004f 100644
@@ -387,7 +387,12 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
+
 }
 
 int
@@ -415,7 +420,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -504,7 +513,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
 	plt_free(cq->desc_base);
@@ -884,7 +893,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
 	}
 
-	return rc;
+	return nix_tel_node_add_sq(sq);
 nomem:
 	plt_free(sq->fc);
 fail:
drivers/common/cnxk/roc_platform.h +3 -0
index 57073d62aa..b95af115f7 100644
@@ -145,7 +145,10 @@
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_STRING_VAL RTE_TEL_STRING_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_string rte_tel_data_add_array_string
 #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)			\
Signature · 1 line
2.25.1
#32 lore raw

PATCH v6 4/4 net/cnxk: add telemetry endpoing to ethdev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 148 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 149 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +148 -0
new file mode 100644
index 0000000000..4d89151a90
@@ -0,0 +1,148 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)
+{
+	struct rte_eth_dev *eth_dev;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			/** No of rx queues */
+			uint16_t rx_queues;
+			/** No of tx queues */
+			uint16_t tx_queues;
+			/** Port ID */
+			uint16_t port_id;
+			/** MAC entries */
+			char mac_addr[MACADDR_LEN];
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint16_t flags;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Offload capabilities */
+			uint64_t rx_offload_capa;
+			uint64_t tx_offload_capa;
+			uint32_t speed_capa;
+			/* Configured offloads */
+			uint64_t rx_offloads;
+			uint64_t tx_offloads;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+			/* ETHDEV RSS HF bitmask */
+			uint64_t ethdev_rss_hf;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	};
+	union eth_info_u *eth_info;
+	struct eth_info_s *info;
+	int n_ports, rc = 0;
+	int i, j = 0;
+
+	n_ports = rte_eth_dev_count_avail();
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		goto exit;
+	}
+
+	/* Allocate memory for hw info structure */
+	eth_info = malloc(sizeof(struct eth_info_s) * n_ports);
+	if (!eth_info) {
+		plt_err("No space for HW info");
+		rc = -ENOMEM;
+		goto exit;
+	}
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		info = &eth_info[j].info;
+
+		if (eth_dev) {
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev->nix);
+				memset(info->mac_addr, 0, MACADDR_LEN);
+				snprintf(info->mac_addr, MACADDR_LEN,
+					 "%02x:%02x:%02x:%02x:%02x:%02x",
+					 dev->mac_addr[0], dev->mac_addr[1],
+					 dev->mac_addr[2], dev->mac_addr[3],
+					 dev->mac_addr[4], dev->mac_addr[5]);
+				info->max_mac_entries = dev->max_mac_entries;
+				info->dmac_filter_ena = dev->dmac_filter_enable;
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->flags = dev->flags;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_capa = dev->rx_offload_capa;
+				info->tx_offload_capa = dev->tx_offload_capa;
+				info->rx_offloads = dev->rx_offloads;
+				info->tx_offloads = dev->tx_offloads;
+				info->rx_offload_flags = dev->rx_offload_flags;
+				info->tx_offload_flags = dev->tx_offload_flags;
+				info->ethdev_rss_hf = dev->ethdev_rss_hf;
+			}
+
+			if (eth_dev->data) {
+				info->rx_queues = eth_dev->data->nb_rx_queues;
+				info->tx_queues = eth_dev->data->nb_tx_queues;
+				info->port_id = eth_dev->data->port_id;
+			}
+
+			j++;
+		}
+	}
+
+	/* Validating available count */
+	if (n_ports != j) {
+		rc = -EINVAL;
+		plt_err("Invalid available port count");
+		goto free;
+	}
+
+	struct rte_tel_data *i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+	for (i = 0; i < rte_eth_dev_count_avail(); i++) {
+		for (j = 0; j < (int)ETH_INFO_SZ; j++)
+			rte_tel_data_add_array_u64(i_data, eth_info[i].val[j]);
+	}
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+
+free:
+	free(eth_info);
+exit:
+	return rc;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info,
+				   "Returns ethdev device information");
+}
drivers/net/cnxk/meson.build +1 -0
index d1d4b4e15e..5b3b8422fb 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
Signature · 1 line
2.25.1
#34 lore raw

PATCH v7 1/6 common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to npa.

---
 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
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +224 -0

224 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -2
index cd19ad29c1..f0a1c9f115 100644
@@ -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']
drivers/common/cnxk/roc_platform.h +12 -0
index 241655b334..57073d62aa 100644
@@ -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;
Signature · 1 line
2.25.1
#33 lore raw

v7 cover cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry for cnxk in the following:
- NPA LF
- Mempool driver
- NIX LF
- Ethdev driver
- Crypto driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")

v7:
- Added cryptodev endppoints.
- minor cleanup in other patches.

Gowrishankar Muthukrishnan (6):
common/cnxk: add telemetry endpoints to npa mempool/cnxk: add telemetry end points common/cnxk: add telemetry endpoints to nix net/cnxk: add telemetry endpoing to ethdev
telemetry: fix json output buffer size crypto/cnxk: add telemetry endpoints to cryptodev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 154 ++++
 drivers/crypto/cnxk/meson.build               |   1 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 +++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      | 129 +++
 drivers/net/cnxk/meson.build                  |   1 +
 lib/telemetry/telemetry_json.h                |   7 +-
 15 files changed, 1534 insertions(+), 7 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
Signature · 1 line
2.25.1
#35 lore raw

PATCH v7 2/6 mempool/cnxk: add telemetry end points

Adding telemetry end points to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |   1 +
 2 files changed, 101 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +100 -0
new file mode 100644
index 0000000000..690f557f62
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_tel_handle_list(const char *cmd __rte_unused,
+			const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	CNXK_TEL_DICT_STR(info->d, mp, name);
+	CNXK_TEL_DICT_INT(info->d, mp, pool_id);
+	CNXK_TEL_DICT_INT(info->d, mp, flags);
+	CNXK_TEL_DICT_INT(info->d, mp, socket_id);
+	CNXK_TEL_DICT_INT(info->d, mp, size);
+	CNXK_TEL_DICT_INT(info->d, mp, cache_size);
+	CNXK_TEL_DICT_INT(info->d, mp, elt_size);
+	CNXK_TEL_DICT_INT(info->d, mp, header_size);
+	CNXK_TEL_DICT_INT(info->d, mp, trailer_size);
+	CNXK_TEL_DICT_INT(info->d, mp, private_data_size);
+	CNXK_TEL_DICT_INT(info->d, mp, ops_index);
+	CNXK_TEL_DICT_INT(info->d, mp, populated_size);
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+
+	mz = mp->mz;
+	CNXK_TEL_DICT_STR(info->d, mz, name, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, iova, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, addr, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, len, mz_);
+	CNXK_TEL_DICT_U64(info->d, mz, hugepage_sz, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, socket_id, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, flags, mz_);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -1;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/list", mempool_tel_handle_list,
+		"Returns list of available mempools. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#36 lore raw

PATCH v7 3/6 common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to nix.

---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 849 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  15 +-
 drivers/common/cnxk/roc_platform.h       |   3 +
 6 files changed, 878 insertions(+), 4 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
drivers/common/cnxk/cnxk_telemetry_nix.c new file +849 -0
new file mode 100644
index 0000000000..ba54621fb6
@@ -0,0 +1,849 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node);
+static struct nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *), 0);
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *), 0);
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *), 0);
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->rqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char *params,
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	return cnxk_tel_nix(node->nix, d);
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+	int rc = -1;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		goto exit;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		goto exit;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			rc = cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			rc = cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			rc = cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+exit:
+	return rc;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id");
+}
drivers/common/cnxk/meson.build +2 -1
index f0a1c9f115..fe7a95b526 100644
@@ -65,6 +65,7 @@ sources = files(
 sources += files('cnxk_security.c')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry']
drivers/common/cnxk/roc_nix.c +3 -0
index 3ab954e94d..17beb1a736 100644
@@ -178,6 +178,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;
 }
@@ -413,6 +415,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +9 -0
index 2cd5a72347..ba639791ce 100644
@@ -424,4 +424,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base, uint64_t *data, uint16_t qints,
 int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix);
+void nix_tel_node_del(struct roc_nix *roc_nix);
+int nix_tel_node_add_rq(struct roc_nix_rq *rq);
+int nix_tel_node_add_cq(struct roc_nix_cq *cq);
+int nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +12 -3
index 8fbb13ecbd..f546fc83c5 100644
@@ -387,7 +387,11 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -415,7 +419,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -504,7 +512,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
 	plt_free(cq->desc_base);
@@ -884,6 +892,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
 	}
 
+	rc = nix_tel_node_add_sq(sq);
 	return rc;
 nomem:
 	plt_free(sq->fc);
drivers/common/cnxk/roc_platform.h +3 -0
index 57073d62aa..b95af115f7 100644
@@ -145,7 +145,10 @@
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_STRING_VAL RTE_TEL_STRING_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_string rte_tel_data_add_array_string
 #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)			\
Signature · 1 line
2.25.1
#37 lore raw

PATCH v7 4/6 net/cnxk: add telemetry endpoing to ethdev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 129 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 130 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +129 -0
new file mode 100644
index 0000000000..de8c468670
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)
+{
+	struct rte_eth_dev *eth_dev;
+	struct rte_tel_data *i_data;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			/** No of rx queues */
+			uint16_t rx_queues;
+			/** No of tx queues */
+			uint16_t tx_queues;
+			/** Port ID */
+			uint16_t port_id;
+			/** MAC entries */
+			char mac_addr[MACADDR_LEN];
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint16_t flags;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Offload capabilities */
+			uint64_t rx_offload_capa;
+			uint64_t tx_offload_capa;
+			uint32_t speed_capa;
+			/* Configured offloads */
+			uint64_t rx_offloads;
+			uint64_t tx_offloads;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+			/* ETHDEV RSS HF bitmask */
+			uint64_t ethdev_rss_hf;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	} eth_info;
+	struct eth_info_s *info;
+	unsigned int i, j = 0;
+	int n_ports;
+
+	n_ports = rte_eth_dev_count_avail();
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		if (eth_dev) {
+			memset(&eth_info, 0, sizeof(eth_info));
+			info = &eth_info.info;
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev->nix);
+				memset(info->mac_addr, 0, MACADDR_LEN);
+				snprintf(info->mac_addr, MACADDR_LEN,
+					 "%02x:%02x:%02x:%02x:%02x:%02x",
+					 dev->mac_addr[0], dev->mac_addr[1],
+					 dev->mac_addr[2], dev->mac_addr[3],
+					 dev->mac_addr[4], dev->mac_addr[5]);
+				info->max_mac_entries = dev->max_mac_entries;
+				info->dmac_filter_ena = dev->dmac_filter_enable;
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->flags = dev->flags;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_capa = dev->rx_offload_capa;
+				info->tx_offload_capa = dev->tx_offload_capa;
+				info->rx_offloads = dev->rx_offloads;
+				info->tx_offloads = dev->tx_offloads;
+				info->rx_offload_flags = dev->rx_offload_flags;
+				info->tx_offload_flags = dev->tx_offload_flags;
+				info->ethdev_rss_hf = dev->ethdev_rss_hf;
+			}
+
+			if (eth_dev->data) {
+				info->rx_queues = eth_dev->data->nb_rx_queues;
+				info->tx_queues = eth_dev->data->nb_tx_queues;
+				info->port_id = eth_dev->data->port_id;
+			}
+
+			for (j = 0; j < ETH_INFO_SZ; j++)
+				rte_tel_data_add_array_u64(i_data,
+							   eth_info.val[j]);
+
+			j++;
+		}
+	}
+
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+	return 0;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info,
+				   "Returns ethdev device information");
+}
drivers/net/cnxk/meson.build +1 -0
index d1d4b4e15e..5b3b8422fb 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
Signature · 1 line
2.25.1
#38 lore raw

PATCH v7 5/6 telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Fix json output buffer size for a single largest value.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")
Change-Id Ida314114b654b5085244a659eb08b22969339856
---
 lib/telemetry/telemetry_json.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +5 -2
index ad270b9b30..ba2fde34cb 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,15 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * Size of buffer is (single largest value - 6), where at least 6 chars
+ * would have been used for creating json dict i.e '{"x": ... }'.
+ * This function is not for use for values larger than this buffer size.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[RTE_TEL_MAX_SINGLE_STRING_LEN - 6];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#55 lore raw

PATCH v7 6/6 crypto/cnxk: add telemetry endpoints to cryptodev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to cryptodev.

Change-Id I7a0387fe11f383fca95169cfe2ec97bca46221ac
---
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 154 ++++++++++++++++++
 drivers/crypto/cnxk/meson.build               |   1 +
 2 files changed, 155 insertions(+)
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c new file +154 -0
new file mode 100644
index 0000000000..4c754bc6c7
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_cryptodev.h>
+#include <rte_cryptodev_pmd.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_cryptodev.h"
+#include "cnxk_telemetry.h"
+
+#define CRYPTO_CAPS_SZ                                                         \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities),             \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+#define SEC_CAPS_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_security_capability),                \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+static int
+cryptodev_tel_handle_list(const char *cmd __rte_unused,
+			  const char *params __rte_unused,
+			  struct rte_tel_data *d)
+{
+	struct rte_cryptodev *cryptodev;
+	unsigned int i;
+
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+
+	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
+		cryptodev = rte_cryptodev_pmd_get_dev(i);
+		if (cryptodev->attached != RTE_CRYPTODEV_ATTACHED)
+			continue;
+
+		rte_tel_data_add_array_string(d, cryptodev->data->name);
+	}
+
+	return 0;
+}
+
+static int
+crypto_caps_array(struct rte_tel_data *d,
+		  struct rte_cryptodev_capabilities *dev_caps,
+		  size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_cryptodev_capabilities dev_caps;
+		uint64_t val[CRYPTO_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		if (dev_caps[i].op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
+			break;
+
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+sec_caps_array(struct rte_tel_data *d, struct rte_security_capability *dev_caps,
+	       size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_security_capability dev_caps;
+		uint64_t val[SEC_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < SEC_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+cryptodev_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			  struct rte_tel_data *d)
+{
+	struct rte_tel_data *crypto_caps, *sec_crypto_caps, *sec_caps;
+	int crypto_caps_n, sec_crypto_caps_n, sec_caps_n;
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	struct rte_cryptodev *dev;
+	struct cnxk_cpt_vf *vf;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	rte_strlcpy(name, params, RTE_CRYPTODEV_NAME_LEN);
+	dev = rte_cryptodev_pmd_get_named_dev(name);
+	if (!dev) {
+		plt_err("No cryptodev of name %s available", name);
+		return -1;
+	}
+
+	vf = dev->data->dev_private;
+
+	rte_tel_data_start_dict(d);
+	CNXK_TEL_DICT_INT(d, dev->data, dev_id);
+	CNXK_TEL_DICT_INT(d, dev->data, socket_id);
+	CNXK_TEL_DICT_INT(d, dev->data, dev_started);
+
+	/* Crypto capabilities */
+	crypto_caps = rte_tel_data_alloc();
+	crypto_caps_n = crypto_caps_array(crypto_caps, vf->crypto_caps,
+					  CNXK_CPT_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
+	rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
+
+	/* Security Crypto capabilities */
+	sec_crypto_caps = rte_tel_data_alloc();
+	sec_crypto_caps_n = crypto_caps_array(
+		sec_crypto_caps, vf->sec_crypto_caps, CNXK_SEC_CRYPTO_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_crypto_caps", sec_crypto_caps,
+					0);
+	rte_tel_data_add_dict_int(d, "sec_crypto_caps_n", sec_crypto_caps_n);
+
+	/* Security capabilities */
+	sec_caps = rte_tel_data_alloc();
+	sec_caps_n = sec_caps_array(sec_caps, vf->sec_caps, CNXK_SEC_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
+	rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_cryptodev_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/list", cryptodev_tel_handle_list,
+		"Returns list of available cryptodev. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/info", cryptodev_tel_handle_info,
+		"Returns cryptodev info. Parameters: pci id");
+}
drivers/crypto/cnxk/meson.build +1 -0
index e076783629..14771925c1 100644
@@ -18,6 +18,7 @@ sources = files(
         'cnxk_cryptodev_capabilities.c',
         'cnxk_cryptodev_ops.c',
         'cnxk_cryptodev_sec.c',
+        'cnxk_cryptodev_telemetry.c',
 )
 
 deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev']
Signature · 1 line
2.25.1
#83 lore raw

Re: [dpdk-dev] [v7, 0/6] cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan
Quoted 9 lines · Gowrishankar Muthukrishnan

This patch series enables telemetry for cnxk in the following:
- NPA LF
- Mempool driver
- NIX LF
- Ethdev driver
- Crypto driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")

Please split the patches into three series,

1/6 - 4/6 - for next-net-mrvl and delegate to me
5/6 - for main tree and delegate to Thomas
6/6 - for crypto tree and delegate to Akill
and add appropriate Depends-on:

Quoted 38 lines

v7:
- Added cryptodev endppoints.
- minor cleanup in other patches.

Gowrishankar Muthukrishnan (6):
common/cnxk: add telemetry endpoints to npa mempool/cnxk: add telemetry end points common/cnxk: add telemetry endpoints to nix net/cnxk: add telemetry endpoing to ethdev
telemetry: fix json output buffer size crypto/cnxk: add telemetry endpoints to cryptodev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 154 ++++
 drivers/crypto/cnxk/meson.build               |   1 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 +++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      | 129 +++
 drivers/net/cnxk/meson.build                  |   1 +
 lib/telemetry/telemetry_json.h                |   7 +-
 15 files changed, 1534 insertions(+), 7 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c

--
2.25.1

#84 lore raw

v8 cover cnxk: enable telemetry endpoints for mempool and ethdev

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry for cnxk in the following:
- NPA LF
- Mempool driver
- NIX LF
- Ethdev driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")

v8:
- removed lib telemetry and crypto patches for seperate series.

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
mempool/cnxk: add telemetry end points
common/cnxk: add telemetry endpoints to nix
net/cnxk: add telemetry endpoing to ethdev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 +++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      | 129 +++
 drivers/net/cnxk/meson.build                  |   1 +
 12 files changed, 1374 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
Signature · 1 line
2.25.1
#85 lore raw

PATCH v8 1/4 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 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
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +224 -0

224 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -2
index cd19ad29c1..f0a1c9f115 100644
@@ -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']
drivers/common/cnxk/roc_platform.h +12 -0
index 241655b334..57073d62aa 100644
@@ -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;
Signature · 1 line
2.25.1
#86 lore raw

PATCH v8 2/4 mempool/cnxk: add telemetry end points

In reply to Gowrishankar Muthukrishnan

Adding telemetry end points to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 100 ++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |   1 +
 2 files changed, 101 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +100 -0
new file mode 100644
index 0000000000..690f557f62
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_tel_handle_list(const char *cmd __rte_unused,
+			const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	CNXK_TEL_DICT_STR(info->d, mp, name);
+	CNXK_TEL_DICT_INT(info->d, mp, pool_id);
+	CNXK_TEL_DICT_INT(info->d, mp, flags);
+	CNXK_TEL_DICT_INT(info->d, mp, socket_id);
+	CNXK_TEL_DICT_INT(info->d, mp, size);
+	CNXK_TEL_DICT_INT(info->d, mp, cache_size);
+	CNXK_TEL_DICT_INT(info->d, mp, elt_size);
+	CNXK_TEL_DICT_INT(info->d, mp, header_size);
+	CNXK_TEL_DICT_INT(info->d, mp, trailer_size);
+	CNXK_TEL_DICT_INT(info->d, mp, private_data_size);
+	CNXK_TEL_DICT_INT(info->d, mp, ops_index);
+	CNXK_TEL_DICT_INT(info->d, mp, populated_size);
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+
+	mz = mp->mz;
+	CNXK_TEL_DICT_STR(info->d, mz, name, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, iova, mz_);
+	CNXK_TEL_DICT_PTR(info->d, mz, addr, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, len, mz_);
+	CNXK_TEL_DICT_U64(info->d, mz, hugepage_sz, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, socket_id, mz_);
+	CNXK_TEL_DICT_INT(info->d, mz, flags, mz_);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -1;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/list", mempool_tel_handle_list,
+		"Returns list of available mempools. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#95 lore raw

PATCH v8 3/4 common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to nix.

---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 849 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  15 +-
 drivers/common/cnxk/roc_platform.h       |   3 +
 6 files changed, 878 insertions(+), 4 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
drivers/common/cnxk/cnxk_telemetry_nix.c new file +849 -0
new file mode 100644
index 0000000000..1175f68a51
@@ -0,0 +1,849 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node);
+static struct nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *), 0);
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *), 0);
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *), 0);
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->sqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char *params,
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	return cnxk_tel_nix(node->nix, d);
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+	int rc = -1;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		goto exit;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		goto exit;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			rc = cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			rc = cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			rc = cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+exit:
+	return rc;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id");
+}
drivers/common/cnxk/meson.build +2 -1
index f0a1c9f115..fe7a95b526 100644
@@ -65,6 +65,7 @@ sources = files(
 sources += files('cnxk_security.c')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry']
drivers/common/cnxk/roc_nix.c +3 -0
index 3ab954e94d..17beb1a736 100644
@@ -178,6 +178,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;
 }
@@ -413,6 +415,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +9 -0
index 2cd5a72347..ba639791ce 100644
@@ -424,4 +424,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base, uint64_t *data, uint16_t qints,
 int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix);
+void nix_tel_node_del(struct roc_nix *roc_nix);
+int nix_tel_node_add_rq(struct roc_nix_rq *rq);
+int nix_tel_node_add_cq(struct roc_nix_cq *cq);
+int nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +12 -3
index 8fbb13ecbd..f546fc83c5 100644
@@ -387,7 +387,11 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -415,7 +419,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -504,7 +512,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
 	plt_free(cq->desc_base);
@@ -884,6 +892,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
 	}
 
+	rc = nix_tel_node_add_sq(sq);
 	return rc;
 nomem:
 	plt_free(sq->fc);
drivers/common/cnxk/roc_platform.h +3 -0
index 57073d62aa..b95af115f7 100644
@@ -145,7 +145,10 @@
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_STRING_VAL RTE_TEL_STRING_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_string rte_tel_data_add_array_string
 #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)			\
Signature · 1 line
2.25.1
#96 lore raw

PATCH v8 4/4 net/cnxk: add telemetry endpoing to ethdev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 129 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 130 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +129 -0
new file mode 100644
index 0000000000..de8c468670
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)
+{
+	struct rte_eth_dev *eth_dev;
+	struct rte_tel_data *i_data;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			/** No of rx queues */
+			uint16_t rx_queues;
+			/** No of tx queues */
+			uint16_t tx_queues;
+			/** Port ID */
+			uint16_t port_id;
+			/** MAC entries */
+			char mac_addr[MACADDR_LEN];
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint16_t flags;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Offload capabilities */
+			uint64_t rx_offload_capa;
+			uint64_t tx_offload_capa;
+			uint32_t speed_capa;
+			/* Configured offloads */
+			uint64_t rx_offloads;
+			uint64_t tx_offloads;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+			/* ETHDEV RSS HF bitmask */
+			uint64_t ethdev_rss_hf;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	} eth_info;
+	struct eth_info_s *info;
+	unsigned int i, j = 0;
+	int n_ports;
+
+	n_ports = rte_eth_dev_count_avail();
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		if (eth_dev) {
+			memset(&eth_info, 0, sizeof(eth_info));
+			info = &eth_info.info;
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev->nix);
+				memset(info->mac_addr, 0, MACADDR_LEN);
+				snprintf(info->mac_addr, MACADDR_LEN,
+					 "%02x:%02x:%02x:%02x:%02x:%02x",
+					 dev->mac_addr[0], dev->mac_addr[1],
+					 dev->mac_addr[2], dev->mac_addr[3],
+					 dev->mac_addr[4], dev->mac_addr[5]);
+				info->max_mac_entries = dev->max_mac_entries;
+				info->dmac_filter_ena = dev->dmac_filter_enable;
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->flags = dev->flags;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_capa = dev->rx_offload_capa;
+				info->tx_offload_capa = dev->tx_offload_capa;
+				info->rx_offloads = dev->rx_offloads;
+				info->tx_offloads = dev->tx_offloads;
+				info->rx_offload_flags = dev->rx_offload_flags;
+				info->tx_offload_flags = dev->tx_offload_flags;
+				info->ethdev_rss_hf = dev->ethdev_rss_hf;
+			}
+
+			if (eth_dev->data) {
+				info->rx_queues = eth_dev->data->nb_rx_queues;
+				info->tx_queues = eth_dev->data->nb_tx_queues;
+				info->port_id = eth_dev->data->port_id;
+			}
+
+			for (j = 0; j < ETH_INFO_SZ; j++)
+				rte_tel_data_add_array_u64(i_data,
+							   eth_info.val[j]);
+
+			j++;
+		}
+	}
+
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+	return 0;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info,
+				   "Returns ethdev device information");
+}
drivers/net/cnxk/meson.build +1 -0
index d1d4b4e15e..5b3b8422fb 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
Signature · 1 line
2.25.1
#39 lore raw

PATCH v2 1/1 telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Fix json output buffer size for a single largest value.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

v2:
- split from series 18768 ("cnxk: enable telemetry endpoints").

---
 lib/telemetry/telemetry_json.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +5 -2
index ad270b9b30..ba2fde34cb 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,15 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * Size of buffer is (single largest value - 6), where at least 6 chars
+ * would have been used for creating json dict i.e '{"x": ... }'.
+ * This function is not for use for values larger than this buffer size.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[RTE_TEL_MAX_SINGLE_STRING_LEN - 6];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#97 lore raw

Re: [dpdk-dev] [v8, 4/4] net/cnxk: add telemetry endpoing to ethdev

In reply to Gowrishankar Muthukrishnan
Quoted 58 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 129 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 130 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +42 -0
new file mode 100644
index 0000000000..de8c468670
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+       (RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+        sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+                      const char *params __rte_unused, struct rte_tel_data *d)
+{
+       struct rte_eth_dev *eth_dev;
+       struct rte_tel_data *i_data;
+       struct cnxk_eth_dev *dev;
+       union eth_info_u {
+               struct eth_info_s {
+                       /** PF/VF information */
+                       uint16_t pf_func;
+                       /** No of rx queues */
+                       uint16_t rx_queues;
+                       /** No of tx queues */
+                       uint16_t tx_queues;
+                       /** Port ID */
+                       uint16_t port_id;
+                       /** MAC entries */
+                       char mac_addr[MACADDR_LEN];
+                       uint8_t max_mac_entries;
+                       bool dmac_filter_ena;
+                       uint8_t dmac_filter_count;
+                       uint16_t flags;
+                       uint8_t ptype_disable;
+                       bool scalar_ena;
+                       bool ptp_ena;
+                       /* Offload capabilities */
+                       uint64_t rx_offload_capa;

drivers/net/cnxk/cnxk_ethdev_telemetry.c line 52

Quoted 10 lines
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +10 -0
+                       uint64_t tx_offload_capa;
+                       uint32_t speed_capa;
+                       /* Configured offloads */
+                       uint64_t rx_offloads;
+                       uint64_t tx_offloads;
+                       /* Platform specific offload flags */
+                       uint16_t rx_offload_flags;
+                       uint16_t tx_offload_flags;
+                       /* ETHDEV RSS HF bitmask */
+                       uint64_t ethdev_rss_hf;

+ Ethdev, , mempool and telemetry maintainers

All of the above data except[1] is generic data that can be derived from ethdev APIs or ethdev data from lib/ethdev itself, IMO, We should avoid duplicating this in driver and make useful for other driver/application by adding generic endpoint in ethdev. Same comment for "[2/4] mempool/cnxk: add telemetry end points" for mempool subsystem.

Thoughts from Maintainers?

[1]
uint8_t ptype_disable;
bool scalar_ena;
bool ptp_ena;
uint16_t flags;

#56 lore raw

PATCH v2 1/1 crypto/cnxk: add telemetry endpoints to cryptodev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to cryptodev.

---
Depends-on: series-19052 ("cnxk: enable telemetry endpoints for mempool and ethdev")
Depends-on: patch-19054 ("telemetry: fix json output buffer size")

v2:
- split from series 18768 ("cnxk: enable telemetry endpoints").

---
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 154 ++++++++++++++++++
 drivers/crypto/cnxk/meson.build               |   1 +
 2 files changed, 155 insertions(+)
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c new file +154 -0
new file mode 100644
index 0000000000..4c754bc6c7
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_cryptodev.h>
+#include <rte_cryptodev_pmd.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_cryptodev.h"
+#include "cnxk_telemetry.h"
+
+#define CRYPTO_CAPS_SZ                                                         \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities),             \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+#define SEC_CAPS_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_security_capability),                \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+static int
+cryptodev_tel_handle_list(const char *cmd __rte_unused,
+			  const char *params __rte_unused,
+			  struct rte_tel_data *d)
+{
+	struct rte_cryptodev *cryptodev;
+	unsigned int i;
+
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+
+	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
+		cryptodev = rte_cryptodev_pmd_get_dev(i);
+		if (cryptodev->attached != RTE_CRYPTODEV_ATTACHED)
+			continue;
+
+		rte_tel_data_add_array_string(d, cryptodev->data->name);
+	}
+
+	return 0;
+}
+
+static int
+crypto_caps_array(struct rte_tel_data *d,
+		  struct rte_cryptodev_capabilities *dev_caps,
+		  size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_cryptodev_capabilities dev_caps;
+		uint64_t val[CRYPTO_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		if (dev_caps[i].op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
+			break;
+
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+sec_caps_array(struct rte_tel_data *d, struct rte_security_capability *dev_caps,
+	       size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_security_capability dev_caps;
+		uint64_t val[SEC_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < SEC_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+cryptodev_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			  struct rte_tel_data *d)
+{
+	struct rte_tel_data *crypto_caps, *sec_crypto_caps, *sec_caps;
+	int crypto_caps_n, sec_crypto_caps_n, sec_caps_n;
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	struct rte_cryptodev *dev;
+	struct cnxk_cpt_vf *vf;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	rte_strlcpy(name, params, RTE_CRYPTODEV_NAME_LEN);
+	dev = rte_cryptodev_pmd_get_named_dev(name);
+	if (!dev) {
+		plt_err("No cryptodev of name %s available", name);
+		return -1;
+	}
+
+	vf = dev->data->dev_private;
+
+	rte_tel_data_start_dict(d);
+	CNXK_TEL_DICT_INT(d, dev->data, dev_id);
+	CNXK_TEL_DICT_INT(d, dev->data, socket_id);
+	CNXK_TEL_DICT_INT(d, dev->data, dev_started);
+
+	/* Crypto capabilities */
+	crypto_caps = rte_tel_data_alloc();
+	crypto_caps_n = crypto_caps_array(crypto_caps, vf->crypto_caps,
+					  CNXK_CPT_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
+	rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
+
+	/* Security Crypto capabilities */
+	sec_crypto_caps = rte_tel_data_alloc();
+	sec_crypto_caps_n = crypto_caps_array(
+		sec_crypto_caps, vf->sec_crypto_caps, CNXK_SEC_CRYPTO_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_crypto_caps", sec_crypto_caps,
+					0);
+	rte_tel_data_add_dict_int(d, "sec_crypto_caps_n", sec_crypto_caps_n);
+
+	/* Security capabilities */
+	sec_caps = rte_tel_data_alloc();
+	sec_caps_n = sec_caps_array(sec_caps, vf->sec_caps, CNXK_SEC_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
+	rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_cryptodev_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/list", cryptodev_tel_handle_list,
+		"Returns list of available cryptodev. Takes no parameters");
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/info", cryptodev_tel_handle_info,
+		"Returns cryptodev info. Parameters: pci id");
+}
drivers/crypto/cnxk/meson.build +1 -0
index e40d132f80..0ce89f1c12 100644
@@ -19,6 +19,7 @@ sources = files(
         'cnxk_cryptodev_capabilities.c',
         'cnxk_cryptodev_ops.c',
         'cnxk_cryptodev_sec.c',
+        'cnxk_cryptodev_telemetry.c',
 )
 
 deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev']
Signature · 1 line
2.25.1
#98 lore raw

Re: [dpdk-dev] [v8, 4/4] net/cnxk: add telemetry endpoing to ethdev

In reply to Jerin Jacob
Quoted 73 lines · Jerin Jacob
Quoted 58 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 129 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 130 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +42 -0
new file mode 100644
index 0000000000..de8c468670
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+       (RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+        sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+                      const char *params __rte_unused, struct rte_tel_data *d)
+{
+       struct rte_eth_dev *eth_dev;
+       struct rte_tel_data *i_data;
+       struct cnxk_eth_dev *dev;
+       union eth_info_u {
+               struct eth_info_s {
+                       /** PF/VF information */
+                       uint16_t pf_func;
+                       /** No of rx queues */
+                       uint16_t rx_queues;
+                       /** No of tx queues */
+                       uint16_t tx_queues;
+                       /** Port ID */
+                       uint16_t port_id;
+                       /** MAC entries */
+                       char mac_addr[MACADDR_LEN];
+                       uint8_t max_mac_entries;
+                       bool dmac_filter_ena;
+                       uint8_t dmac_filter_count;
+                       uint16_t flags;
+                       uint8_t ptype_disable;
+                       bool scalar_ena;
+                       bool ptp_ena;
+                       /* Offload capabilities */
+                       uint64_t rx_offload_capa;

drivers/net/cnxk/cnxk_ethdev_telemetry.c line 52

Quoted 10 lines
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +10 -0
+                       uint64_t tx_offload_capa;
+                       uint32_t speed_capa;
+                       /* Configured offloads */
+                       uint64_t rx_offloads;
+                       uint64_t tx_offloads;
+                       /* Platform specific offload flags */
+                       uint16_t rx_offload_flags;
+                       uint16_t tx_offload_flags;
+                       /* ETHDEV RSS HF bitmask */
+                       uint64_t ethdev_rss_hf;

+ Ethdev, , mempool and telemetry maintainers

Quoted 9 lines

All of the above data except[1] is generic data that can be derived from ethdev APIs or ethdev data from lib/ethdev itself, IMO, We should avoid duplicating this in driver and make useful for other driver/application by adding generic endpoint in ethdev. Same comment for "[2/4] mempool/cnxk: add telemetry end points" for mempool subsystem.

Thoughts from Maintainers?

Not a maintainer of those libs, but +1 to making anything generic that can be, save reimplementing things multiple times in drivers.

#99 lore raw

Re: [dpdk-dev] [v8, 4/4] net/cnxk: add telemetry endpoing to ethdev

Quoted 81 lines · Bruce Richardson
Quoted 80 lines · Jerin Jacob
Quoted 58 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 129 +++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |   1 +
 2 files changed, 130 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +42 -0
new file mode 100644
index 0000000000..de8c468670
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+       (RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+        sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+                      const char *params __rte_unused, struct rte_tel_data *d)
+{
+       struct rte_eth_dev *eth_dev;
+       struct rte_tel_data *i_data;
+       struct cnxk_eth_dev *dev;
+       union eth_info_u {
+               struct eth_info_s {
+                       /** PF/VF information */
+                       uint16_t pf_func;
+                       /** No of rx queues */
+                       uint16_t rx_queues;
+                       /** No of tx queues */
+                       uint16_t tx_queues;
+                       /** Port ID */
+                       uint16_t port_id;
+                       /** MAC entries */
+                       char mac_addr[MACADDR_LEN];
+                       uint8_t max_mac_entries;
+                       bool dmac_filter_ena;
+                       uint8_t dmac_filter_count;
+                       uint16_t flags;
+                       uint8_t ptype_disable;
+                       bool scalar_ena;
+                       bool ptp_ena;
+                       /* Offload capabilities */
+                       uint64_t rx_offload_capa;

drivers/net/cnxk/cnxk_ethdev_telemetry.c line 52

Quoted 10 lines
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +10 -0
+                       uint64_t tx_offload_capa;
+                       uint32_t speed_capa;
+                       /* Configured offloads */
+                       uint64_t rx_offloads;
+                       uint64_t tx_offloads;
+                       /* Platform specific offload flags */
+                       uint16_t rx_offload_flags;
+                       uint16_t tx_offload_flags;
+                       /* ETHDEV RSS HF bitmask */
+                       uint64_t ethdev_rss_hf;

+ Ethdev, , mempool and telemetry maintainers

All of the above data except[1] is generic data that can be derived from ethdev APIs or ethdev data from lib/ethdev itself, IMO, We should avoid duplicating this in driver and make useful for other driver/application by adding generic endpoint in ethdev. Same comment for "[2/4] mempool/cnxk: add telemetry end points" for mempool subsystem.

Quoted 4 lines
Quoted 2 lines

Thoughts from Maintainers?

Not a maintainer of those libs, but +1 to making anything generic that can be, save reimplementing things multiple times in drivers.

I agree, I feel it would make more sense to have most of the job done in the mempool library in generic. A new ops could be added to fill driver-specific info.

#40 lore raw

Re: [dpdk-dev] [v2] telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Hi Gowrishankar,

Quoted 49 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Tuesday 21 September 2021 12:03
To: [email protected]
Cc: Power, Ciara <[email protected]>; Gowrishankar Muthukrishnan <[email protected]>
Subject: [v2] telemetry: fix json output buffer size

Fix json output buffer size for a single largest value.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

v2:
- split from series 18768 ("cnxk: enable telemetry endpoints").

---
lib/telemetry/telemetry_json.h | 7 +++++--

1 file changed, 5 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +4 -1
index ad270b9b30..ba2fde34cb 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
 * @file
@@ -23,13 +24,15 @@
 * @internal
 * Copies a value into a buffer if the buffer has enough available space.
 * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * Size of buffer is (single largest value - 6), where at least 6 chars
+ * would have been used for creating json dict i.e '{"x": ... }'.
+ * This function is not for use for values larger than this buffer size.
 */
 __rte_format_printf(3, 4)

static inline int
__json_snprintf(char *buf, const int len, const char *format, ...) {

lib/telemetry/telemetry_json.h +1 -1
-	char tmp[1024];
+	char tmp[RTE_TEL_MAX_SINGLE_STRING_LEN - 6];
	va_list ap;
	int ret;
Quoted 2 lines

--
2.25.1

I am not sure about why we would want this to allow for "RTE_TEL_MAX_SINGLE_STRING_LEN - 6".
The RTE_TEL_MAX_SINGLE_STRING_LEN is used to represent the max size of a singular string value e.g. the response to client being {"<cmd>" : "<string value here up to max size in length>" }

I wonder could we use the "len" parameter in some way here, that would be the available space to be filled of the "buf" being passed in, allowing the function to copy in the maximum amount to fill the buffer.

Thanks,
Ciara

#41 lore raw

Re: [dpdk-dev] [v2] telemetry: fix json output buffer size

Hi Ciara,

Quoted 9 lines

I am not sure about why we would want this to allow for "RTE_TEL_MAX_SINGLE_STRING_LEN - 6".
The RTE_TEL_MAX_SINGLE_STRING_LEN is used to represent the max size of a
singular string value e.g. the response to client being {"<cmd>" : "<string value
here up to max size in length>" }

I wonder could we use the "len" parameter in some way here, that would be the available space to be filled of the "buf" being passed in, allowing the function to copy in the maximum amount to fill the buffer.

Got it. Yeah, "len" is actual available space. I ll send next version based on this.

Also, I propose if we can have platform defined upper limits (esp MAX_CMD_LEN, MAX_SINGLE_STRING_LEN etc) so that, we need not revisit lib/telemetry for platform needs (and I don't think one size fits all platform, may be excess too). Thoughts ?

Thanks,
Gowrishankar

Quoted 3 lines

Thanks,
Ciara

#45 lore raw

PATCH v3 1/1 telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Fix json output buffer size for a single largest value. Also fix compile assertion for the size of output buffer.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

---
v3:
- use "len" param as buffer size.

---
 lib/telemetry/telemetry_json.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +3 -2
index ad270b9b30..f02a12f5b0 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,13 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#46 lore raw

PATCH v4 1/1 telemetry: fix json output buffer size

Fix json output buffer size for a single largest value.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

---
v4:
- corrected typo in commit message.
v3:
- use "len" param as buffer size.

---
 lib/telemetry/telemetry_json.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +3 -2
index ad270b9b30..f02a12f5b0 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,13 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#47 lore raw

PATCH v5 1/1 telemetry: fix json output buffer size

Fix json output buffer size for an actual data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")
---
 lib/telemetry/telemetry_json.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +3 -2
index ad270b9b30..f02a12f5b0 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,13 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#100 lore raw

PATCH 1/1 ethdev: add telemetry endpoint for device info

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint /ethdev/info for device info.

Change-Id I3e6ee2bd1a80675473adf0bd884b194f98e28536
---
 lib/ethdev/rte_ethdev.c | 92 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)
lib/ethdev/rte_ethdev.c +92 -0
index daf5ca9242..9b7bfa5f63 100644
@@ -6242,6 +6242,96 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
 	return 0;
 }
 
+static int
+eth_dev_handle_port_info(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_tel_data *rxq_state, *txq_state;
+	char mac_addr[RTE_ETHER_ADDR_LEN];
+	struct rte_eth_dev *eth_dev;
+	char *end_param;
+	int port_id, i;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	port_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_ETHDEV_LOG(NOTICE,
+			"Extra parameters passed to ethdev telemetry command, ignoring");
+
+	if (!rte_eth_dev_is_valid_port(port_id))
+		return -EINVAL;
+
+	eth_dev = &rte_eth_devices[port_id];
+	if (!eth_dev)
+		return -EINVAL;
+
+	rxq_state = rte_tel_data_alloc();
+	if (!rxq_state)
+		return -ENOMEM;
+
+	txq_state = rte_tel_data_alloc();
+	if (!txq_state)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+	rte_tel_data_add_dict_int(d, "state", eth_dev->state);
+	rte_tel_data_add_dict_int(d, "nb_rx_queues",
+			eth_dev->data->nb_rx_queues);
+	rte_tel_data_add_dict_int(d, "nb_tx_queues",
+			eth_dev->data->nb_tx_queues);
+	rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
+	rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_size_min",
+			eth_dev->data->min_rx_buf_size);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail",
+			eth_dev->data->rx_mbuf_alloc_failed);
+	snprintf(mac_addr, RTE_ETHER_ADDR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
+			 eth_dev->data->mac_addrs->addr_bytes[0],
+			 eth_dev->data->mac_addrs->addr_bytes[1],
+			 eth_dev->data->mac_addrs->addr_bytes[2],
+			 eth_dev->data->mac_addrs->addr_bytes[3],
+			 eth_dev->data->mac_addrs->addr_bytes[4],
+			 eth_dev->data->mac_addrs->addr_bytes[5]);
+	rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
+	rte_tel_data_add_dict_int(d, "promiscuous",
+			eth_dev->data->promiscuous);
+	rte_tel_data_add_dict_int(d, "scattered_rx",
+			eth_dev->data->scattered_rx);
+	rte_tel_data_add_dict_int(d, "all_multicast",
+			eth_dev->data->all_multicast);
+	rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
+	rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
+	rte_tel_data_add_dict_int(d, "dev_configured",
+			eth_dev->data->dev_configured);
+
+	rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+		rte_tel_data_add_array_int(rxq_state,
+				eth_dev->data->rx_queue_state[i]);
+
+	rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+		rte_tel_data_add_array_int(txq_state,
+				eth_dev->data->tx_queue_state[i]);
+
+	rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
+	rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
+	rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
+	rte_tel_data_add_dict_int(d, "dev_flags", eth_dev->data->dev_flags);
+	rte_tel_data_add_dict_int(d, "rx_offloads",
+			eth_dev->data->dev_conf.rxmode.offloads);
+	rte_tel_data_add_dict_int(d, "tx_offloads",
+			eth_dev->data->dev_conf.txmode.offloads);
+	rte_tel_data_add_dict_int(d, "ethdev_rss_hf",
+			eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf);
+
+	return 0;
+}
+
 int
 rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue,
 				  struct rte_hairpin_peer_info *cur_info,
@@ -6323,4 +6413,6 @@ RTE_INIT(ethdev_init_telemetry)
 	rte_telemetry_register_cmd("/ethdev/link_status",
 			eth_dev_handle_port_link_status,
 			"Returns the link status for a port. Parameters: int port_id");
+	rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
+			"Returns the device info for a port. Parameters: int port_id");
 }
Signature · 1 line
2.25.1
#87 lore raw

PATCH 1/1 mempool: add telemetry endpoint for mempool info

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint for mempool info.

---
 lib/mempool/rte_mempool.c | 84 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
lib/mempool/rte_mempool.c +84 -0
index 59a588425b..b8dad2997a 100644
@@ -31,6 +31,7 @@
 #include <rte_spinlock.h>
 #include <rte_tailq.h>
 #include <rte_eal_paging.h>
+#include <rte_telemetry.h>
 
 #include "rte_mempool.h"
 #include "rte_mempool_trace.h"
@@ -1343,3 +1344,86 @@ void rte_mempool_walk(void (*func)(struct rte_mempool *, void *),
 
 	rte_mcfg_mempool_read_unlock();
 }
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_handle_list(const char *cmd __rte_unused,
+	const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	rte_tel_data_add_dict_string(info->d, "name", mp->name);
+	rte_tel_data_add_dict_int(info->d, "pool_id", mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "flags", mp->flags);
+	rte_tel_data_add_dict_int(info->d, "socket_id", mp->socket_id);
+	rte_tel_data_add_dict_int(info->d, "size", mp->size);
+	rte_tel_data_add_dict_int(info->d, "cache_size", mp->cache_size);
+	rte_tel_data_add_dict_int(info->d, "elt_size", mp->elt_size);
+	rte_tel_data_add_dict_int(info->d, "header_size", mp->header_size);
+	rte_tel_data_add_dict_int(info->d, "trailer_size", mp->trailer_size);
+	rte_tel_data_add_dict_int(info->d, "private_data_size",
+			mp->private_data_size);
+	rte_tel_data_add_dict_int(info->d, "ops_index", mp->ops_index);
+	rte_tel_data_add_dict_int(info->d, "populated_size",
+			mp->populated_size);
+
+	mz = mp->mz;
+	rte_tel_data_add_dict_string(info->d, "mz_name", mz->name);
+	rte_tel_data_add_dict_int(info->d, "mz_len", mz->len);
+	rte_tel_data_add_dict_int(info->d, "mz_hugepage_sz",
+							  mz->hugepage_sz);
+	rte_tel_data_add_dict_int(info->d, "mz_socket_id", mz->socket_id);
+	rte_tel_data_add_dict_int(info->d, "mz_flags", mz->flags);
+}
+
+static int
+mempool_handle_info(const char *cmd __rte_unused, const char *params,
+	struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd("/mempool/list", mempool_handle_list,
+		"Returns list of available mempool. Takes no parameters");
+	rte_telemetry_register_cmd("/mempool/info", mempool_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
Signature · 1 line
2.25.1
#57 lore raw

PATCH 1/1 cryptodev: add telemetry endpoint for cryptodev info

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint for cryptodev info.

---
Depends-on: patch-18355 ("cryptodev: add telemetry callbacks")
Depends-on: patch-19247 ("telemetry: fix json output buffer size")

---
 lib/cryptodev/rte_cryptodev.c | 68 +++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)
lib/cryptodev/rte_cryptodev.c +68 -0
index 0823137465..365cf3ccc1 100644
@@ -2481,6 +2481,72 @@ cryptodev_handle_dev_stats(const char *cmd __rte_unused,
 	return 0;
 }
 
+#define CRYPTO_CAPS_SZ                                                         \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities),             \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+static int
+crypto_caps_array(struct rte_tel_data *d,
+		  const struct rte_cryptodev_capabilities *capabilities)
+{
+	const struct rte_cryptodev_capabilities *dev_caps;
+	union caps_u {
+		struct rte_cryptodev_capabilities dev_caps;
+		uint64_t val[CRYPTO_CAPS_SZ];
+	} caps;
+	unsigned int i = 0, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	while ((dev_caps = &capabilities[i++])->op !=
+	   RTE_CRYPTO_OP_TYPE_UNDEFINED) {
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, dev_caps, sizeof(capabilities[0]));
+		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+cryptodev_handle_info(const char *cmd __rte_unused, const char *params,
+			  struct rte_tel_data *d)
+{
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	struct rte_cryptodev_info dev_info;
+	struct rte_tel_data *crypto_caps;
+	struct rte_cryptodev *dev;
+	int crypto_caps_n;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_CRYPTODEV_NAME_LEN);
+	dev = rte_cryptodev_pmd_get_named_dev(name);
+	if (!dev)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "dev_id", dev->data->dev_id);
+	rte_tel_data_add_dict_int(d, "socket_id", dev->data->socket_id);
+	rte_tel_data_add_dict_int(d, "dev_started", dev->data->dev_started);
+
+	/* Crypto capabilities */
+	crypto_caps = rte_tel_data_alloc();
+	if (!crypto_caps)
+		return -ENOMEM;
+
+	rte_cryptodev_info_get(dev->data->dev_id, &dev_info);
+	crypto_caps_n = crypto_caps_array(crypto_caps, dev_info.capabilities);
+	rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
+	rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
+
+	return 0;
+}
+
 RTE_INIT(cryptodev_init_telemetry)
 {
 	rte_telemetry_register_cmd("/cryptodev/list", cryptodev_handle_dev_list,
@@ -2488,4 +2554,6 @@ RTE_INIT(cryptodev_init_telemetry)
 	rte_telemetry_register_cmd("/cryptodev/stats",
 			cryptodev_handle_dev_stats,
 			"Returns the stats for a cryptodev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_info,
+		"Returns cryptodev info. Parameters: pci id");
 }
Signature · 1 line
2.25.1
#105 lore raw

v9 cover cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in cnxk for the following:
- NPA LF
- NIX LF
- Mempool driver
- Ethdev driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")
Depends-on: patch-19248 ("ethdev: add telemetry endpoint for device info")
Depends-on: patch-19251 ("mempool: add telemetry endpoint for mempool info")

v9:
- moved common info from drivers to lib endpoints.

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
common/cnxk: add telemetry endpoints to nix
mempool/cnxk: add telemetry endpoints mempool
net/cnxk: add telemetry endpoints to ethdev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c |  57 ++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      |  93 ++
 drivers/net/cnxk/meson.build                  |   1 +
 12 files changed, 1295 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
Signature · 1 line
2.25.1
#106 lore raw

PATCH v9 1/4 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 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
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +224 -0

224 lines not on this page · raw message

drivers/common/cnxk/meson.build +4 -2
index cd19ad29c1..f0a1c9f115 100644
@@ -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']
drivers/common/cnxk/roc_platform.h +12 -0
index 241655b334..57073d62aa 100644
@@ -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;
Signature · 1 line
2.25.1
#108 lore raw

PATCH v9 2/4 common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to nix.

---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 849 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  15 +-
 drivers/common/cnxk/roc_platform.h       |   3 +
 6 files changed, 878 insertions(+), 4 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
drivers/common/cnxk/cnxk_telemetry_nix.c new file +849 -0
new file mode 100644
index 0000000000..1175f68a51
@@ -0,0 +1,849 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node);
+static struct nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *), 0);
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *), 0);
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *), 0);
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->sqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char *params,
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	return cnxk_tel_nix(node->nix, d);
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+	int rc = -1;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		goto exit;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		goto exit;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			rc = cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			rc = cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			rc = cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+exit:
+	return rc;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id");
+}
drivers/common/cnxk/meson.build +2 -1
index f0a1c9f115..fe7a95b526 100644
@@ -65,6 +65,7 @@ sources = files(
 sources += files('cnxk_security.c')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry']
drivers/common/cnxk/roc_nix.c +3 -0
index 3ab954e94d..17beb1a736 100644
@@ -178,6 +178,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;
 }
@@ -413,6 +415,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +9 -0
index 2cd5a72347..ba639791ce 100644
@@ -424,4 +424,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base, uint64_t *data, uint16_t qints,
 int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix);
+void nix_tel_node_del(struct roc_nix *roc_nix);
+int nix_tel_node_add_rq(struct roc_nix_rq *rq);
+int nix_tel_node_add_cq(struct roc_nix_cq *cq);
+int nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +12 -3
index 8fbb13ecbd..f546fc83c5 100644
@@ -387,7 +387,11 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -415,7 +419,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -504,7 +512,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
 	plt_free(cq->desc_base);
@@ -884,6 +892,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
 	}
 
+	rc = nix_tel_node_add_sq(sq);
 	return rc;
 nomem:
 	plt_free(sq->fc);
drivers/common/cnxk/roc_platform.h +3 -0
index 57073d62aa..b95af115f7 100644
@@ -145,7 +145,10 @@
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_STRING_VAL RTE_TEL_STRING_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_string rte_tel_data_add_array_string
 #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)			\
Signature · 1 line
2.25.1
#110 lore raw

PATCH v9 3/4 mempool/cnxk: add telemetry endpoints mempool

In reply to Gowrishankar Muthukrishnan

Adding telemetry endpoints to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 57 +++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |  1 +
 2 files changed, 58 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +57 -0
new file mode 100644
index 0000000000..c71798d7fd
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#112 lore raw

PATCH v9 4/4 net/cnxk: add telemetry endpoints to ethdev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 93 ++++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |  1 +
 2 files changed, 94 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +93 -0
new file mode 100644
index 0000000000..83bc65848c
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)
+{
+	struct rte_eth_dev *eth_dev;
+	struct rte_tel_data *i_data;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	} eth_info;
+	struct eth_info_s *info;
+	unsigned int i, j = 0;
+	int n_ports;
+
+	n_ports = rte_eth_dev_count_avail();
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		if (eth_dev) {
+			memset(&eth_info, 0, sizeof(eth_info));
+			info = &eth_info.info;
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev->nix);
+				info->max_mac_entries = dev->max_mac_entries;
+				info->dmac_filter_ena = dev->dmac_filter_enable;
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_flags = dev->rx_offload_flags;
+				info->tx_offload_flags = dev->tx_offload_flags;
+			}
+
+			for (j = 0; j < ETH_INFO_SZ; j++)
+				rte_tel_data_add_array_u64(i_data,
+							   eth_info.val[j]);
+
+			j++;
+		}
+	}
+
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+	return 0;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info,
+				   "Returns ethdev device information");
+}
drivers/net/cnxk/meson.build +1 -0
index d1d4b4e15e..5b3b8422fb 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
Signature · 1 line
2.25.1
#81 lore raw

PATCH v3 1/1 crypto/cnxk: add telemetry endpoints to cryptodev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to cryptodev.

---
Depends-on: patch-19252 ("cryptodev: add telemetry endpoint for cryptodev info")
Depends-on: series-19253 ("cnxk: enable telemetry endpoints")

v3:
- common info moved to lib/cryptodev endpoint.

---
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 119 ++++++++++++++++++
 drivers/crypto/cnxk/meson.build               |   1 +
 2 files changed, 120 insertions(+)
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c new file +119 -0
new file mode 100644
index 0000000000..657004e65a
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_cryptodev.h>
+#include <rte_telemetry.h>
+#include <cryptodev_pmd.h>
+
+#include <roc_api.h>
+
+#include "cnxk_cryptodev.h"
+#include "cnxk_telemetry.h"
+
+#define CRYPTO_CAPS_SZ                                                         \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities),             \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+#define SEC_CAPS_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_security_capability),                \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+static int
+crypto_caps_array(struct rte_tel_data *d,
+		  struct rte_cryptodev_capabilities *dev_caps,
+		  size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_cryptodev_capabilities dev_caps;
+		uint64_t val[CRYPTO_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		if (dev_caps[i].op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
+			break;
+
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+sec_caps_array(struct rte_tel_data *d, struct rte_security_capability *dev_caps,
+	       size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_security_capability dev_caps;
+		uint64_t val[SEC_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < SEC_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+cryptodev_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			  struct rte_tel_data *d)
+{
+	struct rte_tel_data *sec_crypto_caps, *sec_caps;
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	int sec_crypto_caps_n, sec_caps_n;
+	struct rte_cryptodev *dev;
+	struct cnxk_cpt_vf *vf;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_CRYPTODEV_NAME_LEN);
+	dev = rte_cryptodev_pmd_get_named_dev(name);
+	if (!dev) {
+		plt_err("No cryptodev of name %s available", name);
+		return -EINVAL;
+	}
+
+	vf = dev->data->dev_private;
+	rte_tel_data_start_dict(d);
+
+	/* Security Crypto capabilities */
+	sec_crypto_caps = rte_tel_data_alloc();
+	sec_crypto_caps_n = crypto_caps_array(
+		sec_crypto_caps, vf->sec_crypto_caps, CNXK_SEC_CRYPTO_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_crypto_caps", sec_crypto_caps,
+					0);
+	rte_tel_data_add_dict_int(d, "sec_crypto_caps_n", sec_crypto_caps_n);
+
+	/* Security capabilities */
+	sec_caps = rte_tel_data_alloc();
+	sec_caps_n = sec_caps_array(sec_caps, vf->sec_caps, CNXK_SEC_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
+	rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_cryptodev_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/info", cryptodev_tel_handle_info,
+		"Returns cryptodev info. Parameters: pci id");
+}
drivers/crypto/cnxk/meson.build +1 -0
index 437d208b5a..4350928289 100644
@@ -19,6 +19,7 @@ sources = files(
         'cnxk_cryptodev_capabilities.c',
         'cnxk_cryptodev_ops.c',
         'cnxk_cryptodev_sec.c',
+        'cnxk_cryptodev_telemetry.c',
 )
 
 deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev']
Signature · 1 line
2.25.1
#82 lore raw

PATCH v4 1/1 crypto/cnxk: add telemetry endpoints to cryptodev

Add telemetry endpoints to cryptodev.

---
Depends-on: patch-19252 ("cryptodev: add telemetry endpoint for cryptodev info")
Depends-on: series-19253 ("cnxk: enable telemetry endpoints")

v4:
- fix compilation issue.

---
 .../crypto/cnxk/cnxk_cryptodev_telemetry.c    | 119 ++++++++++++++++++
 drivers/crypto/cnxk/meson.build               |   1 +
 2 files changed, 120 insertions(+)
 create mode 100644 drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c
drivers/crypto/cnxk/cnxk_cryptodev_telemetry.c new file +119 -0
new file mode 100644
index 0000000000..a9df7e49c3
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_cryptodev.h>
+#include <rte_telemetry.h>
+#include <cryptodev_pmd.h>
+
+#include <cnxk_telemetry.h>
+#include <roc_api.h>
+
+#include "cnxk_cryptodev.h"
+
+#define CRYPTO_CAPS_SZ                                                         \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities),             \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+#define SEC_CAPS_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct rte_security_capability),                \
+			sizeof(uint64_t)) /                                    \
+	 sizeof(uint64_t))
+
+static int
+crypto_caps_array(struct rte_tel_data *d,
+		  struct rte_cryptodev_capabilities *dev_caps,
+		  size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_cryptodev_capabilities dev_caps;
+		uint64_t val[CRYPTO_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		if (dev_caps[i].op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
+			break;
+
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+sec_caps_array(struct rte_tel_data *d, struct rte_security_capability *dev_caps,
+	       size_t dev_caps_n)
+{
+	union caps_u {
+		struct rte_security_capability dev_caps;
+		uint64_t val[SEC_CAPS_SZ];
+	} caps;
+	unsigned int i, j, n = 0;
+
+	rte_tel_data_start_array(d, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < dev_caps_n; i++) {
+		memset(&caps, 0, sizeof(caps));
+		rte_memcpy(&caps.dev_caps, &dev_caps[i], sizeof(dev_caps[0]));
+		for (j = 0; j < SEC_CAPS_SZ; j++)
+			rte_tel_data_add_array_u64(d, caps.val[j]);
+		++n;
+	}
+
+	return n;
+}
+
+static int
+cryptodev_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			  struct rte_tel_data *d)
+{
+	struct rte_tel_data *sec_crypto_caps, *sec_caps;
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
+	int sec_crypto_caps_n, sec_caps_n;
+	struct rte_cryptodev *dev;
+	struct cnxk_cpt_vf *vf;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_CRYPTODEV_NAME_LEN);
+	dev = rte_cryptodev_pmd_get_named_dev(name);
+	if (!dev) {
+		plt_err("No cryptodev of name %s available", name);
+		return -EINVAL;
+	}
+
+	vf = dev->data->dev_private;
+	rte_tel_data_start_dict(d);
+
+	/* Security Crypto capabilities */
+	sec_crypto_caps = rte_tel_data_alloc();
+	sec_crypto_caps_n = crypto_caps_array(
+		sec_crypto_caps, vf->sec_crypto_caps, CNXK_SEC_CRYPTO_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_crypto_caps", sec_crypto_caps,
+					0);
+	rte_tel_data_add_dict_int(d, "sec_crypto_caps_n", sec_crypto_caps_n);
+
+	/* Security capabilities */
+	sec_caps = rte_tel_data_alloc();
+	sec_caps_n = sec_caps_array(sec_caps, vf->sec_caps, CNXK_SEC_MAX_CAPS);
+	rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
+	rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_cryptodev_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/cryptodev/info", cryptodev_tel_handle_info,
+		"Returns cryptodev info. Parameters: pci id");
+}
drivers/crypto/cnxk/meson.build +1 -0
index 437d208b5a..4350928289 100644
@@ -19,6 +19,7 @@ sources = files(
         'cnxk_cryptodev_capabilities.c',
         'cnxk_cryptodev_ops.c',
         'cnxk_cryptodev_sec.c',
+        'cnxk_cryptodev_telemetry.c',
 )
 
 deps += ['bus_pci', 'common_cnxk', 'security', 'eventdev']
Signature · 1 line
2.25.1
#42 lore raw

Re: [dpdk-dev] [v2] telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Hi Gowrishankar,

Quoted 20 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Thursday 23 September 2021 06:53
To: Power, Ciara <[email protected]>; [email protected]
Cc: Richardson, Bruce <[email protected]>
Subject: RE: [v2] telemetry: fix json output buffer size

Hi Ciara,

Quoted 3 lines

I am not sure about why we would want this to allow for "RTE_TEL_MAX_SINGLE_STRING_LEN - 6".
The RTE_TEL_MAX_SINGLE_STRING_LEN is used to represent the max size

of a

Quoted 1 line

singular string value e.g. the response to client being {"<cmd>" : "<string

value

Quoted 5 lines

here up to max size in length>" }

I wonder could we use the "len" parameter in some way here, that would be the available space to be filled of the "buf" being passed in, allowing the function to copy in the maximum amount to fill the buffer.

Quoted 7 lines

Got it. Yeah, "len" is actual available space. I ll send next version based on this.

Also, I propose if we can have platform defined upper limits (esp MAX_CMD_LEN, MAX_SINGLE_STRING_LEN etc) so that, we need not revisit lib/telemetry for platform needs (and I don't think one size fits all platform, may be excess too).
Thoughts ?

I am not sure why it is needed to have limits defined per platform - can you explain further about why it is necessary?

Thanks,
Ciara

Quoted 7 lines

Thanks,
Gowrishankar

Quoted 3 lines

Thanks,
Ciara

#43 lore raw

Re: [dpdk-dev] [v2] telemetry: fix json output buffer size

Quoted 9 lines
Quoted 5 lines

Also, I propose if we can have platform defined upper limits (esp MAX_CMD_LEN, MAX_SINGLE_STRING_LEN etc) so that, we need not revisit lib/telemetry for platform needs (and I don't think one size fits all platform, may be excess too).
Thoughts ?

I am not sure why it is needed to have limits defined per platform - can you explain further about why it is necessary?

Mainly, for the endpoint in driver. In case, if the endpoint data is bigger than MAX_SINGLE_STRING_LEN at the worst case, endpoint will not work correctly.

Thanks,
Gowrishankar

#48 lore raw

Re: [dpdk-dev] [v5] telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

29/09/2021 06:18, Gowrishankar Muthukrishnan:

Quoted 3 lines

Fix json output buffer size for an actual data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

Please could you give a bit more explanations?
What was not working and why?

[...]

Quoted 11 lines

- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length. */
__rte_format_printf(3, 4)
static inline int
__json_snprintf(char *buf, const int len, const char *format, ...) {

lib/telemetry/telemetry_json.h +1 -1
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
#49 lore raw

Re: [dpdk-dev] [EXT] Re: [v5] telemetry: fix json output buffer size

Hi Thomas,

Quoted 12 lines

-----Original Message-----
From: Thomas Monjalon <[email protected]>
Sent: Wednesday, October 6, 2021 11:09 PM
To: Gowrishankar Muthukrishnan <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; Jerin Jacob Kollanukkaran <[email protected]>
Subject: [EXT] Re: [dpdk-dev] [v5] telemetry: fix json output buffer size

External Email

----------------------------------------------------------------------
29/09/2021 06:18, Gowrishankar Muthukrishnan:

Quoted 7 lines
Quoted 4 lines

Fix json output buffer size for an actual data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating

JSON")

Please could you give a bit more explanations?
What was not working and why?

Without this patch, our driver end point (crypto/cnxk) could not successfully deliver the requested info due to its larger amount than the fixed buffer length of 1024 bytes as handled by __json_snprintf. I think it is genuine bug too which we caught up here.

Thanks,
Gowrishankar

Quoted 15 lines

[...]

Quoted 10 lines

- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length. */
__rte_format_printf(3, 4)
static inline int
__json_snprintf(char *buf, const int len, const char *format, ...) {

lib/telemetry/telemetry_json.h +1 -1
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
#50 lore raw

Re: [dpdk-dev] [EXT] Re: [v5] telemetry: fix json output buffer size

07/10/2021 06:58, Gowrishankar Muthukrishnan:

Quoted 7 lines

From: Thomas Monjalon <[email protected]>

Quoted 6 lines

29/09/2021 06:18, Gowrishankar Muthukrishnan:

Quoted 4 lines

Fix json output buffer size for an actual data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating

JSON")

Quoted 6 lines
Quoted 2 lines

Please could you give a bit more explanations?
What was not working and why?

Without this patch, our driver end point (crypto/cnxk) could not successfully deliver the requested info due to its larger amount than the fixed buffer length of 1024 bytes as handled by __json_snprintf. I think it is genuine bug too which we caught up here.

So the commit log should say the JSON message was limited to 1024, and now you allow any specified length.

Quoted 11 lines
Quoted 11 lines

[...]

Quoted 10 lines

- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length. */
__rte_format_printf(3, 4)
static inline int
__json_snprintf(char *buf, const int len, const char *format, ...) {

lib/telemetry/telemetry_json.h +1 -1
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
#51 lore raw

Re: [dpdk-dev] [EXT] Re: [v5] telemetry: fix json output buffer size

Quoted 20 lines

-----Original Message-----
From: Thomas Monjalon <[email protected]>
Sent: Thursday, October 7, 2021 12:52 PM
To: Gowrishankar Muthukrishnan <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; Jerin Jacob Kollanukkaran <[email protected]>
Subject: Re: [EXT] Re: [dpdk-dev] [v5] telemetry: fix json output buffer size

07/10/2021 06:58, Gowrishankar Muthukrishnan:

Quoted 11 lines

From: Thomas Monjalon <[email protected]>

Quoted 9 lines

29/09/2021 06:18, Gowrishankar Muthukrishnan:

Quoted 5 lines

Fix json output buffer size for an actual data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for

creating
JSON")

Please could you give a bit more explanations?
What was not working and why?

Quoted 8 lines
Quoted 2 lines

Without this patch, our driver end point (crypto/cnxk) could not successfully deliver the requested info due to its larger amount than the fixed

buffer length of 1024 bytes as handled by __json_snprintf.

Quoted 1 line

I think it is genuine bug too which we caught up here.

So the commit log should say the JSON message was limited to 1024, and now you allow any specified length.

Ack. I'll send new version with this correction.

Thanks,
Gowrishankar

Quoted 13 lines
Quoted 11 lines
Quoted 11 lines

[...]

Quoted 10 lines

- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length. */
__rte_format_printf(3, 4)
static inline int
__json_snprintf(char *buf, const int len, const char *format, ...) {

lib/telemetry/telemetry_json.h +1 -1
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
#44 lore raw

Re: [dpdk-dev] [v2] telemetry: fix json output buffer size

In reply to Gowrishankar Muthukrishnan

Hi Gowrishankar,

Quoted 13 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Thursday 30 September 2021 10:01
To: Power, Ciara <[email protected]>; [email protected]
Cc: Richardson, Bruce <[email protected]>
Subject: RE: [v2] telemetry: fix json output buffer size

Quoted 6 lines
Quoted 5 lines

Also, I propose if we can have platform defined upper limits (esp MAX_CMD_LEN, MAX_SINGLE_STRING_LEN etc) so that, we need not revisit lib/telemetry for platform needs (and I don't think one size fits all platform, may be excess too).
Thoughts ?

Quoted 7 lines
Quoted 3 lines

I am not sure why it is needed to have limits defined per platform - can you explain further about why it is necessary?

Mainly, for the endpoint in driver. In case, if the endpoint data is bigger than MAX_SINGLE_STRING_LEN at the worst case, endpoint will not work correctly.

The MAX_SINGLE_STRING_LEN is currently 8192 - if a value is turning out to be bigger than that, maybe we should be looking at why the string is that long and if it needs to be - i.e. could it be broken down to be more consumable rather than modifying the lib to accept an extremely long string. I don't see an issue with increasing the MAX_CMD_LEN a little in the lib - although it is currently 56, it probably doesn't need to be a huge increase, commands are easier used when concise.

Not sure having platform specific values here is necessary.

Thanks,
Ciara

Quoted 2 lines

Thanks,
Gowrishankar

#52 lore raw

PATCH v6 1/1 telemetry: remove limitation on JSON output buffer length

In reply to Gowrishankar Muthukrishnan

Earlier, JSON message length was limited to 1024 which would not allow data more than this size. Removed this limitation by creating output buffer based on requested data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

---
v6:
- rephrased the commit header and message.

---
 lib/telemetry/telemetry_json.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
lib/telemetry/telemetry_json.h +3 -2
index ad270b9b30..f02a12f5b0 100644
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_telemetry.h>
 
 /**
  * @file
@@ -23,13 +24,13 @@
  * @internal
  * Copies a value into a buffer if the buffer has enough available space.
  * Nothing written to buffer if an overflow ocurs.
- * This function is not for use for values larger than 1k.
+ * This function is not for use for values larger than given buffer length.
  */
 __rte_format_printf(3, 4)
 static inline int
 __json_snprintf(char *buf, const int len, const char *format, ...)
 {
-	char tmp[1024];
+	char tmp[len];
 	va_list ap;
 	int ret;
 
Signature · 1 line
2.25.1
#101 lore raw

Re: [dpdk-dev] [v1] ethdev: add telemetry endpoint for device info

In reply to Gowrishankar Muthukrishnan
Quoted 111 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint /ethdev/info for device info.

Change-Id I3e6ee2bd1a80675473adf0bd884b194f98e28536
---
  lib/ethdev/rte_ethdev.c | 92 +++++++++++++++++++++++++++++++++++++++++
  1 file changed, 92 insertions(+)
lib/ethdev/rte_ethdev.c +90 -0
index daf5ca9242..9b7bfa5f63 100644
@@ -6242,6 +6242,96 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
  	return 0;
  }
 
+static int
+eth_dev_handle_port_info(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_tel_data *rxq_state, *txq_state;
+	char mac_addr[RTE_ETHER_ADDR_LEN];
+	struct rte_eth_dev *eth_dev;
+	char *end_param;
+	int port_id, i;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	port_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_ETHDEV_LOG(NOTICE,
+			"Extra parameters passed to ethdev telemetry command, ignoring");
+
+	if (!rte_eth_dev_is_valid_port(port_id))
+		return -EINVAL;
+
+	eth_dev = &rte_eth_devices[port_id];
+	if (!eth_dev)
+		return -EINVAL;
+
+	rxq_state = rte_tel_data_alloc();
+	if (!rxq_state)
+		return -ENOMEM;
+
+	txq_state = rte_tel_data_alloc();
+	if (!txq_state)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+	rte_tel_data_add_dict_int(d, "state", eth_dev->state);
+	rte_tel_data_add_dict_int(d, "nb_rx_queues",
+			eth_dev->data->nb_rx_queues);
+	rte_tel_data_add_dict_int(d, "nb_tx_queues",
+			eth_dev->data->nb_tx_queues);
+	rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
+	rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_size_min",
+			eth_dev->data->min_rx_buf_size);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail",
+			eth_dev->data->rx_mbuf_alloc_failed);
+	snprintf(mac_addr, RTE_ETHER_ADDR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
+			 eth_dev->data->mac_addrs->addr_bytes[0],
+			 eth_dev->data->mac_addrs->addr_bytes[1],
+			 eth_dev->data->mac_addrs->addr_bytes[2],
+			 eth_dev->data->mac_addrs->addr_bytes[3],
+			 eth_dev->data->mac_addrs->addr_bytes[4],
+			 eth_dev->data->mac_addrs->addr_bytes[5]);
+	rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
+	rte_tel_data_add_dict_int(d, "promiscuous",
+			eth_dev->data->promiscuous);
+	rte_tel_data_add_dict_int(d, "scattered_rx",
+			eth_dev->data->scattered_rx);
+	rte_tel_data_add_dict_int(d, "all_multicast",
+			eth_dev->data->all_multicast);
+	rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
+	rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
+	rte_tel_data_add_dict_int(d, "dev_configured",
+			eth_dev->data->dev_configured);
+
+	rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+		rte_tel_data_add_array_int(rxq_state,
+				eth_dev->data->rx_queue_state[i]);
+
+	rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+		rte_tel_data_add_array_int(txq_state,
+				eth_dev->data->tx_queue_state[i]);
+
+	rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
+	rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
+	rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
+	rte_tel_data_add_dict_int(d, "dev_flags", eth_dev->data->dev_flags);
+	rte_tel_data_add_dict_int(d, "rx_offloads",
+			eth_dev->data->dev_conf.rxmode.offloads);
+	rte_tel_data_add_dict_int(d, "tx_offloads",
+			eth_dev->data->dev_conf.txmode.offloads);
+	rte_tel_data_add_dict_int(d, "ethdev_rss_hf",
+			eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf);
+
+	return 0;
+}
+
  int
  rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue,
  				  struct rte_hairpin_peer_info *cur_info,

lib/ethdev/rte_ethdev.c RTE_INIT(ethdev_init_telemetry) · line 6418

Quoted 6 lines
lib/ethdev/rte_ethdev.c +2 -0
@@ -6323,4 +6413,6 @@ RTE_INIT(ethdev_init_telemetry)
  	rte_telemetry_register_cmd("/ethdev/link_status",
  			eth_dev_handle_port_link_status,
  			"Returns the link status for a port. Parameters: int port_id");
+	rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
+			"Returns the device info for a port. Parameters: int port_id");
  }

@Ciara, @Bruce, can you please review the set from telemetry perspective?

And overall looks like good idea to provide more ethdev information via telemetry, but when we have this it becomes interface since applications may rely on it, is extending it breaks the apps?
If so perhaps we should consider multiple small commands instead of one big 'info' one, what do you think?

#102 lore raw

Re: [dpdk-dev] [v1] ethdev: add telemetry endpoint for device info

Quoted 120 lines · Ferruh Yigit
Quoted 110 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint /ethdev/info for device info.

Change-Id I3e6ee2bd1a80675473adf0bd884b194f98e28536
---
  lib/ethdev/rte_ethdev.c | 92 +++++++++++++++++++++++++++++++++++++++++
  1 file changed, 92 insertions(+)
lib/ethdev/rte_ethdev.c +90 -0
index daf5ca9242..9b7bfa5f63 100644
@@ -6242,6 +6242,96 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
  	return 0;
  }
+static int
+eth_dev_handle_port_info(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_tel_data *rxq_state, *txq_state;
+	char mac_addr[RTE_ETHER_ADDR_LEN];
+	struct rte_eth_dev *eth_dev;
+	char *end_param;
+	int port_id, i;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	port_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_ETHDEV_LOG(NOTICE,
+			"Extra parameters passed to ethdev telemetry command, ignoring");
+
+	if (!rte_eth_dev_is_valid_port(port_id))
+		return -EINVAL;
+
+	eth_dev = &rte_eth_devices[port_id];
+	if (!eth_dev)
+		return -EINVAL;
+
+	rxq_state = rte_tel_data_alloc();
+	if (!rxq_state)
+		return -ENOMEM;
+
+	txq_state = rte_tel_data_alloc();
+	if (!txq_state)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+	rte_tel_data_add_dict_int(d, "state", eth_dev->state);
+	rte_tel_data_add_dict_int(d, "nb_rx_queues",
+			eth_dev->data->nb_rx_queues);
+	rte_tel_data_add_dict_int(d, "nb_tx_queues",
+			eth_dev->data->nb_tx_queues);
+	rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
+	rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_size_min",
+			eth_dev->data->min_rx_buf_size);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail",
+			eth_dev->data->rx_mbuf_alloc_failed);
+	snprintf(mac_addr, RTE_ETHER_ADDR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
+			 eth_dev->data->mac_addrs->addr_bytes[0],
+			 eth_dev->data->mac_addrs->addr_bytes[1],
+			 eth_dev->data->mac_addrs->addr_bytes[2],
+			 eth_dev->data->mac_addrs->addr_bytes[3],
+			 eth_dev->data->mac_addrs->addr_bytes[4],
+			 eth_dev->data->mac_addrs->addr_bytes[5]);
+	rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
+	rte_tel_data_add_dict_int(d, "promiscuous",
+			eth_dev->data->promiscuous);
+	rte_tel_data_add_dict_int(d, "scattered_rx",
+			eth_dev->data->scattered_rx);
+	rte_tel_data_add_dict_int(d, "all_multicast",
+			eth_dev->data->all_multicast);
+	rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
+	rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
+	rte_tel_data_add_dict_int(d, "dev_configured",
+			eth_dev->data->dev_configured);
+
+	rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+		rte_tel_data_add_array_int(rxq_state,
+				eth_dev->data->rx_queue_state[i]);
+
+	rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+		rte_tel_data_add_array_int(txq_state,
+				eth_dev->data->tx_queue_state[i]);
+
+	rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
+	rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
+	rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
+	rte_tel_data_add_dict_int(d, "dev_flags", eth_dev->data->dev_flags);
+	rte_tel_data_add_dict_int(d, "rx_offloads",
+			eth_dev->data->dev_conf.rxmode.offloads);
+	rte_tel_data_add_dict_int(d, "tx_offloads",
+			eth_dev->data->dev_conf.txmode.offloads);
+	rte_tel_data_add_dict_int(d, "ethdev_rss_hf",
+			eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf);
+
+	return 0;
+}
+
  int
  rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue,
  				  struct rte_hairpin_peer_info *cur_info,

lib/ethdev/rte_ethdev.c RTE_INIT(ethdev_init_telemetry) · line 6418

Quoted 6 lines
lib/ethdev/rte_ethdev.c +2 -0
@@ -6323,4 +6413,6 @@ RTE_INIT(ethdev_init_telemetry)
  	rte_telemetry_register_cmd("/ethdev/link_status",
  			eth_dev_handle_port_link_status,
  			"Returns the link status for a port. Parameters: int port_id");
+	rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
+			"Returns the device info for a port. Parameters: int port_id");
  }

@Ciara, @Bruce, can you please review the set from telemetry perspective?

Quoted 6 lines

And overall looks like good idea to provide more ethdev information via telemetry, but when we have this it becomes interface since applications may rely on it, is extending it breaks the apps?
If so perhaps we should consider multiple small commands instead of one big 'info' one, what do you think?

I think the info command is fine enough granularity as it is. Since (currently) the only output format used is json, we don't need to worry about adding in extra info later, because AFAIK referencing json nodes is by name, rather than by offset. For example, "response['tx_offloads']" should be valid no matter how many extra fields are added into the response later on.

/Bruce

#103 lore raw

Re: [dpdk-dev] [v1] ethdev: add telemetry endpoint for device info

Quoted 128 lines · Bruce Richardson
Quoted 120 lines · Ferruh Yigit
Quoted 110 lines · Gowrishankar Muthukrishnan

Add telemetry endpoint /ethdev/info for device info.

Change-Id I3e6ee2bd1a80675473adf0bd884b194f98e28536
---
   lib/ethdev/rte_ethdev.c | 92 +++++++++++++++++++++++++++++++++++++++++
   1 file changed, 92 insertions(+)
lib/ethdev/rte_ethdev.c +90 -0
index daf5ca9242..9b7bfa5f63 100644
@@ -6242,6 +6242,96 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
   	return 0;
   }
+static int
+eth_dev_handle_port_info(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_tel_data *rxq_state, *txq_state;
+	char mac_addr[RTE_ETHER_ADDR_LEN];
+	struct rte_eth_dev *eth_dev;
+	char *end_param;
+	int port_id, i;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	port_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_ETHDEV_LOG(NOTICE,
+			"Extra parameters passed to ethdev telemetry command, ignoring");
+
+	if (!rte_eth_dev_is_valid_port(port_id))
+		return -EINVAL;
+
+	eth_dev = &rte_eth_devices[port_id];
+	if (!eth_dev)
+		return -EINVAL;
+
+	rxq_state = rte_tel_data_alloc();
+	if (!rxq_state)
+		return -ENOMEM;
+
+	txq_state = rte_tel_data_alloc();
+	if (!txq_state)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+	rte_tel_data_add_dict_int(d, "state", eth_dev->state);
+	rte_tel_data_add_dict_int(d, "nb_rx_queues",
+			eth_dev->data->nb_rx_queues);
+	rte_tel_data_add_dict_int(d, "nb_tx_queues",
+			eth_dev->data->nb_tx_queues);
+	rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
+	rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_size_min",
+			eth_dev->data->min_rx_buf_size);
+	rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail",
+			eth_dev->data->rx_mbuf_alloc_failed);
+	snprintf(mac_addr, RTE_ETHER_ADDR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
+			 eth_dev->data->mac_addrs->addr_bytes[0],
+			 eth_dev->data->mac_addrs->addr_bytes[1],
+			 eth_dev->data->mac_addrs->addr_bytes[2],
+			 eth_dev->data->mac_addrs->addr_bytes[3],
+			 eth_dev->data->mac_addrs->addr_bytes[4],
+			 eth_dev->data->mac_addrs->addr_bytes[5]);
+	rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
+	rte_tel_data_add_dict_int(d, "promiscuous",
+			eth_dev->data->promiscuous);
+	rte_tel_data_add_dict_int(d, "scattered_rx",
+			eth_dev->data->scattered_rx);
+	rte_tel_data_add_dict_int(d, "all_multicast",
+			eth_dev->data->all_multicast);
+	rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
+	rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
+	rte_tel_data_add_dict_int(d, "dev_configured",
+			eth_dev->data->dev_configured);
+
+	rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+		rte_tel_data_add_array_int(rxq_state,
+				eth_dev->data->rx_queue_state[i]);
+
+	rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+		rte_tel_data_add_array_int(txq_state,
+				eth_dev->data->tx_queue_state[i]);
+
+	rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
+	rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
+	rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
+	rte_tel_data_add_dict_int(d, "dev_flags", eth_dev->data->dev_flags);
+	rte_tel_data_add_dict_int(d, "rx_offloads",
+			eth_dev->data->dev_conf.rxmode.offloads);
+	rte_tel_data_add_dict_int(d, "tx_offloads",
+			eth_dev->data->dev_conf.txmode.offloads);
+	rte_tel_data_add_dict_int(d, "ethdev_rss_hf",
+			eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf);
+
+	return 0;
+}
+
   int
   rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue,
   				  struct rte_hairpin_peer_info *cur_info,

lib/ethdev/rte_ethdev.c RTE_INIT(ethdev_init_telemetry) · line 6418

Quoted 6 lines
lib/ethdev/rte_ethdev.c +2 -0
@@ -6323,4 +6413,6 @@ RTE_INIT(ethdev_init_telemetry)
   	rte_telemetry_register_cmd("/ethdev/link_status",
   			eth_dev_handle_port_link_status,
   			"Returns the link status for a port. Parameters: int port_id");
+	rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
+			"Returns the device info for a port. Parameters: int port_id");
   }

@Ciara, @Bruce, can you please review the set from telemetry perspective?

Quoted 6 lines

And overall looks like good idea to provide more ethdev information via telemetry, but when we have this it becomes interface since applications may rely on it, is extending it breaks the apps?
If so perhaps we should consider multiple small commands instead of one big 'info' one, what do you think?

Quoted 6 lines

I think the info command is fine enough granularity as it is. Since (currently) the only output format used is json, we don't need to worry about adding in extra info later, because AFAIK referencing json nodes is by name, rather than by offset. For example, "response['tx_offloads']" should be valid no matter how many extra fields are added into the response later on.

Thanks, so it is extendible, in that case agree to continue as it is.

Acked-by on v6 1/1
#53 lore raw

Re: [dpdk-dev] [v6] telemetry: remove limitation on JSON output buffer length

In reply to Gowrishankar Muthukrishnan
Quoted 9 lines

-----Original Message-----
From: Gowrishankar Muthukrishnan <[email protected]>
Sent: Monday 11 October 2021 11:55
To: [email protected]
Cc: Richardson, Bruce <[email protected]>; Power, Ciara <[email protected]>; [email protected]; Gowrishankar Muthukrishnan <[email protected]>
Subject: [v6] telemetry: remove limitation on JSON output buffer length

Quoted 8 lines

Earlier, JSON message length was limited to 1024 which would not allow data more than this size. Removed this limitation by creating output buffer based on requested data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")

---

<snip>

Thanks,

#88 lore raw

Re: [dpdk-dev] [v1] mempool: add telemetry endpoint for mempool info

In reply to Gowrishankar Muthukrishnan

Not sure review from who we should wait.
Cc'ing telemetry people

29/09/2021 08:40, Gowrishankar Muthukrishnan:

Quoted 107 lines

Add telemetry endpoint for mempool info.

---
 lib/mempool/rte_mempool.c | 84 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
lib/mempool/rte_mempool.c +84 -0
index 59a588425b..b8dad2997a 100644
@@ -31,6 +31,7 @@
 #include <rte_spinlock.h>
 #include <rte_tailq.h>
 #include <rte_eal_paging.h>
+#include <rte_telemetry.h>
 
 #include "rte_mempool.h"
 #include "rte_mempool_trace.h"
@@ -1343,3 +1344,86 @@ void rte_mempool_walk(void (*func)(struct rte_mempool *, void *),
 
 	rte_mcfg_mempool_read_unlock();
 }
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_handle_list(const char *cmd __rte_unused,
+	const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	rte_tel_data_add_dict_string(info->d, "name", mp->name);
+	rte_tel_data_add_dict_int(info->d, "pool_id", mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "flags", mp->flags);
+	rte_tel_data_add_dict_int(info->d, "socket_id", mp->socket_id);
+	rte_tel_data_add_dict_int(info->d, "size", mp->size);
+	rte_tel_data_add_dict_int(info->d, "cache_size", mp->cache_size);
+	rte_tel_data_add_dict_int(info->d, "elt_size", mp->elt_size);
+	rte_tel_data_add_dict_int(info->d, "header_size", mp->header_size);
+	rte_tel_data_add_dict_int(info->d, "trailer_size", mp->trailer_size);
+	rte_tel_data_add_dict_int(info->d, "private_data_size",
+			mp->private_data_size);
+	rte_tel_data_add_dict_int(info->d, "ops_index", mp->ops_index);
+	rte_tel_data_add_dict_int(info->d, "populated_size",
+			mp->populated_size);
+
+	mz = mp->mz;
+	rte_tel_data_add_dict_string(info->d, "mz_name", mz->name);
+	rte_tel_data_add_dict_int(info->d, "mz_len", mz->len);
+	rte_tel_data_add_dict_int(info->d, "mz_hugepage_sz",
+							  mz->hugepage_sz);
+	rte_tel_data_add_dict_int(info->d, "mz_socket_id", mz->socket_id);
+	rte_tel_data_add_dict_int(info->d, "mz_flags", mz->flags);
+}
+
+static int
+mempool_handle_info(const char *cmd __rte_unused, const char *params,
+	struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd("/mempool/list", mempool_handle_list,
+		"Returns list of available mempool. Takes no parameters");
+	rte_telemetry_register_cmd("/mempool/info", mempool_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
#54 lore raw

Re: [dpdk-dev] [v6] telemetry: remove limitation on JSON output buffer length

In reply to Power, Ciara
Quoted 6 lines
Quoted 6 lines

Earlier, JSON message length was limited to 1024 which would not allow data more than this size. Removed this limitation by creating output buffer based on requested data length.

Fixes 52af6ccb2b39 ("telemetry: add utility functions for creating JSON")
Quoted 7 lines
Quoted 2 lines

---

<snip>

Thanks,

Applied, thanks.

#89 lore raw

Re: [dpdk-dev] [v1] mempool: add telemetry endpoint for mempool info

In reply to Thomas Monjalon
Quoted 3 lines · Thomas Monjalon

Not sure review from who we should wait.
Cc'ing telemetry people

I'll give it a quick test and a look over.

#107 lore raw

Re: [dpdk-dev] [EXT] [v9 1/4] common/cnxk: add telemetry endpoints to npa

In reply to Gowrishankar Muthukrishnan

Hi Gowrishankar,

Some comments inline.

Quoted 31 lines

-----Original Message-----
From: dev <[email protected]> On Behalf Of Gowrishankar Muthukrishnan
Sent: Wednesday, September 29, 2021 12:25 PM
To: [email protected]
Cc: Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>; Ashwin Sekhar Thalakalath Kottilveetil <[email protected]>; Pavan Nikhilesh Bhagavatula <[email protected]>; Gowrishankar Muthukrishnan <[email protected]>
Subject: [EXT] [dpdk-dev] [v9 1/4] common/cnxk: add telemetry endpoints to npa

External Email

----------------------------------------------------------------------
Add telemetry endpoints to npa.

---
 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

[...]

Quoted 13 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +13 -0
+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))

drivers/common/cnxk/cnxk_telemetry_npa.c line 31

Quoted 10 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +10 -0
+			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.

drivers/common/cnxk/cnxk_telemetry_npa.c line 35

Quoted 4 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +4 -0
+	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.

Quoted 12 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +12 -0
+	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;
+

[...]

Quoted 9 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +9 -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);
+}
+

drivers/common/cnxk/cnxk_telemetry_npa.c line 200

Quoted 10 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +10 -0
+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.

Quoted 9 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +9 -0
+	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;
+}

drivers/common/cnxk/cnxk_telemetry_npa.c line 219

Quoted 10 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +10 -0
+
+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.

drivers/common/cnxk/cnxk_telemetry_npa.c line 222

Quoted 3 lines
drivers/common/cnxk/cnxk_telemetry_npa.c new file +3 -0
+
+	plt_telemetry_register_cmd(
+		"/cnxk/npa/pool/info", cnxk_npa_tel_handle_info_x,

Same, pool/list if possible.

Review

Quoted 2 lines
(quoted diff) +1 -0
+		"Returns npa pool information. Parameters: pool_id"); }
(quoted diff) +0 -0

Thanks
Harman

Reviewed-by on v9 2/4
#109 lore raw

Re: [dpdk-dev] [EXT] [v9 2/4] common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan
Quoted 17 lines

-----Original Message-----
From: dev <[email protected]> On Behalf Of Gowrishankar Muthukrishnan
Sent: Wednesday, September 29, 2021 12:25 PM
To: [email protected]
Cc: Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>; Ashwin Sekhar Thalakalath Kottilveetil <[email protected]>; Pavan Nikhilesh Bhagavatula <[email protected]>; Gowrishankar Muthukrishnan <[email protected]>
Subject: [EXT] [dpdk-dev] [v9 2/4] common/cnxk: add telemetry endpoints to nix

Quoted 6 lines

External Email

----------------------------------------------------------------------
Add telemetry endpoints to nix.

Patch looks good to me.

Thanks
Harman

Quoted 985 lines
---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 849
+++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  15 +-
 drivers/common/cnxk/roc_platform.h       |   3 +
 6 files changed, 878 insertions(+), 4 deletions(-)  create mode 100644

drivers/common/cnxk/cnxk_telemetry_nix.c

drivers/common/cnxk/cnxk_telemetry_nix.c new file +57 -0
new file mode 100644
index 0000000000..1175f68a51
@@ -0,0 +1,849 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node); static struct
+nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix) {
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix) {
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *),

0);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *),

0);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *),

0);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +104 -0
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix) {
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->sqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name) {
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq) {
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq) {
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq) {
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d) {
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix-
Quoted 1 line

lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix-
Quoted 1 line

lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix-
Quoted 1 line

lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix-
Quoted 1 line

lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix-
Quoted 1 line

lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix-
Quoted 1 line

lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix-
Quoted 1 line

lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +2 -0
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix-
Quoted 1 line

lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);

drivers/common/cnxk/cnxk_telemetry_nix.c new file +529 -0
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d) {
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d) {
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d) {
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d) {
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_); }
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d) {
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_); }
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct
+plt_tel_data *d) {
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct
+plt_tel_data *d) {
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d) {
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_); }
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d) {
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_); }
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct
+plt_tel_data *d) {
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char

*params,

drivers/common/cnxk/cnxk_telemetry_nix.c new file +121 -0
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	return cnxk_tel_nix(node->nix, d);
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+	int rc = -1;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		goto exit;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		goto exit;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			rc = cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			rc = cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			rc = cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+exit:
+	return rc;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id"); }
(quoted diff) +0 -0

b/drivers/common/cnxk/meson.build index f0a1c9f115..fe7a95b526 100644

drivers/common/cnxk/meson.build +2 -1
@@ -65,6 +65,7 @@ sources = files(
 sources += files('cnxk_security.c')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry'] diff --git

a/drivers/common/cnxk/roc_nix.c b/drivers/common/cnxk/roc_nix.c index 3ab954e94d..17beb1a736 100644

drivers/common/cnxk/roc_nix.c +2 -0
@@ -178,6 +178,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t
 nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;

}

drivers/common/cnxk/roc_nix.c +1 -0
@@ -413,6 +415,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +0 -0
index 2cd5a72347..ba639791ce 100644
@@ -424,4 +424,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base,

uint64_t *data, uint16_t qints, int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,

drivers/common/cnxk/roc_nix_priv.h +9 -0
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix); void
+nix_tel_node_del(struct roc_nix *roc_nix); int
+nix_tel_node_add_rq(struct roc_nix_rq *rq); int
+nix_tel_node_add_cq(struct roc_nix_cq *cq); int
+nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +5 -1
index 8fbb13ecbd..f546fc83c5 100644
@@ -387,7 +387,11 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct
 roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 

int

drivers/common/cnxk/roc_nix_queue.c +5 -1
@@ -415,7 +419,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct
 roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 

int

drivers/common/cnxk/roc_nix_queue.c +1 -1
@@ -504,7 +512,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct
 roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
drivers/common/cnxk/roc_nix_queue.c +1 -0
 	plt_free(cq->desc_base);
@@ -884,6 +892,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct
 roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK)
 << 12));
 	}
 
+	rc = nix_tel_node_add_sq(sq);
 	return rc;

nomem:

drivers/common/cnxk/roc_nix_queue.c +0 -0
 	plt_free(sq->fc);
drivers/common/cnxk/roc_platform.h +3 -1
index 57073d62aa..b95af115f7 100644
@@ -145,7 +145,10 @@
 
 #define plt_strlcpy rte_strlcpy
 
+#define PLT_TEL_STRING_VAL RTE_TEL_STRING_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_string rte_tel_data_add_array_string
 #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)			\
--

2.25.1

Reviewed-by on v9 3/4
#111 lore raw

Re: [dpdk-dev] [EXT] [v9 3/4] mempool/cnxk: add telemetry endpoints mempool

In reply to Gowrishankar Muthukrishnan
Quoted 17 lines

-----Original Message-----
From: dev <[email protected]> On Behalf Of Gowrishankar Muthukrishnan
Sent: Wednesday, September 29, 2021 12:25 PM
To: [email protected]
Cc: Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>; Ashwin Sekhar Thalakalath Kottilveetil <[email protected]>; Pavan Nikhilesh Bhagavatula <[email protected]>; Gowrishankar Muthukrishnan <[email protected]>
Subject: [EXT] [dpdk-dev] [v9 3/4] mempool/cnxk: add telemetry endpoints mempool

Quoted 6 lines

External Email

----------------------------------------------------------------------
Adding telemetry endpoints to cnxk mempool driver.

LGTM

Thanks
Harman

Quoted 86 lines
---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 57
+++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |  1 +
 2 files changed, 58 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +21 -0
new file mode 100644
index 0000000000..c71798d7fd
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg) {
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg

*)arg;

drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +3 -0
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name,

RTE_MEMZONE_NAMESIZE))

drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +7 -0
+		return;
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id); }
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char

*params,

drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +23 -0
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name"); }
drivers/mempool/cnxk/meson.build +1 -1
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
--

2.25.1

Reviewed-by on v9 4/4
#113 lore raw

Re: [dpdk-dev] [EXT] [v9 4/4] net/cnxk: add telemetry endpoints to ethdev

In reply to Gowrishankar Muthukrishnan
Quoted 17 lines

-----Original Message-----
From: dev <[email protected]> On Behalf Of Gowrishankar Muthukrishnan
Sent: Wednesday, September 29, 2021 12:25 PM
To: [email protected]
Cc: Jerin Jacob Kollanukkaran <[email protected]>; Kiran Kumar Kokkilagadda <[email protected]>; Nithin Kumar Dabilpuram <[email protected]>; Sunil Kumar Kori <[email protected]>; Satha Koteswara Rao Kottidi <[email protected]>; Ashwin Sekhar Thalakalath Kottilveetil <[email protected]>; Pavan Nikhilesh Bhagavatula <[email protected]>; Gowrishankar Muthukrishnan <[email protected]>
Subject: [EXT] [dpdk-dev] [v9 4/4] net/cnxk: add telemetry endpoints to ethdev

Quoted 6 lines

External Email

----------------------------------------------------------------------
Add telemetry endpoints to ethdev.

LGTM

Thanks
Harman

Quoted 126 lines
---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 93
++++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |  1 +
 2 files changed, 94 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +17 -0
new file mode 100644
index 0000000000..83bc65848c
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)

{

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +47 -0
+	struct rte_eth_dev *eth_dev;
+	struct rte_tel_data *i_data;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	} eth_info;
+	struct eth_info_s *info;
+	unsigned int i, j = 0;
+	int n_ports;
+
+	n_ports = rte_eth_dev_count_avail();
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		if (eth_dev) {
+			memset(&eth_info, 0, sizeof(eth_info));
+			info = &eth_info.info;
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev-
Quoted 1 line

nix);

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +1 -0
+				info->max_mac_entries = dev-
Quoted 1 line

max_mac_entries;

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +1 -0
+				info->dmac_filter_ena = dev-
Quoted 1 line

dmac_filter_enable;

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +6 -0
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_flags = dev-
Quoted 1 line

rx_offload_flags;

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +1 -0
+				info->tx_offload_flags = dev-
Quoted 1 line

tx_offload_flags;

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +17 -0
+			}
+
+			for (j = 0; j < ETH_INFO_SZ; j++)
+				rte_tel_data_add_array_u64(i_data,
+							   eth_info.val[j]);
+
+			j++;
+		}
+	}
+
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+	return 0;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info",

ethdev_tel_handle_info,

drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +1 -0
+				   "Returns ethdev device information"); }
drivers/net/cnxk/meson.build +1 -1
index d1d4b4e15e..5b3b8422fb 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
--

2.25.1

#114 lore raw

v10 cover cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan

This patch series enables telemetry in cnxk for the following:
- NPA LF
- NIX LF
- Mempool driver
- Ethdev driver

Depends-on: series-18612 ("net/cnxk: support for inline ipsec")
Depends-on: patch-19248 ("ethdev: add telemetry endpoint for device info")
Depends-on: patch-19251 ("mempool: add telemetry endpoint for mempool info")

v10:
- added list endpoints for pool and aura (npa)

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
common/cnxk: add telemetry endpoints to nix
mempool/cnxk: add telemetry endpoints mempool
net/cnxk: add telemetry endpoints to ethdev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 260 ++++++
 drivers/common/cnxk/meson.build               |   6 +
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  17 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c |  57 ++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      |  93 ++
 drivers/net/cnxk/meson.build                  |   1 +
 12 files changed, 1334 insertions(+), 3 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
Signature · 1 line
2.25.1
#115 lore raw

PATCH v10 1/4 common/cnxk: add telemetry endpoints to npa

Add telemetry endpoints to npa.

---
 drivers/common/cnxk/cnxk_telemetry.h     |  26 +++
 drivers/common/cnxk/cnxk_telemetry_npa.c | 260 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   5 +
 drivers/common/cnxk/roc_platform.h       |  15 ++
 4 files changed, 306 insertions(+)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
drivers/common/cnxk/cnxk_telemetry.h new file +26 -0
new file mode 100644
index 0000000000..1461fd893f
@@ -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_ */
drivers/common/cnxk/cnxk_telemetry_npa.c new file +260 -0

260 lines not on this page · raw message

drivers/common/cnxk/meson.build +5 -0
index 97db5f087b..d88cfbc7fa 100644
@@ -71,3 +71,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']
drivers/common/cnxk/roc_platform.h +15 -0
index 241655b334..59af6f4975 100644
@@ -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,18 @@
 
 #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;
Signature · 1 line
2.25.1
#116 lore raw

PATCH v10 2/4 common/cnxk: add telemetry endpoints to nix

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to nix.

---
 drivers/common/cnxk/cnxk_telemetry_nix.c | 849 +++++++++++++++++++++++
 drivers/common/cnxk/meson.build          |   3 +-
 drivers/common/cnxk/roc_nix.c            |   3 +
 drivers/common/cnxk/roc_nix_priv.h       |   9 +
 drivers/common/cnxk/roc_nix_queue.c      |  15 +-
 drivers/common/cnxk/roc_platform.h       |   2 +
 6 files changed, 877 insertions(+), 4 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
drivers/common/cnxk/cnxk_telemetry_nix.c new file +849 -0
new file mode 100644
index 0000000000..1175f68a51
@@ -0,0 +1,849 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_telemetry.h"
+#include "roc_api.h"
+#include "roc_priv.h"
+
+struct nix_tel_node {
+	TAILQ_ENTRY(nix_tel_node) node;
+	struct roc_nix *nix;
+	uint16_t n_rq;
+	uint16_t n_cq;
+	uint16_t n_sq;
+	struct roc_nix_rq **rqs;
+	struct roc_nix_cq **cqs;
+	struct roc_nix_sq **sqs;
+};
+
+TAILQ_HEAD(nix_tel_node_list, nix_tel_node);
+static struct nix_tel_node_list nix_list;
+
+static struct nix_tel_node *
+nix_tel_node_get(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(roc_nix);
+	if (node) {
+		if (nix->nb_rx_queues == node->n_rq &&
+		    nix->nb_tx_queues == node->n_sq)
+			return 0;
+
+		nix_tel_node_del(roc_nix);
+	}
+
+	node = plt_zmalloc(sizeof(struct nix_tel_node), 0);
+	if (!node)
+		return -1;
+
+	node->nix = roc_nix;
+	node->rqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_rq *), 0);
+	node->cqs =
+		plt_zmalloc(nix->nb_rx_queues * sizeof(struct roc_nix_cq *), 0);
+	node->sqs =
+		plt_zmalloc(nix->nb_tx_queues * sizeof(struct roc_nix_sq *), 0);
+	TAILQ_INSERT_TAIL(&nix_list, node, node);
+
+	return 0;
+}
+
+void
+nix_tel_node_del(struct roc_nix *roc_nix)
+{
+	struct nix_tel_node *node;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (node->nix == roc_nix) {
+			plt_free(node->rqs);
+			plt_free(node->cqs);
+			plt_free(node->sqs);
+			TAILQ_REMOVE(&nix_list, node, node);
+		}
+	}
+
+	plt_free(node);
+}
+
+static struct nix_tel_node *
+nix_tel_node_get_by_pcidev_name(const char *name)
+{
+	struct nix_tel_node *node, *roc_node = NULL;
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		if (!strncmp(node->nix->pci_dev->name, name,
+			     PCI_PRI_STR_SIZE)) {
+			roc_node = node;
+			break;
+		}
+	}
+
+	return roc_node;
+}
+
+int
+nix_tel_node_add_rq(struct roc_nix_rq *rq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(rq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->rqs[rq->qid] = rq;
+	node->n_rq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_cq(struct roc_nix_cq *cq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(cq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->cqs[cq->qid] = cq;
+	node->n_cq++;
+	return 0;
+}
+
+int
+nix_tel_node_add_sq(struct roc_nix_sq *sq)
+{
+	struct nix_tel_node *node;
+
+	node = nix_tel_node_get(sq->roc_nix);
+	if (!node)
+		return -1;
+
+	node->sqs[sq->qid] = sq;
+	node->n_sq++;
+	return 0;
+}
+
+static int
+cnxk_tel_nix(struct roc_nix *roc_nix, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	struct dev *dev = &nix->dev;
+
+	plt_tel_data_add_dict_ptr(d, "nix", nix);
+	plt_tel_data_add_dict_int(d, "pf_func", dev->pf_func);
+	plt_tel_data_add_dict_int(d, "pf", dev_get_pf(dev->pf_func));
+	plt_tel_data_add_dict_int(d, "vf", dev_get_vf(dev->pf_func));
+
+	CNXK_TEL_DICT_PTR(d, dev, bar2);
+	CNXK_TEL_DICT_PTR(d, dev, bar4);
+	CNXK_TEL_DICT_INT(d, roc_nix, port_id);
+	CNXK_TEL_DICT_INT(d, roc_nix, rss_tag_as_xor);
+	CNXK_TEL_DICT_INT(d, roc_nix, max_sqb_count);
+	CNXK_TEL_DICT_PTR(d, nix, pci_dev);
+	CNXK_TEL_DICT_PTR(d, nix, base);
+	CNXK_TEL_DICT_PTR(d, nix, lmt_base);
+	CNXK_TEL_DICT_INT(d, nix, reta_sz);
+	CNXK_TEL_DICT_INT(d, nix, tx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, rx_chan_base);
+	CNXK_TEL_DICT_INT(d, nix, nb_tx_queues);
+	CNXK_TEL_DICT_INT(d, nix, nb_rx_queues);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov6_idx);
+	CNXK_TEL_DICT_INT(d, nix, lso_tsov4_idx);
+
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v4v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v4",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_udp_tun_v6v6",
+				  nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v4v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v4",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4]);
+	plt_tel_data_add_dict_int(d, "lso_tun_v6v6",
+				  nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6]);
+
+	CNXK_TEL_DICT_INT(d, nix, lf_tx_stats);
+	CNXK_TEL_DICT_INT(d, nix, lf_rx_stats);
+	CNXK_TEL_DICT_INT(d, nix, cgx_links);
+	CNXK_TEL_DICT_INT(d, nix, lbk_links);
+	CNXK_TEL_DICT_INT(d, nix, sdp_links);
+	CNXK_TEL_DICT_INT(d, nix, tx_link);
+	CNXK_TEL_DICT_INT(d, nix, sqb_size);
+	CNXK_TEL_DICT_INT(d, nix, msixoff);
+	CNXK_TEL_DICT_INT(d, nix, cints);
+	CNXK_TEL_DICT_INT(d, nix, qints);
+	CNXK_TEL_DICT_INT(d, nix, sdp_link);
+	CNXK_TEL_DICT_INT(d, nix, ptp_en);
+	CNXK_TEL_DICT_INT(d, nix, rss_alg_idx);
+	CNXK_TEL_DICT_INT(d, nix, tx_pause);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_rq(struct roc_nix_rq *rq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_rq", rq);
+	CNXK_TEL_DICT_INT(d, rq, qid);
+	CNXK_TEL_DICT_PTR(d, rq, aura_handle);
+	CNXK_TEL_DICT_INT(d, rq, ipsech_ena);
+	CNXK_TEL_DICT_INT(d, rq, first_skip);
+	CNXK_TEL_DICT_INT(d, rq, later_skip);
+	CNXK_TEL_DICT_INT(d, rq, lpb_size);
+	CNXK_TEL_DICT_INT(d, rq, sso_ena);
+	CNXK_TEL_DICT_INT(d, rq, tag_mask);
+	CNXK_TEL_DICT_INT(d, rq, flow_tag_width);
+	CNXK_TEL_DICT_INT(d, rq, tt);
+	CNXK_TEL_DICT_INT(d, rq, hwgrp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_ena);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_first_skip);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_max_sz_exp);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_wait_tmo);
+	CNXK_TEL_DICT_INT(d, rq, vwqe_aura_handle);
+	CNXK_TEL_DICT_PTR(d, rq, roc_nix);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq(struct roc_nix_cq *cq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_cq", cq);
+	CNXK_TEL_DICT_INT(d, cq, qid);
+	CNXK_TEL_DICT_INT(d, cq, nb_desc);
+	CNXK_TEL_DICT_PTR(d, cq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, cq, door);
+	CNXK_TEL_DICT_PTR(d, cq, status);
+	CNXK_TEL_DICT_PTR(d, cq, wdata);
+	CNXK_TEL_DICT_PTR(d, cq, desc_base);
+	CNXK_TEL_DICT_INT(d, cq, qmask);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_sq(struct roc_nix_sq *sq, struct plt_tel_data *d)
+{
+	plt_tel_data_add_dict_ptr(d, "nix_sq", sq);
+	CNXK_TEL_DICT_INT(d, sq, qid);
+	CNXK_TEL_DICT_INT(d, sq, max_sqe_sz);
+	CNXK_TEL_DICT_INT(d, sq, nb_desc);
+	CNXK_TEL_DICT_INT(d, sq, sqes_per_sqb_log2);
+	CNXK_TEL_DICT_PTR(d, sq, roc_nix);
+	CNXK_TEL_DICT_PTR(d, sq, aura_handle);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs_adj);
+	CNXK_TEL_DICT_INT(d, sq, nb_sqb_bufs);
+	CNXK_TEL_DICT_PTR(d, sq, io_addr);
+	CNXK_TEL_DICT_PTR(d, sq, lmt_addr);
+	CNXK_TEL_DICT_PTR(d, sq, sqe_mem);
+	CNXK_TEL_DICT_PTR(d, sq, fc);
+
+	return 0;
+}
+
+static void
+nix_rq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_rq_ctx_s *ctx = (struct nix_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_BF_PTR(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static void
+nix_rq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_rq_ctx_s *ctx = (struct nix_cn10k_rq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, wqe_aura, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il3_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, len_il4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, csum_ol4_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, lenerr_dis, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena_wqwd, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ipsech_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w0);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, chi_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsecd_drop_en, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_stashing, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, pb_caching, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_tt, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_grp, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, xqe_hdr_split, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_copy, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_imm_size, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, later_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, first_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_skip, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_sizem1, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, policer_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, band_prof_id, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, spb_aura_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, wqe_pool_drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_pass, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, xqe_drop, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int_ena, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, rq_int, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_pool_drop, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_pass, w4_);
+	CNXK_TEL_DICT_INT(d, ctx, lpb_aura_drop, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_skip, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, max_vsize_exp, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vtime_wait, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, vwqe_ena, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ipsec_vwqe, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, flow_tagw, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, bad_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, good_utag, w5_);
+	CNXK_TEL_DICT_INT(d, ctx, ltag, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_U64(d, ctx, octs, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_U64(d, ctx, pkts, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_octs, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_U64(d, ctx, drop_pkts, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_U64(d, ctx, re_pkts, w10_);
+}
+
+static int
+cnxk_tel_nix_rq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_RQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_rq_ctx_cn9k(&qctx, d);
+	else
+		nix_rq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_tel_nix_cq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile struct nix_cq_ctx_s *ctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_CQ, n, (void *)&ctx);
+	if (rc) {
+		plt_err("Failed to get cq context");
+		return rc;
+	}
+
+	/* W0 */
+	CNXK_TEL_DICT_PTR(d, ctx, base, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_U64(d, ctx, wrptr, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_con, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bpid, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, bp_ena, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, update_time, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, avg_level, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, head, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, tail, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_err_int, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, qsize, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, caching, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop_ena, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, drop, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, bp, w3_);
+
+	return 0;
+}
+
+static void
+nix_sq_ctx_cn9k(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_sq_ctx_s *ctx = (struct nix_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_quantum, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static void
+nix_sq_ctx(void *qctx, struct plt_tel_data *d)
+{
+	struct nix_cn10k_sq_ctx_s *ctx = (struct nix_cn10k_sq_ctx_s *)qctx;
+
+	/* W0 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_way_mask, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, cq, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, sdp_mcast, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, substream, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, qint_idx, w0_);
+	CNXK_TEL_DICT_INT(d, ctx, ena, w0_);
+
+	/* W1 */
+	CNXK_TEL_DICT_INT(d, ctx, sqb_count, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, default_chan, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_weight, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, sso_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, xoff, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_ena, w1_);
+	CNXK_TEL_DICT_INT(d, ctx, smq, w1_);
+
+	/* W2 */
+	CNXK_TEL_DICT_INT(d, ctx, sqe_stype, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int_ena, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sq_int, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, sqb_aura, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_ub, w2_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_rr_count_lb, w2_);
+
+	/* W3 */
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_pend, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_next_sqb_vld, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, head_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smenq_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, tail_offset, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_lso_segnum, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, smq_next_sq, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, mnq_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, lmt_dis, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, cq_limit, w3_);
+	CNXK_TEL_DICT_INT(d, ctx, max_sqe_size, w3_);
+
+	/* W4 */
+	CNXK_TEL_DICT_PTR(d, ctx, next_sqb, w4_);
+
+	/* W5 */
+	CNXK_TEL_DICT_PTR(d, ctx, tail_sqb, w5_);
+
+	/* W6 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_sqb, w6_);
+
+	/* W7 */
+	CNXK_TEL_DICT_PTR(d, ctx, smenq_next_sqb, w7_);
+
+	/* W8 */
+	CNXK_TEL_DICT_PTR(d, ctx, head_sqb, w8_);
+
+	/* W9 */
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vld, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan1_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_vlan0_ins_ena, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_mps, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sb, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_sizem1, w9_);
+	CNXK_TEL_DICT_INT(d, ctx, vfi_lso_total, w9_);
+
+	/* W10 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, scm_lso_rem, w10_);
+
+	/* W11 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, octs, w11_);
+
+	/* W12 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, pkts, w12_);
+
+	/* W14 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_octs, w14_);
+
+	/* W15 */
+	CNXK_TEL_DICT_BF_PTR(d, ctx, drop_pkts, w15_);
+}
+
+static int
+cnxk_tel_nix_sq_ctx(struct roc_nix *roc_nix, uint8_t n, struct plt_tel_data *d)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+	struct npa_lf *npa_lf;
+	volatile void *qctx;
+	int rc = -1;
+
+	npa_lf = idev_npa_obj_get();
+	if (npa_lf == NULL)
+		return NPA_ERR_DEVICE_NOT_BOUNDED;
+
+	rc = nix_q_ctx_get(dev, NIX_AQ_CTYPE_SQ, n, &qctx);
+	if (rc) {
+		plt_err("Failed to get rq context");
+		return rc;
+	}
+
+	if (roc_model_is_cn9k())
+		nix_sq_ctx_cn9k(&qctx, d);
+	else
+		nix_sq_ctx(&qctx, d);
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_list(const char *cmd __plt_unused,
+			 const char *params __plt_unused,
+			 struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	struct roc_nix *roc_nix;
+
+	plt_tel_data_start_array(d, PLT_TEL_STRING_VAL);
+
+	TAILQ_FOREACH(node, &nix_list, node) {
+		roc_nix = node->nix;
+		plt_tel_data_add_array_string(d, roc_nix->pci_dev->name);
+	}
+
+	return 0;
+}
+
+static int
+cnxk_nix_tel_handle_info(const char *cmd __plt_unused, const char *params,
+			 struct plt_tel_data *d)
+{
+	char name[PCI_PRI_STR_SIZE];
+	struct nix_tel_node *node;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	plt_strlcpy(name, params, PCI_PRI_STR_SIZE);
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		return -1;
+
+	plt_tel_data_start_dict(d);
+	return cnxk_tel_nix(node->nix, d);
+}
+
+static int
+cnxk_nix_tel_handle_info_x(const char *cmd, const char *params,
+			   struct plt_tel_data *d)
+{
+	struct nix_tel_node *node;
+	char *name, *param;
+	char buf[1024];
+	int rc = -1;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		goto exit;
+
+	plt_strlcpy(buf, params, PCI_PRI_STR_SIZE + 1);
+	name = strtok(buf, ",");
+	param = strtok(NULL, "\0");
+
+	node = nix_tel_node_get_by_pcidev_name(name);
+	if (!node)
+		goto exit;
+
+	plt_tel_data_start_dict(d);
+
+	if (strstr(cmd, "rq")) {
+		char *tok = strtok(param, ",");
+		int rq;
+
+		if (!tok)
+			goto exit;
+
+		rq = strtol(tok, NULL, 10);
+		if ((node->n_rq <= rq) || (rq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_rq_ctx(node->nix, rq, d);
+		else
+			rc = cnxk_tel_nix_rq(node->rqs[rq], d);
+
+	} else if (strstr(cmd, "cq")) {
+		char *tok = strtok(param, ",");
+		int cq;
+
+		if (!tok)
+			goto exit;
+
+		cq = strtol(tok, NULL, 10);
+		if ((node->n_cq <= cq) || (cq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_cq_ctx(node->nix, cq, d);
+		else
+			rc = cnxk_tel_nix_cq(node->cqs[cq], d);
+
+	} else if (strstr(cmd, "sq")) {
+		char *tok = strtok(param, ",");
+		int sq;
+
+		if (!tok)
+			goto exit;
+
+		sq = strtol(tok, NULL, 10);
+		if ((node->n_sq <= sq) || (sq < 0))
+			goto exit;
+
+		if (strstr(cmd, "ctx"))
+			rc = cnxk_tel_nix_sq_ctx(node->nix, sq, d);
+		else
+			rc = cnxk_tel_nix_sq(node->sqs[sq], d);
+	}
+
+exit:
+	return rc;
+}
+
+PLT_INIT(cnxk_telemetry_nix_init)
+{
+	TAILQ_INIT(&nix_list);
+
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/list", cnxk_nix_tel_handle_list,
+		"Returns list of available NIX devices. Takes no parameters");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/info", cnxk_nix_tel_handle_info,
+		"Returns nix information. Parameters: pci id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq information. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/rq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix rq context. Parameters: pci id, rq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq information. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/cq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix cq context. Parameters: pci id, cq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/info", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq information. Parameters: pci id, sq id");
+	plt_telemetry_register_cmd(
+		"/cnxk/nix/sq/ctx", cnxk_nix_tel_handle_info_x,
+		"Returns nix sq context. Parameters: pci id, sq id");
+}
drivers/common/cnxk/meson.build +2 -1
index d88cfbc7fa..7b8a4c6633 100644
@@ -73,6 +73,7 @@ includes += include_directories('../../../lib/ethdev')
 includes += include_directories('../../../lib/meter')
 
 # Telemetry common code
-sources += files('cnxk_telemetry_npa.c')
+sources += files('cnxk_telemetry_npa.c',
+                 'cnxk_telemetry_nix.c')
 
 deps += ['bus_pci', 'net', 'telemetry']
drivers/common/cnxk/roc_nix.c +3 -0
index b7ef843b4b..64156ceb19 100644
@@ -184,6 +184,8 @@ roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
 	nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
 	if (!nix->sqs)
 		return -ENOMEM;
+
+	nix_tel_node_add(roc_nix);
 fail:
 	return rc;
 }
@@ -419,6 +421,7 @@ roc_nix_dev_init(struct roc_nix *roc_nix)
 dev_fini:
 	rc |= dev_fini(dev, pci_dev);
 fail:
+	nix_tel_node_del(roc_nix);
 	return rc;
 }
 
drivers/common/cnxk/roc_nix_priv.h +9 -0
index 8beb5454b7..2f5eefd6ec 100644
@@ -427,4 +427,13 @@ int nix_lf_int_reg_dump(uintptr_t nix_lf_base, uint64_t *data, uint16_t qints,
 int nix_q_ctx_get(struct dev *dev, uint8_t ctype, uint16_t qid,
 		  __io void **ctx_p);
 
+/*
+ * Telemetry
+ */
+int nix_tel_node_add(struct roc_nix *roc_nix);
+void nix_tel_node_del(struct roc_nix *roc_nix);
+int nix_tel_node_add_rq(struct roc_nix_rq *rq);
+int nix_tel_node_add_cq(struct roc_nix_cq *cq);
+int nix_tel_node_add_sq(struct roc_nix_sq *sq);
+
 #endif /* _ROC_NIX_PRIV_H_ */
drivers/common/cnxk/roc_nix_queue.c +12 -3
index 422eef124c..0510f9692e 100644
@@ -387,7 +387,11 @@ roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -415,7 +419,11 @@ roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
 	if (rc)
 		return rc;
 
-	return mbox_process(mbox);
+	rc = mbox_process(mbox);
+	if (rc)
+		return rc;
+
+	return nix_tel_node_add_rq(rq);
 }
 
 int
@@ -504,7 +512,7 @@ roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
 	if (rc)
 		goto free_mem;
 
-	return 0;
+	return nix_tel_node_add_cq(cq);
 
 free_mem:
 	plt_free(cq->desc_base);
@@ -888,6 +896,7 @@ roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
 	}
 
+	rc = nix_tel_node_add_sq(sq);
 	return rc;
 nomem:
 	plt_free(sq->fc);
drivers/common/cnxk/roc_platform.h +2 -0
index 59af6f4975..731c5bc3b3 100644
@@ -146,9 +146,11 @@
 #define plt_strlcpy rte_strlcpy
 
 #define PLT_TEL_INT_VAL              RTE_TEL_INT_VAL
+#define PLT_TEL_STRING_VAL           RTE_TEL_STRING_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_add_array_string rte_tel_data_add_array_string
 #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)			\
Signature · 1 line
2.25.1
#117 lore raw

PATCH v10 3/4 mempool/cnxk: add telemetry endpoints mempool

In reply to Gowrishankar Muthukrishnan

Adding telemetry endpoints to cnxk mempool driver.

---
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c | 57 +++++++++++++++++++
 drivers/mempool/cnxk/meson.build              |  1 +
 2 files changed, 58 insertions(+)
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
drivers/mempool/cnxk/cnxk_mempool_telemetry.c new file +57 -0
new file mode 100644
index 0000000000..c71798d7fd
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include <rte_mempool.h>
+#include <rte_memzone.h>
+#include <rte_telemetry.h>
+
+#include <roc_api.h>
+
+#include "cnxk_mempool.h"
+#include "cnxk_telemetry.h"
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	int aura_id;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	aura_id = roc_npa_aura_handle_to_aura(mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "aura_id", aura_id);
+}
+
+static int
+mempool_tel_handle_info(const char *cmd __rte_unused, const char *params,
+			struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (params == NULL || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(cnxk_mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd(
+		"/cnxk/mempool/info", mempool_tel_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
drivers/mempool/cnxk/meson.build +1 -0
index e28a9e044d..d5d1978569 100644
@@ -11,6 +11,7 @@ endif
 sources = files(
         'cnxk_mempool.c',
         'cnxk_mempool_ops.c',
+        'cnxk_mempool_telemetry.c',
         'cn9k_mempool_ops.c',
         'cn10k_mempool_ops.c',
 )
Signature · 1 line
2.25.1
#118 lore raw

PATCH v10 4/4 net/cnxk: add telemetry endpoints to ethdev

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoints to ethdev.

---
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 93 ++++++++++++++++++++++++
 drivers/net/cnxk/meson.build             |  1 +
 2 files changed, 94 insertions(+)
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c
drivers/net/cnxk/cnxk_ethdev_telemetry.c new file +93 -0
new file mode 100644
index 0000000000..83bc65848c
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+
+#include <rte_telemetry.h>
+
+#include "cnxk_ethdev.h"
+
+/* Macro to count no of words in eth_info_s size */
+#define ETH_INFO_SZ                                                            \
+	(RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) /         \
+	 sizeof(uint64_t))
+#define MACADDR_LEN 18
+
+static int
+ethdev_tel_handle_info(const char *cmd __rte_unused,
+		       const char *params __rte_unused, struct rte_tel_data *d)
+{
+	struct rte_eth_dev *eth_dev;
+	struct rte_tel_data *i_data;
+	struct cnxk_eth_dev *dev;
+	union eth_info_u {
+		struct eth_info_s {
+			/** PF/VF information */
+			uint16_t pf_func;
+			uint8_t max_mac_entries;
+			bool dmac_filter_ena;
+			uint8_t dmac_filter_count;
+			uint8_t ptype_disable;
+			bool scalar_ena;
+			bool ptp_ena;
+			/* Platform specific offload flags */
+			uint16_t rx_offload_flags;
+			uint16_t tx_offload_flags;
+		} info;
+		uint64_t val[ETH_INFO_SZ];
+	} eth_info;
+	struct eth_info_s *info;
+	unsigned int i, j = 0;
+	int n_ports;
+
+	n_ports = rte_eth_dev_count_avail();
+	if (!n_ports) {
+		plt_err("No active ethernet ports found.");
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_int(d, "n_ports", n_ports);
+
+	i_data = rte_tel_data_alloc();
+	rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL);
+
+	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		/* Skip if port is unused */
+		if (!rte_eth_dev_is_valid_port(i))
+			continue;
+
+		eth_dev = &rte_eth_devices[i];
+		if (eth_dev) {
+			memset(&eth_info, 0, sizeof(eth_info));
+			info = &eth_info.info;
+			dev = cnxk_eth_pmd_priv(eth_dev);
+			if (dev) {
+				info->pf_func = roc_nix_get_pf_func(&dev->nix);
+				info->max_mac_entries = dev->max_mac_entries;
+				info->dmac_filter_ena = dev->dmac_filter_enable;
+				info->dmac_filter_count =
+					dev->dmac_filter_count;
+				info->ptype_disable = dev->ptype_disable;
+				info->scalar_ena = dev->scalar_ena;
+				info->ptp_ena = dev->ptp_en;
+				info->rx_offload_flags = dev->rx_offload_flags;
+				info->tx_offload_flags = dev->tx_offload_flags;
+			}
+
+			for (j = 0; j < ETH_INFO_SZ; j++)
+				rte_tel_data_add_array_u64(i_data,
+							   eth_info.val[j]);
+
+			j++;
+		}
+	}
+
+	rte_tel_data_add_dict_container(d, "info", i_data, 0);
+	return 0;
+}
+
+RTE_INIT(cnxk_ethdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info,
+				   "Returns ethdev device information");
+}
drivers/net/cnxk/meson.build +1 -0
index d86188fed7..341ac99771 100644
@@ -13,6 +13,7 @@ sources = files(
         'cnxk_ethdev_devargs.c',
         'cnxk_ethdev_ops.c',
         'cnxk_ethdev_sec.c',
+        'cnxk_ethdev_telemetry.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
         'cnxk_ptp.c',
Signature · 1 line
2.25.1
#119 lore raw

Re: [dpdk-dev] [v9 0/4] cnxk: enable telemetry endpoints

In reply to Gowrishankar Muthukrishnan
Quoted 7 lines · Gowrishankar Muthukrishnan

This patch series enables telemetry in cnxk for the following:
- NPA LF
- NIX LF
- cnxk Mempool driver
- cnxk Ethdev driver

Series Acked-by: Jerin Jacob <[email protected]> Series applied to dpdk-next-net-mrvl/for-dpdk-main. Thanks.

Quoted 32 lines

v9:
- moved common info from drivers to lib endpoints.

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
common/cnxk: add telemetry endpoints to nix
mempool/cnxk: add telemetry endpoints mempool
net/cnxk: add telemetry endpoints to ethdev

 drivers/common/cnxk/cnxk_telemetry.h          |  26 +
 drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
 drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
 drivers/common/cnxk/meson.build               |   7 +-
 drivers/common/cnxk/roc_nix.c                 |   3 +
 drivers/common/cnxk/roc_nix_priv.h            |   9 +
 drivers/common/cnxk/roc_nix_queue.c           |  15 +-
 drivers/common/cnxk/roc_platform.h            |  15 +
 drivers/mempool/cnxk/cnxk_mempool_telemetry.c |  57 ++
 drivers/mempool/cnxk/meson.build              |   1 +
 drivers/net/cnxk/cnxk_ethdev_telemetry.c      |  93 ++
 drivers/net/cnxk/meson.build                  |   1 +
 12 files changed, 1295 insertions(+), 5 deletions(-)
 create mode 100644 drivers/common/cnxk/cnxk_telemetry.h
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c
 create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c
 create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c
 create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c

--
2.25.1

#120 lore raw

Re: [dpdk-dev] [v9 0/4] cnxk: enable telemetry endpoints

Quoted 11 lines · Jerin Jacob
Quoted 7 lines · Gowrishankar Muthukrishnan

This patch series enables telemetry in cnxk for the following:
- NPA LF
- NIX LF
- cnxk Mempool driver
- cnxk Ethdev driver

Quoted 3 lines

Series Acked-by: Jerin Jacob <[email protected]> Series applied to dpdk-next-net-mrvl/for-dpdk-main. Thanks.

For record, v10 of this set seems merged according patchwork:
https://patches.dpdk.org/project/dpdk/list/?series=19788&state=*

Quoted 32 lines
Quoted 32 lines

v9:
- moved common info from drivers to lib endpoints.

Gowrishankar Muthukrishnan (4):
common/cnxk: add telemetry endpoints to npa
common/cnxk: add telemetry endpoints to nix
mempool/cnxk: add telemetry endpoints mempool
net/cnxk: add telemetry endpoints to ethdev

  drivers/common/cnxk/cnxk_telemetry.h          |  26 +
  drivers/common/cnxk/cnxk_telemetry_nix.c      | 849 ++++++++++++++++++
  drivers/common/cnxk/cnxk_telemetry_npa.c      | 224 +++++
  drivers/common/cnxk/meson.build               |   7 +-
  drivers/common/cnxk/roc_nix.c                 |   3 +
  drivers/common/cnxk/roc_nix_priv.h            |   9 +
  drivers/common/cnxk/roc_nix_queue.c           |  15 +-
  drivers/common/cnxk/roc_platform.h            |  15 +
  drivers/mempool/cnxk/cnxk_mempool_telemetry.c |  57 ++
  drivers/mempool/cnxk/meson.build              |   1 +
  drivers/net/cnxk/cnxk_ethdev_telemetry.c      |  93 ++
  drivers/net/cnxk/meson.build                  |   1 +
  12 files changed, 1295 insertions(+), 5 deletions(-)

create mode 100644 drivers/common/cnxk/cnxk_telemetry.h create mode 100644 drivers/common/cnxk/cnxk_telemetry_nix.c create mode 100644 drivers/common/cnxk/cnxk_telemetry_npa.c create mode 100644 drivers/mempool/cnxk/cnxk_mempool_telemetry.c create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c

--
2.25.1

#91 lore raw

PATCH v2 1/1 mempool: add telemetry endpoint for mempool info

In reply to Gowrishankar Muthukrishnan

Add telemetry endpoint for mempool info.

---
v2:
- code alignments fixed

---
 lib/mempool/rte_mempool.c | 84 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
lib/mempool/rte_mempool.c +84 -0
index b75d26c82a..2d915e591d 100644
@@ -31,6 +31,7 @@
 #include <rte_spinlock.h>
 #include <rte_tailq.h>
 #include <rte_eal_paging.h>
+#include <rte_telemetry.h>
 
 #include "rte_mempool.h"
 #include "rte_mempool_trace.h"
@@ -1483,3 +1484,86 @@ rte_mempool_event_callback_unregister(rte_mempool_event_callback *func,
 	rte_errno = -ret;
 	return ret;
 }
+
+static void
+mempool_list_cb(struct rte_mempool *mp, void *arg)
+{
+	struct rte_tel_data *d = (struct rte_tel_data *)arg;
+
+	rte_tel_data_add_array_string(d, mp->name);
+}
+
+static int
+mempool_handle_list(const char *cmd __rte_unused,
+		    const char *params __rte_unused, struct rte_tel_data *d)
+{
+	rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+	rte_mempool_walk(mempool_list_cb, d);
+	return 0;
+}
+
+struct mempool_info_cb_arg {
+	char *pool_name;
+	struct rte_tel_data *d;
+};
+
+static void
+mempool_info_cb(struct rte_mempool *mp, void *arg)
+{
+	struct mempool_info_cb_arg *info = (struct mempool_info_cb_arg *)arg;
+	const struct rte_memzone *mz;
+
+	if (strncmp(mp->name, info->pool_name, RTE_MEMZONE_NAMESIZE))
+		return;
+
+	rte_tel_data_add_dict_string(info->d, "name", mp->name);
+	rte_tel_data_add_dict_int(info->d, "pool_id", mp->pool_id);
+	rte_tel_data_add_dict_int(info->d, "flags", mp->flags);
+	rte_tel_data_add_dict_int(info->d, "socket_id", mp->socket_id);
+	rte_tel_data_add_dict_int(info->d, "size", mp->size);
+	rte_tel_data_add_dict_int(info->d, "cache_size", mp->cache_size);
+	rte_tel_data_add_dict_int(info->d, "elt_size", mp->elt_size);
+	rte_tel_data_add_dict_int(info->d, "header_size", mp->header_size);
+	rte_tel_data_add_dict_int(info->d, "trailer_size", mp->trailer_size);
+	rte_tel_data_add_dict_int(info->d, "private_data_size",
+				  mp->private_data_size);
+	rte_tel_data_add_dict_int(info->d, "ops_index", mp->ops_index);
+	rte_tel_data_add_dict_int(info->d, "populated_size",
+				  mp->populated_size);
+
+	mz = mp->mz;
+	rte_tel_data_add_dict_string(info->d, "mz_name", mz->name);
+	rte_tel_data_add_dict_int(info->d, "mz_len", mz->len);
+	rte_tel_data_add_dict_int(info->d, "mz_hugepage_sz",
+				  mz->hugepage_sz);
+	rte_tel_data_add_dict_int(info->d, "mz_socket_id", mz->socket_id);
+	rte_tel_data_add_dict_int(info->d, "mz_flags", mz->flags);
+}
+
+static int
+mempool_handle_info(const char *cmd __rte_unused, const char *params,
+		    struct rte_tel_data *d)
+{
+	struct mempool_info_cb_arg mp_arg;
+	char name[RTE_MEMZONE_NAMESIZE];
+
+	if (!params || strlen(params) == 0)
+		return -EINVAL;
+
+	rte_strlcpy(name, params, RTE_MEMZONE_NAMESIZE);
+
+	rte_tel_data_start_dict(d);
+	mp_arg.pool_name = name;
+	mp_arg.d = d;
+	rte_mempool_walk(mempool_info_cb, &mp_arg);
+
+	return 0;
+}
+
+RTE_INIT(mempool_init_telemetry)
+{
+	rte_telemetry_register_cmd("/mempool/list", mempool_handle_list,
+		"Returns list of available mempool. Takes no parameters");
+	rte_telemetry_register_cmd("/mempool/info", mempool_handle_info,
+		"Returns mempool info. Parameters: pool_name");
+}
Signature · 1 line
2.25.1