@@ -523,6 +523,7 @@ CONFIG_RTE_PMD_PACKET_PREFETCH=y
CONFIG_RTE_LIBRTE_BBDEV=y
CONFIG_RTE_BBDEV_MAX_DEVS=128
CONFIG_RTE_BBDEV_OFFLOAD_COST=y
+CONFIG_RTE_BBDEV_SDK_AVX2=n
#
# Compile PMD for NULL bbdev device
@@ -532,7 +533,7 @@ CONFIG_RTE_LIBRTE_PMD_BBDEV_NULL=y
#
# Compile PMD for turbo software bbdev device
#
-CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW=n
+CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW=y
#
# Compile generic crypto device library
@@ -1,158 +1,181 @@
-.. SPDX-License-Identifier: BSD-3-Clause
- Copyright(c) 2017 Intel Corporation
-
-SW Turbo Poll Mode Driver
-=========================
-
-The SW Turbo PMD (**baseband_turbo_sw**) provides a poll mode bbdev driver that utilizes
-Intel optimized libraries for LTE Layer 1 workloads acceleration. This PMD
-supports the functions: Turbo FEC, Rate Matching and CRC functions.
-
-Features
---------
-
-SW Turbo PMD has support for the following capabilities:
-
-For the encode operation:
-
-* ``RTE_BBDEV_TURBO_CRC_24A_ATTACH``
-* ``RTE_BBDEV_TURBO_CRC_24B_ATTACH``
-* ``RTE_BBDEV_TURBO_RATE_MATCH``
-* ``RTE_BBDEV_TURBO_RV_INDEX_BYPASS``
-
-For the decode operation:
-
-* ``RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE``
-* ``RTE_BBDEV_TURBO_CRC_TYPE_24B``
-* ``RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN``
-* ``RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN``
-* ``RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP``
-* ``RTE_BBDEV_TURBO_EARLY_TERMINATION``
-
-
-Limitations
------------
-
-* In-place operations for Turbo encode and decode are not supported
-
-Installation
-------------
-
-FlexRAN SDK Download
-~~~~~~~~~~~~~~~~~~~~
-
-To build DPDK with the *baseband_turbo_sw* PMD the user is required to download
-the export controlled ``FlexRAN SDK`` Libraries. An account at `Intel Resource
-Design Center <https://www.intel.com/content/www/us/en/design/resource-design-center.html>`_
-needs to be registered.
-
-Once registered, the user needs to log in, and look for
-*Intel FlexRAN Software Release Package -18-09* to download or directly through
-this `link <https://cdrdv2.intel.com/v1/dl/getContent/605167>`_.
-
-After download is complete, the user needs to unpack and compile on their
-system before building DPDK.
-
-The following table maps DPDK versions with past FlexRAN SDK releases:
-
-.. _table_flexran_releases:
-
-.. table:: DPDK and FlexRAN SDK releases compliance
-
- ===================== ============================
- DPDK version FlexRAN SDK release
- ===================== ============================
- 18.02 1.3.0
- 18.05 1.4.0
- 18.08 1.6.0
- 19.02 18.09
- ===================== ============================
-
-FlexRAN SDK Installation
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-The following are pre-requisites for building FlexRAN SDK Libraries:
- (a) An AVX2 supporting machine
- (b) CentOS Linux release 7.2.1511 (Core) operating system
- (c) Intel ICC 18.0.1 20171018 compiler installed
-
-The following instructions should be followed in this exact order:
-
-#. Set the environment variables:
-
- .. code-block:: console
-
- source <path-to-icc-compiler-install-folder>/linux/bin/compilervars.sh intel64 -platform linux
-
-#. Extract the ``605167-flexran-18-09-tar.gz`` package:
-
- .. code-block:: console
-
- mkdir FlexRAN-18.09
- tar xvzf 605167-flexran-18-09-tar.gz -C FlexRAN-18.09/
-
-#. Run the SDK extractor script and accept the license:
-
- .. code-block:: console
-
- cd <path-to-workspace>/FlexRAN-18.09/
- ./SDK-18.09.sh
-
-#. Generate makefiles based on system configuration:
-
- .. code-block:: console
-
- cd <path-to-workspace>/FlexRAN-18.09/SDK-18.09/sdk/
- ./create-makefiles-linux.sh
-
-#. A build folder is generated in this form ``build-<ISA>-<CC>``, enter that
- folder and install:
-
- .. code-block:: console
-
- cd build-avx2-icc/
- make && make install
-
-
-Initialization
---------------
-
-In order to enable this virtual bbdev PMD, the user must:
-
-* Build the ``FLEXRAN SDK`` libraries (explained in Installation section).
-
-* Export the environmental variables ``FLEXRAN_SDK`` to the path where the
- FlexRAN SDK libraries were installed. And ``DIR_WIRELESS_SDK`` to the path
- where the libraries were extracted.
-
-Example:
-
-.. code-block:: console
-
- export FLEXRAN_SDK=<path-to-workspace>/FlexRAN-18.09/SDK-18.09/sdk/build-avx2-icc/install
- export DIR_WIRELESS_SDK=<path-to-workspace>/FlexRAN-18.09/SDK-18.09/sdk/
-
-
-* Set ``CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW=y`` in DPDK common configuration
- file ``config/common_base``.
-
-To use the PMD in an application, user must:
-
-- Call ``rte_vdev_init("baseband_turbo_sw")`` within the application.
-
-- Use ``--vdev="baseband_turbo_sw"`` in the EAL options, which will call ``rte_vdev_init()`` internally.
-
-The following parameters (all optional) can be provided in the previous two calls:
-
-* ``socket_id``: Specify the socket where the memory for the device is going to be allocated
- (by default, *socket_id* will be the socket where the core that is creating the PMD is running on).
-
-* ``max_nb_queues``: Specify the maximum number of queues in the device (default is ``RTE_MAX_LCORE``).
-
-Example:
-~~~~~~~~
-
-.. code-block:: console
-
- ./test-bbdev.py -e="--vdev=baseband_turbo_sw,socket_id=0,max_nb_queues=8" \
- -c validation -v ./turbo_*_default.data
+.. SPDX-License-Identifier: BSD-3-Clause
+ Copyright(c) 2017 Intel Corporation
+
+SW FEC Poll Mode Driver
+=========================
+
+The SW FEC PMD (**baseband_turbo_sw**) provides a software only poll mode bbdev
+driver that can optionally utilize Intel optimized libraries for LTE and 5GNR
+Layer 1 workloads acceleration.
+
+Note that the driver can also be built without any dependency with reduced
+functionality for maintenance purpose.
+
+To enable linking to the SDK libraries see detailed installation section below.
+Two flags can be enabled depending on whether the target machine can support
+AVX2 and AVX512 instructions sets and the related SDK libraries for vectorized
+signal processing functions are installed :
+- CONFIG_RTE_BBDEV_SDK_AVX2
+- CONFIG_RTE_BBDEV_SDK_AVX512
+By default these 2 flags are disabled by default. For AVX2 machine and SDK
+library installed then the first flag can be enabled. For AVX512 machine and
+SDK library installed then both flags can be enabled for full real time capability.
+
+This PMD supports the functions: FEC, Rate Matching and CRC functions detailed
+in the Features section.
+
+Features
+--------
+
+SW FEC PMD can support for the following capabilities when the SDK libraries
+are used:
+
+For the LTE encode operation:
+
+* ``RTE_BBDEV_TURBO_CRC_24A_ATTACH``
+* ``RTE_BBDEV_TURBO_CRC_24B_ATTACH``
+* ``RTE_BBDEV_TURBO_RATE_MATCH``
+* ``RTE_BBDEV_TURBO_RV_INDEX_BYPASS``
+
+For the LTE decode operation:
+
+* ``RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE``
+* ``RTE_BBDEV_TURBO_CRC_TYPE_24B``
+* ``RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN``
+* ``RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN``
+* ``RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP``
+* ``RTE_BBDEV_TURBO_EARLY_TERMINATION``
+
+For the 5G NR LDPC encode operation:
+
+* ``RTE_BBDEV_LDPC_RATE_MATCH``
+* ``RTE_BBDEV_LDPC_CRC_24A_ATTACH``
+* ``RTE_BBDEV_LDPC_CRC_24B_ATTACH``
+
+For the 5G NR LDPC decode operation:
+
+* ``RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK``
+* ``RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK``
+* ``RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP``
+* ``RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE``
+* ``RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE``
+* ``RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE``
+
+Limitations
+-----------
+
+* In-place operations for encode and decode are not supported
+
+Installation
+------------
+
+FlexRAN FEC SDK Download
+~~~~~~~~~~~~~~~~~~~~
+
+As an option it is possible to link this driver with FleXRAN SDK libraries
+which can enable real time signal processing using AVX instructions.
+
+These libraries are available through this link `link <https://software.intel.com/en-us/articles/flexran-lte-and-5g-nr-fec-software-development-kit-modules>`_.
+
+After download is complete, the user needs to unpack and compile on their
+system before building DPDK.
+
+The following table maps DPDK versions with past FlexRAN SDK releases:
+
+.. _table_flexran_releases:
+
+.. table:: DPDK and FlexRAN FEC SDK releases compliance
+
+ ===================== ============================
+ DPDK version FlexRAN FEC SDK release
+ ===================== ============================
+ 19.08 19.04
+ ===================== ============================
+
+FlexRAN SDK Installation
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Note that the installation of these libraries is optional.
+
+The following are pre-requisites for building FlexRAN SDK Libraries:
+ (a) An AVX2 or AVX512 supporting machine
+ (b) CentOS Linux release 7.2.1511 (Core) operating system is advised
+ (c) Intel ICC 18.0.1 20171018 compiler or more recent and related libraries
+ ICC is available with a free community license `link <https://software.intel.com/en-us/system-studio/choose-download#technical>`_.
+
+The following instructions should be followed in this exact order:
+
+#. Set the environment variables:
+
+ .. code-block:: console
+
+ source <path-to-icc-compiler-install-folder>/linux/bin/compilervars.sh intel64 -platform linux
+
+#. Run the SDK extractor script and accept the license:
+
+ .. code-block:: console
+
+ cd <path-to-workspace>
+ ./FlexRAN-FEC-SDK-19-04.sh
+
+#. Generate makefiles based on system configuration:
+
+ .. code-block:: console
+
+ cd <path-to-workspace>/FlexRAN-FEC-SDK-19-04/sdk/
+ ./create-makefiles-linux.sh
+
+#. A build folder is generated in this form ``build-<ISA>-<CC>``, enter that
+ folder and install:
+
+ .. code-block:: console
+
+ cd build-avx512-icc/
+ make && make install
+
+Initialization
+--------------
+
+In order to enable this virtual bbdev PMD, the user may:
+
+* Build the ``FLEXRAN SDK`` libraries (explained in Installation section).
+
+* Export the environmental variables ``FLEXRAN_SDK`` to the path where the
+ FlexRAN SDK libraries were installed. And ``DIR_WIRELESS_SDK`` to the path
+ where the libraries were extracted.
+
+Example:
+
+.. code-block:: console
+
+ export FLEXRAN_SDK=<path-to-workspace>/FlexRAN-FEC-SDK-19-04/sdk/build-avx2-icc/install
+ export DIR_WIRELESS_SDK=<path-to-workspace>/FlexRAN-FEC-SDK-19-04/sdk/build-avx2-icc/
+
+* Set ``CONFIG_RTE_BBDEV_SDK_AVX2=y`` and ``CONFIG_RTE_BBDEV_SDK_AVX512=y``
+ in DPDK common configuration file ``config/common_base`` to be able to use
+ the SDK libraries as mentioned above.
+ For AVX2 machine it is possible to only enable CONFIG_RTE_BBDEV_SDK_AVX2
+ for limited 4G functionality.
+ If no flag are set the PMD driver will still build but its capabilities
+ will be limited accordingly.
+
+To use the PMD in an application, user must:
+
+- Call ``rte_vdev_init("baseband_turbo_sw")`` within the application.
+
+- Use ``--vdev="baseband_turbo_sw"`` in the EAL options, which will call ``rte_vdev_init()`` internally.
+
+The following parameters (all optional) can be provided in the previous two calls:
+
+* ``socket_id``: Specify the socket where the memory for the device is going to be allocated
+ (by default, *socket_id* will be the socket where the core that is creating the PMD is running on).
+
+* ``max_nb_queues``: Specify the maximum number of queues in the device (default is ``RTE_MAX_LCORE``).
+
+Example:
+~~~~~~~~
+
+.. code-block:: console
+
+ ./test-bbdev.py -e="--vdev=baseband_turbo_sw,socket_id=0,max_nb_queues=8" \
+ -c validation -v ./turbo_*_default.data
@@ -1,7 +1,7 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-drivers = ['null']
-
-config_flag_fmt = 'RTE_LIBRTE_@0@_PMD'
-driver_name_fmt = 'rte_pmd_@0@'
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
+
+drivers = ['null', 'turbo_sw']
+
+config_flag_fmt = 'RTE_LIBRTE_@0@_PMD'
+driver_name_fmt = 'rte_pmd_@0@'
@@ -3,9 +3,6 @@
include $(RTE_SDK)/mk/rte.vars.mk
-ifeq ($(FLEXRAN_SDK),)
-$(error "Please define FLEXRAN_SDK environment variable")
-endif
# library name
LIB = librte_pmd_bbdev_turbo_sw.a
@@ -21,17 +18,21 @@ LDLIBS += -lrte_bus_vdev
# versioning export map
EXPORT_MAP := rte_pmd_bbdev_turbo_sw_version.map
-# external library dependencies
+# external library dependencies if available
+ifeq ($(CONFIG_RTE_BBDEV_SDK_AVX2),y)
+ifeq ($(FLEXRAN_SDK),)
+$(error "Please define FLEXRAN_SDK environment variable")
+endif
CFLAGS += -I$(FLEXRAN_SDK)/lib_common
CFLAGS += -I$(FLEXRAN_SDK)/lib_turbo
CFLAGS += -I$(FLEXRAN_SDK)/lib_crc
CFLAGS += -I$(FLEXRAN_SDK)/lib_rate_matching
-
LDLIBS += -L$(FLEXRAN_SDK)/lib_turbo -lturbo
LDLIBS += -L$(FLEXRAN_SDK)/lib_crc -lcrc
LDLIBS += -L$(FLEXRAN_SDK)/lib_rate_matching -lrate_matching
LDLIBS += -L$(FLEXRAN_SDK)/lib_common -lcommon
-LDLIBS += -lstdc++ -lirc -limf -lipps
+LDLIBS += -lstdc++ -lirc -limf -lipps -lsvml
+endif
# library version
LIBABIVER := 1
@@ -14,10 +14,11 @@
#include <rte_bbdev.h>
#include <rte_bbdev_pmd.h>
+#ifdef RTE_BBDEV_SDK_AVX2
#include <phy_turbo.h>
#include <phy_crc.h>
#include <phy_rate_match.h>
-#include <divide.h>
+#endif
#define DRIVER_NAME baseband_turbo_sw
@@ -143,6 +144,7 @@ struct turbo_sw_queue {
struct bbdev_private *internals = dev->data->dev_private;
static const struct rte_bbdev_op_cap bbdev_capabilities[] = {
+#ifdef RTE_BBDEV_SDK_AVX2
{
.type = RTE_BBDEV_OP_TURBO_DEC,
.cap.turbo_dec = {
@@ -172,6 +174,7 @@ struct turbo_sw_queue {
.num_buffers_dst = RTE_BBDEV_MAX_CODE_BLOCKS,
}
},
+#endif
RTE_BBDEV_END_OF_CAPABILITIES_LIST()
};
@@ -472,6 +475,7 @@ struct turbo_sw_queue {
struct rte_mbuf *m_out, uint16_t in_offset, uint16_t out_offset,
uint16_t in_length, struct rte_bbdev_stats *q_stats)
{
+#ifdef RTE_BBDEV_SDK_AVX2
int ret;
int16_t k_idx;
uint16_t m;
@@ -724,6 +728,22 @@ struct turbo_sw_queue {
}
*tmp_out = 0;
}
+#else
+ RTE_SET_USED(q);
+ RTE_SET_USED(op);
+ RTE_SET_USED(r);
+ RTE_SET_USED(c);
+ RTE_SET_USED(k);
+ RTE_SET_USED(ncb);
+ RTE_SET_USED(e);
+ RTE_SET_USED(m_in);
+ RTE_SET_USED(m_out_head);
+ RTE_SET_USED(m_out);
+ RTE_SET_USED(in_offset);
+ RTE_SET_USED(out_offset);
+ RTE_SET_USED(in_length);
+ RTE_SET_USED(q_stats);
+#endif
}
static inline void
@@ -856,6 +876,7 @@ struct turbo_sw_queue {
uint16_t crc24_overlap, uint16_t in_length,
struct rte_bbdev_stats *q_stats)
{
+#ifdef RTE_BBDEV_SDK_AVX2
int ret;
int32_t k_idx;
int32_t iter_cnt;
@@ -972,6 +993,22 @@ struct turbo_sw_queue {
rte_bbdev_log(ERR, "Turbo Decoder failed");
return;
}
+#else
+ RTE_SET_USED(q);
+ RTE_SET_USED(op);
+ RTE_SET_USED(c);
+ RTE_SET_USED(k);
+ RTE_SET_USED(kw);
+ RTE_SET_USED(m_in);
+ RTE_SET_USED(m_out_head);
+ RTE_SET_USED(m_out);
+ RTE_SET_USED(in_offset);
+ RTE_SET_USED(out_offset);
+ RTE_SET_USED(check_crc_24b);
+ RTE_SET_USED(crc24_overlap);
+ RTE_SET_USED(in_length);
+ RTE_SET_USED(q_stats);
+#endif
}
static inline void
new file mode 100644
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2019 Intel Corporation
+
+path = get_option('flexran_sdk')
+
+if dpdk_conf.has('RTE_BBDEV_SDK_AVX2')
+ lib = cc.find_library('libturbo', dirs: [path + '/lib_turbo'], required: false)
+ if not lib.found()
+ build = false
+ else
+ ext_deps += cc.find_library('libturbo', dirs: [path + '/lib_turbo'], required: true)
+ ext_deps += cc.find_library('libcrc', dirs: [path + '/lib_crc'], required: true)
+ ext_deps += cc.find_library('librate_matching', dirs: [path + '/lib_rate_matching'], required: true)
+ ext_deps += cc.find_library('libcommon', dirs: [path + '/lib_common'], required: true)
+ ext_deps += cc.find_library('libstdc++', required: true)
+ ext_deps += cc.find_library('libirc', required: true)
+ ext_deps += cc.find_library('libimf', required: true)
+ ext_deps += cc.find_library('libipps', required: true)
+ ext_deps += cc.find_library('libsvml', required: true)
+ includes += include_directories(path + '/lib_turbo')
+ includes += include_directories(path + '/lib_crc')
+ includes += include_directories(path + '/lib_rate_matching')
+ includes += include_directories(path + '/lib_common')
+ endif
+endif
+
+deps += ['bbdev', 'bus_vdev', 'ring']
+name = 'bbdev_turbo_sw'
+allow_experimental_apis = true
+sources = files('bbdev_turbo_software.c')
@@ -221,11 +221,14 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_NULL) += -lrte_pmd_bbdev_null
# TURBO SOFTWARE PMD is dependent on the FLEXRAN library
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -lrte_pmd_bbdev_turbo_sw
+ifeq ($(CONFIG_RTE_BBDEV_SDK_AVX2),y)
+# Dependency on the FLEXRAN SDK library if available
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -L$(FLEXRAN_SDK)/lib_crc -lcrc
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -L$(FLEXRAN_SDK)/lib_turbo -lturbo
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -L$(FLEXRAN_SDK)/lib_rate_matching -lrate_matching
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -L$(FLEXRAN_SDK)/lib_common -lcommon
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW) += -lirc -limf -lstdc++ -lipps
+endif # CONFIG_RTE_BBDEV_SDK_AVX2
endif # CONFIG_RTE_LIBRTE_BBDEV
ifeq ($(CONFIG_RTE_LIBRTE_CRYPTODEV),y)