Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (c) 2023 Marvell.
3 : : */
4 : :
5 : : #include <rte_hash_crc.h>
6 : : #include <rte_mldev.h>
7 : :
8 : : #include "cnxk_ml_model.h"
9 : : #include "cnxk_ml_utils.h"
10 : :
11 : : enum cnxk_ml_model_type
12 : 0 : cnxk_ml_model_get_type(struct rte_ml_model_params *params)
13 : : {
14 : : struct cn10k_ml_model_metadata_header *metadata_header;
15 : : enum cnxk_ml_model_type type;
16 : : uint32_t payload_crc32c;
17 : : uint32_t header_crc32c;
18 : :
19 : 0 : type = mvtvm_ml_model_type_get(params);
20 [ # # ]: 0 : if (type == ML_CNXK_MODEL_TYPE_TVM)
21 : : return ML_CNXK_MODEL_TYPE_TVM;
22 [ # # ]: 0 : else if (type == ML_CNXK_MODEL_TYPE_INVALID)
23 : : return ML_CNXK_MODEL_TYPE_INVALID;
24 : :
25 : : /* Check model magic string */
26 : 0 : metadata_header = (struct cn10k_ml_model_metadata_header *)params->addr;
27 [ # # ]: 0 : if (strncmp((char *)metadata_header->magic, MRVL_ML_MODEL_MAGIC_STRING, 4) != 0) {
28 : 0 : plt_err("Invalid Glow model, magic = %s", metadata_header->magic);
29 : 0 : return ML_CNXK_MODEL_TYPE_INVALID;
30 : : }
31 : :
32 : : /* Header CRC check */
33 [ # # ]: 0 : if (metadata_header->header_crc32c != 0) {
34 : 0 : header_crc32c = rte_hash_crc(
35 : : params->addr,
36 : : sizeof(struct cn10k_ml_model_metadata_header) - sizeof(uint32_t), 0);
37 : :
38 [ # # ]: 0 : if (header_crc32c != metadata_header->header_crc32c) {
39 : 0 : plt_err("Invalid Glow model, Header CRC mismatch");
40 : 0 : return ML_CNXK_MODEL_TYPE_INVALID;
41 : : }
42 : : }
43 : :
44 : : /* Payload CRC check */
45 [ # # ]: 0 : if (metadata_header->payload_crc32c != 0) {
46 : 0 : payload_crc32c = rte_hash_crc(
47 : 0 : PLT_PTR_ADD(params->addr, sizeof(struct cn10k_ml_model_metadata_header)),
48 : 0 : params->size - sizeof(struct cn10k_ml_model_metadata_header), 0);
49 : :
50 [ # # ]: 0 : if (payload_crc32c != metadata_header->payload_crc32c) {
51 : 0 : plt_err("Invalid Glow model, Payload CRC mismatch");
52 : 0 : return ML_CNXK_MODEL_TYPE_INVALID;
53 : : }
54 : : }
55 : :
56 : : return ML_CNXK_MODEL_TYPE_GLOW;
57 : : }
58 : :
59 : : void
60 : 0 : cnxk_ml_model_dump(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *model, FILE *fp)
61 : : {
62 : : struct cnxk_ml_layer *layer;
63 : : uint16_t layer_id;
64 : :
65 : : /* Print debug info */
66 : 0 : cnxk_ml_print_line(fp, LINE_LEN);
67 : 0 : fprintf(fp, " Model Information (Model ID: %u, Name: %s)\n", model->model_id, model->name);
68 : 0 : cnxk_ml_print_line(fp, LINE_LEN);
69 : 0 : fprintf(fp, "%*s : %u\n", FIELD_LEN, "model_id", model->model_id);
70 : : fprintf(fp, "%*s : %s\n", FIELD_LEN, "name", model->name);
71 : 0 : fprintf(fp, "%*s : %d\n", FIELD_LEN, "type", model->type);
72 : 0 : fprintf(fp, "%*s : %d\n", FIELD_LEN, "subtype", model->subtype);
73 : 0 : fprintf(fp, "%*s : 0x%016lx\n", FIELD_LEN, "model", PLT_U64_CAST(model));
74 : 0 : fprintf(fp, "%*s : %u\n", FIELD_LEN, "batch_size", model->batch_size);
75 : 0 : fprintf(fp, "%*s : %u\n", FIELD_LEN, "nb_layers", model->nb_layers);
76 : :
77 : : /* Print model state */
78 [ # # ]: 0 : if (model->state == ML_CNXK_MODEL_STATE_LOADED)
79 : : fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "loaded");
80 [ # # ]: 0 : if (model->state == ML_CNXK_MODEL_STATE_JOB_ACTIVE)
81 : : fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "job_active");
82 [ # # ]: 0 : if (model->state == ML_CNXK_MODEL_STATE_STARTED)
83 : : fprintf(fp, "%*s : %s\n", FIELD_LEN, "state", "started");
84 : 0 : cnxk_ml_print_line(fp, LINE_LEN);
85 : : fprintf(fp, "\n");
86 : :
87 [ # # ]: 0 : for (layer_id = 0; layer_id < model->nb_layers; layer_id++) {
88 : 0 : layer = &model->layer[layer_id];
89 [ # # ]: 0 : if (layer->type == ML_CNXK_LAYER_TYPE_MRVL)
90 : 0 : cn10k_ml_layer_print(cnxk_mldev, layer, fp);
91 : : else
92 : 0 : mvtvm_ml_layer_print(cnxk_mldev, layer, fp);
93 : : }
94 : 0 : }
|