get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/133412/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 133412,
    "url": "http://patchwork.dpdk.org/api/patches/133412/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231026124347.22477-23-syalavarthi@marvell.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20231026124347.22477-23-syalavarthi@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231026124347.22477-23-syalavarthi@marvell.com",
    "date": "2023-10-26T12:43:31",
    "name": "[v9,22/34] ml/cnxk: fetch layer info and load TVM model",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "22dcfbbef753a29d17768564f125f2e08a266693",
    "submitter": {
        "id": 2480,
        "url": "http://patchwork.dpdk.org/api/people/2480/?format=api",
        "name": "Srikanth Yalavarthi",
        "email": "syalavarthi@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patchwork.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231026124347.22477-23-syalavarthi@marvell.com/mbox/",
    "series": [
        {
            "id": 30002,
            "url": "http://patchwork.dpdk.org/api/series/30002/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=30002",
            "date": "2023-10-26T12:43:09",
            "name": "Implementation of revised ml/cnxk driver",
            "version": 9,
            "mbox": "http://patchwork.dpdk.org/series/30002/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/133412/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/133412/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 9CED443208;\n\tThu, 26 Oct 2023 14:48:51 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A5A0E42EA9;\n\tThu, 26 Oct 2023 14:44:28 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 71F0D42E13\n for <dev@dpdk.org>; Thu, 26 Oct 2023 14:44:04 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 39QALk0D007523 for <dev@dpdk.org>; Thu, 26 Oct 2023 05:44:03 -0700",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3txcsr25pc-14\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Thu, 26 Oct 2023 05:44:03 -0700",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48;\n Thu, 26 Oct 2023 05:43:59 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend\n Transport; Thu, 26 Oct 2023 05:43:59 -0700",
            "from ml-host-33.caveonetworks.com (unknown [10.110.143.233])\n by maili.marvell.com (Postfix) with ESMTP id F06773F70C1;\n Thu, 26 Oct 2023 05:43:58 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=kgJDeGJr2iGuN/7bAYBLQLaQbQ75TU9AYFPu/+OvR1M=;\n b=e7H3fekHkxYfb5U+d3BSWOGYPSexV/k3KI2RIWEUCs3ianKfahwv4/xfbLVplCIvQT6b\n x6HFAMZUPRgOTGg4M97MAkSl5QW43OQT2j06zS8zEzWBnq6V8bC3vilZo+FUnmNoWYoV\n Djtcfm2+6rk+4egr+qiBB7av5DChgozPm/4ONyr0iLeSy0j596JOw43e7KaXsesGLKuQ\n a6uOwxqMC0WxJOREyM34aJ2UqdFGF3jdyez1eRkZWvhamH/aJ5Pa18E4IlPx4/MEAdva\n QrkHlIH0XLbpkaDxOcgjMQYaUFCzkdHGWFpDPLLbO9Q/50M6ewpPrLunL0kn4uRKJu0J Pg==",
        "From": "Srikanth Yalavarthi <syalavarthi@marvell.com>",
        "To": "Srikanth Yalavarthi <syalavarthi@marvell.com>",
        "CC": "<dev@dpdk.org>, <sshankarnara@marvell.com>, <aprabhu@marvell.com>,\n <ptakkar@marvell.com>",
        "Subject": "[PATCH v9 22/34] ml/cnxk: fetch layer info and load TVM model",
        "Date": "Thu, 26 Oct 2023 05:43:31 -0700",
        "Message-ID": "<20231026124347.22477-23-syalavarthi@marvell.com>",
        "X-Mailer": "git-send-email 2.42.0",
        "In-Reply-To": "<20231026124347.22477-1-syalavarthi@marvell.com>",
        "References": "<20230830155927.3566-1-syalavarthi@marvell.com>\n <20231026124347.22477-1-syalavarthi@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "HGQBbxbdChWeH_rtrqR-BZcGfNraSj6Y",
        "X-Proofpoint-GUID": "HGQBbxbdChWeH_rtrqR-BZcGfNraSj6Y",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.272,Aquarius:18.0.987,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2023-10-26_10,2023-10-26_01,2023-05-22_02",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Added support to fetch TVM model layer information and\nupdate internal structures based on the layer information\nSet callback functions for layer load and unload and\nenable model loading using TVMDP library. Added support\nto fetch full metadata after model load.\n\nSigned-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>\n---\n drivers/ml/cnxk/cn10k_ml_model.c | 11 +++++\n drivers/ml/cnxk/cn10k_ml_model.h |  2 +\n drivers/ml/cnxk/cn10k_ml_ops.c   |  7 ++-\n drivers/ml/cnxk/cnxk_ml_io.h     |  8 ++++\n drivers/ml/cnxk/mvtvm_ml_model.c | 25 ++++++++++\n drivers/ml/cnxk/mvtvm_ml_model.h |  4 ++\n drivers/ml/cnxk/mvtvm_ml_ops.c   | 81 ++++++++++++++++++++++++++++++++\n drivers/ml/cnxk/mvtvm_ml_stubs.c | 10 ++++\n drivers/ml/cnxk/mvtvm_ml_stubs.h |  3 ++\n 9 files changed, 149 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/ml/cnxk/cn10k_ml_model.c b/drivers/ml/cnxk/cn10k_ml_model.c\nindex af9d5a666f..0325cd54f1 100644\n--- a/drivers/ml/cnxk/cn10k_ml_model.c\n+++ b/drivers/ml/cnxk/cn10k_ml_model.c\n@@ -716,3 +716,14 @@ cn10k_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer\n \tcnxk_ml_print_line(fp, LINE_LEN);\n \tfprintf(fp, \"\\n\");\n }\n+\n+int\n+cn10k_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)\n+{\n+\tif (model->type == ML_CNXK_MODEL_TYPE_TVM)\n+\t\treturn mvtvm_ml_model_get_layer_id(model, layer_name, layer_id);\n+\n+\t*layer_id = 0;\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/ml/cnxk/cn10k_ml_model.h b/drivers/ml/cnxk/cn10k_ml_model.h\nindex 45f2ed5fcf..6744175cd5 100644\n--- a/drivers/ml/cnxk/cn10k_ml_model.h\n+++ b/drivers/ml/cnxk/cn10k_ml_model.h\n@@ -461,5 +461,7 @@ void cn10k_ml_model_info_set(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_mode\n \t\t\t     struct cnxk_ml_io_info *io_info,\n \t\t\t     struct cn10k_ml_model_metadata *metadata);\n void cn10k_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, FILE *fp);\n+int cn10k_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,\n+\t\t\t\tuint16_t *layer_id);\n \n #endif /* _CN10K_ML_MODEL_H_ */\ndiff --git a/drivers/ml/cnxk/cn10k_ml_ops.c b/drivers/ml/cnxk/cn10k_ml_ops.c\nindex a471e98fbf..4191ccc840 100644\n--- a/drivers/ml/cnxk/cn10k_ml_ops.c\n+++ b/drivers/ml/cnxk/cn10k_ml_ops.c\n@@ -576,7 +576,7 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin\n \tsize_t layer_xstats_size;\n \tuint8_t *base_dma_addr;\n \tuint16_t scratch_pages;\n-\tuint16_t layer_id = 0;\n+\tuint16_t layer_id;\n \tuint16_t wb_pages;\n \tuint64_t mz_size;\n \tuint16_t idx;\n@@ -584,7 +584,6 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin\n \tint ret;\n \n \tPLT_SET_USED(size);\n-\tPLT_SET_USED(layer_name);\n \n \tcnxk_mldev = (struct cnxk_ml_dev *)device;\n \tif (cnxk_mldev == NULL) {\n@@ -598,6 +597,10 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin\n \t\treturn -EINVAL;\n \t}\n \n+\tret = cn10k_ml_model_get_layer_id(model, layer_name, &layer_id);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n \tlayer = &model->layer[layer_id];\n \n \tret = cn10k_ml_model_metadata_check(buffer, size);\ndiff --git a/drivers/ml/cnxk/cnxk_ml_io.h b/drivers/ml/cnxk/cnxk_ml_io.h\nindex d500d77b9a..c33a9c23a1 100644\n--- a/drivers/ml/cnxk/cnxk_ml_io.h\n+++ b/drivers/ml/cnxk/cnxk_ml_io.h\n@@ -5,13 +5,21 @@\n #ifndef _CNXK_ML_IO_H_\n #define _CNXK_ML_IO_H_\n \n+#ifdef RTE_MLDEV_CNXK_ENABLE_MVTVM\n+#include <tvmdp.h>\n+#endif\n+\n #include <rte_mldev.h>\n \n /* Maximum number of models per device */\n #define ML_CNXK_MAX_MODELS 16\n \n /* Maximum number of layers per model */\n+#ifdef RTE_MLDEV_CNXK_ENABLE_MVTVM\n+#define ML_CNXK_MODEL_MAX_LAYERS TVMDP_MODEL_LAYERS_MAX\n+#else\n #define ML_CNXK_MODEL_MAX_LAYERS 1\n+#endif\n \n /* Maximum number of inputs or outputs per layer or model */\n #define ML_CNXK_MODEL_MAX_INPUT_OUTPUT 32\ndiff --git a/drivers/ml/cnxk/mvtvm_ml_model.c b/drivers/ml/cnxk/mvtvm_ml_model.c\nindex 4c9a080c05..8536fd8927 100644\n--- a/drivers/ml/cnxk/mvtvm_ml_model.c\n+++ b/drivers/ml/cnxk/mvtvm_ml_model.c\n@@ -110,3 +110,28 @@ mvtvm_ml_model_blob_parse(struct rte_ml_model_params *params, struct mvtvm_ml_mo\n \n \treturn -EINVAL;\n }\n+\n+int\n+mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)\n+{\n+\tuint16_t i;\n+\n+\tfor (i = 0; i < model->mvtvm.metadata.model.nb_layers; i++) {\n+\t\tif (strcmp(model->layer[i].name, layer_name) == 0)\n+\t\t\tbreak;\n+\t}\n+\n+\tif (i == model->mvtvm.metadata.model.nb_layers) {\n+\t\tplt_err(\"Invalid layer name: %s\", layer_name);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (model->layer[i].type != ML_CNXK_LAYER_TYPE_MRVL) {\n+\t\tplt_err(\"Invalid layer type, name: %s type: %d\", layer_name, model->layer[i].type);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t*layer_id = i;\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/ml/cnxk/mvtvm_ml_model.h b/drivers/ml/cnxk/mvtvm_ml_model.h\nindex b11b66f495..6cb2639876 100644\n--- a/drivers/ml/cnxk/mvtvm_ml_model.h\n+++ b/drivers/ml/cnxk/mvtvm_ml_model.h\n@@ -11,6 +11,8 @@\n \n #include \"cnxk_ml_io.h\"\n \n+struct cnxk_ml_model;\n+\n /* Maximum number of objects per model */\n #define ML_MVTVM_MODEL_OBJECT_MAX 3\n \n@@ -46,5 +48,7 @@ struct mvtvm_ml_model_data {\n enum cnxk_ml_model_type mvtvm_ml_model_type_get(struct rte_ml_model_params *params);\n int mvtvm_ml_model_blob_parse(struct rte_ml_model_params *params,\n \t\t\t      struct mvtvm_ml_model_object *object);\n+int mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,\n+\t\t\t\tuint16_t *layer_id);\n \n #endif /* _MVTVM_ML_MODEL_H_ */\ndiff --git a/drivers/ml/cnxk/mvtvm_ml_ops.c b/drivers/ml/cnxk/mvtvm_ml_ops.c\nindex e2413b6b15..9a3ada1b0d 100644\n--- a/drivers/ml/cnxk/mvtvm_ml_ops.c\n+++ b/drivers/ml/cnxk/mvtvm_ml_ops.c\n@@ -49,9 +49,13 @@ mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *\n \t\t    struct cnxk_ml_model *model)\n {\n \tstruct mvtvm_ml_model_object object[ML_MVTVM_MODEL_OBJECT_MAX];\n+\tstruct tvmrt_glow_callback *callback;\n \tchar str[RTE_MEMZONE_NAMESIZE];\n \tconst struct plt_memzone *mz;\n \tsize_t model_object_size = 0;\n+\tuint16_t nb_mrvl_layers;\n+\tuint16_t nb_llvm_layers;\n+\tuint8_t layer_id = 0;\n \tuint64_t mz_size = 0;\n \tint ret;\n \n@@ -99,5 +103,82 @@ mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *\n \trte_memcpy(model->mvtvm.object.params.addr, object[2].buffer, object[2].size);\n \trte_free(object[2].buffer);\n \n+\t/* Get metadata - stage 1 */\n+\tret = tvmdp_model_metadata_get_stage1(model->mvtvm.object.json.addr,\n+\t\t\t\t\t      model->mvtvm.object.json.size,\n+\t\t\t\t\t      &model->mvtvm.metadata);\n+\tif (ret != 0) {\n+\t\tplt_err(\"TVMDP: Failed to parse metadata - stage 1, model_id = %u, error = %d\",\n+\t\t\tmodel->model_id, ret);\n+\t\tgoto error;\n+\t}\n+\n+\t/* Set model fields */\n+\tplt_strlcpy(model->name, model->mvtvm.metadata.model.name, TVMDP_NAME_STRLEN);\n+\tmodel->batch_size = 1;\n+\tmodel->nb_layers = model->mvtvm.metadata.model.nb_layers;\n+\n+\t/* Update layer info */\n+\tnb_mrvl_layers = 0;\n+\tnb_llvm_layers = 0;\n+\tfor (layer_id = 0; layer_id < model->mvtvm.metadata.model.nb_layers; layer_id++) {\n+\t\trte_strscpy(model->layer[layer_id].name,\n+\t\t\t    model->mvtvm.metadata.model.layer[layer_id].name, TVMDP_NAME_STRLEN);\n+\t\tif (strcmp(model->mvtvm.metadata.model.layer[layer_id].type, \"mrvl\") == 0 ||\n+\t\t    strcmp(model->mvtvm.metadata.model.layer[layer_id].type, \"MRVL\") == 0) {\n+\t\t\tmodel->layer[layer_id].type = ML_CNXK_LAYER_TYPE_MRVL;\n+\t\t\tnb_mrvl_layers++;\n+\t\t} else if (strcmp(model->mvtvm.metadata.model.layer[layer_id].type, \"llvm\") == 0 ||\n+\t\t\t   strcmp(model->mvtvm.metadata.model.layer[layer_id].type, \"LLVM\") == 0) {\n+\t\t\tmodel->layer[layer_id].type = ML_CNXK_LAYER_TYPE_LLVM;\n+\t\t\tnb_llvm_layers++;\n+\t\t}\n+\t}\n+\n+\tif ((nb_llvm_layers == 0) && (nb_mrvl_layers == 0)) {\n+\t\tplt_err(\"Invalid model, nb_llvm_layers = %u, nb_mrvl_layers = %u\", nb_llvm_layers,\n+\t\t\tnb_mrvl_layers);\n+\t\tgoto error;\n+\t}\n+\n+\t/* Set model subtype */\n+\tif ((nb_llvm_layers == 0) && (nb_mrvl_layers == 1))\n+\t\tmodel->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_MRVL;\n+\telse if ((nb_llvm_layers > 0) && (nb_mrvl_layers == 0))\n+\t\tmodel->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_LLVM;\n+\telse\n+\t\tmodel->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_HYBRID;\n+\n+\t/* Set callback function array */\n+\tif (model->subtype != ML_CNXK_MODEL_SUBTYPE_TVM_LLVM) {\n+\t\tcallback = &model->mvtvm.cb;\n+\t\tcallback->tvmrt_glow_layer_load = cn10k_ml_layer_load;\n+\t\tcallback->tvmrt_glow_layer_unload = cn10k_ml_layer_unload;\n+\t} else {\n+\t\tcallback = NULL;\n+\t}\n+\n+\t/* Initialize model in TVMDP */\n+\tret = tvmdp_model_load(cnxk_mldev, model->model_id, (void *)(&model->mvtvm.object),\n+\t\t\t       callback);\n+\tif (ret != 0) {\n+\t\tplt_err(\"TVMDP: Model load failed, model_id = %u, error = %d\", model->model_id,\n+\t\t\tret);\n+\t\tgoto error;\n+\t}\n+\n+\t/* Get model metadata - stage 2 */\n+\tret = tvmdp_model_metadata_get_stage2(model->model_id, &model->mvtvm.metadata);\n+\tif (ret != 0) {\n+\t\tplt_err(\"TVMDP: Failed to get metadata, model_id = %u, error = %d\\n\",\n+\t\t\tmodel->model_id, ret);\n+\t\tgoto error;\n+\t}\n+\n \treturn 0;\n+\n+error:\n+\trte_memzone_free(mz);\n+\n+\treturn ret;\n }\ndiff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.c b/drivers/ml/cnxk/mvtvm_ml_stubs.c\nindex 7f3b3abb2e..d621dbc897 100644\n--- a/drivers/ml/cnxk/mvtvm_ml_stubs.c\n+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.c\n@@ -17,6 +17,16 @@ mvtvm_ml_model_type_get(struct rte_ml_model_params *params)\n \treturn ML_CNXK_MODEL_TYPE_UNKNOWN;\n }\n \n+int\n+mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)\n+{\n+\tRTE_SET_USED(model);\n+\tRTE_SET_USED(layer_name);\n+\tRTE_SET_USED(layer_id);\n+\n+\treturn -EINVAL;\n+}\n+\n int\n mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)\n {\ndiff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.h b/drivers/ml/cnxk/mvtvm_ml_stubs.h\nindex 4bb1772ef4..23fdfdc4cd 100644\n--- a/drivers/ml/cnxk/mvtvm_ml_stubs.h\n+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.h\n@@ -16,4 +16,7 @@ int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);\n int mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *params,\n \t\t\tstruct cnxk_ml_model *model);\n \n+int mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,\n+\t\t\t\tuint16_t *layer_id);\n+\n #endif /* _MVTVM_ML_STUBS_H_ */\n",
    "prefixes": [
        "v9",
        "22/34"
    ]
}