aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-dpdk')
-rw-r--r--platform/linux-dpdk/Makefile.am39
-rw-r--r--platform/linux-dpdk/README3
l---------platform/linux-dpdk/arch/aarch64/odp_cpu_idling.h1
l---------platform/linux-dpdk/arch/aarch64/odp_llsc.h1
l---------platform/linux-dpdk/arch/aarch64/odp_wait_until.h1
l---------platform/linux-dpdk/arch/arm/odp_atomic.h1
l---------platform/linux-dpdk/arch/arm/odp_cpu_idling.h1
l---------platform/linux-dpdk/arch/arm/odp_llsc.h1
l---------platform/linux-dpdk/arch/default/odp_cpu_idling.h1
l---------platform/linux-dpdk/arch/default/odp_wait_until.h1
-rw-r--r--platform/linux-dpdk/example/Makefile.am5
-rw-r--r--platform/linux-dpdk/example/ml/.gitignore5
-rw-r--r--platform/linux-dpdk/example/ml/Makefile.am54
l---------platform/linux-dpdk/example/ml/README.md1
l---------platform/linux-dpdk/example/ml/example_digit.csv1
l---------platform/linux-dpdk/example/ml/mnist-12.onnx1
l---------platform/linux-dpdk/example/ml/odp_ml_run_mnist.sh1
l---------platform/linux-dpdk/example/ml/odp_ml_run_model_explorer.sh1
l---------platform/linux-dpdk/example/ml/odp_ml_run_simple_linear.sh1
l---------platform/linux-dpdk/example/ml/simple_linear.onnx1
-rw-r--r--platform/linux-dpdk/include-abi/odp/api/abi/dma_types.h2
l---------platform/linux-dpdk/include-abi/odp/api/abi/ml_types.h1
-rw-r--r--platform/linux-dpdk/include-abi/odp/api/abi/packet_types.h2
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/event_inline_types.h1
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/packet_inline_types.h1
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/packet_inlines.h4
-rw-r--r--platform/linux-dpdk/include/odp_buffer_internal.h7
-rw-r--r--platform/linux-dpdk/include/odp_config_internal.h9
-rw-r--r--platform/linux-dpdk/include/odp_packet_internal.h8
-rw-r--r--platform/linux-dpdk/include/odp_timer_internal.h13
-rw-r--r--platform/linux-dpdk/libodp-dpdk.pc.in2
-rw-r--r--platform/linux-dpdk/m4/configure.m47
-rw-r--r--platform/linux-dpdk/m4/odp_libconfig.m42
l---------platform/linux-dpdk/m4/odp_ml.m41
-rw-r--r--platform/linux-dpdk/odp_crypto.c13
-rw-r--r--platform/linux-dpdk/odp_event.c7
-rw-r--r--platform/linux-dpdk/odp_init.c15
-rw-r--r--platform/linux-dpdk/odp_packet.c1
-rw-r--r--platform/linux-dpdk/odp_pool.c10
-rw-r--r--platform/linux-dpdk/odp_schedule_eventdev.c4
-rw-r--r--platform/linux-dpdk/odp_system_info.c9
-rw-r--r--platform/linux-dpdk/odp_timer.c2
-rw-r--r--platform/linux-dpdk/test/Makefile.am6
-rw-r--r--platform/linux-dpdk/test/crypto.conf2
-rw-r--r--platform/linux-dpdk/test/default-timer.conf2
-rw-r--r--platform/linux-dpdk/test/example/ipsec_api/Makefile.am2
-rw-r--r--platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am2
-rw-r--r--platform/linux-dpdk/test/process-mode.conf2
-rw-r--r--platform/linux-dpdk/test/sched-basic.conf2
-rw-r--r--platform/linux-dpdk/test/stash-custom.conf2
-rw-r--r--platform/linux-dpdk/test/validation/api/ml/.gitignore1
-rw-r--r--platform/linux-dpdk/test/validation/api/ml/Makefile.am29
l---------platform/linux-dpdk/test/validation/api/ml/README.md1
l---------platform/linux-dpdk/test/validation/api/ml/batch_add.onnx1
l---------platform/linux-dpdk/test/validation/api/ml/batch_add_gen.py1
l---------platform/linux-dpdk/test/validation/api/ml/gen_models.sh1
l---------platform/linux-dpdk/test/validation/api/ml/requirements.txt1
l---------platform/linux-dpdk/test/validation/api/ml/simple_linear.onnx1
l---------platform/linux-dpdk/test/validation/api/ml/simple_linear_gen.py1
59 files changed, 243 insertions, 56 deletions
diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am
index 886fe8f48..0bfe35092 100644
--- a/platform/linux-dpdk/Makefile.am
+++ b/platform/linux-dpdk/Makefile.am
@@ -13,6 +13,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/@ARCH_DIR@
AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/default
AM_CPPFLAGS += $(OPENSSL_CPPFLAGS)
+AM_CPPFLAGS += $(ORT_CPPFLAGS)
AM_CFLAGS += $(DPDK_CFLAGS)
AM_CFLAGS += $(LIBCONFIG_CFLAGS)
@@ -88,6 +89,7 @@ odpapiabiarchinclude_HEADERS += \
include-abi/odp/api/abi/init.h \
include-abi/odp/api/abi/ipsec.h \
include-abi/odp/api/abi/ipsec_types.h \
+ include-abi/odp/api/abi/ml_types.h \
include-abi/odp/api/abi/packet.h \
include-abi/odp/api/abi/packet_types.h \
include-abi/odp/api/abi/packet_flags.h \
@@ -136,6 +138,7 @@ noinst_HEADERS = \
${top_srcdir}/platform/linux-generic/include/odp_classification_internal.h \
include/odp_eventdev_internal.h \
${top_srcdir}/platform/linux-generic/include/odp_forward_typedefs_internal.h \
+ ${top_srcdir}/platform/linux-generic/include/odp_ml_fp16.h \
${top_srcdir}/platform/linux-generic/include/odp_global_data.h \
${top_srcdir}/platform/linux-generic/include/odp_init_internal.h \
${top_srcdir}/platform/linux-generic/include/odp_ipsec_internal.h \
@@ -217,6 +220,8 @@ __LIB__libodp_dpdk_la_SOURCES = \
../linux-generic/odp_ipsec_sad.c \
../linux-generic/odp_name_table.c \
../linux-generic/odp_libconfig.c \
+ ../linux-generic/odp_ml_fp16.c \
+ ../linux-generic/odp_ml_quantize.c \
odp_packet.c \
odp_packet_dpdk.c \
../linux-generic/odp_packet_vector.c \
@@ -255,6 +260,14 @@ __LIB__libodp_dpdk_la_SOURCES = \
../linux-generic/odp_version.c \
../linux-generic/odp_weak.c
+if WITH_ML
+__LIB__libodp_dpdk_la_SOURCES += \
+ ../linux-generic/odp_ml.c
+else
+__LIB__libodp_dpdk_la_SOURCES += \
+ ../linux-generic/odp_ml_null.c
+endif
+
if ODP_ABI_COMPAT
__LIB__libodp_dpdk_la_SOURCES += \
../linux-generic/odp_atomic_api.c \
@@ -301,15 +314,11 @@ odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/default/odp/api/abi/wait_until_generic.h \
arch/default/odp/api/abi/wait_until.h
endif
-noinst_HEADERS += arch/arm/odp_atomic.h \
- arch/arm/odp_cpu.h \
- arch/arm/odp_cpu_idling.h \
- arch/arm/odp_llsc.h \
+noinst_HEADERS += arch/arm/odp_cpu.h \
arch/default/odp_atomic.h \
arch/default/odp_cpu.h \
- arch/default/odp_cpu_idling.h \
- arch/default/odp_random.h
-
+ arch/default/odp_random.h \
+ arch/default/odp_wait_until.h
endif
if ARCH_IS_AARCH64
__LIB__libodp_dpdk_la_SOURCES += arch/aarch64/odp_atomic.c \
@@ -334,9 +343,8 @@ endif
noinst_HEADERS += arch/aarch64/odp_atomic.h \
arch/aarch64/odp_cpu.h \
arch/aarch64/cpu_flags.h \
- arch/aarch64/odp_cpu_idling.h \
- arch/aarch64/odp_llsc.h \
- arch/aarch64/odp_random.h
+ arch/aarch64/odp_random.h \
+ arch/aarch64/odp_wait_until.h
endif
if ARCH_IS_DEFAULT
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
@@ -357,8 +365,8 @@ odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
endif
noinst_HEADERS += arch/default/odp_atomic.h \
arch/default/odp_cpu.h \
- arch/default/odp_cpu_idling.h \
- arch/default/odp_random.h
+ arch/default/odp_random.h \
+ arch/default/odp_wait_until.h
endif
if ARCH_IS_POWERPC
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
@@ -379,8 +387,8 @@ odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
endif
noinst_HEADERS += arch/default/odp_atomic.h \
arch/default/odp_cpu.h \
- arch/default/odp_cpu_idling.h \
- arch/default/odp_random.h
+ arch/default/odp_random.h \
+ arch/default/odp_wait_until.h
endif
if ARCH_IS_X86
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
@@ -406,7 +414,7 @@ noinst_HEADERS += arch/x86/cpu_flags.h \
arch/x86/odp_random.h \
arch/default/odp_atomic.h \
arch/default/odp_cpu.h \
- arch/default/odp_cpu_idling.h
+ arch/default/odp_wait_until.h
endif
__LIB__libodp_dpdk_la_LIBADD = $(ATOMIC_LIBS)
@@ -415,6 +423,7 @@ __LIB__libodp_dpdk_la_LIBADD += $(LIBCONFIG_LIBS)
__LIB__libodp_dpdk_la_LIBADD += $(DPDK_LIBS_LIBODP)
__LIB__libodp_dpdk_la_LIBADD += $(PTHREAD_LIBS)
__LIB__libodp_dpdk_la_LIBADD += $(TIMER_LIBS)
+__LIB__libodp_dpdk_la_LIBADD += $(ORT_LIBS)
CHECK_GLOBALS_REGEX = " (odp_|_odp_|_deprecated_odp_|miniz_|mz_|tdefl_|tinfl_|mp_hdlr_init_odp_pool_ops)"
diff --git a/platform/linux-dpdk/README b/platform/linux-dpdk/README
index 421d3f958..c0298ab34 100644
--- a/platform/linux-dpdk/README
+++ b/platform/linux-dpdk/README
@@ -36,7 +36,8 @@ cmds below for Ubuntu, where it has been compiled and tested.
On Ubuntu install pcap development library:
sudo apt-get install libpcap-dev
-Right now ODP-DPDK supports DPDK v21.11 and v22.11 (recommended version).
+Right now ODP-DPDK supports DPDK v21.11, v22.11 (recommended version), and
+v23.11.
Compile DPDK
------------
diff --git a/platform/linux-dpdk/arch/aarch64/odp_cpu_idling.h b/platform/linux-dpdk/arch/aarch64/odp_cpu_idling.h
deleted file mode 120000
index c8230bb63..000000000
--- a/platform/linux-dpdk/arch/aarch64/odp_cpu_idling.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/aarch64/odp_cpu_idling.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/aarch64/odp_llsc.h b/platform/linux-dpdk/arch/aarch64/odp_llsc.h
deleted file mode 120000
index eb8d1200b..000000000
--- a/platform/linux-dpdk/arch/aarch64/odp_llsc.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/aarch64/odp_llsc.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/aarch64/odp_wait_until.h b/platform/linux-dpdk/arch/aarch64/odp_wait_until.h
new file mode 120000
index 000000000..f7d35f0ca
--- /dev/null
+++ b/platform/linux-dpdk/arch/aarch64/odp_wait_until.h
@@ -0,0 +1 @@
+../../../linux-generic/arch/aarch64/odp_wait_until.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/arm/odp_atomic.h b/platform/linux-dpdk/arch/arm/odp_atomic.h
deleted file mode 120000
index 61a8c536b..000000000
--- a/platform/linux-dpdk/arch/arm/odp_atomic.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/arm/odp_atomic.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/arm/odp_cpu_idling.h b/platform/linux-dpdk/arch/arm/odp_cpu_idling.h
deleted file mode 120000
index 56afe9027..000000000
--- a/platform/linux-dpdk/arch/arm/odp_cpu_idling.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/arm/odp_cpu_idling.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/arm/odp_llsc.h b/platform/linux-dpdk/arch/arm/odp_llsc.h
deleted file mode 120000
index b3f3f371f..000000000
--- a/platform/linux-dpdk/arch/arm/odp_llsc.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/arm/odp_llsc.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/default/odp_cpu_idling.h b/platform/linux-dpdk/arch/default/odp_cpu_idling.h
deleted file mode 120000
index eb2d21c4b..000000000
--- a/platform/linux-dpdk/arch/default/odp_cpu_idling.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/default/odp_cpu_idling.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/default/odp_wait_until.h b/platform/linux-dpdk/arch/default/odp_wait_until.h
new file mode 120000
index 000000000..d2e7b5316
--- /dev/null
+++ b/platform/linux-dpdk/arch/default/odp_wait_until.h
@@ -0,0 +1 @@
+../../../linux-generic/arch/default/odp_wait_until.h \ No newline at end of file
diff --git a/platform/linux-dpdk/example/Makefile.am b/platform/linux-dpdk/example/Makefile.am
new file mode 100644
index 000000000..84f337387
--- /dev/null
+++ b/platform/linux-dpdk/example/Makefile.am
@@ -0,0 +1,5 @@
+SUBDIRS =
+
+if WITH_ML
+SUBDIRS += ml
+endif
diff --git a/platform/linux-dpdk/example/ml/.gitignore b/platform/linux-dpdk/example/ml/.gitignore
new file mode 100644
index 000000000..d845f6bb5
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/.gitignore
@@ -0,0 +1,5 @@
+model_explorer
+simple_linear
+mnist
+*.log
+*.trs
diff --git a/platform/linux-dpdk/example/ml/Makefile.am b/platform/linux-dpdk/example/ml/Makefile.am
new file mode 100644
index 000000000..7abbc3828
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/Makefile.am
@@ -0,0 +1,54 @@
+include $(top_srcdir)/example/Makefile.inc
+
+LDADD += -lm
+
+bin_PROGRAMS = model_explorer simple_linear mnist
+
+simple_linear_SOURCES = \
+ ../../../linux-generic/example/ml/simple_linear.c \
+ ../../../linux-generic/example/ml/model_read.c \
+ ../../../linux-generic/example/ml/model_read.h
+model_explorer_SOURCES = \
+ ../../../linux-generic/example/ml/model_explorer.c \
+ ../../../linux-generic/example/ml/model_read.c \
+ ../../../linux-generic/example/ml/model_read.h
+mnist_SOURCES = \
+ ../../../linux-generic/example/ml/mnist.c \
+ ../../../linux-generic/example/ml/model_read.c \
+ ../../../linux-generic/example/ml/model_read.h
+
+EXTRA_DIST = \
+ odp_ml_run_mnist.sh \
+ example_digit.csv \
+ mnist-12.onnx \
+ odp_ml_run_model_explorer.sh \
+ odp_ml_run_simple_linear.sh \
+ simple_linear.onnx
+
+if test_example
+TESTS = \
+ odp_ml_run_mnist.sh \
+ odp_ml_run_model_explorer.sh \
+ odp_ml_run_simple_linear.sh
+endif
+
+# If building out-of-tree, make check will not copy the scripts and data to the
+# $(builddir) assuming that all commands are run locally. However this prevents
+# running tests on a remote target using LOG_COMPILER.
+# So copy all script and data files explicitly here.
+all-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ if [ -e $(srcdir)/$$f ]; then \
+ mkdir -p $(builddir)/$$(dirname $$f); \
+ cp -f $(srcdir)/$$f $(builddir)/$$f; \
+ fi \
+ done \
+ fi
+
+clean-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ rm -f $(builddir)/$$f; \
+ done \
+ fi
diff --git a/platform/linux-dpdk/example/ml/README.md b/platform/linux-dpdk/example/ml/README.md
new file mode 120000
index 000000000..ddeec649f
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/README.md
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/README.md \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/example_digit.csv b/platform/linux-dpdk/example/ml/example_digit.csv
new file mode 120000
index 000000000..5e5514aaf
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/example_digit.csv
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/example_digit.csv \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/mnist-12.onnx b/platform/linux-dpdk/example/ml/mnist-12.onnx
new file mode 120000
index 000000000..94d4515b8
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/mnist-12.onnx
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/mnist-12.onnx \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/odp_ml_run_mnist.sh b/platform/linux-dpdk/example/ml/odp_ml_run_mnist.sh
new file mode 120000
index 000000000..7d9c6f84c
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/odp_ml_run_mnist.sh
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/odp_ml_run_mnist.sh \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/odp_ml_run_model_explorer.sh b/platform/linux-dpdk/example/ml/odp_ml_run_model_explorer.sh
new file mode 120000
index 000000000..f28535b64
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/odp_ml_run_model_explorer.sh
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/odp_ml_run_model_explorer.sh \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/odp_ml_run_simple_linear.sh b/platform/linux-dpdk/example/ml/odp_ml_run_simple_linear.sh
new file mode 120000
index 000000000..2691d9282
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/odp_ml_run_simple_linear.sh
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/odp_ml_run_simple_linear.sh \ No newline at end of file
diff --git a/platform/linux-dpdk/example/ml/simple_linear.onnx b/platform/linux-dpdk/example/ml/simple_linear.onnx
new file mode 120000
index 000000000..5893a9176
--- /dev/null
+++ b/platform/linux-dpdk/example/ml/simple_linear.onnx
@@ -0,0 +1 @@
+../../../linux-generic/example/ml/simple_linear.onnx \ No newline at end of file
diff --git a/platform/linux-dpdk/include-abi/odp/api/abi/dma_types.h b/platform/linux-dpdk/include-abi/odp/api/abi/dma_types.h
index 3c009f4c4..318c2c385 100644
--- a/platform/linux-dpdk/include-abi/odp/api/abi/dma_types.h
+++ b/platform/linux-dpdk/include-abi/odp/api/abi/dma_types.h
@@ -11,7 +11,7 @@ extern "C" {
#include <odp/api/plat/strong_types.h>
-/** @ingroup odp_dma
+/** @addtogroup odp_dma
* @{
*/
diff --git a/platform/linux-dpdk/include-abi/odp/api/abi/ml_types.h b/platform/linux-dpdk/include-abi/odp/api/abi/ml_types.h
new file mode 120000
index 000000000..18b483da1
--- /dev/null
+++ b/platform/linux-dpdk/include-abi/odp/api/abi/ml_types.h
@@ -0,0 +1 @@
+../../../../../linux-generic/include-abi/odp/api/abi/ml_types.h \ No newline at end of file
diff --git a/platform/linux-dpdk/include-abi/odp/api/abi/packet_types.h b/platform/linux-dpdk/include-abi/odp/api/abi/packet_types.h
index 1f5f9e6f7..9ca66db54 100644
--- a/platform/linux-dpdk/include-abi/odp/api/abi/packet_types.h
+++ b/platform/linux-dpdk/include-abi/odp/api/abi/packet_types.h
@@ -21,7 +21,7 @@ extern "C" {
#include <odp/api/std_types.h>
#include <odp/api/plat/strong_types.h>
-/** @ingroup odp_packet
+/** @addtogroup odp_packet
* @{
*/
diff --git a/platform/linux-dpdk/include/odp/api/plat/event_inline_types.h b/platform/linux-dpdk/include/odp/api/plat/event_inline_types.h
index ee5490ff1..94a95a889 100644
--- a/platform/linux-dpdk/include/odp/api/plat/event_inline_types.h
+++ b/platform/linux-dpdk/include/odp/api/plat/event_inline_types.h
@@ -28,6 +28,7 @@ extern "C" {
typedef struct _odp_event_inline_offset_t {
uint16_t event_type;
uint16_t base_data;
+ uint16_t subtype;
uint16_t flow_id;
uint16_t pool;
uint16_t buf_len;
diff --git a/platform/linux-dpdk/include/odp/api/plat/packet_inline_types.h b/platform/linux-dpdk/include/odp/api/plat/packet_inline_types.h
index 5bbcadd32..255db9d78 100644
--- a/platform/linux-dpdk/include/odp/api/plat/packet_inline_types.h
+++ b/platform/linux-dpdk/include/odp/api/plat/packet_inline_types.h
@@ -41,7 +41,6 @@ typedef struct _odp_packet_inline_offset_t {
uint16_t timestamp;
uint16_t input_flags;
uint16_t flags;
- uint16_t subtype;
uint16_t cls_mark;
uint16_t ipsec_ctx;
uint16_t crypto_op;
diff --git a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
index 7b2764a05..b41a272ef 100644
--- a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
+++ b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
@@ -25,6 +25,7 @@ extern "C" {
#include <odp/api/time_types.h>
#include <odp/api/plat/debug_inlines.h>
+#include <odp/api/plat/event_inline_types.h>
#include <odp/api/plat/event_validation_external.h>
#include <odp/api/plat/packet_io_inlines.h>
#include <odp/api/plat/packet_inline_types.h>
@@ -647,7 +648,8 @@ _ODP_INLINE void odp_packet_to_event_multi(const odp_packet_t pkt[],
_ODP_INLINE odp_event_subtype_t odp_packet_subtype(odp_packet_t pkt)
{
- return (odp_event_subtype_t)_odp_pkt_get(pkt, int8_t, subtype);
+ return (odp_event_subtype_t)_odp_event_hdr_field((odp_event_t)(uintptr_t)pkt,
+ int8_t, subtype);
}
_ODP_INLINE odp_packet_tx_compl_t odp_packet_tx_compl_from_event(odp_event_t ev)
diff --git a/platform/linux-dpdk/include/odp_buffer_internal.h b/platform/linux-dpdk/include/odp_buffer_internal.h
index dc65fd17d..cb7f50073 100644
--- a/platform/linux-dpdk/include/odp_buffer_internal.h
+++ b/platform/linux-dpdk/include/odp_buffer_internal.h
@@ -73,6 +73,13 @@ static inline odp_buffer_hdr_t *_odp_buf_hdr(odp_buffer_t buf)
return (odp_buffer_hdr_t *)(uintptr_t)buf;
}
+static inline void _odp_buffer_subtype_set(odp_buffer_t buf, int subtype)
+{
+ odp_buffer_hdr_t *buf_hdr = _odp_buf_hdr(buf);
+
+ buf_hdr->event_hdr.subtype = subtype;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-dpdk/include/odp_config_internal.h b/platform/linux-dpdk/include/odp_config_internal.h
index bc69610ca..c423ec14b 100644
--- a/platform/linux-dpdk/include/odp_config_internal.h
+++ b/platform/linux-dpdk/include/odp_config_internal.h
@@ -177,6 +177,15 @@ extern "C" {
*/
#define CONFIG_IPSEC_MAX_NUM_SA 4000
+/* Maximum number of ML models that can be created or loaded. */
+#define CONFIG_ML_MAX_MODELS 4
+
+/* Maximum number of inputs for a ML model. */
+#define CONFIG_ML_MAX_INPUTS 4
+
+/* Maximum number of outputs for a ML model. */
+#define CONFIG_ML_MAX_OUTPUTS 4
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-dpdk/include/odp_packet_internal.h b/platform/linux-dpdk/include/odp_packet_internal.h
index c86f0646a..cae77245a 100644
--- a/platform/linux-dpdk/include/odp_packet_internal.h
+++ b/platform/linux-dpdk/include/odp_packet_internal.h
@@ -218,9 +218,9 @@ static inline struct rte_mbuf *pkt_to_mbuf(odp_packet_t pkt)
return (struct rte_mbuf *)(uintptr_t)pkt;
}
-static inline void packet_subtype_set(odp_packet_t pkt, int ev)
+static inline void packet_subtype_set(odp_packet_t pkt, int subtype)
{
- packet_hdr(pkt)->event_hdr.subtype = ev;
+ packet_hdr(pkt)->event_hdr.subtype = subtype;
}
/**
@@ -236,7 +236,9 @@ static inline void packet_init(odp_packet_hdr_t *pkt_hdr, odp_pktio_t input)
pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID;
pkt_hdr->p.l4_offset = ODP_PACKET_OFFSET_INVALID;
- pkt_hdr->event_hdr.subtype = ODP_EVENT_PACKET_BASIC;
+ if (odp_unlikely(pkt_hdr->event_hdr.subtype != ODP_EVENT_PACKET_BASIC))
+ pkt_hdr->event_hdr.subtype = ODP_EVENT_PACKET_BASIC;
+
pkt_hdr->input = input;
}
diff --git a/platform/linux-dpdk/include/odp_timer_internal.h b/platform/linux-dpdk/include/odp_timer_internal.h
index 3cc8ca469..35a4911af 100644
--- a/platform/linux-dpdk/include/odp_timer_internal.h
+++ b/platform/linux-dpdk/include/odp_timer_internal.h
@@ -24,6 +24,14 @@
#include <rte_config.h>
+#include <stdint.h>
+
+/*
+ * Use as the argument to timer_run() to force a scan and to ignore rate
+ * limit.
+ */
+#define TIMER_SCAN_FORCE INT32_MAX
+
/**
* Internal Timeout header
*/
@@ -56,10 +64,13 @@ ODP_STATIC_ASSERT(sizeof(odp_timeout_hdr_t) <= 3 * RTE_CACHE_LINE_SIZE,
void _odp_timer_run_inline(int dec);
/* Static inline wrapper to minimize modification of schedulers. */
-static inline void timer_run(int dec)
+static inline uint64_t timer_run(int dec)
{
if (odp_global_rw->inline_timers)
_odp_timer_run_inline(dec);
+
+ /* Time to the next timeout not available with DPDK timers */
+ return UINT64_MAX;
}
#endif
diff --git a/platform/linux-dpdk/libodp-dpdk.pc.in b/platform/linux-dpdk/libodp-dpdk.pc.in
index c3ee4f7b9..8fcc4ac0a 100644
--- a/platform/linux-dpdk/libodp-dpdk.pc.in
+++ b/platform/linux-dpdk/libodp-dpdk.pc.in
@@ -8,5 +8,5 @@ Description: The ODP packet processing engine
Version: @PKGCONFIG_VERSION@
Requires.private: libconfig
Libs: -L${libdir} -l@ODP_LIB_NAME@ @DPDK_LIBS_NON_ABI_COMPAT@ @ATOMIC_LIBS_NON_ABI_COMPAT@
-Libs.private: @DPDK_LIBS_ABI_COMPAT@ @OPENSSL_STATIC_LIBS@ @PTHREAD_LIBS@ @TIMER_LIBS@ -lpthread @ATOMIC_LIBS_ABI_COMPAT@
+Libs.private: @DPDK_LIBS_ABI_COMPAT@ @OPENSSL_STATIC_LIBS@ @PTHREAD_LIBS@ @TIMER_LIBS@ -lpthread @ATOMIC_LIBS_ABI_COMPAT@ @ORT_LIBS@
Cflags: -I${includedir} @DPDK_CFLAGS@
diff --git a/platform/linux-dpdk/m4/configure.m4 b/platform/linux-dpdk/m4/configure.m4
index 0fcd4a5b3..535cfc5fa 100644
--- a/platform/linux-dpdk/m4/configure.m4
+++ b/platform/linux-dpdk/m4/configure.m4
@@ -11,6 +11,7 @@ m4_include([platform/linux-dpdk/m4/odp_openssl.m4])
m4_include([platform/linux-dpdk/m4/odp_pcapng.m4])
m4_include([platform/linux-dpdk/m4/odp_scheduler.m4])
m4_include([platform/linux-dpdk/m4/odp_wfe.m4])
+m4_include([platform/linux-dpdk/m4/odp_ml.m4])
ODP_EVENT_VALIDATION
ODP_PTHREAD
@@ -66,7 +67,7 @@ esac
# Required for experimental rte_event_port_unlinks_in_progress() API
DPDK_CFLAGS="${DPDK_CFLAGS} -DALLOW_EXPERIMENTAL_API"
-AS_VAR_APPEND([PLAT_DEP_LIBS], ["${ATOMIC_LIBS} ${LIBCONFIG_LIBS} ${OPENSSL_LIBS} ${DPDK_LIBS_LT} ${LIBCLI_LIBS}"])
+AS_VAR_APPEND([PLAT_DEP_LIBS], ["${ATOMIC_LIBS} ${LIBCONFIG_LIBS} ${OPENSSL_LIBS} ${DPDK_LIBS_LT} ${LIBCLI_LIBS} ${ORT_LIBS}"])
# Add text to the end of configure with platform specific settings.
# Make sure it's aligned same as other lines in configure.ac.
@@ -77,6 +78,7 @@ AS_VAR_APPEND([PLAT_CFG_TEXT], ["
pcap: ${have_pmd_pcap}
pcapng: ${have_pcapng}
wfe_locks: ${use_wfe_locks}
+ ml_support: ${ml_support}
default_config_path: ${default_config_path}"])
ODP_CHECK_CFLAG([-Wno-error=cast-align])
@@ -94,6 +96,8 @@ AM_CONDITIONAL([PLATFORM_IS_LINUX_DPDK],
AC_CONFIG_FILES([platform/linux-dpdk/Makefile
platform/linux-dpdk/libodp-dpdk.pc
platform/linux-dpdk/dumpconfig/Makefile
+ platform/linux-dpdk/example/Makefile
+ platform/linux-dpdk/example/ml/Makefile
platform/linux-dpdk/test/Makefile
platform/linux-dpdk/test/example/Makefile
platform/linux-dpdk/test/example/classifier/Makefile
@@ -108,5 +112,6 @@ AC_CONFIG_FILES([platform/linux-dpdk/Makefile
platform/linux-dpdk/test/example/switch/Makefile
platform/linux-dpdk/test/performance/Makefile
platform/linux-dpdk/test/performance/dmafwd/Makefile
+ platform/linux-dpdk/test/validation/api/ml/Makefile
platform/linux-dpdk/test/validation/api/pktio/Makefile])
])
diff --git a/platform/linux-dpdk/m4/odp_libconfig.m4 b/platform/linux-dpdk/m4/odp_libconfig.m4
index 7bcfb4505..2bf89ac2e 100644
--- a/platform/linux-dpdk/m4/odp_libconfig.m4
+++ b/platform/linux-dpdk/m4/odp_libconfig.m4
@@ -3,7 +3,7 @@
##########################################################################
m4_define([_odp_config_version_generation], [0])
m4_define([_odp_config_version_major], [1])
-m4_define([_odp_config_version_minor], [25])
+m4_define([_odp_config_version_minor], [26])
m4_define([_odp_config_version],
[_odp_config_version_generation._odp_config_version_major._odp_config_version_minor])
diff --git a/platform/linux-dpdk/m4/odp_ml.m4 b/platform/linux-dpdk/m4/odp_ml.m4
new file mode 120000
index 000000000..6e76047e5
--- /dev/null
+++ b/platform/linux-dpdk/m4/odp_ml.m4
@@ -0,0 +1 @@
+../../linux-generic/m4/odp_ml.m4 \ No newline at end of file
diff --git a/platform/linux-dpdk/odp_crypto.c b/platform/linux-dpdk/odp_crypto.c
index aeb9c11e3..6170dd8df 100644
--- a/platform/linux-dpdk/odp_crypto.c
+++ b/platform/linux-dpdk/odp_crypto.c
@@ -707,12 +707,11 @@ static int cipher_gen_capability(const struct rte_crypto_param_range *key_size,
for (uint32_t key_len = key_size_min; key_len <= key_size_max;
key_len += key_inc) {
- for (uint32_t iv_size = iv_size_min;
- iv_size <= iv_size_max; iv_size += iv_inc) {
+ for (uint32_t iv_len = iv_size_min; iv_len <= iv_size_max; iv_len += iv_inc) {
odp_crypto_cipher_capability_t capa;
capa.key_len = key_len;
- capa.iv_len = iv_size;
+ capa.iv_len = iv_len;
capa.bit_mode = false;
idx = cipher_capa_insert(src, &capa, idx, num_copy);
@@ -918,14 +917,14 @@ static int auth_gen_capability(const struct rte_crypto_param_range *key_size,
for (uint16_t key_len = key_size_min;
key_len <= key_size_max;
key_len += key_inc) {
- for (uint16_t iv_size = iv_size_min;
- iv_size <= iv_size_max;
- iv_size += iv_inc) {
+ for (uint16_t iv_len = iv_size_min;
+ iv_len <= iv_size_max;
+ iv_len += iv_inc) {
odp_crypto_auth_capability_t capa;
capa.digest_len = digest_len;
capa.key_len = key_len;
- capa.iv_len = iv_size;
+ capa.iv_len = iv_len;
capa.bit_mode = false;
capa.aad_len.min = aad_size->min;
capa.aad_len.max = aad_size->max;
diff --git a/platform/linux-dpdk/odp_event.c b/platform/linux-dpdk/odp_event.c
index dff3e2ed2..0c2f3d22e 100644
--- a/platform/linux-dpdk/odp_event.c
+++ b/platform/linux-dpdk/odp_event.c
@@ -12,6 +12,7 @@
#include <odp/api/packet.h>
#include <odp/api/timer.h>
#include <odp/api/pool.h>
+#include <odp/api/ml.h>
#include <odp_buffer_internal.h>
#include <odp_ipsec_internal.h>
@@ -36,6 +37,7 @@ const _odp_event_inline_offset_t
_odp_event_inline_offset ODP_ALIGNED_CACHE = {
.event_type = offsetof(_odp_event_hdr_t, hdr.event_type),
.base_data = offsetof(_odp_event_hdr_t, mb.buf_addr),
+ .subtype = offsetof(_odp_event_hdr_t, hdr.subtype),
.flow_id = offsetof(_odp_event_hdr_t, hdr.flow_id),
.pool = offsetof(_odp_event_hdr_t, hdr.pool),
.buf_len = offsetof(_odp_event_hdr_t, mb.buf_len)
@@ -69,6 +71,9 @@ static inline void event_free(odp_event_t event, _odp_ev_id_t id)
case ODP_EVENT_DMA_COMPL:
odp_dma_compl_free(odp_dma_compl_from_event(event));
break;
+ case ODP_EVENT_ML_COMPL:
+ odp_ml_compl_free(odp_ml_compl_from_event(event));
+ break;
default:
_ODP_ABORT("Invalid event type: %d\n", odp_event_type(event));
}
@@ -117,6 +122,8 @@ int odp_event_is_valid(odp_event_t event)
/* Fall through */
case ODP_EVENT_DMA_COMPL:
/* Fall through */
+ case ODP_EVENT_ML_COMPL:
+ /* Fall through */
case ODP_EVENT_PACKET_TX_COMPL:
break;
default:
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index 4d6f395c5..79c449f1d 100644
--- a/platform/linux-dpdk/odp_init.c
+++ b/platform/linux-dpdk/odp_init.c
@@ -59,6 +59,7 @@ enum init_stage {
IPSEC_SAD_INIT,
IPSEC_INIT,
DMA_INIT,
+ ML_INIT,
ALL_INIT /* All init stages completed */
};
@@ -103,6 +104,7 @@ static void disable_features(odp_global_data_ro_t *global_ro,
global_ro->disable.traffic_mngr = init_param->not_used.feat.tm;
global_ro->disable.compress = init_param->not_used.feat.compress;
+ global_ro->disable.ml = init_param->not_used.feat.ml;
}
static int read_pci_config(char **pci_cmd)
@@ -331,6 +333,13 @@ static int term_global(enum init_stage stage)
switch (stage) {
case ALL_INIT:
+ case ML_INIT:
+ if (_odp_ml_term_global()) {
+ _ODP_ERR("ODP ML term failed.\n");
+ rc = -1;
+ }
+ /* Fall through */
+
case DMA_INIT:
if (_odp_dma_term_global()) {
_ODP_ERR("ODP DMA term failed.\n");
@@ -689,6 +698,12 @@ int odp_init_global(odp_instance_t *instance,
}
stage = DMA_INIT;
+ if (_odp_ml_init_global()) {
+ _ODP_ERR("ODP ML init failed.\n");
+ goto init_failed;
+ }
+ stage = ML_INIT;
+
/* Dummy support for single instance */
*instance = (odp_instance_t)odp_global_ro.main_pid;
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index a61c4c34a..bcd2c2fb3 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -64,7 +64,6 @@ const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE = {
.timestamp = offsetof(odp_packet_hdr_t, timestamp),
.input_flags = offsetof(odp_packet_hdr_t, p.input_flags),
.flags = offsetof(odp_packet_hdr_t, p.flags),
- .subtype = offsetof(odp_packet_hdr_t, event_hdr.subtype),
.cls_mark = offsetof(odp_packet_hdr_t, cls_mark),
.ipsec_ctx = offsetof(odp_packet_hdr_t, ipsec_ctx),
.crypto_op = offsetof(odp_packet_hdr_t, crypto_op_result),
diff --git a/platform/linux-dpdk/odp_pool.c b/platform/linux-dpdk/odp_pool.c
index f7726f97b..dfd14a978 100644
--- a/platform/linux-dpdk/odp_pool.c
+++ b/platform/linux-dpdk/odp_pool.c
@@ -626,6 +626,7 @@ static void init_obj_priv_data(struct rte_mempool *mp ODP_UNUSED, void *arg, voi
event_hdr->hdr.pool = _odp_pool_handle(pool);
event_hdr->hdr.type = priv_data->type;
event_hdr->hdr.event_type = priv_data->event_type;
+ event_hdr->hdr.subtype = ODP_EVENT_NO_SUBTYPE;
switch (priv_data->type) {
case ODP_POOL_BUFFER:
@@ -852,6 +853,8 @@ static const char *get_short_type_str(odp_pool_type_t type)
return "V";
case ODP_POOL_DMA_COMPL:
return "D";
+ case ODP_POOL_ML_COMPL:
+ return "M";
default:
return "-";
}
@@ -946,6 +949,11 @@ int odp_pool_info(odp_pool_t pool_hdl, odp_pool_info_t *info)
info->dma_pool_param.uarea_size = pool->params.buf.uarea_size;
info->dma_pool_param.cache_size = pool->params.buf.cache_size;
+ } else if (pool->type_2 == ODP_POOL_ML_COMPL) {
+ info->ml_pool_param.num = pool->params.buf.num;
+ info->ml_pool_param.uarea_size = pool->params.buf.uarea_size;
+ info->ml_pool_param.cache_size = pool->params.buf.cache_size;
+
} else {
info->params = pool->params;
}
@@ -1091,6 +1099,7 @@ int odp_pool_ext_capability(odp_pool_type_t type,
case ODP_POOL_TIMEOUT:
case ODP_POOL_VECTOR:
case ODP_POOL_DMA_COMPL:
+ case ODP_POOL_ML_COMPL:
memset(capa, 0, sizeof(odp_pool_ext_capability_t));
return 0;
default:
@@ -1361,6 +1370,7 @@ static void init_ext_obj(struct rte_mempool *mp, void *arg, void *mbuf, unsigned
event_hdr->hdr.pool = _odp_pool_handle(pool);
event_hdr->hdr.type = mb_ctor_arg->type;
event_hdr->hdr.event_type = mb_ctor_arg->event_type;
+ event_hdr->hdr.subtype = ODP_EVENT_NO_SUBTYPE;
switch (mb_ctor_arg->type) {
case ODP_POOL_BUFFER:
diff --git a/platform/linux-dpdk/odp_schedule_eventdev.c b/platform/linux-dpdk/odp_schedule_eventdev.c
index d6f3ba2f7..4ef8a51b7 100644
--- a/platform/linux-dpdk/odp_schedule_eventdev.c
+++ b/platform/linux-dpdk/odp_schedule_eventdev.c
@@ -604,8 +604,8 @@ static inline uint16_t input_cached(odp_event_t out_ev[], unsigned int max_num,
uint8_t first_queue = _odp_eventdev_local.cache.event[idx].queue_id;
for (i = 0; i < max_num && _odp_eventdev_local.cache.count; i++) {
- uint16_t idx = _odp_eventdev_local.cache.idx;
- struct rte_event *event = &_odp_eventdev_local.cache.event[idx];
+ uint16_t cache_idx = _odp_eventdev_local.cache.idx;
+ struct rte_event *event = &_odp_eventdev_local.cache.event[cache_idx];
if (odp_unlikely(event->queue_id != first_queue))
break;
diff --git a/platform/linux-dpdk/odp_system_info.c b/platform/linux-dpdk/odp_system_info.c
index 0ebb3e09f..d9cddcb40 100644
--- a/platform/linux-dpdk/odp_system_info.c
+++ b/platform/linux-dpdk/odp_system_info.c
@@ -27,7 +27,6 @@
#include <odp_packet_internal.h>
#include <errno.h>
-#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>
@@ -312,8 +311,9 @@ int _odp_system_info_init(void)
num_cpus);
/* Read and save all CPU frequencies for static mode */
- for (i = 0; i < CONFIG_NUM_CPU_IDS; i++)
- odp_global_ro.system_info.cpu_hz[i] = cpu_hz_current(i);
+ if (odp_global_ro.system_info.cpu_hz_static)
+ for (i = 0; i < CONFIG_NUM_CPU_IDS; i++)
+ odp_global_ro.system_info.cpu_hz[i] = cpu_hz_current(i);
/* By default, read max frequency from a cpufreq file */
for (i = 0; i < CONFIG_NUM_CPU_IDS; i++) {
@@ -552,5 +552,8 @@ void odp_sys_config_print(void)
_ODP_PRINT("CONFIG_POOLS: %i\n", CONFIG_POOLS);
_ODP_PRINT("CONFIG_POOL_MAX_NUM: %i\n", CONFIG_POOL_MAX_NUM);
_ODP_PRINT("CONFIG_IPSEC_MAX_NUM_SA: %i\n", CONFIG_IPSEC_MAX_NUM_SA);
+ _ODP_PRINT("CONFIG_ML_MAX_MODELS: %i\n", CONFIG_ML_MAX_MODELS);
+ _ODP_PRINT("CONFIG_ML_MAX_INPUTS: %i\n", CONFIG_ML_MAX_INPUTS);
+ _ODP_PRINT("CONFIG_ML_MAX_OUTPUTS: %i\n", CONFIG_ML_MAX_OUTPUTS);
_ODP_PRINT("\n");
}
diff --git a/platform/linux-dpdk/odp_timer.c b/platform/linux-dpdk/odp_timer.c
index e01a541ad..f4c190aad 100644
--- a/platform/linux-dpdk/odp_timer.c
+++ b/platform/linux-dpdk/odp_timer.c
@@ -438,7 +438,7 @@ int _odp_timer_term_local(void)
void _odp_timer_run_inline(int dec)
{
- int poll_interval = timer_global->poll_interval;
+ int poll_interval = (dec == TIMER_SCAN_FORCE) ? 0 : timer_global->poll_interval;
odp_time_t now;
int ret;
diff --git a/platform/linux-dpdk/test/Makefile.am b/platform/linux-dpdk/test/Makefile.am
index c210edbdc..2a33bfbcd 100644
--- a/platform/linux-dpdk/test/Makefile.am
+++ b/platform/linux-dpdk/test/Makefile.am
@@ -18,6 +18,12 @@ test_SCRIPTS = $(dist_check_SCRIPTS)
SUBDIRS += validation/api/pktio \
example \
performance
+
+if WITH_ML
+TESTS += validation/api/ml/ml_linux$(EXEEXT)
+SUBDIRS += validation/api/ml
+endif
+
else
#performance tests refer to pktio_env
if test_perf
diff --git a/platform/linux-dpdk/test/crypto.conf b/platform/linux-dpdk/test/crypto.conf
index 9b10b9a76..97fdea6f5 100644
--- a/platform/linux-dpdk/test/crypto.conf
+++ b/platform/linux-dpdk/test/crypto.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.25"
+config_file_version = "0.1.26"
system: {
# One crypto queue pair is required per thread for lockless operation
diff --git a/platform/linux-dpdk/test/default-timer.conf b/platform/linux-dpdk/test/default-timer.conf
index 495972c5e..3219854de 100644
--- a/platform/linux-dpdk/test/default-timer.conf
+++ b/platform/linux-dpdk/test/default-timer.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.25"
+config_file_version = "0.1.26"
timer: {
# Use DPDK default timer API based implementation
diff --git a/platform/linux-dpdk/test/example/ipsec_api/Makefile.am b/platform/linux-dpdk/test/example/ipsec_api/Makefile.am
index 101c97cdf..2535ad466 100644
--- a/platform/linux-dpdk/test/example/ipsec_api/Makefile.am
+++ b/platform/linux-dpdk/test/example/ipsec_api/Makefile.am
@@ -19,5 +19,3 @@ clean-local:
rm -f $(builddir)/$$f; \
done \
fi
-
-.NOTPARALLEL:
diff --git a/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am b/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am
index 101c97cdf..2535ad466 100644
--- a/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am
+++ b/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am
@@ -19,5 +19,3 @@ clean-local:
rm -f $(builddir)/$$f; \
done \
fi
-
-.NOTPARALLEL:
diff --git a/platform/linux-dpdk/test/process-mode.conf b/platform/linux-dpdk/test/process-mode.conf
index a40fd7aa0..827eb6074 100644
--- a/platform/linux-dpdk/test/process-mode.conf
+++ b/platform/linux-dpdk/test/process-mode.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.25"
+config_file_version = "0.1.26"
dpdk: {
process_mode_memory_mb = 1024
diff --git a/platform/linux-dpdk/test/sched-basic.conf b/platform/linux-dpdk/test/sched-basic.conf
index a11d35706..2c11cb419 100644
--- a/platform/linux-dpdk/test/sched-basic.conf
+++ b/platform/linux-dpdk/test/sched-basic.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.25"
+config_file_version = "0.1.26"
# Test scheduler with an odd spread value and without dynamic load balance
sched_basic: {
diff --git a/platform/linux-dpdk/test/stash-custom.conf b/platform/linux-dpdk/test/stash-custom.conf
index bb9c37fda..62f314c4e 100644
--- a/platform/linux-dpdk/test/stash-custom.conf
+++ b/platform/linux-dpdk/test/stash-custom.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.25"
+config_file_version = "0.1.26"
# Test overflow safe stash variant
stash: {
diff --git a/platform/linux-dpdk/test/validation/api/ml/.gitignore b/platform/linux-dpdk/test/validation/api/ml/.gitignore
new file mode 100644
index 000000000..e31f902c4
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/.gitignore
@@ -0,0 +1 @@
+ml_linux
diff --git a/platform/linux-dpdk/test/validation/api/ml/Makefile.am b/platform/linux-dpdk/test/validation/api/ml/Makefile.am
new file mode 100644
index 000000000..40910d5c6
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/Makefile.am
@@ -0,0 +1,29 @@
+include ../Makefile.inc
+
+test_PROGRAMS = ml_linux
+ml_linux_SOURCES = ../../../../../linux-generic/test/validation/api/ml/ml_linux.c
+
+EXTRA_DIST = \
+ batch_add.onnx \
+ simple_linear.onnx
+
+# If building out-of-tree, make check will not copy the scripts and data to the
+# $(builddir) assuming that all commands are run locally. However this prevents
+# running tests on a remote target using LOG_COMPILER.
+# So copy all script and data files explicitly here.
+all-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ if [ -e $(srcdir)/$$f ]; then \
+ mkdir -p $(builddir)/$$(dirname $$f); \
+ cp -f $(srcdir)/$$f $(builddir)/$$f; \
+ fi \
+ done \
+ fi
+
+clean-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ rm -f $(builddir)/$$f; \
+ done \
+ fi
diff --git a/platform/linux-dpdk/test/validation/api/ml/README.md b/platform/linux-dpdk/test/validation/api/ml/README.md
new file mode 120000
index 000000000..d121a477d
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/README.md
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/README.md \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/batch_add.onnx b/platform/linux-dpdk/test/validation/api/ml/batch_add.onnx
new file mode 120000
index 000000000..b827c0e58
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/batch_add.onnx
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/batch_add.onnx \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/batch_add_gen.py b/platform/linux-dpdk/test/validation/api/ml/batch_add_gen.py
new file mode 120000
index 000000000..695b6d399
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/batch_add_gen.py
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/batch_add_gen.py \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/gen_models.sh b/platform/linux-dpdk/test/validation/api/ml/gen_models.sh
new file mode 120000
index 000000000..e9b25d58f
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/gen_models.sh
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/gen_models.sh \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/requirements.txt b/platform/linux-dpdk/test/validation/api/ml/requirements.txt
new file mode 120000
index 000000000..b94d5d389
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/requirements.txt
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/requirements.txt \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/simple_linear.onnx b/platform/linux-dpdk/test/validation/api/ml/simple_linear.onnx
new file mode 120000
index 000000000..f471922d1
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/simple_linear.onnx
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/simple_linear.onnx \ No newline at end of file
diff --git a/platform/linux-dpdk/test/validation/api/ml/simple_linear_gen.py b/platform/linux-dpdk/test/validation/api/ml/simple_linear_gen.py
new file mode 120000
index 000000000..53fb4f6ed
--- /dev/null
+++ b/platform/linux-dpdk/test/validation/api/ml/simple_linear_gen.py
@@ -0,0 +1 @@
+../../../../../linux-generic/test/validation/api/ml/simple_linear_gen.py \ No newline at end of file