[v1,28/34] ml/cnxk: support device dump for TVM models

Message ID 20230830155927.3566-29-syalavarthi@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Implemenation of revised ml/cnxk driver |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Srikanth Yalavarthi Aug. 30, 2023, 3:59 p.m. UTC
  Enabled support to print TVM model layer info.

Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
---
 drivers/ml/cnxk/cnxk_ml_model.c  |  9 ++++-
 drivers/ml/cnxk/cnxk_ml_ops.c    |  1 +
 drivers/ml/cnxk/mvtvm_ml_model.c | 59 ++++++++++++++++++++++++++++++++
 drivers/ml/cnxk/mvtvm_ml_model.h |  2 ++
 4 files changed, 70 insertions(+), 1 deletion(-)
  

Patch

diff --git a/drivers/ml/cnxk/cnxk_ml_model.c b/drivers/ml/cnxk/cnxk_ml_model.c
index 746d3ca5a95..e63ee58ab27 100644
--- a/drivers/ml/cnxk/cnxk_ml_model.c
+++ b/drivers/ml/cnxk/cnxk_ml_model.c
@@ -115,6 +115,8 @@  cnxk_ml_model_dump(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *model,
 	cnxk_ml_print_line(fp, LINE_LEN);
 	fprintf(fp, "%*s : %u\n", FIELD_LEN, "model_id", model->model_id);
 	fprintf(fp, "%*s : %s\n", FIELD_LEN, "name", model->name);
+	fprintf(fp, "%*s : %d\n", FIELD_LEN, "type", model->type);
+	fprintf(fp, "%*s : %d\n", FIELD_LEN, "subtype", model->subtype);
 	fprintf(fp, "%*s : 0x%016lx\n", FIELD_LEN, "model", PLT_U64_CAST(model));
 	fprintf(fp, "%*s : %u\n", FIELD_LEN, "batch_size", model->batch_size);
 	fprintf(fp, "%*s : %u\n", FIELD_LEN, "nb_layers", model->nb_layers);
@@ -131,6 +133,11 @@  cnxk_ml_model_dump(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *model,
 
 	for (layer_id = 0; layer_id < model->nb_layers; layer_id++) {
 		layer = &model->layer[layer_id];
-		cn10k_ml_layer_print(cnxk_mldev, layer, fp);
+		if (layer->type == ML_CNXK_LAYER_TYPE_MRVL)
+			cn10k_ml_layer_print(cnxk_mldev, layer, fp);
+#ifdef RTE_MLDEV_CNXK_ENABLE_MVTVM
+		else
+			mvtvm_ml_layer_print(cnxk_mldev, layer, fp);
+#endif
 	}
 }
diff --git a/drivers/ml/cnxk/cnxk_ml_ops.c b/drivers/ml/cnxk/cnxk_ml_ops.c
index 45c3d61a9b6..f933a2b846f 100644
--- a/drivers/ml/cnxk/cnxk_ml_ops.c
+++ b/drivers/ml/cnxk/cnxk_ml_ops.c
@@ -18,6 +18,7 @@ 
 #include "cnxk_ml_io.h"
 #include "cnxk_ml_model.h"
 #include "cnxk_ml_ops.h"
+#include "cnxk_ml_utils.h"
 
 /* ML model macros */
 #define CNXK_ML_MODEL_MEMZONE_NAME "ml_cnxk_model_mz"
diff --git a/drivers/ml/cnxk/mvtvm_ml_model.c b/drivers/ml/cnxk/mvtvm_ml_model.c
index 6d72a5255e2..24dc862d685 100644
--- a/drivers/ml/cnxk/mvtvm_ml_model.c
+++ b/drivers/ml/cnxk/mvtvm_ml_model.c
@@ -15,6 +15,7 @@ 
 
 #include "cnxk_ml_dev.h"
 #include "cnxk_ml_model.h"
+#include "cnxk_ml_utils.h"
 
 /* Objects list */
 char mvtvm_object_list[ML_MVTVM_MODEL_OBJECT_MAX][RTE_ML_STR_MAX] = {"mod.so", "mod.json",
@@ -241,3 +242,61 @@  mvtvm_ml_model_info_set(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *mo
 	cn10k_ml_model_info_set(cnxk_mldev, model, &model->mvtvm.info,
 				&model->layer[0].glow.metadata);
 }
+
+void
+mvtvm_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, FILE *fp)
+{
+	char str[STR_LEN];
+	uint8_t i;
+
+	/* Print debug info */
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, " Layer Information (Layer ID: %u, Name: %s)\n",
+		cnxk_mldev->index_map[layer->index].layer_id, layer->name);
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, "%*s : %u\n", FIELD_LEN, "layer_id",
+		cnxk_mldev->index_map[layer->index].layer_id);
+	fprintf(fp, "%*s : %s\n", FIELD_LEN, "name", layer->name);
+	fprintf(fp, "%*s : %d\n", FIELD_LEN, "type", layer->type);
+	fprintf(fp, "%*s : 0x%016lx\n", FIELD_LEN, "layer", PLT_U64_CAST(layer));
+	fprintf(fp, "%*s : %u\n", FIELD_LEN, "batch_size", layer->batch_size);
+
+	/* Print model state */
+	if (layer->state == ML_CNXK_LAYER_STATE_LOADED)
+		fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "loaded");
+	if (layer->state == ML_CNXK_LAYER_STATE_JOB_ACTIVE)
+		fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "job_active");
+	if (layer->state == ML_CNXK_LAYER_STATE_STARTED)
+		fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "started");
+
+	fprintf(fp, "%*s : %u\n", FIELD_LEN, "num_inputs", layer->info.nb_inputs);
+	fprintf(fp, "%*s : %u\n", FIELD_LEN, "num_outputs", layer->info.nb_outputs);
+	fprintf(fp, "\n");
+
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, "%8s  %16s  %12s\n", "input", "input_name", "input_type");
+	cnxk_ml_print_line(fp, LINE_LEN);
+	for (i = 0; i < layer->info.nb_inputs; i++) {
+		fprintf(fp, "%8u  ", i);
+		fprintf(fp, "%*s  ", 16, layer->info.input[i].name);
+		rte_ml_io_type_to_str(layer->info.input[i].qtype, str, STR_LEN);
+		fprintf(fp, "%*s  ", 12, str);
+	}
+	fprintf(fp, "\n");
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, "\n");
+
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, "%8s  %16s  %12s\n", "output", "output_name", "output_type");
+	cnxk_ml_print_line(fp, LINE_LEN);
+	for (i = 0; i < layer->info.nb_outputs; i++) {
+		fprintf(fp, "%8u  ", i);
+		fprintf(fp, "%*s  ", 16, layer->info.output[i].name);
+		rte_ml_io_type_to_str(layer->info.output[i].qtype, str, STR_LEN);
+		fprintf(fp, "%*s  ", 12, str);
+		fprintf(fp, "\n");
+	}
+	fprintf(fp, "\n");
+	cnxk_ml_print_line(fp, LINE_LEN);
+	fprintf(fp, "\n");
+}
diff --git a/drivers/ml/cnxk/mvtvm_ml_model.h b/drivers/ml/cnxk/mvtvm_ml_model.h
index eef424b5c2a..fa7735cfaa0 100644
--- a/drivers/ml/cnxk/mvtvm_ml_model.h
+++ b/drivers/ml/cnxk/mvtvm_ml_model.h
@@ -13,6 +13,7 @@ 
 
 struct cnxk_ml_dev;
 struct cnxk_ml_model;
+struct cnxk_ml_layer;
 
 /* Maximum number of objects per model */
 #define ML_MVTVM_MODEL_OBJECT_MAX 3
@@ -50,5 +51,6 @@  int mvtvm_ml_model_blob_parse(struct rte_ml_model_params *params,
 			      struct mvtvm_ml_model_object *object);
 void mvtvm_ml_model_io_info_update(struct cnxk_ml_model *model);
 void mvtvm_ml_model_info_set(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *model);
+void mvtvm_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, FILE *fp);
 
 #endif /* _MVTVM_ML_MODEL_H_ */