get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 123163,
    "url": "https://patches.dpdk.org/api/patches/123163/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20230206202453.336280-2-jerinj@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://patches.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": "<20230206202453.336280-2-jerinj@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230206202453.336280-2-jerinj@marvell.com",
    "date": "2023-02-06T20:24:42",
    "name": "[v2,01/12] mldev: introduce machine learning device library",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "4ea0269bcc5157cf4f7b460795e34e12fba14f38",
    "submitter": {
        "id": 1188,
        "url": "https://patches.dpdk.org/api/people/1188/?format=api",
        "name": "Jerin Jacob Kollanukkaran",
        "email": "jerinj@marvell.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20230206202453.336280-2-jerinj@marvell.com/mbox/",
    "series": [
        {
            "id": 26825,
            "url": "https://patches.dpdk.org/api/series/26825/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=26825",
            "date": "2023-02-06T20:24:41",
            "name": "mldev: introduce machine learning device library",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/26825/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/123163/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/123163/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 A806C41C25;\n\tMon,  6 Feb 2023 21:25:15 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 92E3442D0B;\n\tMon,  6 Feb 2023 21:25:15 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n [67.231.148.174])\n by mails.dpdk.org (Postfix) with ESMTP id 0259940156\n for <dev@dpdk.org>; Mon,  6 Feb 2023 21:25:13 +0100 (CET)",
            "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 316KHPoc013391; Mon, 6 Feb 2023 12:25:13 -0800",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3nhnkv5afw-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Mon, 06 Feb 2023 12:25:12 -0800",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.42;\n Mon, 6 Feb 2023 12:25:10 -0800",
            "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.42 via Frontend\n Transport; Mon, 6 Feb 2023 12:25:10 -0800",
            "from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14])\n by maili.marvell.com (Postfix) with ESMTP id 5A3CE3F7069;\n Mon,  6 Feb 2023 12:25:07 -0800 (PST)"
        ],
        "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=3cbRXTO+09Fz6AFiqffaCHVlMcnRaGkIK/mnEi8GhYw=;\n b=WKqlXRJM9cPPulf/y++oLVQhfAAELIwbs7a3heUBMjUd3AKF4eOlOlA8XDrG5DUwcgc/\n 9TBo9qBIIS33HDuDHKE/gtT7CzBAb9k0ogKAuI8C01W1zY0Iwp9jKFe2zfu+lmQDn0RX\n f0AWUsd8TskOhgaPHJhUI1JbMfjj92NLGTKXVA8XgCAYUSCHQFjlhJ4i82uK1SpAgdxz\n b+wmAwC6vidwd+vu3AJ4moR0CmEei/NqlnJlWzdwUBi1Rn3coBE2vaGJvio/KoayAAAI\n EKhcSwRCI0L+Lid3UXimgaUpyprMXlSNQZnxpYYJ2GGqNATZXU7QsvtF2203Ir5+33l9 mg==",
        "From": "<jerinj@marvell.com>",
        "To": "<dev@dpdk.org>, Thomas Monjalon <thomas@monjalon.net>, Bruce Richardson\n <bruce.richardson@intel.com>, Srikanth Yalavarthi <syalavarthi@marvell.com>",
        "CC": "<ferruh.yigit@xilinx.com>, <stephen@networkplumber.org>,\n <dchickles@marvell.com>, <sshankarnara@marvell.com>,\n <pkapoor@marvell.com>, Jerin Jacob <jerinj@marvell.com>",
        "Subject": "[dpdk-dev] [PATCH v2 01/12] mldev: introduce machine learning device\n library",
        "Date": "Tue, 7 Feb 2023 01:54:42 +0530",
        "Message-ID": "<20230206202453.336280-2-jerinj@marvell.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20230206202453.336280-1-jerinj@marvell.com>",
        "References": "<20221114120238.2143832-1-jerinj@marvell.com>\n <20230206202453.336280-1-jerinj@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "hU9s8wlQDHHwOEyBnYny0vlSslBJvbbN",
        "X-Proofpoint-GUID": "hU9s8wlQDHHwOEyBnYny0vlSslBJvbbN",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1\n definitions=2023-02-06_07,2023-02-06_03,2022-06-22_01",
        "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": "From: Jerin Jacob <jerinj@marvell.com>\n\nAdd mldev API specification to standardize and use the machine learning\ndevice and inference operations in vendor neutral way.\n\nFollowing operations are abstracted through APIs\n\n- ML device capability probe\n- ML device configuration\n- ML device queue pair configuration\n- ML device state management\n- ML device stat/xstat operations\n- ML model load/unload/start/stop operations\n- ML model information probe\n- ML IO operations to find size for input and output buffers\n- ML quantize and dequantize operations\n- ML ops pool creation and free operations\n- ML device enqueue/dequeue fastpath interference operations\n\nAlso added programming guide.\n\nSigned-off-by: Jerin Jacob <jerinj@marvell.com>\nSigned-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>\n---\n MAINTAINERS                              |    5 +\n config/rte_config.h                      |    3 +\n doc/api/doxy-api-index.md                |    1 +\n doc/api/doxy-api.conf.in                 |    1 +\n doc/guides/prog_guide/img/mldev_flow.svg |  714 ++++++++++++++\n doc/guides/prog_guide/index.rst          |    1 +\n doc/guides/prog_guide/mldev.rst          |  186 ++++\n doc/guides/rel_notes/release_23_03.rst   |    5 +\n lib/meson.build                          |    1 +\n lib/mldev/meson.build                    |   18 +\n lib/mldev/rte_mldev.c                    |    8 +\n lib/mldev/rte_mldev.h                    | 1099 ++++++++++++++++++++++\n lib/mldev/version.map                    |    7 +\n 13 files changed, 2049 insertions(+)\n create mode 100644 doc/guides/prog_guide/img/mldev_flow.svg\n create mode 100644 doc/guides/prog_guide/mldev.rst\n create mode 100644 lib/mldev/meson.build\n create mode 100644 lib/mldev/rte_mldev.c\n create mode 100644 lib/mldev/rte_mldev.h\n create mode 100644 lib/mldev/version.map",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 9a0f416d2e..a39c00a608 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -538,6 +538,11 @@ F: drivers/raw/skeleton/\n F: app/test/test_rawdev.c\n F: doc/guides/prog_guide/rawdev.rst\n \n+ML device API - EXPERIMENTAL\n+M: Srikanth Yalavarthi <syalavarthi@marvell.com>\n+F: lib/mldev/\n+F: doc/guides/prog_guide/mldev.rst\n+\n \n Memory Pool Drivers\n -------------------\ndiff --git a/config/rte_config.h b/config/rte_config.h\nindex 7b8c85e948..2c91c2b3d3 100644\n--- a/config/rte_config.h\n+++ b/config/rte_config.h\n@@ -82,6 +82,9 @@\n /* rawdev defines */\n #define RTE_RAWDEV_MAX_DEVS 64\n \n+/* mldev defines */\n+#define RTE_MLDEV_MAX_DEVS 64\n+\n /* ip_fragmentation defines */\n #define RTE_LIBRTE_IP_FRAG_MAX_FRAG 8\n // RTE_LIBRTE_IP_FRAG_TBL_STAT is not set\ndiff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md\nindex de488c7abf..a12562977a 100644\n--- a/doc/api/doxy-api-index.md\n+++ b/doc/api/doxy-api-index.md\n@@ -22,6 +22,7 @@ The public API headers are grouped by topics:\n   [compress](@ref rte_comp.h),\n   [regexdev](@ref rte_regexdev.h),\n   [dmadev](@ref rte_dmadev.h),\n+  [mldev](@ref rte_mldev.h),\n   [eventdev](@ref rte_eventdev.h),\n   [event_eth_rx_adapter](@ref rte_event_eth_rx_adapter.h),\n   [event_eth_tx_adapter](@ref rte_event_eth_tx_adapter.h),\ndiff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in\nindex f0886c3bd1..5d6416d3e0 100644\n--- a/doc/api/doxy-api.conf.in\n+++ b/doc/api/doxy-api.conf.in\n@@ -57,6 +57,7 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \\\n                           @TOPDIR@/lib/mempool \\\n                           @TOPDIR@/lib/meter \\\n                           @TOPDIR@/lib/metrics \\\n+                          @TOPDIR@/lib/mldev \\\n                           @TOPDIR@/lib/node \\\n                           @TOPDIR@/lib/net \\\n                           @TOPDIR@/lib/pcapng \\\ndiff --git a/doc/guides/prog_guide/img/mldev_flow.svg b/doc/guides/prog_guide/img/mldev_flow.svg\nnew file mode 100644\nindex 0000000000..6c5dda14e5\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/mldev_flow.svg\n@@ -0,0 +1,714 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<!-- SPDX-License-Identifier: BSD-3-Clause -->\n+<!-- Copyright (c) 2022 Marvell. -->\n+<!-- Created with Inkscape (http://www.inkscape.org/) -->\n+\n+<svg\n+   width=\"320mm\"\n+   height=\"297mm\"\n+   viewBox=\"0 0 320 297\"\n+   version=\"1.1\"\n+   id=\"svg6899\"\n+   inkscape:version=\"1.2.1 (9c6d41e410, 2022-07-14)\"\n+   sodipodi:docname=\"mldev_flow.svg\"\n+   inkscape:export-filename=\"mldev_flow.png\"\n+   inkscape:export-xdpi=\"96\"\n+   inkscape:export-ydpi=\"96\"\n+   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n+   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\n+   xmlns=\"http://www.w3.org/2000/svg\"\n+   xmlns:svg=\"http://www.w3.org/2000/svg\">\n+  <sodipodi:namedview\n+     id=\"namedview6901\"\n+     pagecolor=\"#ffffff\"\n+     bordercolor=\"#000000\"\n+     borderopacity=\"0.25\"\n+     inkscape:showpageshadow=\"2\"\n+     inkscape:pageopacity=\"0.0\"\n+     inkscape:pagecheckerboard=\"0\"\n+     inkscape:deskcolor=\"#d1d1d1\"\n+     inkscape:document-units=\"mm\"\n+     showgrid=\"false\"\n+     inkscape:connector-spacing=\"0\"\n+     inkscape:lockguides=\"false\"\n+     inkscape:zoom=\"0.49638341\"\n+     inkscape:cx=\"640.63382\"\n+     inkscape:cy=\"525.80323\"\n+     inkscape:window-width=\"1920\"\n+     inkscape:window-height=\"986\"\n+     inkscape:window-x=\"-11\"\n+     inkscape:window-y=\"-11\"\n+     inkscape:window-maximized=\"1\"\n+     inkscape:current-layer=\"layer1\" />\n+  <defs\n+     id=\"defs6896\">\n+    <marker\n+       style=\"overflow:visible\"\n+       id=\"RoundedArrow\"\n+       refX=\"5\"\n+       refY=\"0\"\n+       orient=\"auto-start-reverse\"\n+       inkscape:stockid=\"RoundedArrow\"\n+       markerWidth=\"6.1347523\"\n+       markerHeight=\"5.9304948\"\n+       viewBox=\"0 0 6.1347524 5.9304951\"\n+       inkscape:isstock=\"true\"\n+       inkscape:collect=\"always\"\n+       preserveAspectRatio=\"xMidYMid\">\n+      <path\n+         transform=\"scale(0.7)\"\n+         d=\"m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z\"\n+         style=\"fill:context-stroke;fill-rule:evenodd;stroke:none\"\n+         id=\"path1367\" />\n+    </marker>\n+    <marker\n+       style=\"overflow:visible\"\n+       id=\"TriangleStart\"\n+       refX=\"4\"\n+       refY=\"0\"\n+       orient=\"auto-start-reverse\"\n+       inkscape:stockid=\"TriangleStart\"\n+       markerWidth=\"5.3244081\"\n+       markerHeight=\"6.155385\"\n+       viewBox=\"0 0 5.3244081 6.1553851\"\n+       inkscape:isstock=\"true\"\n+       inkscape:collect=\"always\"\n+       preserveAspectRatio=\"xMidYMid\">\n+      <path\n+         transform=\"scale(0.5)\"\n+         style=\"fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt\"\n+         d=\"M 5.77,0 -2.88,5 V -5 Z\"\n+         id=\"path135\" />\n+    </marker>\n+  </defs>\n+  <g\n+     inkscape:label=\"Layer 1\"\n+     inkscape:groupmode=\"layer\"\n+     id=\"layer1\">\n+    <rect\n+       style=\"fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers\"\n+       id=\"rect39991\"\n+       width=\"312.88394\"\n+       height=\"286.7659\"\n+       x=\"3.5580292\"\n+       y=\"5.1170502\"\n+       ry=\"18.197132\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 114.68664,155.38145 h 32.15418\"\n+       id=\"path24358\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176-1\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleStart)\"\n+       d=\"m 114.68664,179.58099 h 32.15008\"\n+       id=\"path24360\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176-1\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#TriangleStart)\"\n+       d=\"m 114.68664,203.78389 h 32.15008\"\n+       id=\"path24362\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176-1\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#TriangleStart)\"\n+       d=\"m 114.68664,227.98576 32.14997,0\"\n+       id=\"path24364\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176-1\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleStart)\"\n+       d=\"M 146.8367,252.18432 H 114.68664\"\n+       id=\"path24366\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-end=\"#rect24176-1\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleStart)\"\n+       d=\"M 146.8367,276.38309 H 114.68664\"\n+       id=\"path24368\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-end=\"#rect24176-1\" />\n+    <rect\n+       style=\"fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2, 1;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       id=\"rect24370\"\n+       width=\"18.09137\"\n+       height=\"13.568528\"\n+       x=\"127.27605\"\n+       y=\"208.81961\"\n+       ry=\"2.7394907\"\n+       inkscape:connector-avoid=\"true\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 70.388979,148.58514 -1e-6,-46.3516\"\n+       id=\"path24426\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176-1\"\n+       inkscape:connection-end=\"#rect24176\" />\n+    <g\n+       id=\"g42647\">\n+      <g\n+         id=\"g31403\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844498;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.68901, 0.844498;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5-9\"\n+           width=\"99.155487\"\n+           height=\"14.152132\"\n+           x=\"190.88715\"\n+           y=\"229.93475\"\n+           ry=\"2.2479143\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-236.90309\"\n+           y=\"240.37343\"\n+           id=\"text31115\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-236.90309\"\n+             y=\"240.37343\">rte_ml_model_update_params()</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31398\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844505;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.68902, 0.844505;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-4\"\n+           width=\"99.155495\"\n+           height=\"14.152357\"\n+           x=\"190.88705\"\n+           y=\"205.73608\"\n+           ry=\"2.2479498\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-212.70453\"\n+           y=\"240.37334\"\n+           id=\"text31115-8\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113-8\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-212.70453\"\n+             y=\"240.37334\">rte_ml_model_stop()</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31408\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844505;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.68901, 0.844505;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5-2-2\"\n+           width=\"99.155495\"\n+           height=\"14.152359\"\n+           x=\"190.88715\"\n+           y=\"254.13341\"\n+           ry=\"2.2479503\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-261.10187\"\n+           y=\"240.37343\"\n+           id=\"text31115-1\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113-3\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-261.10187\"\n+             y=\"240.37343\">rte_ml_model_unload()</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31393\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844566;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.68914, 0.844566;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5-2-5\"\n+           width=\"99.155434\"\n+           height=\"14.154394\"\n+           x=\"190.88718\"\n+           y=\"181.53319\"\n+           ry=\"2.2482734\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-188.50266\"\n+           y=\"240.37343\"\n+           id=\"text31115-4\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113-2\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-188.50266\"\n+             y=\"240.37343\">rte_ml_model_start()</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31388\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844565;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.68914, 0.844565;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5-8\"\n+           width=\"99.155434\"\n+           height=\"14.154395\"\n+           x=\"190.88718\"\n+           y=\"157.33029\"\n+           ry=\"2.2482736\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-164.29976\"\n+           y=\"240.37343\"\n+           id=\"text31115-6\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113-5\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-164.29976\"\n+             y=\"240.37343\">rte_ml_model_info_get()</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31383\"\n+         transform=\"translate(-44.050451,15.173444)\">\n+        <rect\n+           style=\"fill:#cadae7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844503;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.689, 0.844503;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-2\"\n+           width=\"99.155495\"\n+           height=\"14.152369\"\n+           x=\"190.89127\"\n+           y=\"133.13176\"\n+           ry=\"2.2479515\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-140.10022\"\n+           y=\"240.37755\"\n+           id=\"text31115-0\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31113-35\"\n+             style=\"stroke:none;stroke-width:0.75\"\n+             x=\"-140.10022\"\n+             y=\"240.37755\">rte_ml_model_load()</tspan></text>\n+      </g>\n+    </g>\n+    <rect\n+       style=\"fill:#ffccaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844503;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.689, 0.844503;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       id=\"rect24200-2-5\"\n+       width=\"99.155495\"\n+       height=\"14.152369\"\n+       x=\"184.08008\"\n+       y=\"112.15163\"\n+       ry=\"2.2479515\"\n+       inkscape:connector-avoid=\"true\" />\n+    <text\n+       xml:space=\"preserve\"\n+       style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       x=\"-119.12009\"\n+       y=\"233.56647\"\n+       id=\"text31115-0-5\"\n+       transform=\"rotate(-90)\"><tspan\n+         sodipodi:role=\"line\"\n+         id=\"tspan31113-35-8\"\n+         style=\"stroke:none;stroke-width:0.75\"\n+         x=\"-119.12009\"\n+         y=\"233.56647\">rte_ml_dequeue_burst()</tspan></text>\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 114.90712,47.649005 h 56.16045\"\n+       id=\"path24248\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-start=\"#rect24176\"\n+       inkscape:connection-end=\"#rect24200\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 171.06762,70.71111 -56.1605,0.0024\"\n+       id=\"path24250\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-end=\"#rect24176\"\n+       inkscape:connection-start=\"#rect24200-5\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"M 171.06765,93.773951 H 114.90712\"\n+       id=\"path24252\"\n+       inkscape:connector-type=\"orthogonal\"\n+       inkscape:connector-curvature=\"0\"\n+       inkscape:connection-end=\"#rect24176\"\n+       inkscape:connection-start=\"#rect24200-5-2\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 215.44396,47.649004 h 36.42795\"\n+       id=\"path24566\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 215.444,70.710168 h 36.42791\"\n+       id=\"path24568\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\" />\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:3, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#TriangleStart);marker-end:url(#TriangleStart)\"\n+       d=\"m 215.44395,93.773951 36.42796,-10e-7\"\n+       id=\"path24570\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\" />\n+    <g\n+       id=\"g42675\">\n+      <g\n+         id=\"g31358\"\n+         transform=\"translate(-19.708778,16.231776)\">\n+        <rect\n+           style=\"fill:#dcf4d3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.623639;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.24728, 0.623639;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200\"\n+           width=\"44.376362\"\n+           height=\"17.244751\"\n+           x=\"190.77635\"\n+           y=\"22.794853\"\n+           ry=\"2.7391431\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-31.802492\"\n+           y=\"212.98004\"\n+           id=\"text31256\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31254\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-31.802492\"\n+             y=\"212.98004\">Queue Pair 0</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31353\"\n+         transform=\"translate(-19.708778,16.231776)\">\n+        <rect\n+           style=\"fill:#dcf4d3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.623639;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.24728, 0.623639;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5\"\n+           width=\"44.376362\"\n+           height=\"17.244749\"\n+           x=\"190.7764\"\n+           y=\"45.856018\"\n+           ry=\"2.7391429\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-54.863655\"\n+           y=\"213.10411\"\n+           id=\"text31256-9\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31254-9\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-54.863655\"\n+             y=\"213.10411\">Queue Pair ..</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31363\"\n+         transform=\"translate(-19.708778,16.231776)\">\n+        <rect\n+           style=\"fill:#dcf4d3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.623731;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.24746, 0.623731;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24200-5-2\"\n+           width=\"44.37627\"\n+           height=\"17.249832\"\n+           x=\"190.77643\"\n+           y=\"68.917259\"\n+           ry=\"2.7399504\"\n+           inkscape:connector-avoid=\"true\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-77.927437\"\n+           y=\"213.08859\"\n+           id=\"text31256-5\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31254-8\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-77.927437\"\n+             y=\"213.08859\">Queue Pair N</tspan></text>\n+      </g>\n+    </g>\n+    <g\n+       id=\"g42661\">\n+      <g\n+         id=\"g31368\"\n+         transform=\"translate(-19.708778,16.231776)\"\n+         inkscape:connector-avoid=\"true\">\n+        <rect\n+           style=\"fill:#ffeeaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.08598;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24479\"\n+           width=\"30.914017\"\n+           height=\"10.84422\"\n+           x=\"271.58066\"\n+           y=\"25.995117\"\n+           ry=\"2.2564735\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-31.941525\"\n+           y=\"287.03415\"\n+           id=\"text31260\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31258\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-31.941525\"\n+             y=\"287.03415\">Core 0</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31373\"\n+         transform=\"translate(-19.708778,16.231776)\">\n+        <rect\n+           style=\"fill:#ffeeaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.08598;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24479-4\"\n+           width=\"30.914017\"\n+           height=\"10.84422\"\n+           x=\"271.58066\"\n+           y=\"49.056282\"\n+           ry=\"2.2564735\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-55.00008\"\n+           y=\"287.15549\"\n+           id=\"text31260-0\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31258-7\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-55.00008\"\n+             y=\"287.15549\">Core ..</tspan></text>\n+      </g>\n+      <g\n+         id=\"g31378\"\n+         transform=\"translate(-19.708778,16.231776)\"\n+         inkscape:connector-avoid=\"true\">\n+        <rect\n+           style=\"fill:#ffeeaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.08598;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           id=\"rect24479-41\"\n+           width=\"30.914017\"\n+           height=\"10.84422\"\n+           x=\"271.58066\"\n+           y=\"72.120064\"\n+           ry=\"2.2564735\" />\n+        <text\n+           xml:space=\"preserve\"\n+           style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 2;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+           x=\"-78.063866\"\n+           y=\"287.13998\"\n+           id=\"text31260-5\"\n+           transform=\"rotate(-90)\"><tspan\n+             sodipodi:role=\"line\"\n+             id=\"tspan31258-8\"\n+             style=\"stroke-width:0.75\"\n+             x=\"-78.063866\"\n+             y=\"287.13998\">Core N</tspan></text>\n+      </g>\n+    </g>\n+    <rect\n+       style=\"fill:#ffccaa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.844503;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.689, 0.844503;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       id=\"rect24200-2-5-6\"\n+       width=\"99.155495\"\n+       height=\"14.152369\"\n+       x=\"184.08008\"\n+       y=\"13.539296\"\n+       ry=\"2.2479515\"\n+       inkscape:connector-avoid=\"true\" />\n+    <text\n+       xml:space=\"preserve\"\n+       style=\"font-size:6.35px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.750001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3, 1.5;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       x=\"-20.507757\"\n+       y=\"233.56647\"\n+       id=\"text31115-0-5-7\"\n+       transform=\"rotate(-90)\"><tspan\n+         sodipodi:role=\"line\"\n+         id=\"tspan31113-35-8-7\"\n+         style=\"stroke:none;stroke-width:0.75\"\n+         x=\"-20.507757\"\n+         y=\"233.56647\">rte_ml_enqueue_burst()</tspan></text>\n+    <path\n+       style=\"fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:2.25, 0.75;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#RoundedArrow)\"\n+       d=\"M 233.65793,27.691665 V 112.15163\"\n+       id=\"path36804\"\n+       inkscape:connector-type=\"polyline\"\n+       inkscape:connector-curvature=\"0\" />\n+    <g\n+       id=\"g42683\">\n+      <rect\n+         style=\"fill:#44d7f4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+         id=\"rect24176\"\n+         width=\"89.036293\"\n+         height=\"63.036304\"\n+         x=\"25.870831\"\n+         y=\"39.197231\"\n+         ry=\"3.0941005\" />\n+      <text\n+         xml:space=\"preserve\"\n+         style=\"font-size:11.2889px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+         x=\"-49.288273\"\n+         y=\"70.228432\"\n+         id=\"text38896\"\n+         transform=\"rotate(-90)\"><tspan\n+           sodipodi:role=\"line\"\n+           id=\"tspan38894\"\n+           style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:'Arial Bold';stroke-width:0.265\"\n+           x=\"-49.288273\"\n+           y=\"70.228432\">Machine</tspan><tspan\n+           sodipodi:role=\"line\"\n+           style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:'Arial Bold';stroke-width:0.265\"\n+           x=\"-63.399399\"\n+           y=\"70.228432\"\n+           id=\"tspan38898\">Learning</tspan><tspan\n+           sodipodi:role=\"line\"\n+           style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:'Arial Bold';stroke-width:0.265\"\n+           x=\"-77.510529\"\n+           y=\"70.228432\"\n+           id=\"tspan38900\">Inference</tspan><tspan\n+           sodipodi:role=\"line\"\n+           style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:'Arial Bold';stroke-width:0.265\"\n+           x=\"-91.621651\"\n+           y=\"70.228432\"\n+           id=\"tspan38902\">Engine</tspan></text>\n+    </g>\n+    <g\n+       id=\"g42621\">\n+      <rect\n+         style=\"fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.405;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+         id=\"rect24176-1\"\n+         width=\"88.595322\"\n+         height=\"134.59531\"\n+         x=\"26.09132\"\n+         y=\"148.58514\"\n+         ry=\"6.6065331\" />\n+      <g\n+         id=\"g42601\">\n+        <g\n+           id=\"g39966\"\n+           transform=\"translate(-60.175145,10.144324)\">\n+          <rect\n+             style=\"fill:#007cab;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.236524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             id=\"rect38962\"\n+             width=\"48.620556\"\n+             height=\"21.483501\"\n+             x=\"106.25385\"\n+             y=\"146.14212\"\n+             ry=\"1.9712806\" />\n+          <text\n+             xml:space=\"preserve\"\n+             style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             x=\"-157.3761\"\n+             y=\"130.49591\"\n+             id=\"text39799\"\n+             transform=\"rotate(-90)\"><tspan\n+               sodipodi:role=\"line\"\n+               id=\"tspan39797\"\n+               style=\"font-size:6.35px;fill:#000000;stroke-width:0.265\"\n+               x=\"-157.3761\"\n+               y=\"130.49591\">Model 0</tspan></text>\n+        </g>\n+        <g\n+           id=\"g39971\"\n+           transform=\"translate(-60.175151,10.144334)\">\n+          <rect\n+             style=\"fill:#007cab;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.236524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             id=\"rect38962-8\"\n+             width=\"48.620556\"\n+             height=\"21.483501\"\n+             x=\"106.25385\"\n+             y=\"178.65079\"\n+             ry=\"1.9712806\" />\n+          <text\n+             xml:space=\"preserve\"\n+             style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             x=\"-189.88477\"\n+             y=\"130.49591\"\n+             id=\"text39799-8\"\n+             transform=\"rotate(-90)\"><tspan\n+               sodipodi:role=\"line\"\n+               id=\"tspan39797-1\"\n+               style=\"font-size:6.35px;fill:#000000;stroke-width:0.265\"\n+               x=\"-189.88477\"\n+               y=\"130.49591\">Model 1</tspan></text>\n+        </g>\n+        <g\n+           id=\"g39976\"\n+           transform=\"translate(-60.175145,10.144324)\">\n+          <rect\n+             style=\"fill:#007cab;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.236524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             id=\"rect38962-9\"\n+             width=\"48.620556\"\n+             height=\"21.483501\"\n+             x=\"106.25385\"\n+             y=\"211.15947\"\n+             ry=\"1.9712806\" />\n+          <text\n+             xml:space=\"preserve\"\n+             style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             x=\"-222.39345\"\n+             y=\"130.49591\"\n+             id=\"text39799-9\"\n+             transform=\"rotate(-90)\"><tspan\n+               sodipodi:role=\"line\"\n+               id=\"tspan39797-8\"\n+               style=\"font-size:6.35px;fill:#000000;stroke-width:0.265\"\n+               x=\"-222.39345\"\n+               y=\"130.49591\">Model ..</tspan></text>\n+        </g>\n+        <g\n+           id=\"g39981\"\n+           transform=\"translate(-60.175145,10.144324)\">\n+          <rect\n+             style=\"fill:#007cab;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.236524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             id=\"rect38962-7\"\n+             width=\"48.620556\"\n+             height=\"21.483501\"\n+             x=\"106.25385\"\n+             y=\"243.66815\"\n+             ry=\"1.9712806\" />\n+          <text\n+             xml:space=\"preserve\"\n+             style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+             x=\"-254.90213\"\n+             y=\"130.49591\"\n+             id=\"text39799-90\"\n+             transform=\"rotate(-90)\"><tspan\n+               sodipodi:role=\"line\"\n+               id=\"tspan39797-5\"\n+               style=\"font-size:6.35px;fill:#000000;stroke-width:0.265\"\n+               x=\"-254.90213\"\n+               y=\"130.49591\">Model N</tspan></text>\n+        </g>\n+      </g>\n+    </g>\n+    <text\n+       xml:space=\"preserve\"\n+       style=\"font-size:14.1111px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;writing-mode:tb-rl;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers\"\n+       x=\"-279.79742\"\n+       y=\"275.46826\"\n+       id=\"text38896-4\"\n+       transform=\"rotate(-90)\"><tspan\n+         sodipodi:role=\"line\"\n+         style=\"font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.1111px;font-family:Arial;-inkscape-font-specification:'Arial Bold';stroke-width:0.265\"\n+         x=\"-279.79742\"\n+         y=\"275.46826\"\n+         id=\"tspan38902-6\">mldev</tspan></text>\n+  </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex 8564883018..d7f2a28bdb 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -30,6 +30,7 @@ Programmer's Guide\n     regexdev\n     dmadev\n     gpudev\n+    mldev\n     rte_security\n     rawdev\n     link_bonding_poll_mode_drv_lib\ndiff --git a/doc/guides/prog_guide/mldev.rst b/doc/guides/prog_guide/mldev.rst\nnew file mode 100644\nindex 0000000000..a0bd370e72\n--- /dev/null\n+++ b/doc/guides/prog_guide/mldev.rst\n@@ -0,0 +1,186 @@\n+..  SPDX-License-Identifier: BSD-3-Clause\n+    Copyright (c) 2022 Marvell.\n+\n+Machine Learning Device Library\n+===============================\n+\n+The MLDEV library provides a Machine Learning device framework for the management and\n+provisioning of hardware and software ML poll mode drivers, defining APIs which\n+support a number of ML operations including device handling and inference processing.\n+The ML model creation and training is outside of the scope of this library.\n+\n+The ML framework is built on the following model:\n+\n+.. _figure_mldev_work_flow:\n+\n+.. figure:: img/mldev_flow.*\n+\n+  Work flow of inference on MLDEV\n+\n+**ML Device**: A hardware or software-based implementation of ML device API for running\n+inferences using a pre-trained ML model.\n+\n+**ML Model**: An ML model is an algorithm trained over a dataset. A model consists of\n+procedure/algorithm and data/pattern required to make predictions on live data. Once\n+the model is created and trained outside of the DPDK scope, the model can be loaded\n+via rte_ml_model_load() and then start it using rte_ml_model_start() API. The\n+rte_ml_model_params_update() can be used to update the model parameters such as weights\n+and bias without unloading the model using rte_ml_model_unload().\n+\n+**ML Inference**: ML inference is the process of feeding data to the model via\n+rte_ml_enqueue_burst() API and use rte_ml_dequeue_burst() API to get the calculated\n+outputs / predictions from the started model.\n+\n+Design Principles\n+-----------------\n+\n+The MLDEV library follows the same basic principles as those used in DPDK's\n+Ethernet Device framework and the Crypto framework. The MLDEV framework provides\n+a generic Machine Learning device framework which supports both physical (hardware)\n+and virtual (software) ML devices as well as an ML API to manage and configure ML\n+devices. The APIs also supports performing ML inference operations through ML poll\n+mode driver.\n+\n+\n+Device Operations\n+-----------------\n+\n+Device Creation\n+~~~~~~~~~~~~~~~\n+\n+Physical ML devices are discovered during the PCI probe/enumeration, through the\n+EAL functions which are executed at DPDK initialization, based on their PCI device\n+identifier, each unique PCI BDF (bus/bridge, device, function). ML physical devices,\n+like other physical devices in DPDK can be white-listed or black-listed\n+using the EAL command line options.\n+\n+\n+Device Identification\n+~~~~~~~~~~~~~~~~~~~~~\n+\n+Each device, whether virtual or physical is uniquely designated by two\n+identifiers:\n+\n+- A unique device index used to designate the ML device in all functions\n+  exported by the MLDEV API.\n+\n+- A device name used to designate the ML device in console messages, for\n+  administration or debugging purposes.\n+\n+Device Features and Capabilities\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+ML devices may support different feature set. In order to get the\n+supported PMD feature ``rte_ml_dev_info_get`` API which return the\n+info of the device and it's supported features.\n+\n+Device Configuration\n+~~~~~~~~~~~~~~~~~~~~\n+\n+The configuration of each ML device includes the following operations:\n+\n+- Allocation of resources, including hardware resources if a physical device.\n+- Resetting the device into a well-known default state.\n+- Initialization of statistics counters.\n+\n+The rte_ml_dev_configure API is used to configure a ML device.\n+\n+.. code-block:: c\n+\n+   int rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *cfg);\n+\n+The ``rte_ml_dev_config`` structure is used to pass the configuration parameters\n+for the ML device, for example  number of queue pairs, maximum number of models,\n+maximum size of model and so on.\n+\n+Configuration of Queue Pairs\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Each ML device can be configured with number of queue pairs.\n+Each queue pair is configured using ``rte_ml_dev_queue_pair_setup``\n+\n+Logical Cores, Memory and Queues Pair Relationships\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Multiple logical cores should never share the same queue pair for enqueuing\n+operations or dequeueing operations on the same ML device since this would\n+require global locks and hinder performance.\n+\n+Configuration of Machine Learning models\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Pre-trained ML models that are built using external ML compiler / training frameworks\n+are used to perform inference operations. These models are configured on an ML device\n+in a two-stage process that includes loading the model on an ML device, and starting\n+the model to accept inference operations. Inference operations can be queued for a\n+model only when the model is in started state. Model load stage assigns a Model ID,\n+which is unique for the model in a driver's context. Model ID is used during all\n+subsequent slow-path and fast-path operations.\n+\n+Model loading and start is done through the ``rte_ml_model_load`` and\n+``rte_ml_model_start`` functions.\n+\n+Similarly stop and unloading are done through ``rte_ml_model_stop`` and\n+``rte_ml_model_unload`` functions.\n+\n+Stop and unload functions would release the resources allocated for the\n+models. Inference tasks cannot be queued for a model that is stopped.\n+\n+Detailed information related to the model can be retrieved from the driver using the\n+function ``rte_ml_model_info_get``. Model information is accessible to the application\n+through the ``rte_ml_model_info`` structure. Information available to the user would\n+include the details related to the inputs and outputs, and the maximum batch size\n+supported by the model.\n+\n+User can optionally update the model params such as weights and bias, without unloading\n+the model, through the ``rte_ml_model_params_update`` function. A model should be in\n+stopped state to update the params. Model has to be started in order to enqueue inference\n+requests after a params update.\n+\n+Enqueue / Dequeue\n+~~~~~~~~~~~~~~~~~\n+\n+The burst enqueue API uses a ML device identifier and a queue pair identifier\n+to specify the device queue pair to schedule the processing on. The ``nb_ops``\n+parameter is the number of operations to process which are supplied in the\n+``ops`` array of ``rte_ml_op`` structures. The enqueue function returns the\n+number of operations it enqueued for processing, a return value equal to\n+``nb_ops`` means that all packets have been enqueued.\n+\n+The dequeue API uses the same format as the enqueue API of processed but\n+the ``nb_ops`` and ``ops`` parameters are now used to specify the max processed\n+operations the user wishes to retrieve and the location in which to store them.\n+The API call returns the actual number of processed operations returned; this\n+can never be larger than ``nb_ops``.\n+\n+``rte_ml_op`` provides the required information to the driver to queue an ML inference\n+task. ML op specifies the model to be used and the number of batches to be executed in\n+the inference task. Input and output buffer information is specified through the\n+structure ``rte_ml_buff_seg``, which supports segmented data. Input is provided through\n+the ``rte_ml_op::input`` and output through ``rte_ml_op::output``. Data pointed in each\n+op, should not be released until the dequeue of for that op.\n+\n+\n+Quantize and Dequantize\n+~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Inference operations performed with lower precision types would improve the throughput\n+and efficiency of the inference execution with a minimal loss of accuracy, which is within\n+the tolerance limits. Quantization and dequantization is the process of converting data\n+from a higher precision type to a lower precision type and vice-versa. ML library provides\n+the functions ``rte_ml_io_quantize`` and ``rte_ml_io_dequantize`` to enable data type\n+conversions. User needs to provide the address of the quantized and dequantized data\n+buffers to the functions, along the number of the batches in the buffers.\n+\n+For quantization, the dequantized data is assumed to be of the type ``dtype`` provided by\n+the ``rte_ml_model_info::input`` and the data is converted to ``qtype`` provided by the\n+``rte_ml_model_info::input``.\n+\n+For dequantization, the quantized data is assumed to be of the type ``qtype`` provided by\n+the ``rte_ml_model_info::output`` and the data is converted to ``dtype`` provided by the\n+``rte_ml_model_info::output``.\n+\n+Size of the buffers required for the input and output can be calculated using the functions\n+``rte_ml_io_input_size_get`` and ``rte_ml_io_output_size_get``. These functions would get the\n+buffer sizes for both quantized and dequantized data for the given number of batches.\n+\ndiff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst\nindex 73f5d94e14..354916d1fc 100644\n--- a/doc/guides/rel_notes/release_23_03.rst\n+++ b/doc/guides/rel_notes/release_23_03.rst\n@@ -78,6 +78,11 @@ New Features\n     ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter\n     required for eth_rx, eth_tx, crypto and timer eventdev adapters.\n \n+* **Added machine learning inference device library.**\n+\n+  * Added a machine learning inference device framework for management and provision of\n+    hardware and software machine learning inference devices.\n+\n \n Removed Items\n -------------\ndiff --git a/lib/meson.build b/lib/meson.build\nindex a90fee31b7..ad91819375 100644\n--- a/lib/meson.build\n+++ b/lib/meson.build\n@@ -63,6 +63,7 @@ libraries = [\n         'flow_classify', # flow_classify lib depends on pkt framework table lib\n         'graph',\n         'node',\n+        'mldev',\n ]\n \n optional_libs = [\ndiff --git a/lib/mldev/meson.build b/lib/mldev/meson.build\nnew file mode 100644\nindex 0000000000..e378cfca30\n--- /dev/null\n+++ b/lib/mldev/meson.build\n@@ -0,0 +1,18 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright (c) 2022 Marvell.\n+\n+sources = files(\n+        'rte_mldev.c',\n+)\n+\n+headers = files(\n+        'rte_mldev.h',\n+)\n+\n+deps += ['mempool']\n+\n+if get_option('buildtype').contains('debug')\n+        cflags += [ '-DRTE_LIBRTE_ML_DEV_DEBUG' ]\n+else\n+        cflags += [ '-URTE_LIBRTE_ML_DEV_DEBUG' ]\n+endif\ndiff --git a/lib/mldev/rte_mldev.c b/lib/mldev/rte_mldev.c\nnew file mode 100644\nindex 0000000000..70aad4c44b\n--- /dev/null\n+++ b/lib/mldev/rte_mldev.c\n@@ -0,0 +1,8 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2022 Marvell.\n+ */\n+\n+#include <rte_log.h>\n+#include <rte_mldev.h>\n+\n+RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);\ndiff --git a/lib/mldev/rte_mldev.h b/lib/mldev/rte_mldev.h\nnew file mode 100644\nindex 0000000000..7b2cc1c270\n--- /dev/null\n+++ b/lib/mldev/rte_mldev.h\n@@ -0,0 +1,1099 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2022 Marvell.\n+ */\n+\n+#ifndef RTE_MLDEV_H\n+#define RTE_MLDEV_H\n+\n+/**\n+ * @file rte_mldev.h\n+ *\n+ * @warning\n+ * @b EXPERIMENTAL:\n+ * All functions in this file may be changed or removed without prior notice.\n+ *\n+ * ML (Machine Learning) device API.\n+ *\n+ * The ML framework is built on the following model:\n+ *\n+ *\n+ *     +-----------------+               rte_ml_[en|de]queue_burst()\n+ *     |                 |                          |\n+ *     |     Machine     o------+     +--------+    |\n+ *     |     Learning    |      |     | queue  |    |    +------+\n+ *     |     Inference   o------+-----o        |<===o===>|Core 0|\n+ *     |     Engine      |      |     | pair 0 |         +------+\n+ *     |                 o----+ |     +--------+\n+ *     |                 |    | |\n+ *     +-----------------+    | |     +--------+\n+ *              ^             | |     | queue  |         +------+\n+ *              |             | +-----o        |<=======>|Core 1|\n+ *              |             |       | pair 1 |         +------+\n+ *              |             |       +--------+\n+ *     +--------+--------+    |\n+ *     | +-------------+ |    |       +--------+\n+ *     | |   Model 0   | |    |       | queue  |         +------+\n+ *     | +-------------+ |    +-------o        |<=======>|Core N|\n+ *     | +-------------+ |            | pair N |         +------+\n+ *     | |   Model 1   | |            +--------+\n+ *     | +-------------+ |\n+ *     | +-------------+ |<------> rte_ml_model_load()\n+ *     | |   Model ..  | |-------> rte_ml_model_info_get()\n+ *     | +-------------+ |<------- rte_ml_model_start()\n+ *     | +-------------+ |<------- rte_ml_model_stop()\n+ *     | |   Model N   | |<------- rte_ml_model_params_update()\n+ *     | +-------------+ |<------- rte_ml_model_unload()\n+ *     +-----------------+\n+ *\n+ * ML Device: A hardware or software-based implementation of ML device API for\n+ * running inferences using a pre-trained ML model.\n+ *\n+ * ML Model: An ML model is an algorithm trained over a dataset. A model consists of\n+ * procedure/algorithm and data/pattern required to make predictions on live data.\n+ * Once the model is created and trained outside of the DPDK scope, the model can be loaded\n+ * via rte_ml_model_load() and then start it using rte_ml_model_start() API.\n+ * The rte_ml_model_params_update() can be used to update the model parameters such as weight\n+ * and bias without unloading the model using rte_ml_model_unload().\n+ *\n+ * ML Inference: ML inference is the process of feeding data to the model via\n+ * rte_ml_enqueue_burst() API and use rte_ml_dequeue_burst() API to get the calculated\n+ * outputs/predictions from the started model.\n+ *\n+ * In all functions of the ML device API, the ML device is designated by an\n+ * integer >= 0 named as device identifier *dev_id*.\n+ *\n+ * The functions exported by the ML device API to setup a device designated by\n+ * its device identifier must be invoked in the following order:\n+ *\n+ *      - rte_ml_dev_configure()\n+ *      - rte_ml_dev_queue_pair_setup()\n+ *      - rte_ml_dev_start()\n+ *\n+ * A model is required to run the inference operations with the user specified inputs.\n+ * Application needs to invoke the ML model API in the following order before queueing\n+ * inference jobs.\n+ *\n+ *      - rte_ml_model_load()\n+ *      - rte_ml_model_start()\n+ *\n+ * A model can be loaded on a device only after the device has been configured and can be\n+ * started or stopped only after a device has been started.\n+ *\n+ * The rte_ml_model_info_get() API is provided to retrieve the information related to the model.\n+ * The information would include the shape and type of input and output required for the inference.\n+ *\n+ * Data quantization and dequantization is one of the main aspects in ML domain. This involves\n+ * conversion of input data from a higher precision to a lower precision data type and vice-versa\n+ * for the output. APIs are provided to enable quantization through rte_ml_io_quantize() and\n+ * dequantization through rte_ml_io_dequantize(). These APIs have the capability to handle input\n+ * and output buffers holding data for multiple batches.\n+ *\n+ * Two utility APIs rte_ml_io_input_size_get() and rte_ml_io_output_size_get() can used to get the\n+ * size of quantized and de-quantized multi-batch input and output buffers.\n+ *\n+ * User can optionally update the model parameters with rte_ml_model_params_update() after\n+ * invoking rte_ml_model_stop() API on a given model ID.\n+ *\n+ * The application can invoke, in any order, the functions exported by the ML API to enqueue\n+ * inference jobs and dequeue inference response.\n+ *\n+ * If the application wants to change the device configuration (i.e., call\n+ * rte_ml_dev_configure() or rte_ml_dev_queue_pair_setup()), then application must stop the\n+ * device using rte_ml_dev_stop() API. Likewise, if model parameters need to be updated then\n+ * the application must call rte_ml_model_stop() followed by rte_ml_model_params_update() API\n+ * for the given model. The application does not need to call rte_ml_dev_stop() API for\n+ * any model re-configuration such as rte_ml_model_params_update(), rte_ml_model_unload() etc.\n+ *\n+ * Once the device is in the start state after invoking rte_ml_dev_start() API and the model is in\n+ * start state after invoking rte_ml_model_start() API, then the application can call\n+ * rte_ml_enqueue_burst() and rte_ml_dequeue_burst() API on the destined device and model ID.\n+ *\n+ * Finally, an application can close an ML device by invoking the rte_ml_dev_close() function.\n+ *\n+ * Typical application utilisation of the ML API will follow the following\n+ * programming flow.\n+ *\n+ * - rte_ml_dev_configure()\n+ * - rte_ml_dev_queue_pair_setup()\n+ * - rte_ml_model_load()\n+ * - rte_ml_dev_start()\n+ * - rte_ml_model_start()\n+ * - rte_ml_model_info_get()\n+ * - rte_ml_enqueue_burst()\n+ * - rte_ml_dequeue_burst()\n+ * - rte_ml_model_stop()\n+ * - rte_ml_model_unload()\n+ * - rte_ml_dev_stop()\n+ * - rte_ml_dev_close()\n+ *\n+ * Regarding multi-threading, by default, all the functions of the ML Device API exported by a PMD\n+ * are lock-free functions which assume to not be invoked in parallel on different logical cores\n+ * on the same target object. For instance, the dequeue function of a poll mode driver cannot be\n+ * invoked in parallel on two logical cores to operate on same queue pair. Of course, this function\n+ * can be invoked in parallel by different logical core on different queue pair.\n+ * It is the responsibility of the user application to enforce this rule.\n+ */\n+\n+#include <rte_common.h>\n+#include <rte_log.h>\n+#include <rte_mempool.h>\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+/* Logging Macro */\n+extern int rte_ml_dev_logtype;\n+\n+#define RTE_MLDEV_LOG(level, fmt, args...)                                                         \\\n+\trte_log(RTE_LOG_##level, rte_ml_dev_logtype, \"%s(): \" fmt \"\\n\", __func__, ##args)\n+\n+#define RTE_ML_STR_MAX 128\n+/**< Maximum length of name string */\n+\n+/* Device operations */\n+\n+/**\n+ * Get the total number of ML devices that have been successfully initialised.\n+ *\n+ * @return\n+ *   - The total number of usable ML devices.\n+ */\n+__rte_experimental\n+uint16_t\n+rte_ml_dev_count(void);\n+\n+/**\n+ * Check if the device is in ready state.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @return\n+ *   - 0 if device state is not in ready state.\n+ *   - 1 if device state is ready state.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_is_valid_dev(int16_t dev_id);\n+\n+/**\n+ * Return the NUMA socket to which a device is connected.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @return\n+ *   - The NUMA socket id to which the device is connected\n+ *   - 0 If the socket could not be determined.\n+ *   - -EINVAL: if the dev_id value is not valid.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_socket_id(int16_t dev_id);\n+\n+/**  ML device information */\n+struct rte_ml_dev_info {\n+\tconst char *driver_name;\n+\t/**< Driver name */\n+\tuint16_t max_models;\n+\t/**< Maximum number of models supported by the device.\n+\t * @see struct rte_ml_dev_config::nb_models\n+\t */\n+\tuint16_t max_queue_pairs;\n+\t/**< Maximum number of queues pairs supported by the device.\n+\t * @see struct rte_ml_dev_config::nb_queue_pairs\n+\t */\n+\tuint16_t max_desc;\n+\t/**< Maximum allowed number of descriptors for queue pair by the device.\n+\t * @see struct rte_ml_dev_qp_conf::nb_desc\n+\t */\n+\tuint16_t max_segments;\n+\t/**< Maximum number of scatter-gather entries supported by the device.\n+\t * @see struct rte_ml_buff_seg  struct rte_ml_buff_seg::next\n+\t */\n+\tuint16_t min_align_size;\n+\t/**< Minimum alignment size of IO buffers used by the device. */\n+};\n+\n+/**\n+ * Retrieve the information of the device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param dev_info\n+ *   A pointer to a structure of type *rte_ml_dev_info* to be filled with the info of the device.\n+ *\n+ * @return\n+ *   - 0: Success, driver updates the information of the ML device\n+ *   - < 0: Error code returned by the driver info get function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info);\n+\n+/** ML device configuration structure */\n+struct rte_ml_dev_config {\n+\tint socket_id;\n+\t/**< Socket to allocate resources on. */\n+\tuint16_t nb_models;\n+\t/**< Number of models to be loaded on the device.\n+\t * This value cannot exceed the max_models which is previously provided in\n+\t * struct rte_ml_dev_info::max_models\n+\t */\n+\tuint16_t nb_queue_pairs;\n+\t/**< Number of queue pairs to configure on this device.\n+\t * This value cannot exceed the max_models which is previously provided in\n+\t * struct rte_ml_dev_info::max_queue_pairs\n+\t */\n+};\n+\n+/**\n+ * Configure an ML device.\n+ *\n+ * This function must be invoked first before any other function in the API.\n+ *\n+ * ML Device can be re-configured, when in a stopped state. Device cannot be re-configured after\n+ * rte_ml_dev_close() is called.\n+ *\n+ * The caller may use rte_ml_dev_info_get() to get the capability of each resources available for\n+ * this ML device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device to configure.\n+ * @param config\n+ *   The ML device configuration structure.\n+ *\n+ * @return\n+ *   - 0: Success, device configured.\n+ *   - < 0: Error code returned by the driver configuration function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config);\n+\n+/* Forward declaration */\n+struct rte_ml_op;\n+\n+/**< Callback function called during rte_ml_dev_stop(), invoked once per flushed ML op */\n+typedef void (*rte_ml_dev_stop_flush_t)(int16_t dev_id, uint16_t qp_id, struct rte_ml_op *op);\n+\n+/** ML device queue pair configuration structure. */\n+struct rte_ml_dev_qp_conf {\n+\tuint32_t nb_desc;\n+\t/**< Number of descriptors per queue pair.\n+\t * This value cannot exceed the max_desc which previously provided in\n+\t * struct rte_ml_dev_info:max_desc\n+\t */\n+\trte_ml_dev_stop_flush_t cb;\n+\t/**< Callback function called during rte_ml_dev_stop(), invoked once per active ML op.\n+\t * Value NULL is allowed, in which case callback will not be invoked.\n+\t * This function can be used to properly dispose of outstanding ML ops from all\n+\t * queue pairs, for example ops containing  memory pointers.\n+\t * @see rte_ml_dev_stop()\n+\t */\n+};\n+\n+/**\n+ * Set up a queue pair for a device. This should only be called when the device is stopped.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param queue_pair_id\n+ *   The index of the queue pairs to set up. The value must be in the range [0, nb_queue_pairs - 1]\n+ * previously supplied to rte_ml_dev_configure().\n+ * @param qp_conf\n+ *   The pointer to the configuration data to be used for the queue pair.\n+ * @param socket_id\n+ *   The *socket_id* argument is the socket identifier in case of NUMA.\n+ * The value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the memory allocated\n+ * for the queue pair.\n+ *\n+ * @return\n+ *   - 0: Success, queue pair correctly set up.\n+ *   - < 0: Queue pair configuration failed.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,\n+\t\t\t    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id);\n+\n+/**\n+ * Start an ML device.\n+ *\n+ * The device start step consists of setting the configured features and enabling the ML device\n+ * to accept inference jobs.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @return\n+ *   - 0: Success, device started.\n+ *   - <0: Error code of the driver device start function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_start(int16_t dev_id);\n+\n+/**\n+ * Stop an ML device. A stopped device cannot accept inference jobs.\n+ * The device can be restarted with a call to rte_ml_dev_start().\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @return\n+ *   - 0: Success, device stopped.\n+ *   - <0: Error code of the driver device stop function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_stop(int16_t dev_id);\n+\n+/**\n+ * Close an ML device. The device cannot be restarted!\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @return\n+ *  - 0 on successfully closing device.\n+ *  - <0 on failure to close device.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_close(int16_t dev_id);\n+\n+/** Status of ML operation */\n+enum rte_ml_op_status {\n+\tRTE_ML_OP_STATUS_SUCCESS = 0,\n+\t/**< Operation completed successfully */\n+\tRTE_ML_OP_STATUS_NOT_PROCESSED,\n+\t/**< Operation has not yet been processed by the device. */\n+\tRTE_ML_OP_STATUS_ERROR,\n+\t/**< Operation completed with error.\n+\t * Application can invoke rte_ml_op_error_get() to get PMD specific\n+\t * error code if needed.\n+\t */\n+};\n+\n+/** ML operation's input and output buffer representation as scatter gather list\n+ */\n+struct rte_ml_buff_seg {\n+\trte_iova_t iova_addr;\n+\t/**< IOVA address of segment buffer. */\n+\tvoid *addr;\n+\t/**< Virtual address of segment buffer. */\n+\tuint32_t length;\n+\t/**< Segment length. */\n+\tuint32_t reserved;\n+\t/**< Reserved for future use. */\n+\tstruct rte_ml_buff_seg *next;\n+\t/**< Points to next segment. Value NULL represents the last segment. */\n+};\n+\n+/**\n+ * ML Operation.\n+ *\n+ * This structure contains data related to performing an ML operation on the buffers using\n+ * the model specified through model_id.\n+ */\n+struct rte_ml_op {\n+\tuint16_t model_id;\n+\t/**< Model ID to be used for the operation. */\n+\tuint16_t nb_batches;\n+\t/**< Number of batches. Minimum value must be one.\n+\t * Input buffer must hold inference data for each batch as contiguous.\n+\t */\n+\tuint32_t reserved;\n+\t/**< Reserved for future use. */\n+\tstruct rte_mempool *mempool;\n+\t/**< Pool from which operation is allocated. */\n+\tstruct rte_ml_buff_seg input;\n+\t/**< Input buffer to hold the inference data. */\n+\tstruct rte_ml_buff_seg output;\n+\t/**< Output buffer to hold the inference output by the driver. */\n+\tRTE_STD_C11\n+\tunion {\n+\t\tuint64_t user_u64;\n+\t\t/**< User data as uint64_t.*/\n+\t\tvoid *user_ptr;\n+\t\t/**< User data as void*.*/\n+\t};\n+\tenum rte_ml_op_status status;\n+\t/**< Operation status. */\n+\tuint64_t impl_opaque;\n+\t/**< Implementation specific opaque value.\n+\t * An implementation may use this field to hold\n+\t * implementation specific value to share between\n+\t * dequeue and enqueue operation.\n+\t * The application should not modify this field.\n+\t */\n+} __rte_cache_aligned;\n+\n+/* Enqueue/Dequeue operations */\n+\n+/**\n+ * Enqueue a burst of ML inferences for processing on an ML device.\n+ *\n+ * The rte_ml_enqueue_burst() function is invoked to place ML inference\n+ * operations on the queue *qp_id* of the device designated by its *dev_id*.\n+ *\n+ * The *nb_ops* parameter is the number of inferences to process which are\n+ * supplied in the *ops* array of *rte_ml_op* structures.\n+ *\n+ * The rte_ml_enqueue_burst() function returns the number of inferences it\n+ * actually enqueued for processing. A return value equal to *nb_ops* means that\n+ * all packets have been enqueued.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param qp_id\n+ *   The index of the queue pair which inferences are to be enqueued for processing.\n+ * The value must be in the range [0, nb_queue_pairs - 1] previously supplied to\n+ * *rte_ml_dev_configure*.\n+ * @param ops\n+ *   The address of an array of *nb_ops* pointers to *rte_ml_op* structures which contain the\n+ * ML inferences to be processed.\n+ * @param nb_ops\n+ *   The number of operations to process.\n+ *\n+ * @return\n+ *   The number of inference operations actually enqueued to the ML device.\n+ * The return value can be less than the value of the *nb_ops* parameter when the ML device queue\n+ * is full or if invalid parameters are specified in a *rte_ml_op*.\n+ */\n+__rte_experimental\n+uint16_t\n+rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops);\n+\n+/**\n+ * Dequeue a burst of processed ML inferences operations from a queue on the ML device.\n+ * The dequeued operations are stored in *rte_ml_op* structures whose pointers are supplied\n+ * in the *ops* array.\n+ *\n+ * The rte_ml_dequeue_burst() function returns the number of inferences actually dequeued,\n+ * which is the number of *rte_ml_op* data structures effectively supplied into the *ops* array.\n+ *\n+ * A return value equal to *nb_ops* indicates that the queue contained at least nb_ops* operations,\n+ * and this is likely to signify that other processed operations remain in the devices output queue.\n+ * Application implementing a \"retrieve as many processed operations as possible\" policy can check\n+ * this specific case and keep invoking the rte_ml_dequeue_burst() function until a value less than\n+ * *nb_ops* is returned.\n+ *\n+ * The rte_ml_dequeue_burst() function does not provide any error notification to avoid\n+ * the corresponding overhead.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param qp_id\n+ *   The index of the queue pair from which to retrieve processed packets.\n+ * The value must be in the range [0, nb_queue_pairs - 1] previously supplied to\n+ * rte_ml_dev_configure().\n+ * @param ops\n+ *   The address of an array of pointers to *rte_ml_op* structures that must be large enough to\n+ * store *nb_ops* pointers in it.\n+ * @param nb_ops\n+ *   The maximum number of inferences to dequeue.\n+ *\n+ * @return\n+ *   The number of operations actually dequeued, which is the number of pointers\n+ * to *rte_ml_op* structures effectively supplied to the *ops* array.\n+ */\n+__rte_experimental\n+uint16_t\n+rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops);\n+\n+/**\n+ * Verbose error structure definition.\n+ */\n+struct rte_ml_op_error {\n+\tchar message[RTE_ML_STR_MAX]; /**< Human-readable error message. */\n+\tuint64_t errcode;\t      /**< Vendor specific error code. */\n+};\n+\n+/**\n+ * Get PMD specific error information for an ML op.\n+ *\n+ * When an ML operation completed with RTE_ML_OP_STATUS_ERROR as status,\n+ * This API allows to get PMD specific error details.\n+ *\n+ * @param[in] dev_id\n+ *   Device identifier\n+ * @param[in] op\n+ *   Handle of ML operation\n+ * @param[in] error\n+ *   Address of structure rte_ml_op_error to be filled\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_op_error_get(int16_t dev_id, struct rte_ml_op *op, struct rte_ml_op_error *error);\n+\n+/* Statistics operations */\n+\n+/** Device statistics. */\n+struct rte_ml_dev_stats {\n+\tuint64_t enqueued_count;\n+\t/**< Count of all operations enqueued */\n+\tuint64_t dequeued_count;\n+\t/**< Count of all operations dequeued */\n+\tuint64_t enqueue_err_count;\n+\t/**< Total error count on operations enqueued */\n+\tuint64_t dequeue_err_count;\n+\t/**< Total error count on operations dequeued */\n+};\n+\n+/**\n+ * Retrieve the general I/O statistics of a device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param stats\n+ *   Pointer to structure to where statistics will be copied.\n+ * On error, this location may or may not have been modified.\n+ * @return\n+ *   - 0 on success\n+ *   - -EINVAL: If invalid parameter pointer is provided.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats);\n+\n+/**\n+ * Reset the statistics of a device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ */\n+__rte_experimental\n+void\n+rte_ml_dev_stats_reset(int16_t dev_id);\n+\n+/**\n+ * A name-key lookup element for extended statistics.\n+ *\n+ * This structure is used to map between names and ID numbers for extended ML device statistics.\n+ */\n+struct rte_ml_dev_xstats_map {\n+\tuint16_t id;\n+\t/**< xstat identifier */\n+\tchar name[RTE_ML_STR_MAX];\n+\t/**< xstat name */\n+};\n+\n+/**\n+ * Retrieve names of extended statistics of an ML device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param[out] xstats_map\n+ *   Block of memory to insert id and names into. Must be at least size in capacity.\n+ * If set to NULL, function returns required capacity.\n+ * @param size\n+ *   Capacity of xstats_map (number of name-id maps).\n+ *\n+ * @return\n+ *   - Positive value on success:\n+ *      - The return value is the number of entries filled in the stats map.\n+ *      - If xstats_map set to NULL then required capacity for xstats_map.\n+ *   - Negative value on error:\n+ *      - -ENODEV: for invalid *dev_id*.\n+ *      - -ENOTSUP: if the device doesn't support this function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_xstats_names_get(int16_t dev_id, struct rte_ml_dev_xstats_map *xstats_map,\n+\t\t\t    uint32_t size);\n+\n+/**\n+ * Retrieve the value of a single stat by requesting it by name.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param name\n+ *   The stat name to retrieve.\n+ * @param stat_id\n+ *   If non-NULL, the numerical id of the stat will be returned, so that further requests for\n+ * the stat can be got using rte_ml_dev_xstats_get, which will be faster as it doesn't need to\n+ * scan a list of names for the stat.\n+ * @param[out] value\n+ *   Must be non-NULL, retrieved xstat value will be stored in this address.\n+ *\n+ * @return\n+ *   - 0: Successfully retrieved xstat value.\n+ *   - -EINVAL: invalid parameters.\n+ *   - -ENOTSUP: if not supported.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value);\n+\n+/**\n+ * Retrieve extended statistics of an ML device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param stat_ids\n+ *   The id numbers of the stats to get. The ids can be fetched from the stat position in the\n+ * stat list from rte_ml_dev_xstats_names_get(), or by using rte_ml_dev_xstats_by_name_get().\n+ * @param values\n+ *   The values for each stats request by ID.\n+ * @param nb_ids\n+ *   The number of stats requested.\n+ * @return\n+ *   - Positive value: number of stat entries filled into the values array\n+ *   - Negative value on error:\n+ *      - -ENODEV: for invalid *dev_id*.\n+ *      - -ENOTSUP: if the device doesn't support this function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_xstats_get(int16_t dev_id, const uint16_t *stat_ids, uint64_t *values, uint16_t nb_ids);\n+\n+/**\n+ * Reset the values of the xstats of the selected component in the device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param stat_ids\n+ *   Selects specific statistics to be reset. When NULL, all statistics will be reset.\n+ * If non-NULL, must point to array of at least *nb_ids* size.\n+ * @param nb_ids\n+ *   The number of ids available from the *ids* array. Ignored when ids is NULL.\n+ * @return\n+ *   - 0: Successfully reset the statistics to zero.\n+ *   - -EINVAL: invalid parameters.\n+ *   - -ENOTSUP: if not supported.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_xstats_reset(int16_t dev_id, const uint16_t *stat_ids, uint16_t nb_ids);\n+\n+/* Utility operations */\n+\n+/**\n+ * Dump internal information about *dev_id* to the FILE* provided in *fd*.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param fd\n+ *   A pointer to a file for output.\n+ * @return\n+ *   - 0: on success.\n+ *   - <0: on failure.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_dump(int16_t dev_id, FILE *fd);\n+\n+/**\n+ * Trigger the ML device self test.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @return\n+ *   - 0: Selftest successful.\n+ *   - -ENOTSUP: if the device doesn't support selftest.\n+ *   - other values < 0 on failure.\n+ */\n+__rte_experimental\n+int\n+rte_ml_dev_selftest(int16_t dev_id);\n+\n+/* Model operations */\n+\n+/** ML model load parameters\n+ *\n+ * Parameters required to load an ML model.\n+ */\n+struct rte_ml_model_params {\n+\tvoid *addr;\n+\t/**< Address of model buffer */\n+\tsize_t size;\n+\t/**< Size of model buffer */\n+};\n+\n+/**\n+ * Load an ML model to the device.\n+ *\n+ * Load an ML model to the device with parameters requested in the structure rte_ml_model_params.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] params\n+ *   Parameters for the model to be loaded.\n+ * @param[out] model_id\n+ *   Identifier of the model loaded.\n+ *\n+ * @return\n+ *   - 0: Success, Model loaded.\n+ *   - < 0: Failure, Error code of the model load driver function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id);\n+\n+/**\n+ * Unload an ML model from the device.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier of the model to be unloaded.\n+ *\n+ * @return\n+ *   - 0: Success, Model unloaded.\n+ *   - < 0: Failure, Error code of the model unload driver function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_unload(int16_t dev_id, uint16_t model_id);\n+\n+/**\n+ * Start an ML model for the given device ID.\n+ *\n+ * Start an ML model to accept inference requests.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier of the model to be started.\n+ *\n+ * @return\n+ *   - 0: Success, Model loaded.\n+ *   - < 0: Failure, Error code of the model start driver function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_start(int16_t dev_id, uint16_t model_id);\n+\n+/**\n+ * Stop an ML model for the given device ID.\n+ *\n+ * Model stop would disable the ML model to be used for inference jobs.\n+ * All inference jobs must have been completed before model stop is attempted.\n+\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier of the model to be stopped.\n+ *\n+ * @return\n+ *   - 0: Success, Model unloaded.\n+ *   - < 0: Failure, Error code of the model stop driver function.\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_stop(int16_t dev_id, uint16_t model_id);\n+\n+/**\n+ * Input and output data types. ML models can operate on reduced precision\n+ * datatypes to achieve better power efficiency, lower network latency and lower memory footprint.\n+ * This enum is used to represent the lower precision integer and floating point types used\n+ * by ML models.\n+ */\n+enum rte_ml_io_type {\n+\tRTE_ML_IO_TYPE_UNKNOWN = 0,\n+\t/**< Invalid or unknown type */\n+\tRTE_ML_IO_TYPE_INT8,\n+\t/**< 8-bit integer */\n+\tRTE_ML_IO_TYPE_UINT8,\n+\t/**< 8-bit unsigned integer */\n+\tRTE_ML_IO_TYPE_INT16,\n+\t/**< 16-bit integer */\n+\tRTE_ML_IO_TYPE_UINT16,\n+\t/**< 16-bit unsigned integer */\n+\tRTE_ML_IO_TYPE_INT32,\n+\t/**< 32-bit integer */\n+\tRTE_ML_IO_TYPE_UINT32,\n+\t/**< 32-bit unsigned integer */\n+\tRTE_ML_IO_TYPE_FP8,\n+\t/**< 8-bit floating point number */\n+\tRTE_ML_IO_TYPE_FP16,\n+\t/**< IEEE 754 16-bit floating point number */\n+\tRTE_ML_IO_TYPE_FP32,\n+\t/**< IEEE 754 32-bit floating point number */\n+\tRTE_ML_IO_TYPE_BFLOAT16\n+\t/**< 16-bit brain floating point number. */\n+};\n+\n+/**\n+ * Input and output format. This is used to represent the encoding type of multi-dimensional\n+ * used by ML models.\n+ */\n+enum rte_ml_io_format {\n+\tRTE_ML_IO_FORMAT_NCHW = 1,\n+\t/**< Batch size (N) x channels (C) x height (H) x width (W) */\n+\tRTE_ML_IO_FORMAT_NHWC,\n+\t/**< Batch size (N) x height (H) x width (W) x channels (C) */\n+\tRTE_ML_IO_FORMAT_CHWN,\n+\t/**< Channels (C) x height (H) x width (W) x batch size (N) */\n+\tRTE_ML_IO_FORMAT_3D,\n+\t/**< Format to represent a 3 dimensional data */\n+\tRTE_ML_IO_FORMAT_2D,\n+\t/**< Format to represent matrix data */\n+\tRTE_ML_IO_FORMAT_1D,\n+\t/**< Format to represent vector data */\n+\tRTE_ML_IO_FORMAT_SCALAR,\n+\t/**< Format to represent scalar data */\n+};\n+\n+/**\n+ * Input and output shape. This structure represents the encoding format and dimensions\n+ * of the tensor or vector.\n+ *\n+ * The data can be a 4D / 3D tensor, matrix, vector or a scalar. Number of dimensions used\n+ * for the data would depend on the format. Unused dimensions to be set to 1.\n+ */\n+struct rte_ml_io_shape {\n+\tenum rte_ml_io_format format;\n+\t/**< Format of the data */\n+\tuint32_t w;\n+\t/**< First dimension */\n+\tuint32_t x;\n+\t/**< Second dimension */\n+\tuint32_t y;\n+\t/**< Third dimension */\n+\tuint32_t z;\n+\t/**< Fourth dimension */\n+};\n+\n+/** Input and output data information structure\n+ *\n+ * Specifies the type and shape of input and output data.\n+ */\n+struct rte_ml_io_info {\n+\tchar name[RTE_ML_STR_MAX];\n+\t/**< Name of data */\n+\tstruct rte_ml_io_shape shape;\n+\t/**< Shape of data */\n+\tenum rte_ml_io_type qtype;\n+\t/**< Type of quantized data */\n+\tenum rte_ml_io_type dtype;\n+\t/**< Type of de-quantized data */\n+};\n+\n+/** Model information structure */\n+struct rte_ml_model_info {\n+\tchar name[RTE_ML_STR_MAX];\n+\t/**< Model name. */\n+\tchar version[RTE_ML_STR_MAX];\n+\t/**< Model version */\n+\tuint16_t model_id;\n+\t/**< Model ID */\n+\tuint16_t device_id;\n+\t/**< Device ID */\n+\tuint16_t batch_size;\n+\t/**< Maximum number of batches that the model can process simultaneously */\n+\tuint32_t nb_inputs;\n+\t/**< Number of inputs */\n+\tconst struct rte_ml_io_info *input_info;\n+\t/**< Input info array. Array size is equal to nb_inputs */\n+\tuint32_t nb_outputs;\n+\t/**< Number of outputs */\n+\tconst struct rte_ml_io_info *output_info;\n+\t/**< Output info array. Array size is equal to nb_output */\n+\tuint64_t wb_size;\n+\t/**< Size of model weights and bias */\n+};\n+\n+/**\n+ * Get ML model information.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model created\n+ * @param[out] model_info\n+ *   Pointer to a model info structure\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info);\n+\n+/**\n+ * Update the model parameters without unloading model.\n+ *\n+ * Update model parameters such as weights and bias without unloading the model.\n+ * rte_ml_model_stop() must be called before invoking this API.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model created\n+ * @param[in] buffer\n+ *   Pointer to the model weights and bias buffer.\n+ * Size of the buffer is equal to wb_size returned in *rte_ml_model_info*.\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer);\n+\n+/* IO operations */\n+\n+/**\n+ * Get size of quantized and dequantized input buffers.\n+ *\n+ * Calculate the size of buffers required for quantized and dequantized input data.\n+ * This API would return the buffer sizes for the number of batches provided and would\n+ * consider the alignment requirements as per the PMD. Input sizes computed by this API can\n+ * be used by the application to allocate buffers.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model created\n+ * @param[in] nb_batches\n+ *   Number of batches of input to be processed in a single inference job\n+ * @param[out] input_qsize\n+ *   Quantized input size pointer.\n+ * NULL value is allowed, in which case input_qsize is not calculated by the driver.\n+ * @param[out] input_dsize\n+ *   Dequantized input size pointer.\n+ * NULL value is allowed, in which case input_dsize is not calculated by the driver.\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,\n+\t\t\t uint64_t *input_qsize, uint64_t *input_dsize);\n+\n+/**\n+ * Get size of quantized and dequantized output buffers.\n+ *\n+ * Calculate the size of buffers required for quantized and dequantized output data.\n+ * This API would return the buffer sizes for the number of batches provided and would consider\n+ * the alignment requirements as per the PMD. Output sizes computed by this API can be used by the\n+ * application to allocate buffers.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model created\n+ * @param[in] nb_batches\n+ *   Number of batches of input to be processed in a single inference job\n+ * @param[out] output_qsize\n+ *   Quantized output size pointer.\n+ * NULL value is allowed, in which case output_qsize is not calculated by the driver.\n+ * @param[out] output_dsize\n+ *   Dequantized output size pointer.\n+ * NULL value is allowed, in which case output_dsize is not calculated by the driver.\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,\n+\t\t\t  uint64_t *output_qsize, uint64_t *output_dsize);\n+\n+/**\n+ * Quantize input data.\n+ *\n+ * Quantization converts data from a higher precision types to a lower precision types to improve\n+ * the throughput and efficiency of the model execution with minimal loss of accuracy.\n+ * Types of dequantized data and quantized data are specified by the model.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model\n+ * @param[in] nb_batches\n+ *   Number of batches in the dequantized input buffer\n+ * @param[in] dbuffer\n+ *   Address of dequantized input data\n+ * @param[in] qbuffer\n+ *   Address of quantized input data\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer,\n+\t\t   void *qbuffer);\n+\n+/**\n+ * Dequantize output data.\n+ *\n+ * Dequantization converts data from a lower precision type to a higher precision type.\n+ * Types of quantized data and dequantized are specified by the model.\n+ *\n+ * @param[in] dev_id\n+ *   The identifier of the device.\n+ * @param[in] model_id\n+ *   Identifier for the model\n+ * @param[in] nb_batches\n+ *   Number of batches in the dequantized output buffer\n+ * @param[in] qbuffer\n+ *   Address of quantized output data\n+ * @param[in] dbuffer\n+ *   Address of dequantized output data\n+ *\n+ * @return\n+ *   - Returns 0 on success\n+ *   - Returns negative value on failure\n+ */\n+__rte_experimental\n+int\n+rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer,\n+\t\t     void *dbuffer);\n+\n+/* ML op pool operations */\n+\n+/**\n+ * Create an ML operation pool\n+ *\n+ * @param name\n+ *   ML operations pool name\n+ * @param nb_elts\n+ *   Number of elements in pool\n+ * @param cache_size\n+ *   Number of elements to cache on lcore, see\n+ *   *rte_mempool_create* for further details about cache size\n+ * @param user_size\n+ *   Size of private data to allocate for user with each operation\n+ * @param socket_id\n+ *   Socket to identifier allocate memory on\n+ * @return\n+ *  - On success pointer to mempool\n+ *  - On failure NULL\n+ */\n+__rte_experimental\n+struct rte_mempool *\n+rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,\n+\t\t      uint16_t user_size, int socket_id);\n+\n+/**\n+ * Free an ML operation pool\n+ *\n+ * @param mempool\n+ *   A pointer to the mempool structure.\n+ *   If NULL then, the function does nothing.\n+ */\n+__rte_experimental\n+void\n+rte_ml_op_pool_free(struct rte_mempool *mempool);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* RTE_MLDEV_H */\ndiff --git a/lib/mldev/version.map b/lib/mldev/version.map\nnew file mode 100644\nindex 0000000000..3793380442\n--- /dev/null\n+++ b/lib/mldev/version.map\n@@ -0,0 +1,7 @@\n+EXPERIMENTAL {\n+\tglobal:\n+\n+\trte_ml_dev_logtype;\n+\n+\tlocal: *;\n+};\n",
    "prefixes": [
        "v2",
        "01/12"
    ]
}