Added support to configure and close TVMDP library based
on ML device configuration options.
Updated meson build to enable Jansson, TVM runtime, TVMDP
library as build dependencies.
Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
---
doc/guides/mldevs/cnxk.rst | 58 +++++++++++++++++++++++++++++++
drivers/ml/cnxk/cnxk_ml_ops.c | 7 ++++
drivers/ml/cnxk/cnxk_ml_ops.h | 6 ++++
drivers/ml/cnxk/meson.build | 59 ++++++++++++++++++++++++++++++++
drivers/ml/cnxk/mvtvm_ml_ops.c | 41 ++++++++++++++++++++++
drivers/ml/cnxk/mvtvm_ml_ops.h | 19 ++++++++++
drivers/ml/cnxk/mvtvm_ml_stubs.c | 26 ++++++++++++++
drivers/ml/cnxk/mvtvm_ml_stubs.h | 15 ++++++++
8 files changed, 231 insertions(+)
create mode 100644 drivers/ml/cnxk/mvtvm_ml_ops.c
create mode 100644 drivers/ml/cnxk/mvtvm_ml_ops.h
create mode 100644 drivers/ml/cnxk/mvtvm_ml_stubs.c
create mode 100644 drivers/ml/cnxk/mvtvm_ml_stubs.h
@@ -46,6 +46,64 @@ or cross-compiled on an x86 platform.
Refer to :doc:`../platform/cnxk` for instructions to build your DPDK application.
+Compilation Prerequisites
+-------------------------
+
+This driver requires external libraries to optionally enable support for
+models compiled using Apache TVM framework. The following dependencies are
+not part of DPDK and must be installed separately:
+
+- **Jansson**
+
+ This library enables support to parse and read JSON files.
+
+- **TVM**
+
+ Apache TVM provides a runtime library (libtvm_runtime) used to execute
+ models on CPU cores or hardware accelerators.
+
+.. note::
+
+ DPDK CNXK ML driver requires TVM version 0.10.0
+
+.. code-block:: console
+
+ git clone https://github.com/apache/tvm.git
+ cd tvm
+ git checkout v0.10.0 -b v0.10.0
+ cmake -S ./ -B build \
+ -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
+ -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
+ -DMACHINE_NAME=aarch64-linux-gnu \
+ -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
+ -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY
+ make -C build
+ make -C build install
+
+- **TVMDP**
+
+ Marvell's `TVM Dataplane Library <https://github.com/MarvellEmbeddedProcessors/tvmdp>`_
+ works as an interface between TVM runtime and DPDK drivers. TVMDP library
+ provides a simplified C interface for TVM's runtime based on C++.
+
+.. code-block:: console
+
+ git clone https://github.com/MarvellEmbeddedProcessors/tvmdp.git
+ cd tvmdp
+ git checkout main
+ cmake -S ./ -B build \
+ -DCMAKE_TOOLCHAIN_FILE=config/toolchains/arm64_linux_gcc.cmake \
+ -DBUILD_SHARED_LIBS=ON \
+ -DBUILD_TESTING=OFF
+ make -C build
+ make -C build install
+
+- **libarchive**
+
+ Apached TVM framework generates compiled models as tar archives. This
+ library enables support to decompress and read archive files in tar,
+ xz and other formats.
+
Initialization
--------------
@@ -564,6 +564,10 @@ cnxk_ml_dev_configure(struct rte_ml_dev *dev, const struct rte_ml_dev_config *co
goto error;
}
+ ret = mvtvm_ml_dev_configure(cnxk_mldev, conf);
+ if (ret != 0)
+ goto error;
+
/* Set device capabilities */
cnxk_mldev->max_nb_layers =
cnxk_mldev->cn10k_mldev.fw.req->cn10k_req.jd.fw_load.cap.s.max_models;
@@ -624,6 +628,9 @@ cnxk_ml_dev_close(struct rte_ml_dev *dev)
/* Un-initialize xstats */
cnxk_ml_xstats_uninit(cnxk_mldev);
+ if (mvtvm_ml_dev_close(cnxk_mldev) != 0)
+ plt_err("Failed to close MVTVM ML Device");
+
if (cn10k_ml_dev_close(cnxk_mldev) != 0)
plt_err("Failed to close CN10K ML Device");
@@ -12,6 +12,12 @@
#include "cn10k_ml_ops.h"
+#ifdef RTE_MLDEV_CNXK_ENABLE_MVTVM
+#include "mvtvm_ml_ops.h"
+#else
+#include "mvtvm_ml_stubs.h"
+#endif
+
/* Request structure */
struct cnxk_ml_req {
/* Device specific request */
@@ -7,6 +7,32 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
subdir_done()
endif
+enable_mvtvm = true
+
+if not jansson_dep.found()
+ message('drivers/ml/cnxk: jansson not found')
+ enable_mvtvm = false
+endif
+
+if not cc.check_header('dlpack/dlpack.h')
+ message('drivers/ml/cnxk: dlpack.h not found')
+ enable_mvtvm = false
+endif
+
+tvmrt_lib = cc.find_library('tvm_runtime', required: false)
+if tvmrt_lib.found()
+ tvmrt_dep = declare_dependency(dependencies: tvmrt_lib)
+else
+ message('drivers/ml/cnxk: tvm_runtime not found')
+ enable_mvtvm = false
+endif
+
+tvmdp_dep = dependency('tvmdp', required: false)
+if not tvmdp_dep.found()
+ message('drivers/ml/cnxk: tvmdp not found')
+ enable_mvtvm = false
+endif
+
driver_sdk_headers = files(
'cn10k_ml_dev.h',
'cn10k_ml_ops.h',
@@ -34,6 +60,39 @@ sources = files(
deps += ['mldev', 'common_cnxk', 'kvargs', 'hash']
+if enable_mvtvm
+
+dpdk_conf.set('RTE_MLDEV_CNXK_ENABLE_MVTVM', 1)
+
+driver_sdk_headers += files(
+ 'mvtvm_ml_ops.h',
+)
+
+sources += files(
+ 'mvtvm_ml_ops.c',
+)
+
+ext_deps += tvmrt_dep
+ext_deps += tvmdp_dep
+ext_deps += cc.find_library('stdc++', required: true)
+ext_deps += jansson_dep
+
+deps += ['bus_vdev']
+
+message('drivers/ml/cnxk: Enabled TVM model support')
+else
+message('drivers/ml/cnxk: Disabled TVM model support')
+
+driver_sdk_headers += files(
+ 'mvtvm_ml_stubs.h',
+)
+
+sources += files(
+ 'mvtvm_ml_stubs.c',
+)
+
+endif
+
require_iova_in_mbuf = false
if get_option('buildtype').contains('debug')
new file mode 100644
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#include <rte_common.h>
+#include <rte_cycles.h>
+#include <rte_mldev.h>
+#include <rte_mldev_pmd.h>
+
+#include "cnxk_ml_dev.h"
+#include "cnxk_ml_ops.h"
+
+int
+mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
+{
+ int ret;
+
+ RTE_SET_USED(conf);
+
+ /* Configure TVMDP library */
+ ret = tvmdp_configure(cnxk_mldev->mldev->data->nb_models, rte_get_tsc_cycles);
+ if (ret != 0)
+ plt_err("TVMDP configuration failed, error = %d\n", ret);
+
+ return ret;
+}
+
+int
+mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev)
+{
+ int ret;
+
+ RTE_SET_USED(cnxk_mldev);
+
+ /* Close TVMDP library configuration */
+ ret = tvmdp_close();
+ if (ret != 0)
+ plt_err("TVMDP close failed, error = %d\n", ret);
+
+ return ret;
+}
new file mode 100644
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#ifndef _MVTVM_ML_OPS_H_
+#define _MVTVM_ML_OPS_H_
+
+#include <dlpack/dlpack.h>
+
+#include <tvmdp.h>
+
+#include <rte_mldev.h>
+
+struct cnxk_ml_dev;
+
+int mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf);
+int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);
+
+#endif /* _MVTVM_ML_OPS_H_ */
new file mode 100644
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#include <rte_mldev.h>
+
+#include "mvtvm_ml_stubs.h"
+
+#include "cnxk_ml_dev.h"
+
+int
+mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
+{
+ RTE_SET_USED(cnxk_mldev);
+ RTE_SET_USED(conf);
+
+ return 0;
+}
+
+int
+mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev)
+{
+ RTE_SET_USED(cnxk_mldev);
+
+ return 0;
+}
new file mode 100644
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#ifndef _MVTVM_ML_STUBS_H_
+#define _MVTVM_ML_STUBS_H_
+
+#include <rte_mldev.h>
+
+struct cnxk_ml_dev;
+
+int mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf);
+int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);
+
+#endif /* _MVTVM_ML_STUBS_H_ */