get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 29452,
    "url": "https://patches.dpdk.org/api/patches/29452/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1506735475-77078-5-git-send-email-amr.mokhtar@intel.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": "<1506735475-77078-5-git-send-email-amr.mokhtar@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1506735475-77078-5-git-send-email-amr.mokhtar@intel.com",
    "date": "2017-09-30T01:37:54",
    "name": "[dpdk-dev,v1,5/6] bbdev: documentation",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "991590160250188d19ba30b2c9f8f582b2fce67e",
    "submitter": {
        "id": 807,
        "url": "https://patches.dpdk.org/api/people/807/?format=api",
        "name": "Mokhtar, Amr",
        "email": "amr.mokhtar@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1506735475-77078-5-git-send-email-amr.mokhtar@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/29452/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/29452/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id CE7F11B1EB;\n\tSat, 30 Sep 2017 03:38:13 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 2DFC11B1BB\n\tfor <dev@dpdk.org>; Sat, 30 Sep 2017 03:38:08 +0200 (CEST)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n\tby fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t29 Sep 2017 18:38:07 -0700",
            "from silpixa00391537.ir.intel.com (HELO\n\tsilpixa00391537.ger.corp.intel.com) ([10.237.222.189])\n\tby orsmga003.jf.intel.com with ESMTP; 29 Sep 2017 18:38:05 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos; i=\"5.42,455,1500966000\"; d=\"scan'208\";\n\ta=\"1020035482\"",
        "From": "Amr Mokhtar <amr.mokhtar@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "niall.power@intel.com, chris.macnamara@intel.com,\n\tAmr Mokhtar <amr.mokhtar@intel.com>",
        "Date": "Sat, 30 Sep 2017 02:37:54 +0100",
        "Message-Id": "<1506735475-77078-5-git-send-email-amr.mokhtar@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1506735475-77078-1-git-send-email-amr.mokhtar@intel.com>",
        "References": "<1506735475-77078-1-git-send-email-amr.mokhtar@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=y",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v1 5/6] bbdev: documentation",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Amr Mokhtar <amr.mokhtar@intel.com>\n---\n doc/api/doxy-api-index.md                    |   1 +\n doc/api/doxy-api.conf                        |   1 +\n doc/guides/bbdevs/index.rst                  |  40 ++\n doc/guides/bbdevs/null.rst                   |  77 ++++\n doc/guides/bbdevs/turbo_sw.rst               | 101 +++++\n doc/guides/index.rst                         |   1 +\n doc/guides/prog_guide/bbdev.rst              | 609 +++++++++++++++++++++++++++\n doc/guides/prog_guide/img/bbdev_workflow.svg | 440 +++++++++++++++++++\n doc/guides/prog_guide/index.rst              |   1 +\n doc/guides/sample_app_ug/bbdev_app.rst       | 187 ++++++++\n doc/guides/sample_app_ug/index.rst           |   1 +\n doc/guides/tools/index.rst                   |   1 +\n doc/guides/tools/testbbdev.rst               | 546 ++++++++++++++++++++++++\n 13 files changed, 2006 insertions(+)\n create mode 100644 doc/guides/bbdevs/index.rst\n create mode 100644 doc/guides/bbdevs/null.rst\n create mode 100644 doc/guides/bbdevs/turbo_sw.rst\n create mode 100644 doc/guides/prog_guide/bbdev.rst\n create mode 100644 doc/guides/prog_guide/img/bbdev_workflow.svg\n create mode 100644 doc/guides/sample_app_ug/bbdev_app.rst\n create mode 100644 doc/guides/tools/testbbdev.rst",
    "diff": "diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md\nindex 19e0d4f..6541187 100644\n--- a/doc/api/doxy-api-index.md\n+++ b/doc/api/doxy-api-index.md\n@@ -47,6 +47,7 @@ The public API headers are grouped by topics:\n   [bitrate]            (@ref rte_bitrate.h),\n   [latency]            (@ref rte_latencystats.h),\n   [devargs]            (@ref rte_devargs.h),\n+  [bbdev]              (@ref rte_bbdev.h),\n   [PCI]                (@ref rte_pci.h)\n \n - **device specific**:\ndiff --git a/doc/api/doxy-api.conf b/doc/api/doxy-api.conf\nindex 823554f..ffdbebe 100644\n--- a/doc/api/doxy-api.conf\n+++ b/doc/api/doxy-api.conf\n@@ -37,6 +37,7 @@ INPUT                   = doc/api/doxy-api-index.md \\\n                           lib/librte_eal/common/include \\\n                           lib/librte_eal/common/include/generic \\\n                           lib/librte_acl \\\n+                          lib/librte_bbdev \\\n                           lib/librte_bitratestats \\\n                           lib/librte_cfgfile \\\n                           lib/librte_cmdline \\\ndiff --git a/doc/guides/bbdevs/index.rst b/doc/guides/bbdevs/index.rst\nnew file mode 100644\nindex 0000000..c9aa1b0\n--- /dev/null\n+++ b/doc/guides/bbdevs/index.rst\n@@ -0,0 +1,40 @@\n+..\n+   BSD LICENSE\n+\n+   Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+     * Redistributions of source code must retain the above copyright\n+       notice, this list of conditions and the following disclaimer.\n+     * Redistributions in binary form must reproduce the above copyright\n+       notice, this list of conditions and the following disclaimer in\n+       the documentation and/or other materials provided with the\n+       distribution.\n+     * Neither the name of Intel Corporation nor the names of its\n+       contributors may be used to endorse or promote products derived\n+       from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+Baseband Device Drivers\n+=======================\n+\n+.. toctree::\n+    :maxdepth: 2\n+    :numbered:\n+\n+    null\n+    turbo_sw\ndiff --git a/doc/guides/bbdevs/null.rst b/doc/guides/bbdevs/null.rst\nnew file mode 100644\nindex 0000000..0f40232\n--- /dev/null\n+++ b/doc/guides/bbdevs/null.rst\n@@ -0,0 +1,77 @@\n+..\n+   BSD LICENSE\n+\n+   Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+     * Redistributions of source code must retain the above copyright\n+       notice, this list of conditions and the following disclaimer.\n+     * Redistributions in binary form must reproduce the above copyright\n+       notice, this list of conditions and the following disclaimer in\n+       the documentation and/or other materials provided with the\n+       distribution.\n+     * Neither the name of Intel Corporation nor the names of its\n+       contributors may be used to endorse or promote products derived\n+       from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+BBDEV null Poll Mode Driver\n+============================\n+\n+The (**bbdev_null**) is a bbdev poll mode driver which provides a minimal\n+implementation of a software bbdev device. As a null device it does not modify\n+the data in the mbuf on which the bbdev operation is to operate and it only\n+works for operation type ``RTE_BBDEV_OP_NONE``.\n+\n+When a burst of mbufs is submitted to a *bbdev null PMD* for processing then\n+each mbuf in the burst will be enqueued in an internal buffer ring to be\n+collected on a dequeue call.\n+\n+\n+Limitations\n+-----------\n+\n+* In-place operations for Turbo encode and decode are not supported\n+\n+Installation\n+------------\n+\n+The *bbdev null PMD* is enabled and built by default in both the Linux and\n+FreeBSD builds.\n+\n+Initialization\n+--------------\n+\n+To use the PMD in an application, user must:\n+\n+- Call ``rte_vdev_init(\"bbdev_null\")`` within the application.\n+\n+- Use ``--vdev=\"bbdev_null\"`` in the EAL options, which will call ``rte_vdev_init()`` internally.\n+\n+The following parameters (all optional) can be provided in the previous two calls:\n+\n+* ``socket_id``: Specify the socket where the memory for the device is going to be allocated\n+  (by default, *socket_id* will be the socket where the core that is creating the PMD is running on).\n+\n+* ``max_nb_queues``: Specify the maximum number of queues in the device (default is ``RTE_MAX_LCORE``).\n+\n+Example:\n+~~~~~~~~\n+\n+.. code-block:: console\n+\n+    ./test-bbdev.py -e=\"--vdev=bbdev_null,socket_id=0,max_nb_queues=8\"\ndiff --git a/doc/guides/bbdevs/turbo_sw.rst b/doc/guides/bbdevs/turbo_sw.rst\nnew file mode 100644\nindex 0000000..a8af487\n--- /dev/null\n+++ b/doc/guides/bbdevs/turbo_sw.rst\n@@ -0,0 +1,101 @@\n+..\n+   BSD LICENSE\n+\n+   Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+     * Redistributions of source code must retain the above copyright\n+       notice, this list of conditions and the following disclaimer.\n+     * Redistributions in binary form must reproduce the above copyright\n+       notice, this list of conditions and the following disclaimer in\n+       the documentation and/or other materials provided with the\n+       distribution.\n+     * Neither the name of Intel Corporation nor the names of its\n+       contributors may be used to endorse or promote products derived\n+       from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+SW Turbo Poll Mode Driver\n+=========================\n+\n+The SW Turbo PMD (**turbo_sw**) provides a poll mode bbdev driver that utilizes\n+Intel optimized libraries for LTE Layer 1 workloads acceleration. This PMD\n+supports the functions: Turbo FEC, Rate Matching and CRC functions.\n+\n+Features\n+--------\n+\n+SW Turbo PMD has support for the following capabilities:\n+\n+For the encode operation:\n+\n+* ``RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE``\n+* ``RTE_BBDEV_TURBO_RAW_INPUT_DATA``\n+\n+For the decode operation:\n+\n+* ``RTE_BBDEV_TURBO_CRC_24B_ATTACH``\n+* ``RTE_BBDEV_TURBO_RATE_MATCH``\n+* ``RTE_BBDEV_TURBO_RV_INDEX_BYPASS``\n+\n+\n+Limitations\n+-----------\n+\n+* In-place operations for Turbo encode and decode are not supported\n+\n+Installation\n+------------\n+\n+To build DPDK with the *turbo_sw* the user is required to download\n+the export controlled **turbo sw** libs, by requesting it from\n+`<https://networkbuilders.intel.com/network-technologies/dpdk>`_.\n+\n+After downloading the library, the user needs to unpack and compile it\n+on their system before building DPDK.\n+\n+Initialization\n+--------------\n+\n+In order to enable this virtual bbdev PMD, user must:\n+\n+* Build the **turbo sw** library (explained in Installation section).\n+\n+* Export the environmental variable ``BBLIB_PATH`` with the path where the library was built.\n+\n+* Set ``CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW=y`` in DPDK common configuration file ``config/common_base``.\n+\n+To use the PMD in an application, user must:\n+\n+- Call ``rte_vdev_init(\"turbo_sw\")`` within the application.\n+\n+- Use ``--vdev=\"turbo_sw\"`` in the EAL options, which will call ``rte_vdev_init()`` internally.\n+\n+The following parameters (all optional) can be provided in the previous two calls:\n+\n+* ``socket_id``: Specify the socket where the memory for the device is going to be allocated\n+  (by default, *socket_id* will be the socket where the core that is creating the PMD is running on).\n+\n+* ``max_nb_queues``: Specify the maximum number of queues in the device (default is ``RTE_MAX_LCORE``).\n+\n+Example:\n+~~~~~~~~\n+\n+.. code-block:: console\n+\n+    ./test-bbdev.py -e=\"--vdev=turbo_sw,socket_id=0,max_nb_queues=8\" \\\n+    -c validation -v ./test_vectors/bbdev_vector_t?_default.data\ndiff --git a/doc/guides/index.rst b/doc/guides/index.rst\nindex 63716b0..53f29e7 100644\n--- a/doc/guides/index.rst\n+++ b/doc/guides/index.rst\n@@ -44,6 +44,7 @@ DPDK documentation\n    nics/index\n    cryptodevs/index\n    eventdevs/index\n+   bbdevs/index\n    xen/index\n    contributing/index\n    rel_notes/index\ndiff --git a/doc/guides/prog_guide/bbdev.rst b/doc/guides/prog_guide/bbdev.rst\nnew file mode 100644\nindex 0000000..f2fdab0\n--- /dev/null\n+++ b/doc/guides/prog_guide/bbdev.rst\n@@ -0,0 +1,609 @@\n+..\n+   BSD LICENSE\n+\n+   Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+     * Redistributions of source code must retain the above copyright\n+       notice, this list of conditions and the following disclaimer.\n+     * Redistributions in binary form must reproduce the above copyright\n+       notice, this list of conditions and the following disclaimer in\n+       the documentation and/or other materials provided with the\n+       distribution.\n+     * Neither the name of Intel Corporation nor the names of its\n+       contributors may be used to endorse or promote products derived\n+       from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+Wireless Baseband Device Library\n+================================\n+\n+The Wireless Baseband library provides a common programming framework that\n+abstracts HW accelerators based on FPGA and/or Fixed Function Accelerators that\n+assist with LTE Physical Layer processing. Furthermore, it decouples the\n+application from the compute-intensive wireless functions by abstracting their\n+optimized libraries to appear as virtual bbdev devices.\n+\n+The framework currently only supports Turbo Code FEC function.\n+\n+\n+Design Principles\n+-----------------\n+\n+The Wireless Baseband library follows the same ideology of DPDK's Ethernet\n+Device and Crypto Device frameworks. Wireless Baseband provides a generic\n+acceleration abstraction framework which supports both physical (hardware) and\n+virtual (software) wireless acceleration functions.\n+\n+.. figure:: img/bbdev_workflow.*\n+\n+Device Management\n+-----------------\n+\n+Device Creation\n+~~~~~~~~~~~~~~~\n+\n+Physical bbdev devices are discovered during the PCI probe/enumeration of the\n+EAL function which is executed at DPDK initialization, based on\n+their PCI device identifier, each unique PCI BDF (bus/bridge, device,\n+function).\n+\n+Virtual devices can be created by two mechanisms, either using the EAL command\n+line options or from within the application using an EAL API directly.\n+\n+From the command line using the --vdev EAL option\n+\n+.. code-block:: console\n+\n+   --vdev 'turbo_sw,max_nb_queues=8,socket_id=0'\n+\n+Our using the rte_vdev_init API within the application code.\n+\n+.. code-block:: c\n+\n+    rte_vdev_init(\"turbo_sw\", \"max_nb_queues=2,socket_id=0\")\n+\n+All virtual bbdev devices support the following initialization parameters:\n+\n+- ``max_nb_queues`` - maximum number of queues supported by the device.\n+\n+- ``socket_id`` - socket on which to allocate the device resources on.\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 bbdev device in all functions\n+  exported by the bbdev API.\n+\n+- A device name used to designate the bbdev device in console messages, for\n+  administration or debugging purposes. For ease of use, the port name includes\n+  the port index.\n+\n+\n+Device Configuration\n+~~~~~~~~~~~~~~~~~~~~\n+\n+From the application point of view, each instance of a bbdev device consists of\n+one or more queues identified by queue IDs. While different devices may have\n+different capabilities (e.g. support different operation types), all queues on\n+a device support identical configuration possibilities. A queue is configured\n+for only one type of operation and is configured at initializations time.\n+When an operation is enqueued to a specific queue ID, the result is dequeued\n+from the same queue ID.\n+\n+Configuration of a device has two different levels: configuration that applies\n+to the whole device, and configuration that applies to a single queue.\n+\n+Device configuration is applied with ``rte_bbdev_configure(dev_id,num_queues,conf)``\n+and queue configuration is applied with\n+``rte_bbdev_queue_configure(dev_id,queue_id,conf)``. Note that, although all\n+queues on a device support same capabilities, they can be configured differently\n+and will then behave differently.\n+\n+The configuration of each bbdev 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_bbdev_configure API is used to configure a bbdev device.\n+\n+.. code-block:: c\n+\n+   int rte_bbdev_configure(uint16_t dev_id, uint16_t num_queues,\n+                           const struct rte_bbdev_conf *conf);\n+\n+- ``num_queues`` argument identifies the total number of queues to setup for\n+  this device.\n+\n+- ``rte_bbdev_conf`` structure is used to pass the configuration parameters for\n+  device configuration.\n+\n+\n+Queues Configuration\n+~~~~~~~~~~~~~~~~~~~~\n+\n+Each bbdev devices queue is individually configured through the\n+``rte_bbdev_queue_configure()`` API.\n+Each queue resources may be allocated on a specified socket.\n+\n+.. code-block:: c\n+\n+    struct rte_bbdev_queue_conf {\n+        int socket;  /**< NUMA socket used for memory allocation */\n+        uint32_t queue_size;  /**< Size of queue */\n+        uint8_t priority;  /**< Queue priority */\n+        bool deferred_start; /**< Do not start queue when device is started. */\n+        enum rte_bbdev_op_type op_type; /**< Operation type */\n+    };\n+\n+Device & Queues Management\n+~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+After initialization, devices are in a stopped state, so must be started by the\n+application. If an application is finished using a device it can close the\n+device. Once closed, it cannot be restarted.\n+\n+.. code-block:: c\n+\n+    int rte_bbdev_start(uint16_t dev_id)\n+    int rte_bbdev_stop(uint16_t dev_id)\n+    int rte_bbdev_close(uint16_t dev_id)\n+    int rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id)\n+    int rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id)\n+\n+\n+By default, all queues are started when the device is started, but they can be\n+stopped individually.\n+\n+.. code-block:: c\n+\n+    int rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id)\n+    int rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id)\n+\n+\n+Logical Cores, Memory and Queues Relationships\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The bbdev device Library as the Poll Mode Driver library support NUMA for when\n+a processor’s logical cores and interfaces utilize its local memory. Therefore\n+baseband operations, the mbuf being operated on should be allocated from memory\n+pools created in the local memory. The buffers should, if possible, remain on\n+the local processor to obtain the best performance results and buffer\n+descriptors should be populated with mbufs allocated from a mempool allocated\n+from local memory.\n+\n+The run-to-completion model also performs better, especially in the case of\n+virtual bbdev devices, if the baseband operation and data buffers are in local\n+memory instead of a remote processor's memory. This is also true for the\n+pipe-line model provided all logical cores used are located on the same processor.\n+\n+Multiple logical cores should never share the same queue for enqueuing\n+operations or dequeuing operations on the same bbdev device since this would\n+require global locks and hinder performance. It is however possible to use a\n+different logical core to dequeue an operation on a queue pair from the logical\n+core which it was enqueued on. This means that a baseband burst enqueue/dequeue\n+APIs are a logical place to transition from one logical core to another in a\n+packet processing pipeline.\n+\n+\n+Device Operation Capabilities\n+-----------------------------\n+\n+Capabilities (in terms of operations supported, max number of queues, etc.)\n+identify what a bbdev is capable of performing that differs from one device to\n+another. For the full scope of the bbdev capability see the definition of the\n+structure in the *DPDK API Reference*.\n+\n+.. code-block:: c\n+\n+   struct rte_bbdev_op_cap;\n+\n+A device reports its capabilities when registering itself in the bbdev framework.\n+With the aid of this capabilities mechanism, an application can query devices to\n+discover which operations within the LTE physical layer they are capable of\n+performing. Below is an example of the capabilities for a PMD it supports in\n+relation to Turbo Encoding and Decoding operations.\n+\n+.. code-block:: c\n+\n+    static const struct rte_bbdev_op_cap bbdev_capabilities[] = {\n+        {\n+            .type = RTE_BBDEV_OP_TURBO_DEC,\n+            .cap.turbo_dec = {\n+                .capability_flags =\n+                    RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE |\n+                    RTE_BBDEV_TURBO_RAW_INPUT_DATA,\n+                .num_buffers_src = 1,\n+                .num_buffers_hard_out = 1,\n+                .num_buffers_soft_out = 0,\n+            }\n+        },\n+        {\n+            .type   = RTE_BBDEV_OP_TURBO_ENC,\n+            .cap.turbo_enc = {\n+                .capability_flags =\n+                        RTE_BBDEV_TURBO_CRC_24B_ATTACH |\n+                        RTE_BBDEV_TURBO_RATE_MATCH |\n+                        RTE_BBDEV_TURBO_RV_INDEX_BYPASS,\n+                .num_buffers_src = 1,\n+                .num_buffers_dst = 1,\n+            }\n+        }\n+    };\n+\n+Capabilities Discovery\n+~~~~~~~~~~~~~~~~~~~~~~\n+\n+Discovering the features and capabilities of a bbdev device poll mode driver\n+is achieved through the ``rte_bbdev_info_get()`` function.\n+\n+.. code-block:: c\n+\n+   int rte_bbdev_info_get(uint16_t dev_id, struct rte_bbdev_info *dev_info)\n+\n+This allows the user to query a specific bbdev PMD and get all the device\n+capabilities. The ``rte_bbdev_info`` structure provides two levels of\n+information:\n+\n+- Device relevant information, like: name and related rte_bus.\n+\n+- Driver specific information, as defined by the ``struct rte_bbdev_driver_info``\n+  structure, this is where capabilities reside along with other specifics like:\n+  maximum queue sizes and priority level.\n+\n+.. code-block:: c\n+\n+    struct rte_bbdev_info {\n+        int socket_id;  /**< NUMA socket that device is on */\n+        const char *dev_name;  /**< Unique device name */\n+        const struct rte_bus *bus;  /**< Bus information */\n+        uint16_t num_queues;  /**< Number of queues currently configured */\n+        struct rte_bbdev_conf conf;  /**< Current device configuration */\n+        bool started;  /**< Set if device is currently started */\n+        struct rte_bbdev_driver_info drv;  /**< Info from device driver */\n+    };\n+\n+Operation Processing\n+--------------------\n+\n+Scheduling of baseband operations on DPDK's application data path is\n+performed using a burst oriented asynchronous API set. A queue on a bbdev\n+device accepts a burst of baseband operations using enqueue burst API. On physical\n+bbdev devices the enqueue burst API will place the operations to be processed\n+on the device's hardware input queue, for virtual devices the processing of the\n+baseband operations is usually completed during the enqueue call to the bbdev\n+device. The dequeue burst API will retrieve any processed operations available\n+from the queue on the bbdev device, from physical devices this is usually\n+directly from the device's processed queue, and for virtual device's from a\n+``rte_ring`` where processed operations are place after being processed on the\n+enqueue call.\n+\n+\n+Enqueue / Dequeue Burst APIs\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The burst enqueue API uses a bbdev device identifier and a queue\n+identifier to specify the bbdev device queue to schedule the processing on.\n+The ``num_ops`` parameter is the number of operations to process which are\n+supplied in the ``ops`` array of ``rte_bbdev_op`` structures.\n+The enqueue function returns the number of operations it actually enqueued for\n+processing, a return value equal to ``num_ops`` means that all packets have been\n+enqueued.\n+\n+.. code-block:: c\n+\n+   uint16_t rte_bbdev_enqueue_ops(uint16_t dev_id, uint16_t queue_id,\n+                                  struct rte_bbdev_op **ops, uint16_t num_ops)\n+\n+The dequeue API uses the same format as the enqueue API of processed but\n+the ``num_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 ``num_ops``.\n+\n+.. code-block:: c\n+\n+   uint16_t rte_bbdev_dequeue_ops(uint16_t dev_id, uint16_t queue_id,\n+                                  struct rte_bbdev_op **ops, uint16_t num_ops)\n+\n+\n+Operation Representation\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+A bbdev operation is represented by a ``rte_bbdev_op`` structure, which is a\n+generic metadata container for all necessary information required for the\n+bbdev operation to be processed on a particular bbdev device poll mode driver.\n+\n+.. code-block:: c\n+\n+    struct rte_bbdev_op {\n+        enum rte_bbdev_op_type type;  /**< Type of this operation */\n+        int status;  /**< Status of operation that was performed */\n+        struct rte_mempool *mempool;  /**< Mempool which op instance is in */\n+        void *opaque_data;  /**< Opaque pointer for user data */\n+        ...\n+        union {\n+            void *generic;\n+            struct rte_bbdev_op_turbo_dec *turbo_dec;\n+            struct rte_bbdev_op_turbo_enc *turbo_enc;\n+        };\n+    };\n+\n+The operation structure includes the operation type and the operation status,\n+a reference to the operation specific data, which can vary in size and content\n+depending on the operation being provisioned. It also contains the source\n+mempool for the operation, if it allocated from a mempool.\n+\n+If bbdev operations are allocated from a bbdev operation mempool, see next\n+section, there is also the ability to allocate private memory with the\n+operation for applications purposes.\n+\n+Application software is responsible for specifying all the operation specific\n+fields in the ``rte_bbdev_op`` structure which are then used by the bbdev PMD\n+to process the requested operation.\n+\n+\n+Operation Management and Allocation\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The bbdev library provides an API set for managing bbdev operations which\n+utilize the Mempool Library to allocate operation buffers. Therefore, it ensures\n+that the bbdev operation is interleaved optimally across the channels and\n+ranks for optimal processing.\n+\n+.. code-block:: c\n+\n+    struct rte_mempool *\n+    rte_bbdev_op_pool_create(const char *name, enum rte_bbdev_op_type type,\n+                             unsigned int num_elements, unsigned int cache_size,\n+                             int socket_id)\n+\n+``rte_bbdev_op_alloc_bulk()`` and ``rte_bbdev_op_free_bulk()`` are used to\n+allocate bbdev operations of a specific type from a given bbdev operation mempool.\n+\n+.. code-block:: c\n+\n+    int rte_bbdev_op_alloc_bulk(struct rte_mempool *mempool,\n+                                enum rte_bbdev_op_type type,\n+                                struct rte_bbdev_op **ops,\n+                                uint16_t num_ops)\n+\n+``rte_bbdev_op_free_bulk()`` is called by the application to return an operation\n+to its allocating pool.\n+\n+.. code-block:: c\n+\n+   void rte_bbdev_op_free_bulk(struct rte_bbdev_op **ops, unsigned int num_ops)\n+\n+\n+BBDEV Operations\n+~~~~~~~~~~~~~~~~\n+\n+The bbdev operation structure contains all the mutable data relating to\n+performing Turbo code processing on a referenced mbuf data buffer. It is used\n+for either encode or decode operations.\n+\n+Turbo Encode operation accepts one input and one output.\n+\n+Turbo Decode operation accepts one input and two outputs, called *hard-decision*\n+and *soft-decision* outputs. *Soft-decision* output is optional.\n+\n+It is expected that the application provides input and output ``mbuf`` pointers\n+allocated and ready to use. The baseband framework supports turbo coding on\n+Code Blocks (CB) and Transport Blocks (TB).\n+\n+For the output buffer(s), the application needs only to provide an allocated and\n+free mbuf (containing only one mbuf segment), so that bbdev can write the\n+operation outcome.\n+\n+**Turbo Encode Op structure**\n+\n+.. code-block:: c\n+\n+    struct rte_bbdev_op_turbo_enc {\n+        struct rte_bbdev_op_data input; /**< input src data */\n+        struct rte_bbdev_op_data output; /**< output buffer */\n+\n+        uint32_t op_flags;\n+        int32_t n_soft;\n+        int32_t k_mimo;\n+        int32_t mdl_harq;\n+\n+        int32_t g;\n+        int32_t nl;\n+        int32_t qm;\n+        uint8_t rv_index;\n+\n+        uint8_t code_block_mode; /**< 0 - transpot block, 1 - code block */\n+        union {\n+            struct rte_bbdev_op_enc_cb_params cb_params;\n+            struct rte_bbdev_op_enc_tb_params tb_params;\n+        };\n+    };\n+\n+\n+**Turbo Decode Op structure**\n+\n+.. code-block:: c\n+\n+    struct rte_bbdev_op_turbo_dec {\n+        struct rte_bbdev_op_data input; /**< input src data */\n+        struct rte_bbdev_op_data hard_output; /**< hard output buffer */\n+        struct rte_bbdev_op_data soft_output; /**< soft output buffer */\n+\n+        uint32_t op_flags;\n+        uint8_t rv_index;\n+        uint8_t iter_min:4;\n+        uint8_t iter_max:4;\n+        uint8_t iter_count;\n+        uint8_t ext_scale;\n+        uint8_t num_maps;\n+\n+        uint8_t code_block_mode; /**< 0 - transpot block, 1 - code block */\n+        union {\n+            struct rte_bbdev_op_dec_cb_params cb_params;\n+            struct rte_bbdev_op_dec_tb_params tb_params;\n+        };\n+    };\n+\n+Input and output data buffers are identified by ``rte_bbdev_op_data`` structure.\n+This strucutre has three elements:\n+\n+- ``data`` - This is the mbuf reference\n+\n+- ``offset`` - The starting point for the Turbo input/output, in bytes, from the\n+  start of the data in the data buffer. It must be smaller than data_len of the\n+  mbuf's first segment\n+\n+- ``length`` - The length, in bytes, of the buffer on which the Turbo operation\n+  will or has been computed. For the input, the length is set by the application.\n+  For the output(s), the length is computed by the bbdev PMD driver.\n+\n+Sample code\n+-----------\n+\n+The baseband device sample application gives an introduction on how to use the\n+bbdev framework, by giving a sample code performing a loop-back operation with a\n+baseband processor capable of transceiving data packets.\n+\n+The following sample pseudo-code shows the basic steps to encode several buffers\n+using (**sw_trubo**) bbdev PMD.\n+\n+.. code-block:: c\n+\n+    /* EAL Init */\n+    ret = rte_eal_init(argc, argv);\n+    if (ret < 0)\n+        rte_exit(EXIT_FAILURE, \"Invalid EAL arguments\\n\");\n+\n+    /* Get number of available bbdev devices */\n+    nb_bbdevs = rte_bbdev_count();\n+    if (nb_bbdevs == 0)\n+        rte_exit(EXIT_FAILURE, \"No bbdevs detected!\\n\");\n+\n+    /* Create bbdev op pools */\n+    bbdev_op_pool[RTE_BBDEV_OP_TURBO_ENC] =\n+            rte_bbdev_op_pool_create(\"bbdev_op_pool_enc\",\n+            RTE_BBDEV_OP_TURBO_ENC, NB_MBUF, 128, rte_socket_id());\n+\n+    /* Configure BBDEV device */\n+    ret = rte_bbdev_configure(dev_id, qs_nb, NULL);\n+    if (ret < 0)\n+        rte_exit(EXIT_FAILURE,\n+                \"ERROR(%d): BBDEV %u not configured properly\\n\",\n+                ret, dev_id);\n+\n+    /* Get information for this device */\n+    rte_bbdev_info_get(dev_id, &info);\n+\n+    /* setup device queues */\n+    qconf.socket = info.socket_id;\n+    qconf.queue_size = info.drv.queue_size_lim;\n+    qconf.op_type = RTE_BBDEV_OP_TURBO_ENC;\n+\n+    for (q_id = 0; q_id < qs_nb; q_id++) {\n+        /* Configure all queues belonging to this bbdev device */\n+        ret = rte_bbdev_queue_configure(dev_id, q_id, &qconf);\n+        if (ret < 0)\n+            rte_exit(EXIT_FAILURE,\n+                    \"ERROR(%d): BBDEV %u queue %u not configured properly\\n\",\n+                    ret, dev_id, q_id);\n+    }\n+\n+    /* Start bbdev device */\n+    ret = rte_bbdev_start(dev_id);\n+\n+    /* Create the mbuf mempool for pkts */\n+    mbuf_pool = rte_pktmbuf_pool_create(\"bbdev_mbuf_pool\",\n+            NB_MBUF, MEMPOOL_CACHE_SIZE, 0,\n+            RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());\n+    if (mbuf_pool == NULL)\n+        rte_exit(EXIT_FAILURE,\n+                \"Unable to create '%s' pool\\n\", pool_name);\n+\n+    while (!global_exit_flag) {\n+\n+        /* Allocate burst of op structures in preparation for enqueue */\n+        if (rte_bbdev_op_alloc_bulk(bbdev_op_pool[RTE_BBDEV_OP_TURBO_ENC],\n+            op_type, ops_burst, op_num) != 0)\n+            continue;\n+\n+        /* Allocate input mbuf pkts */\n+        ret = rte_pktmbuf_alloc_bulk(mbuf_pool, input_pkts_burst, MAX_PKT_BURST);\n+        if (ret < 0)\n+            continue;\n+\n+        /* Allocate output mbuf pkts */\n+        ret = rte_pktmbuf_alloc_bulk(mbuf_pool, output_pkts_burst, MAX_PKT_BURST);\n+        if (ret < 0)\n+            continue;\n+\n+        switch (op_type) {\n+        case RTE_BBDEV_OP_TURBO_ENC:\n+            for (j = 0; j < op_num; j++) {\n+                /* Append the size of the ethernet header */\n+                rte_pktmbuf_append(input_pkts_burst[j],\n+                        sizeof(struct ether_hdr));\n+\n+                /* set op */\n+                ops_burst[j]->type = RTE_BBDEV_OP_TURBO_ENC;\n+\n+                ops_burst[j]->turbo_enc->input.offset =\n+                    sizeof(struct ether_hdr);\n+\n+                ops_burst[j]->turbo_enc->input.length =\n+                    rte_pktmbuf_pkt_len(bbdev_pkts[j]);\n+\n+                ops_burst[j]->turbo_enc->input.data =\n+                    input_pkts_burst[j];\n+\n+                ops_burst[j]->turbo_enc->output.offset =\n+                    sizeof(struct ether_hdr);\n+\n+                ops_burst[j]->turbo_enc->output.data =\n+                        output_pkts_burst[j];\n+            }\n+            break;\n+\n+        case RTE_BBDEV_OP_TURBO_DEC:\n+            break;\n+\n+        default:\n+            break;\n+        }\n+\n+        /* Enqueue packets on BBDEV device */\n+        op_num = rte_bbdev_enqueue_ops(qconf->bbdev_id,\n+                qconf->bbdev_qs[q], ops_burst,\n+                MAX_PKT_BURST);\n+\n+        /* Dequeue packets from BBDEV device*/\n+        op_num = rte_bbdev_dequeue_ops(qconf->bbdev_id,\n+                qconf->bbdev_qs[q], ops_burst,\n+                MAX_PKT_BURST);\n+    }\n+\n+\n+BBDEV Device API\n+~~~~~~~~~~~~~~~~\n+\n+The bbdev Library API is described in the *DPDK API Reference* document.\ndiff --git a/doc/guides/prog_guide/img/bbdev_workflow.svg b/doc/guides/prog_guide/img/bbdev_workflow.svg\nnew file mode 100644\nindex 0000000..44a1fa6\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/bbdev_workflow.svg\n@@ -0,0 +1,440 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n+<!-- Generated by Microsoft Visio, SVG Export bbdev_workflow.svg Page-1 -->\n+<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:ev=\"http://www.w3.org/2001/xml-events\"\n+\t\txmlns:v=\"http://schemas.microsoft.com/visio/2003/SVGExtensions/\" width=\"8.23078in\" height=\"6.07112in\"\n+\t\tviewBox=\"0 0 592.616 437.121\" xml:space=\"preserve\" color-interpolation-filters=\"sRGB\" class=\"st18\">\n+\t<v:documentProperties v:langID=\"1033\" v:metric=\"true\" v:viewMarkup=\"false\"/>\n+\n+\t<style type=\"text/css\">\n+\t<![CDATA[\n+\t\t.st1 {marker-end:url(#mrkr4-6);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}\n+\t\t.st2 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.44247787610619}\n+\t\t.st3 {visibility:visible}\n+\t\t.st4 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}\n+\t\t.st5 {fill:#9bc2e6;stroke:#c8c8c8;stroke-width:0.25}\n+\t\t.st6 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25}\n+\t\t.st7 {fill:#2d71ae;stroke:#c8c8c8;stroke-width:0.25}\n+\t\t.st8 {fill:#feffff;font-family:Calibri;font-size:1.16666em}\n+\t\t.st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:none}\n+\t\t.st10 {fill:#ffffff;stroke:none;stroke-width:0.25}\n+\t\t.st11 {fill:#000000;font-family:Calibri;font-size:1.00001em}\n+\t\t.st12 {fill:#feffff;font-family:Calibri;font-size:1.00001em}\n+\t\t.st13 {marker-end:url(#mrkr4-90);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}\n+\t\t.st14 {fill:none;stroke:none;stroke-width:0.25}\n+\t\t.st15 {fill:#000000;font-family:Consolas;font-size:0.75em}\n+\t\t.st16 {font-size:1em}\n+\t\t.st17 {fill:#feffff;font-family:Consolas;font-size:0.75em;font-weight:bold}\n+\t\t.st18 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}\n+\t]]>\n+\t</style>\n+\n+\t<defs id=\"Markers\">\n+\t\t<g id=\"lend4\">\n+\t\t\t<path d=\"M 2 1 L 0 0 L 2 -1 L 2 1 \" style=\"stroke:none\"/>\n+\t\t</g>\n+\t\t<marker id=\"mrkr4-6\" class=\"st2\" v:arrowType=\"4\" v:arrowSize=\"2\" v:setback=\"4.34\" refX=\"-4.34\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend4\" transform=\"scale(-2.26,-2.26) \"/>\n+\t\t</marker>\n+\t\t<marker id=\"mrkr4-90\" class=\"st2\" v:arrowType=\"4\" v:arrowSize=\"2\" v:setback=\"4.52\" refX=\"-4.52\" orient=\"auto\"\n+\t\t\t\tmarkerUnits=\"strokeWidth\" overflow=\"visible\">\n+\t\t\t<use xlink:href=\"#lend4\" transform=\"scale(-2.26,-2.26) \"/>\n+\t\t</marker>\n+\t</defs>\n+\t<defs id=\"Filters\">\n+\t\t<filter id=\"filter_2\">\n+\t\t\t<feGaussianBlur stdDeviation=\"2\"/>\n+\t\t</filter>\n+\t</defs>\n+\t<g v:mID=\"0\" v:index=\"1\" v:groupContext=\"foregroundPage\">\n+\t\t<title>Page-1</title>\n+\t\t<v:pageProperties v:drawingScale=\"0.0393701\" v:pageScale=\"0.0393701\" v:drawingUnits=\"24\" v:shadowOffsetX=\"8.50394\"\n+\t\t\t\tv:shadowOffsetY=\"-8.50394\"/>\n+\t\t<v:layer v:name=\"Connector\" v:index=\"0\"/>\n+\t\t<v:layer v:name=\"Flowchart\" v:index=\"1\"/>\n+\t\t<g id=\"shape20-1\" v:mID=\"20\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(-15.561,-361.299) rotate(-26.5651) scale(-1,1)\">\n+\t\t\t<title>Line-curve connector</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L15.98 442.17 L31.98 445 L48.02 445.59 L64.09 443.95 L80.2 440.08 L80.54 439.96\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"group1-7\" transform=\"translate(151.579,-379.1)\" v:mID=\"1\" v:groupContext=\"group\" v:layerMember=\"1\">\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<title>Start state</title>\n+\t\t\t<g id=\"shape2-8\" v:mID=\"2\" v:groupContext=\"shape\" v:layerMember=\"1\">\n+\t\t\t\t<title>Sheet.2</title>\n+\t\t\t\t<g id=\"shadow2-9\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t\t<path d=\"M0 408.77 A28.3465 28.3465 0 0 1 56.69 408.77 A28.3465 28.3465 0 1 1 0 408.77 Z\" class=\"st4\"/>\n+\t\t\t\t</g>\n+\t\t\t\t<path d=\"M0 408.77 A28.3465 28.3465 0 0 1 56.69 408.77 A28.3465 28.3465 0 1 1 0 408.77 Z\" class=\"st5\"/>\n+\t\t\t</g>\n+\t\t\t<g id=\"shape3-13\" v:mID=\"3\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(5.66929,-5.66929)\">\n+\t\t\t\t<title>Sheet.3</title>\n+\t\t\t\t<path d=\"M0 414.44 A22.6772 22.6772 0 0 1 45.35 414.44 A22.6772 22.6772 0 1 1 0 414.44 Z\" class=\"st6\"/>\n+\t\t\t</g>\n+\t\t</g>\n+\t\t<g id=\"group4-15\" transform=\"translate(401.701,-329.149)\" v:mID=\"4\" v:groupContext=\"group\" v:layerMember=\"1\">\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<title>Stop state</title>\n+\t\t\t<g id=\"shape5-16\" v:mID=\"5\" v:groupContext=\"shape\" v:layerMember=\"1\">\n+\t\t\t\t<title>Sheet.5</title>\n+\t\t\t\t<g id=\"shadow5-17\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t\t<path d=\"M0 408.77 A28.3465 28.3465 0 0 1 56.69 408.77 A28.3465 28.3465 0 1 1 0 408.77 Z\" class=\"st4\"/>\n+\t\t\t\t</g>\n+\t\t\t\t<path d=\"M0 408.77 A28.3465 28.3465 0 0 1 56.69 408.77 A28.3465 28.3465 0 1 1 0 408.77 Z\" class=\"st7\"/>\n+\t\t\t</g>\n+\t\t\t<g id=\"shape6-21\" v:mID=\"6\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(5.66929,-5.66929)\">\n+\t\t\t\t<title>Sheet.6</title>\n+\t\t\t\t<path d=\"M0 414.44 A22.6772 22.6772 0 0 1 45.35 414.44 A22.6772 22.6772 0 1 1 0 414.44 Z\" class=\"st6\"/>\n+\t\t\t</g>\n+\t\t</g>\n+\t\t<g id=\"group7-23\" transform=\"translate(15.8562,-86.9787)\" v:mID=\"7\" v:groupContext=\"group\" v:layerMember=\"1\">\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"ControlY\" v:val=\"VT0(0.53740157480315):24\"/>\n+\t\t\t\t<v:ud v:nameU=\"ScaleFactor\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"ControlY\" v:prompt=\"\" v:val=\"VT0(2.5984251981273):1\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<title>Entity 2</title>\n+\t\t\t<g id=\"shape8-24\" v:mID=\"8\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(0,-187.087)\">\n+\t\t\t\t<title>Sheet.8</title>\n+\t\t\t\t<desc>Device Configuration</desc>\n+\t\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t\t<v:textRect cx=\"150.285\" cy=\"416.665\" width=\"300.57\" height=\"40.9108\"/>\n+\t\t\t\t<g id=\"shadow8-25\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t\t<rect x=\"0\" y=\"396.21\" width=\"300.569\" height=\"40.9108\" class=\"st4\"/>\n+\t\t\t\t</g>\n+\t\t\t\t<rect x=\"0\" y=\"396.21\" width=\"300.569\" height=\"40.9108\" class=\"st6\"/>\n+\t\t\t\t<text x=\"90.77\" y=\"420.87\" class=\"st8\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device Configuration</text>\t\t\t</g>\n+\t\t\t<g id=\"shape9-30\" v:mID=\"9\" v:groupContext=\"shape\" v:layerMember=\"1\">\n+\t\t\t\t<title>Sheet.9</title>\n+\t\t\t\t<g id=\"shadow9-31\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t\t<rect x=\"0\" y=\"250.034\" width=\"300.569\" height=\"187.087\" class=\"st4\"/>\n+\t\t\t\t</g>\n+\t\t\t\t<rect x=\"0\" y=\"250.034\" width=\"300.569\" height=\"187.087\" class=\"st6\"/>\n+\t\t\t</g>\n+\t\t</g>\n+\t\t<g id=\"shape10-35\" v:mID=\"10\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(37.0945,-201.59)\">\n+\t\t\t<title>Entity 1</title>\n+\t\t\t<desc>Device identified</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"408.774\" width=\"95.08\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow10-36\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st9\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st10\"/>\n+\t\t\t<text x=\"6.5\" y=\"412.37\" class=\"st11\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device identified</text>\t\t</g>\n+\t\t<g id=\"shape11-41\" v:mID=\"11\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(179.925,-157.762)\">\n+\t\t\t<title>Entity 1.11</title>\n+\t\t\t<desc>Device configured</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"51.0236\" cy=\"408.774\" width=\"102.05\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow11-42\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"102.047\" height=\"56.6929\" class=\"st9\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"102.047\" height=\"56.6929\" class=\"st10\"/>\n+\t\t\t<text x=\"7.11\" y=\"412.37\" class=\"st11\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device configured</text>\t\t</g>\n+\t\t<g id=\"shape12-47\" v:mID=\"12\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(41.6772,-103.431)\">\n+\t\t\t<title>Entity 1.12</title>\n+\t\t\t<desc>Queues configured</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"54.9508\" cy=\"408.774\" width=\"109.91\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow12-48\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"109.902\" height=\"56.6929\" class=\"st9\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"109.902\" height=\"56.6929\" class=\"st10\"/>\n+\t\t\t<text x=\"8.67\" y=\"412.37\" class=\"st11\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Queues configured</text>\t\t</g>\n+\t\t<g id=\"shape14-53\" v:mID=\"14\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(382.508,-187.417)\">\n+\t\t\t<title>Entity 1.14</title>\n+\t\t\t<desc>Device stopped</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"408.774\" width=\"95.08\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow14-54\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st4\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st6\"/>\n+\t\t\t<text x=\"9.93\" y=\"412.37\" class=\"st12\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device stopped</text>\t\t</g>\n+\t\t<g id=\"shape15-59\" v:mID=\"15\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(382.508,-45.6848)\">\n+\t\t\t<title>Entity 1.15</title>\n+\t\t\t<desc>Device running</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"408.774\" width=\"95.08\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow15-60\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st4\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st6\"/>\n+\t\t\t<text x=\"10.99\" y=\"412.37\" class=\"st12\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device running</text>\t\t</g>\n+\t\t<g id=\"shape34-65\" v:mID=\"34\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(199.861,-224.664) rotate(8.90802)\">\n+\t\t\t<title>Line-curve connector.34</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L17.46 430.61 L34.07 426.41 L49.84 424.52 L64.76 424.95 L78.84 427.69 L92.07 432.74 L92.39 432.92\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape35-70\" v:mID=\"35\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(94.9467,-136.066) rotate(-18.1275) scale(-1,1)\">\n+\t\t\t<title>Line-curve connector.35</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L11.56 444.96 L23.54 449.98 L35.96 452.17 L48.8 451.54 L62.07 448.08 L75.78 441.79 L76.09 441.61\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape36-75\" v:mID=\"36\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(141.346,-101.138) rotate(5.87165)\">\n+\t\t\t<title>Line-curve connector.36</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L21.68 451.72 L45.69 462.76 L72.02 470.24 L100.69 474.16 L131.68 474.53 L165.01 471.32 L200.66 464.56\n+\t\t\t\t\t\t L238.64 454.24 L278.95 440.36 L279.28 440.23\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape37-80\" v:mID=\"37\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(-54.6126,221.357) rotate(-90) scale(-1,1)\">\n+\t\t\t<title>Line-curve connector.37</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L19.19 424.76 L38.39 416.27 L57.58 411.65 L76.77 410.91 L95.96 414.03 L115.16 421.03 L134.35 431.91\n+\t\t\t\t\t\t L134.64 432.11\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape38-85\" v:mID=\"38\" v:groupContext=\"shape\" v:layerMember=\"0\" transform=\"translate(-7.07327,334.743) rotate(-90)\">\n+\t\t\t<title>Directed line 1</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L76 437.12\" class=\"st13\"/>\n+\t\t</g>\n+\t\t<g id=\"shape41-91\" v:mID=\"41\" v:groupContext=\"shape\" v:layerMember=\"0\" transform=\"translate(758.012,56.3606) rotate(45)\">\n+\t\t\t<title>Loop on center</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"ScaleFactor\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M22.5 419.89 A22.9262 22.9262 0 1 1 30.34 458.86 L30.03 458.68\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape42-96\" v:mID=\"42\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(91.9936,116.697) rotate(-55.69)\">\n+\t\t\t<title>Loop on center.42</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"ScaleFactor\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M23.68 421.54 A23.5418 23.5418 0 1 1 30.85 458.2 L30.57 457.98\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape43-101\" v:mID=\"43\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(378.733,-215.747) rotate(-0.494766) scale(-1,1)\">\n+\t\t\t<title>Line-curve connector.43</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L25.31 429.84 L50.04 425.26 L74.18 423.39 L97.73 424.22 L120.7 427.75 L143.08 433.99 L143.42 434.12\"\n+\t\t\t\t\tclass=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape44-106\" v:mID=\"44\" v:groupContext=\"shape\" v:layerMember=\"0\" transform=\"translate(-7.07327,193.011) rotate(-90)\">\n+\t\t\t<title>Directed line 1.44</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L76 437.12\" class=\"st13\"/>\n+\t\t</g>\n+\t\t<g id=\"shape45-111\" v:mID=\"45\" v:groupContext=\"shape\" transform=\"translate(98.3701,-345.449)\">\n+\t\t\t<title>Sheet.45</title>\n+\t\t\t<desc>rte_eal_init() rte_bbdev_count()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"54.9508\" cy=\"425.073\" width=\"109.91\" height=\"24.0945\"/>\n+\t\t\t<rect x=\"0\" y=\"413.026\" width=\"109.902\" height=\"24.0945\" class=\"st14\"/>\n+\t\t\t<text x=\"20.31\" y=\"422.37\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_eal_init()<v:newlineChar/><tspan\n+\t\t\t\t\t\tx=\"12.89\" dy=\"1.2em\" class=\"st16\">rte</tspan>_bbdev_count()</text>\t\t</g>\n+\t\t<g id=\"shape48-115\" v:mID=\"48\" v:groupContext=\"shape\" transform=\"translate(135.988,-243.26)\">\n+\t\t\t<title>Sheet.48</title>\n+\t\t\t<desc>rte_bbdev_configure()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"59.2028\" cy=\"429.609\" width=\"118.41\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"118.406\" height=\"15.0236\" class=\"st14\"/>\n+\t\t\t<text x=\"7.25\" y=\"432.31\" class=\"st17\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_configure()</text>\t\t</g>\n+\t\t<g id=\"shape49-118\" v:mID=\"49\" v:groupContext=\"shape\" transform=\"translate(165.752,-113.636)\">\n+\t\t\t<title>Sheet.49</title>\n+\t\t\t<desc>rte_bbdev_queue_configure()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"70.5118\" cy=\"429.609\" width=\"141.03\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"141.024\" height=\"15.0236\" class=\"st14\"/>\n+\t\t\t<text x=\"3.71\" y=\"432.31\" class=\"st17\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_queue_configure()</text>\t\t</g>\n+\t\t<g id=\"shape50-121\" v:mID=\"50\" v:groupContext=\"shape\" transform=\"translate(316.638,-121.148)\">\n+\t\t\t<title>Sheet.50</title>\n+\t\t\t<desc>rte_bbdev_start()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"429.609\" width=\"95.08\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"95.0787\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"5.48\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_start()</text>\t\t</g>\n+\t\t<g id=\"shape51-124\" v:mID=\"51\" v:groupContext=\"shape\" transform=\"translate(382.508,-145.656)\">\n+\t\t\t<title>Sheet.51</title>\n+\t\t\t<desc>rte_bbdev_stop()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"429.609\" width=\"95.08\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"95.0787\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"7.95\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_stop()</text>\t\t</g>\n+\t\t<g id=\"shape52-127\" v:mID=\"52\" v:groupContext=\"shape\" transform=\"translate(463.39,-106.124)\">\n+\t\t\t<title>Sheet.52</title>\n+\t\t\t<desc>rte_bbdev_enqueue_ops()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"64.4882\" cy=\"429.609\" width=\"128.98\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"128.976\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"7.58\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_enqueue_ops()</text>\t\t</g>\n+\t\t<g id=\"shape54-130\" v:mID=\"54\" v:groupContext=\"shape\" transform=\"translate(414.965,-0.25)\">\n+\t\t\t<title>Sheet.54</title>\n+\t\t\t<desc>rte_bbdev_dequeue_ops()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"64.4882\" cy=\"429.609\" width=\"128.98\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"128.976\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"7.58\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_dequeue_ops()</text>\t\t</g>\n+\t\t<g id=\"shape55-133\" v:mID=\"55\" v:groupContext=\"shape\" transform=\"translate(365.559,-277.053)\">\n+\t\t\t<title>Sheet.55</title>\n+\t\t\t<desc>rte_bbdev_close()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"64.4882\" cy=\"429.609\" width=\"128.98\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"128.976\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"22.43\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_close()</text>\t\t</g>\n+\t\t<g id=\"shape56-136\" v:mID=\"56\" v:groupContext=\"shape\" transform=\"translate(259.945,-233.683)\">\n+\t\t\t<title>Sheet.56</title>\n+\t\t\t<desc>rte_bbdev_configure()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"59.2028\" cy=\"429.609\" width=\"118.41\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"118.406\" height=\"15.0236\" class=\"st14\"/>\n+\t\t\t<text x=\"7.25\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_configure()</text>\t\t</g>\n+\t\t<g id=\"shape57-139\" v:mID=\"57\" v:groupContext=\"shape\" transform=\"translate(203.252,-35.2579)\">\n+\t\t\t<title>Sheet.57</title>\n+\t\t\t<desc>rte_bbdev_start()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"429.609\" width=\"95.08\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"95.0787\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"5.48\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_start()</text>\t\t</g>\n+\t\t<g id=\"shape59-142\" v:mID=\"59\" v:groupContext=\"shape\" v:layerMember=\"1\" transform=\"translate(5.47638,-339.415)\">\n+\t\t\t<title>Entity 1.59</title>\n+\t\t\t<desc>Device stopped</desc>\n+\t\t\t<v:custProps>\n+\t\t\t\t<v:cp v:nameU=\"Cost\" v:lbl=\"Cost\" v:type=\"7\" v:format=\"@\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Duration\" v:lbl=\"Duration\" v:type=\"2\" v:langID=\"1033\"/>\n+\t\t\t\t<v:cp v:nameU=\"Resources\" v:lbl=\"Resources\" v:langID=\"1033\"/>\n+\t\t\t</v:custProps>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock v:margins=\"rect(5.66929,5.66929,5.66929,5.66929)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"47.5394\" cy=\"408.774\" width=\"95.08\" height=\"56.6929\"/>\n+\t\t\t<g id=\"shadow59-143\" v:groupContext=\"shadow\" v:shadowOffsetX=\"0.345598\" v:shadowOffsetY=\"-1.97279\" v:shadowType=\"1\"\n+\t\t\t\t\ttransform=\"matrix(1,0,0,1,0.345598,1.97279)\" class=\"st3\">\n+\t\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st4\"/>\n+\t\t\t</g>\n+\t\t\t<rect x=\"0\" y=\"380.428\" width=\"95.0787\" height=\"56.6929\" class=\"st6\"/>\n+\t\t\t<text x=\"9.93\" y=\"412.37\" class=\"st12\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>Device stopped</text>\t\t</g>\n+\t\t<g id=\"shape60-148\" v:mID=\"60\" v:groupContext=\"shape\" v:layerMember=\"0\"\n+\t\t\t\ttransform=\"translate(460.301,-61.0184) rotate(68.7086)\">\n+\t\t\t<title>Line-curve connector.60</title>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud v:nameU=\"Scale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"AntiScale\" v:val=\"VT0(1):26\"/>\n+\t\t\t\t<v:ud v:nameU=\"visVersion\" v:val=\"VT0(15):26\"/>\n+\t\t\t</v:userDefs>\n+\t\t\t<path d=\"M0 437.12 L16.55 442.51 L32.69 445.54 L48.43 446.22 L63.76 444.54 L78.69 440.5 L79.03 440.37\" class=\"st1\"/>\n+\t\t</g>\n+\t\t<g id=\"shape47-153\" v:mID=\"47\" v:groupContext=\"shape\" transform=\"translate(0.25,-314.896)\">\n+\t\t\t<title>Sheet.47</title>\n+\t\t\t<desc>rte_bbdev_info_get()</desc>\n+\t\t\t<v:textBlock v:margins=\"rect(1,1,1,1)\" v:tabSpace=\"42.5197\"/>\n+\t\t\t<v:textRect cx=\"54.9508\" cy=\"429.609\" width=\"109.91\" height=\"15.0236\"/>\n+\t\t\t<rect x=\"0\" y=\"422.097\" width=\"109.902\" height=\"15.0236\" class=\"st10\"/>\n+\t\t\t<text x=\"5.47\" y=\"432.31\" class=\"st15\" v:langID=\"6153\"><v:paragraph v:horizAlign=\"1\"/><v:tabList/>rte_bbdev_info_get()</text>\t\t</g>\n+\t</g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex 40f04a1..a0f8618 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -61,6 +61,7 @@ Programmer's Guide\n     kernel_nic_interface\n     thread_safety_dpdk_functions\n     eventdev\n+    bbdev\n     qos_framework\n     power_man\n     packet_classif_access_ctrl\ndiff --git a/doc/guides/sample_app_ug/bbdev_app.rst b/doc/guides/sample_app_ug/bbdev_app.rst\nnew file mode 100644\nindex 0000000..71a3853\n--- /dev/null\n+++ b/doc/guides/sample_app_ug/bbdev_app.rst\n@@ -0,0 +1,187 @@\n+..  BSD LICENSE\n+    Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+    Redistribution and use in source and binary forms, with or without\n+    modification, are permitted provided that the following conditions\n+    are met:\n+\n+    * Redistributions of source code must retain the above copyright\n+    notice, this list of conditions and the following disclaimer.\n+    * Redistributions in binary form must reproduce the above copyright\n+    notice, this list of conditions and the following disclaimer in\n+    the documentation and/or other materials provided with the\n+    distribution.\n+    * Neither the name of Intel Corporation nor the names of its\n+    contributors may be used to endorse or promote products derived\n+    from this software without specific prior written permission.\n+\n+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+    \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+.. bbdev_app:\n+\n+Loop-back Sample Application using Baseband Device (bbdev)\n+==========================================================\n+\n+The baseband sample application is a simple example of packet processing using\n+the Data Plane Development Kit (DPDK) for baseband workloads using the BBdev library.\n+\n+Overview\n+--------\n+\n+The Baseband device sample application performs a loop-back operation using a baseband device\n+capable of transceiving data packets.\n+A packet is received on a DOWNLINK_RX_PORT or UPLINK_RX_PORTS -> enqueued for\n+baseband operation -> dequeued from the baseband device then looped back to\n+DOWNLINK_TX_PORTS or UPLINK_TX_PORTS, respectively.\n+\n+*   The source MAC address is replaced by the TX_PORT MAC address\n+\n+*   The destination MAC address is replaced by  02:00:00:00:00:TX_PORT_ID\n+\n+Compiling the Application\n+-------------------------\n+\n+#.  Go to the example directory:\n+\n+    .. code-block:: console\n+\n+        export RTE_SDK=/path/to/rte_sdk\n+        cd ${RTE_SDK}/examples/bbdev_app\n+\n+#.  Set the target (a default target is used if not specified). For example:\n+\n+    .. code-block:: console\n+\n+        export RTE_TARGET=x86_64-native-linuxapp-gcc\n+\n+    See the *DPDK Getting Started Guide* for possible RTE_TARGET values.\n+\n+#.  Build the application:\n+\n+    .. code-block:: console\n+\n+        make\n+\n+Running the Application\n+-----------------------\n+\n+The application requires a number of command line options:\n+\n+.. code-block:: console\n+\n+    $ ./build/bbdev [EAL options] -- [-r DOWNLINK_RX_PORTS] [-R UPLINK_RX_PORTS] /\n+\t[-t DOWNLINK_TX_PORTS ] [-T UPLINK_TX_PORTS] /\n+\t[-c DOWNLINK_CORES] [-C UPLINK_CORES]\n+\n+where:\n+\n+* ``r DOWNLINK_RX_PORTS``: decimal amount of downlink receiver ports\n+* ``R UPLINK_RX_PORTS``: decimal amount of uplink receiver ports\n+* ``t DOWNLINK_TX_PORTS``: decimal amount of downlink transceiver ports\n+* ``T UPLINK_TX_PORTS``: decimal amount of uplink transceiver ports\n+* ``c DOWNLINK_CORES``: hexmask for downlink cores amount\n+* ``C UPLINK_CORES``: hexmask for uplink cores amount\n+\n+The application requires that baseband devices capable of performing\n+the specified baseband operation are available on application initialization.\n+This means that HW baseband device/s must be bound to a DPDK driver or\n+a SW baseband device/s (virtual BBdev) must be created (using --vdev).\n+\n+To run the application in linuxapp environment with one baseband device per download and upload,\n+handled by 1 port and 2 logical cores, issue the command:\n+\n+.. code-block:: console\n+\n+    $ ./build/bbdev --vdev='turbo_sw0' --vdev='turbo_sw1' \\\n+\t-w <NIC0PCIADDR> -w <NIC1PCIADDR> -c 0xf8 --socket-mem=2,2 \\\n+\t--file-prefix=bbdev -- -r 1 -R 2 -t 1 -T 2 -c 0x30 -C 0xc0\n+\n+where, NIC0PCIADDR and NIC1PCIADDR are PCI addresses\n+\n+This command creates two virtual bbdev devices (turbo_sw0 and turbo_sw1) where\n+each device is linked to a corresponding ethernet port as whitelisted by the\n+argument -w. 5 cores are allocated to the application, and assigned as:\n+\n+ - core 3 is the master and used to print the stats live on screen,\n+\n+ - cores 4 & 5 are the downlink cores, Tx & Rx\n+\n+ - cores 6 & 7 are the uplink cores, Tx & Rx\n+\n+Refer to the *DPDK Getting Started Guide* for general information on running applications\n+and the Environment Abstraction Layer (EAL) options.\n+\n+Explanation\n+-----------\n+\n+The Baseband device sample application demonstrates the performance of a baseband operation\n+on a data packet being sent and received.\n+Devices are discovered by the DPDK EAL during its initialization phase, and once it is present\n+in the application context, device type and its capabilities can be queried by calling rte_bbdev_info_get(dev_id, &info) function.\n+There are two levels to baseband device configuration - one that applies to the whole device, and one that applies to a single queue.\n+To apply device configuration rte_bbdev_configure()\n+must be called (for example configuring how many queues on a device will be used)\n+Where to configure queues on device rte_bbdev_queue_configure() applies.\n+From the application point of view, each instance of a baseband device consists of one or more queues,\n+identified by queue IDs.\n+Even though different devices might possess different capabilities,\n+all queues on given device support identical configuration possibilities.\n+A queue can be configured for only one type of operation which is done at initializations time.\n+After the initialization, devices are left in a stopped state, until started by the application.\n+By default, all queues are started with the device, however they might be stopped individually.\n+When application ceases to use a device it can be closed by calling rte_bbdev_close(dev_id), however it cannot be restarted.\n+\n+\n+Baseband operation specification\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Operations are enqueued to and later dequeued from the device. To maintain their order two functions are used:\n+\n+- ``rte_bbdev_enqueue_ops(dev_id, queue_id, ops, num_ops)``\n+- ``rte_bbdev_dequeue_ops(dev_id, queue_id, ops, num_ops)``\n+\n+Note that queues are not thread-safe and multiple queues or application-level locking\n+is a requirement for multi-threaded applications aiming to share a device.\n+It is however possible to use one thread to enqueue to a queue ID and another thread to dequeue from the same queue ID.\n+To determine number of queues supported by the device a function can be called:\n+\n+- ``rte_bbdev_info_get()``\n+\n+However it is possible to specify number of supported queues when creating a software device.\n+\n+Using Packet Generator with baseband device sample application\n+--------------------------------------------------------------\n+\n+To allow the bbdev sample app to do the loopback, an influx of traffic is required.\n+This can be done by using DPDK Pktgen to burst traffic on two ethernet ports, and\n+it will print the transmitted along with the looped-back traffic on Rx ports.\n+Executing the command below will generate traffic on the two whitelisted ethernet\n+ports.\n+\n+.. code-block:: console\n+\n+    $ ./pktgen-3.4.0/app/x86_64-native-linuxapp-gcc/pktgen -c 0x7 \\\n+\t--socket-mem=1,1 --file-prefix=pg -w <NIC2PCIADDR> -w <NIC3PCIADDR> -- \\\n+\t-m \"1.0, 2.1\" -P\n+\n+where:\n+\n+* ``-c COREMASK``: A hexadecimal bitmask of cores to run on\n+* ``--socket-mem``: Memory to allocate on specific sockets (use comma separated values)\n+* ``--file-prefix``: Prefix for hugepage filenames\n+* ``-w PCI WHITELIST``: Add a PCI device in white list. The argument format is <[domain:]bus:devid.func>.\n+* ``-m <string>``: Matrix for mapping ports to logical cores.\n+* ``-P``: PROMISCUOUS mode\n+\n+\n+Refer to *The Pktgen Application* documents for general information on running Pktgen with DPDK applications.\ndiff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst\nindex 069d4f1..cc568a9 100644\n--- a/doc/guides/sample_app_ug/index.rst\n+++ b/doc/guides/sample_app_ug/index.rst\n@@ -77,6 +77,7 @@ Sample Applications User Guides\n     ptpclient\n     performance_thread\n     ipsec_secgw\n+    bbdev_app\n \n **Figures**\n \ndiff --git a/doc/guides/tools/index.rst b/doc/guides/tools/index.rst\nindex c9133ec..a390fe7 100644\n--- a/doc/guides/tools/index.rst\n+++ b/doc/guides/tools/index.rst\n@@ -41,3 +41,4 @@ DPDK Tools User Guides\n     devbind\n     cryptoperf\n     testeventdev\n+    testbbdev\ndiff --git a/doc/guides/tools/testbbdev.rst b/doc/guides/tools/testbbdev.rst\nnew file mode 100644\nindex 0000000..682176d\n--- /dev/null\n+++ b/doc/guides/tools/testbbdev.rst\n@@ -0,0 +1,546 @@\n+..\n+   BSD LICENSE\n+\n+   Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+     * Redistributions of source code must retain the above copyright\n+       notice, this list of conditions and the following disclaimer.\n+     * Redistributions in binary form must reproduce the above copyright\n+       notice, this list of conditions and the following disclaimer in\n+       the documentation and/or other materials provided with the\n+       distribution.\n+     * Neither the name of Intel Corporation nor the names of its\n+       contributors may be used to endorse or promote products derived\n+       from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+dpdk-test-bbdev Application\n+==============================\n+\n+The ``dpdk-test-bbdev`` tool is a Data Plane Development Kit (DPDK) utility that\n+allows measuring performance parameters of PMDs available in the bbdev framework.\n+Available tests available for execution are: latency, throughput, validation and\n+sanity tests. Execution of tests can be customized using various parameters\n+passed to a python running script.\n+\n+Compiling the Application\n+-------------------------\n+\n+**Step 1: PMD setting**\n+\n+The ``dpdk-test-bbdev`` tool depends on crypto device drivers PMD which\n+are disabled by default in the build configuration file ``common_base``.\n+The bbdevice drivers PMD which should be tested can be enabled by setting\n+\n+   ``CONFIG_RTE_LIBRTE_PMD_<name>=y``\n+\n+Setting example for (*turbo_sw*) PMD\n+\n+   ``CONFIG_RTE_LIBRTE_PMD_BBDEV_TURBO_SW=y``\n+\n+**Step 2: Build the application**\n+\n+Execute the ``dpdk-setup.sh`` script to build the DPDK library together with the\n+``dpdk-test-bbdev`` application.\n+\n+Initially, the user must select a DPDK target to choose the correct target type\n+and compiler options to use when building the libraries.\n+The user must have all libraries, modules, updates and compilers installed\n+in the system prior to this, as described in the earlier chapters in this\n+Getting Started Guide.\n+\n+Running the Application\n+-----------------------\n+\n+The tool application has a number of command line options:\n+\n+.. code-block:: console\n+\n+  python test-bbdev.py [-h] [-p TESTAPP_PATH] [-e EAL_PARAMS] [-t TIMEOUT]\n+                       [-c TEST_CASE [TEST_CASE ...]]\n+                       [-v TEST_VECTOR [TEST_VECTOR...]] [-n NUM_OPS]\n+                       [-b BURST_SIZE [BURST_SIZE ...]]\n+\n+command-line Options\n+~~~~~~~~~~~~~~~~~~~~\n+\n+The following are the command-line options:\n+\n+``-h, --help``\n+ Shows help message and exit.\n+\n+``-p TESTAPP_PATH, --testapp_path TESTAPP_PATH``\n+ Indicates the path to the bbdev test app. If not specified path is set based\n+ on *$RTE_SDK* environment variable concatenated with \"*/build/app/testbbdev*\".\n+\n+``-e EAL_PARAMS, --eal_params EAL_PARAMS``\n+ Specifies EAL arguments which are passed to the test app. For more details,\n+ refer to DPDK documentation at http://dpdk.org/doc.\n+\n+``-t TIMEOUT, --timeout TIMEOUT``\n+ Specifies timeout in seconds. If not specified timeout is set to 300 seconds.\n+\n+``-c TEST_CASE [TEST_CASE ...], --test_cases TEST_CASE [TEST_CASE ...]``\n+ Defines test cases to run. If not specified all available tests are run.\n+\n+ The following tests can be run:\n+  * unittest\n+     Small unit tests witch check basic functionality of bbdev library.\n+  * latency\n+     Test calculates three latency metrics:\n+      * offload_latency_tc\n+         measures the cost of offloading enqueue and dequeue operations.\n+      * offload_latency_empty_q_tc\n+         measures the cost of offloading a dequeue operation from an empty queue.\n+         checks how long last dequeueing if there is no operations to dequeue\n+      * operation_latency_tc\n+         measures the time difference from the first attempt to enqueue till the\n+         first successful dequeue.\n+  * validation\n+     Test do enqueue on given vector and compare output after dequeueing.\n+  * throughput\n+     Test measures the achieved throughput on the available lcores.\n+     Results are printed in million operations per second and million bits per second.\n+  * interrupt\n+     The same test as 'throughput' but uses interrupts instead of PMD to perform\n+     the dequeue.\n+\n+ **Example usage:**\n+\n+ ``./test-bbdev.py -c validation``\n+  Runs validation test suite\n+\n+ ``./test-bbdev.py -c latency throughput``\n+  Runs latency and throughput test suites\n+\n+``-v TEST_VECTOR [TEST_VECTOR ...], --test_vector TEST_VECTOR [TEST_VECTOR ...]``\n+ Specifies paths to the test vector files. If not specified path is set based\n+ on *$RTE_SDK* environment variable concatenated with\n+ \"*/app/test-bbdev/test_vectors/bbdev_vector_null.data*\" and indicates default\n+ data file.\n+\n+ **Example usage:**\n+\n+ ``./test-bbdev.py -v app/test-bbdev/test_vectors/bbdev_vector_td_test1.data``\n+  Fills vector based on bbdev_vector_td_test1.data file and runs all tests\n+\n+ ``./test-bbdev.py -v bbdev_vector_td_test1.data bbdev_vector_te_test2.data``\n+  The bbdev test app is executed twice. First time vector is filled based on\n+  *bbdev_vector_td_test1.data* file and second time based on\n+  *bbdev_vector_te_test2.data* file. For both executions all tests are run.\n+\n+``-n NUM_OPS, --num_ops NUM_OPS``\n+ Specifies number of operations to process on device. If not specified num_ops\n+ is set to 32 operations.\n+\n+``-v BURST_SIZE [BURST_SIZE ...], --burst-size BURST_SIZE [BURST_SIZE ...]``\n+ Specifies operations enqueue/dequeue burst size. If not specified burst_size is\n+ set to 32.\n+\n+\n+Parameter globbing\n+~~~~~~~~~~~~~~~~~~\n+\n+Thanks to the globbing functionality in python test-bbdev.py script allows to\n+run tests with different set of vector files without giving all of them explicitly.\n+\n+**Example usage:**\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -v app/test-bbdev/test_vectors/bbdev_vector_*.data\n+\n+It runs all tests with following vectors:\n+\n+- ``bbdev_vector_null.data``\n+\n+- ``bbdev_vector_te_default.data``\n+\n+- ``bbdev_vector_td_default.data``\n+\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -v app/test-bbdev/test_vectors/bbdev_vector_t?_default.data\n+\n+It runs all tests with \"default\" vectors:\n+\n+- ``bbdev_vector_te_default.data``\n+\n+- ``bbdev_vector_td_default.data``\n+\n+\n+Running Tests\n+-------------\n+\n+Shortened tree of isg_cid-wireless_dpdk_ae with dpdk compiled for\n+x86_64-native-linuxapp-icc target:\n+\n+::\n+\n+ |-- app\n+     |-- test-bbdev\n+         |-- test_vectors\n+             |-- bbdev_vector_null.data\n+             |-- bbdev_vector_te_default.data\n+             |-- bbdev_vector_td_default.data\n+\n+ |-- x86_64-native-linuxapp-icc\n+     |-- app\n+         |-- testbbdev\n+\n+All bbdev devices\n+~~~~~~~~~~~~~~~~~\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -p ../../x86_64-native-linuxapp-icc/app/testbbdev\n+  -v ./test_vectors/bbdev_vector_td_default.data\n+\n+It runs all available tests using the test vector filled based on\n+*bbdev_vector_td_default.data* file.\n+By default number of operations to process on device is set to 32, timeout is\n+set to 300s and operations enqueue/dequeue burst size is set to 32.\n+Moreover a bbdev (*bbdev_null*) device will be created.\n+\n+bbdev turbo_sw device\n+~~~~~~~~~~~~~~~~~~~~~\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -p ../../x86_64-native-linuxapp-icc/app/testbbdev\n+  -e=\"--vdev=turbo_sw\" -t 120 -c validation\n+  -v ./test_vectors/bdev_vector_te_bypass*.data -n 64 -b 8 32\n+\n+It runs **validation** test for each vector file that matches the given pattern.\n+Number of operations to process on device is set to 64 and operations timeout is\n+set to 120s and enqueue/dequeue burst size is set to 8 and to 32.\n+Moreover a bbdev (*turbo_sw*) device will be created.\n+\n+\n+bbdev null device\n+~~~~~~~~~~~~~~~~~\n+\n+Executing bbdev null device with *bbdev_vector_null.data* helps in measuring the\n+overhead introduced by the bbdev framework.\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -e=\"--vdev=bbdev_null0\"\n+  -v ./test_vectors/bbdev_vector_null.data\n+\n+**Note:**\n+\n+bbdev_null device does not have to be defined explicitly as it is created by default.\n+\n+\n+\n+Test Vector files\n+=================\n+\n+Test Vector files contain the data which is used to set turbo decoder/encoder\n+parameters and buffers for validation purpose. New test vector files should be\n+stored in ``app/test-bbdev/test_vectors/`` directory. Detailed description of\n+the systax of the test vector files is in the following section.\n+\n+\n+Basic principles for test vector files\n+--------------------------------------\n+Line started with ``#`` is treated as a comment and is ignored.\n+\n+If variable is a chain of values, values should be separated by a comma. If\n+assignment is split into several lines, each line (except the last one) has to\n+be ended with a comma.\n+There is no comma after last value in last line. Correct assignment should\n+look like the following:\n+\n+.. parsed-literal::\n+\n+ variable =\n+ value, value, value, value,\n+ value, value\n+\n+In case where variable is a single value correct assignment looks like the\n+following:\n+\n+.. parsed-literal::\n+\n+ variable =\n+ value\n+\n+Length of chain variable is calculated by parser. Can not be defined\n+explicitly.\n+\n+Variable op_type has to be defined as a first variable in file. It specifies\n+what type of operations will be executed. For decoder op_type has to be set to\n+``RTE_BBDEV_OP_TURBO_DEC`` and for encoder to ``RTE_BBDEV_OP_TURBO_ENC``.\n+\n+Full details of the meaning and valid values for the below fields are\n+documented in *rte_bbdev_op.h*\n+\n+\n+Turbo decoder test vectors template\n+-----------------------------------\n+\n+For turbo decoder it has to be always set to ``RTE_BBDEV_OP_TURBO_DEC``\n+\n+.. parsed-literal::\n+\n+    op_type =\n+    RTE_BBDEV_OP_TURBO_DEC\n+\n+Chain of uint32_t values. Note that it is possible to define more than one\n+input/output entries which will result in chaining two or more data structures\n+for *segmented Transport Blocks*\n+\n+.. parsed-literal::\n+\n+    input0 =\n+    0x00000000, 0x7f817f00, 0x7f7f8100, 0x817f8100, 0x81008100, 0x7f818100, 0x81817f00, 0x7f818100,\n+    0x81007f00, 0x7f818100, 0x817f8100, 0x81817f00, 0x81008100, 0x817f7f00, 0x7f7f8100, 0x81817f00\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    input1 =\n+    0x7f7f0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n+    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    input2 =\n+    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n+    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    hard_output0 =\n+    0xa7d6732e\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    hard_output1 =\n+    0xa61\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    soft_output0 =\n+    0x817f817f, 0x7f817f7f, 0x81818181, 0x817f7f81, 0x7f818181, 0x8181817f, 0x817f817f, 0x8181817f\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    soft_output1 =\n+    0x817f7f81, 0x7f7f7f81, 0x7f7f8181\n+\n+uint32_t value\n+\n+.. parsed-literal::\n+\n+    e =\n+    44\n+\n+uint16_t value\n+\n+.. parsed-literal::\n+\n+    k =\n+    40\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    rv_index =\n+    0\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    iter_max =\n+    8\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    iter_min =\n+    4\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    expected_iter_count =\n+    8\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    ext_scale =\n+    15\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    num_maps =\n+    0\n+\n+Chain of flags for turbo decoder operation. Following flags can be used:\n+\n+- ``RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE``\n+\n+- ``RTE_BBDEV_TURBO_CRC_TYPE_24B``\n+\n+- ``RTE_BBDEV_TURBO_EQUALIZER``\n+\n+- ``RTE_BBDEV_TURBO_SOFT_OUT_SATURATE``\n+\n+- ``RTE_BBDEV_TURBO_HALF_ITERATION_EVEN``\n+\n+- ``RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH``\n+\n+- ``RTE_BBDEV_TURBO_SOFT_OUTPUT``\n+\n+- ``RTE_BBDEV_TURBO_EARLY_TERMINATION``\n+\n+If ``RTE_BBDEV_TURBO_CRC_TYPE_24B`` is set input has to be increased by three\n+bytes for CRC24B purposes\n+\n+.. parsed-literal::\n+\n+    op_flags =\n+    RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_EQUALIZER,\n+    RTE_BBDEV_TURBO_SOFT_OUTPUT\n+\n+Chain of operation statuses that are expected after operation is performed.\n+Following statuses can be used:\n+\n+- ``DMA``\n+\n+- ``FCW``\n+\n+- ``CRC``\n+\n+- ``OK``\n+\n+``OK`` means no errors are expected. Cannot be used with other values.\n+\n+.. parsed-literal::\n+\n+    expected_status =\n+    FCW, CRC\n+\n+\n+Turbo encoder test vectors template\n+-----------------------------------\n+\n+For turbo encoder it has to be always set to ``RTE_BBDEV_OP_TURBO_ENC``\n+\n+.. parsed-literal::\n+\n+    op_type =\n+    RTE_BBDEV_OP_TURBO_ENC\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    input0 =\n+    0x11d2bcac, 0x4d\n+\n+Chain of uint32_t values\n+\n+.. parsed-literal::\n+\n+    output0 =\n+    0xd2399179, 0x640eb999, 0x2cbaf577, 0xaf224ae2, 0x9d139927, 0xe6909b29,\n+    0xa25b7f47, 0x2aa224ce, 0x79f2\n+\n+uint32_t value\n+\n+.. parsed-literal::\n+\n+    e =\n+    272\n+\n+uint16_t value\n+\n+.. parsed-literal::\n+\n+    k =\n+    40\n+\n+uint16_t value\n+\n+.. parsed-literal::\n+\n+    ncb =\n+    192\n+\n+uint8_t value\n+\n+.. parsed-literal::\n+\n+    rv_index =\n+    0\n+\n+Chain of flags for turbo encoder operation. Following flags can be used:\n+\n+- ``RTE_BBDEV_TURBO_RV_INDEX_BYPASS``\n+\n+- ``RTE_BBDEV_TURBO_RATE_MATCH``\n+\n+- ``RTE_BBDEV_TURBO_CRC_24B_ATTACH``\n+\n+- ``RTE_BBDEV_TURBO_CRC_24A_ATTACH``\n+\n+\n+.. parsed-literal::\n+\n+    op_flags =\n+    RTE_BBDEV_TURBO_RATE_MATCH\n+\n+Chain of operation statuses that are expected after operation is performed.\n+Following statuses can be used:\n+\n+- ``DMA``\n+\n+- ``FCW``\n+\n+- ``OK``\n+\n+``OK`` means no errors are expected. Cannot be used with other values.\n+\n+.. parsed-literal::\n+\n+    expected_status =\n+    OK\n",
    "prefixes": [
        "dpdk-dev",
        "v1",
        "5/6"
    ]
}