get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 56084,
    "url": "http://patches.dpdk.org/api/patches/56084/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190704122959.18919-2-thomas@monjalon.net/",
    "project": {
        "id": 1,
        "url": "http://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": "<20190704122959.18919-2-thomas@monjalon.net>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190704122959.18919-2-thomas@monjalon.net",
    "date": "2019-07-04T12:29:56",
    "name": "[v11,1/4] raw/ntb: introduce NTB raw device driver",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "96dba202ca74e6781afe6b054798ae1e1e33c225",
    "submitter": {
        "id": 685,
        "url": "http://patches.dpdk.org/api/people/685/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas@monjalon.net"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20190704122959.18919-2-thomas@monjalon.net/mbox/",
    "series": [
        {
            "id": 5339,
            "url": "http://patches.dpdk.org/api/series/5339/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=5339",
            "date": "2019-07-04T12:29:55",
            "name": "rawdev driver for ntb",
            "version": 11,
            "mbox": "http://patches.dpdk.org/series/5339/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/56084/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/56084/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 8E6501BE31;\n\tThu,  4 Jul 2019 14:30:39 +0200 (CEST)",
            "from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com\n\t[66.111.4.25]) by dpdk.org (Postfix) with ESMTP id 15FEB1BE2A\n\tfor <dev@dpdk.org>; Thu,  4 Jul 2019 14:30:38 +0200 (CEST)",
            "from compute1.internal (compute1.nyi.internal [10.202.2.41])\n\tby mailout.nyi.internal (Postfix) with ESMTP id A19F721550;\n\tThu,  4 Jul 2019 08:30:37 -0400 (EDT)",
            "from mailfrontend2 ([10.202.2.163])\n\tby compute1.internal (MEProxy); Thu, 04 Jul 2019 08:30:37 -0400",
            "from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184])\n\tby mail.messagingengine.com (Postfix) with ESMTPA id 576F2380074;\n\tThu,  4 Jul 2019 08:30:36 -0400 (EDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=\n\tfrom:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding; s=mesmtp; bh=EbX0bXnDj7\n\tT/UoB/AlErGfQWh+Av0BUXDVyLhjCaxIM=; b=r2+sqFiK5nPCyE5yqivgtD6BRz\n\tocIfvWKFs28uQMjXO96u+AKNZAQ340XsZ/mDnJgbJ02k9H2XhKcZsjcbMhQkueDq\n\t9c6X3QG4STkGAjMSYABDhT9l6+gzlCM7uVXrrUYzm6HuTC1pGC+1T3Lu6jIuoqUh\n\tB5rZkb/YV5mOJmKF8=",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n\tmessagingengine.com; h=cc:content-transfer-encoding:date:from\n\t:in-reply-to:message-id:mime-version:references:subject:to\n\t:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=\n\tfm3; bh=EbX0bXnDj7T/UoB/AlErGfQWh+Av0BUXDVyLhjCaxIM=; b=NxmzsRz2\n\t5xWgemIaJQxZcgP8eqsEORcUExaJjxigAdjt2Xsml+j5NDGePsJUhLwBDIXQ7cVk\n\tbtRVQei6/8ZQb87cPS4sI5tn5p7/bRtAnWAzo7QXMSQEOODxuvBTkbOveDSkZVsT\n\twQu9mX7rB6/SVJQtYNyXJz9zz6ri64eNw+6O+83Bdd9nIGaDbAyEPFjg2CWSyhQg\n\tDkoWBiXBT/mjxTgQpvVljDyLwuqPI33/I4BjT+ADkkow8hoz0piLe4ZaGYkSoUz/\n\tWm7rbMWXpF/tg3pSbgIqGTjyO5wuLl196YNTD9U5KhlDRTWfw1bOLykFEem7jGZR\n\tZ3338/lSO5GzLw=="
        ],
        "X-ME-Sender": "<xms:bfEdXY1eUU-86k7uX1M-zLpPDCj0hk5YxsbYtf6O9du83JAJdquluQ>",
        "X-ME-Proxy-Cause": "gggruggvucftvghtrhhoucdtuddrgeduvddrfedvgdehhecutefuodetggdotefrodftvf\n\tcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu\n\tuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc\n\tfjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepvfhhohhmrghs\n\tucfoohhnjhgrlhhonhcuoehthhhomhgrshesmhhonhhjrghlohhnrdhnvghtqeenucffoh\n\thmrghinhepshhusgguihhrrdhmkhdpvhgrrhhsrdhmkhdplhhisgdrmhhknecukfhppeej\n\tjedrudefgedrvddtfedrudekgeenucfrrghrrghmpehmrghilhhfrhhomhepthhhohhmrg\n\thssehmohhnjhgrlhhonhdrnhgvthenucevlhhushhtvghrufhiiigvpedt",
        "X-ME-Proxy": "<xmx:bfEdXUmMdRMvtRi4ffKvoZMY_Dvjm6urBSE9BHJp5CPSv5SA_g6ciw>\n\t<xmx:bfEdXegpCKlRZ8mbLrr_yWzp4t1EQQ_D3_l8dWLer8RuZ02PatgoFQ>\n\t<xmx:bfEdXZT6vywBG744BsibJGHgqY4Q7-l9TAU7VGRqsaFZEKKFwmM-Yg>\n\t<xmx:bfEdXYur3kiaqAhF-60_DMTiTvCXfm8zgRX7f4UvPNFledwbLJUq-g>",
        "From": "Thomas Monjalon <thomas@monjalon.net>",
        "To": "dev@dpdk.org, John McNamara <john.mcnamara@intel.com>,\n\tMarko Kovacevic <marko.kovacevic@intel.com>,\n\tXiaoyun Li <xiaoyun.li@intel.com>, Jingjing Wu <jingjing.wu@intel.com>",
        "Cc": "Xiaolong Ye <xiaolong.ye@intel.com>",
        "Date": "Thu,  4 Jul 2019 14:29:56 +0200",
        "Message-Id": "<20190704122959.18919-2-thomas@monjalon.net>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190704122959.18919-1-thomas@monjalon.net>",
        "References": "<20190628025346.31312-1-xiaoyun.li@intel.com>\n\t<20190704122959.18919-1-thomas@monjalon.net>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v11 1/4] raw/ntb: introduce NTB raw device driver",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Xiaoyun Li <xiaoyun.li@intel.com>\n\nIntroduce rawdev driver support for NTB (Non-transparent Bridge) which\ncan help to connect two separate hosts with each other.\n\nSigned-off-by: Xiaoyun Li <xiaoyun.li@intel.com>\nAcked-by: Jingjing Wu <jingjing.wu@intel.com>\nReviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>\n---\n MAINTAINERS                             |   6 +\n config/common_base                      |   5 +\n doc/guides/rawdevs/index.rst            |   1 +\n doc/guides/rawdevs/ntb.rst              |  22 ++\n doc/guides/rel_notes/release_19_08.rst  |   6 +\n drivers/raw/Makefile                    |   1 +\n drivers/raw/meson.build                 |   2 +-\n drivers/raw/ntb/Makefile                |  27 ++\n drivers/raw/ntb/meson.build             |   7 +\n drivers/raw/ntb/ntb.c                   | 488 ++++++++++++++++++++++++\n drivers/raw/ntb/ntb.h                   | 164 ++++++++\n drivers/raw/ntb/rte_pmd_ntb_version.map |   4 +\n mk/rte.app.mk                           |   1 +\n 13 files changed, 733 insertions(+), 1 deletion(-)\n create mode 100644 doc/guides/rawdevs/ntb.rst\n create mode 100644 drivers/raw/ntb/Makefile\n create mode 100644 drivers/raw/ntb/meson.build\n create mode 100644 drivers/raw/ntb/ntb.c\n create mode 100644 drivers/raw/ntb/ntb.h\n create mode 100644 drivers/raw/ntb/rte_pmd_ntb_version.map",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 605422077..9e6308aa4 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1105,6 +1105,12 @@ M: Nipun Gupta <nipun.gupta@nxp.com>\n F: drivers/raw/dpaa2_cmdif/\n F: doc/guides/rawdevs/dpaa2_cmdif.rst\n \n+NTB\n+M: Xiaoyun Li <xiaoyun.li@intel.com>\n+M: Jingjing Wu <jingjing.wu@intel.com>\n+F: drivers/raw/ntb/\n+F: doc/guides/rawdevs/ntb.rst\n+\n \n Packet processing\n -----------------\ndiff --git a/config/common_base b/config/common_base\nindex f68107e7a..75e130a43 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -762,6 +762,11 @@ CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV=y\n #\n CONFIG_RTE_LIBRTE_PMD_IOAT_RAWDEV=y\n \n+#\n+# Compile PMD for NTB raw device\n+#\n+CONFIG_RTE_LIBRTE_PMD_NTB_RAWDEV=y\n+\n #\n # Compile librte_ring\n #\ndiff --git a/doc/guides/rawdevs/index.rst b/doc/guides/rawdevs/index.rst\nindex 0a21989e4..e19c4ec26 100644\n--- a/doc/guides/rawdevs/index.rst\n+++ b/doc/guides/rawdevs/index.rst\n@@ -15,3 +15,4 @@ application through rawdev API.\n     dpaa2_qdma\n     ifpga_rawdev\n     ioat_rawdev\n+    ntb\ndiff --git a/doc/guides/rawdevs/ntb.rst b/doc/guides/rawdevs/ntb.rst\nnew file mode 100644\nindex 000000000..9559ea4b0\n--- /dev/null\n+++ b/doc/guides/rawdevs/ntb.rst\n@@ -0,0 +1,22 @@\n+..  SPDX-License-Identifier: BSD-3-Clause\n+    Copyright(c) 2018 Intel Corporation.\n+\n+NTB Rawdev Driver\n+=================\n+\n+The ``ntb`` rawdev driver provides a non-transparent bridge between two\n+separate hosts so that they can communicate with each other. Thus, many\n+user cases can benefit from this, such as fault tolerance and visual\n+acceleration.\n+\n+Build Options\n+-------------\n+\n+- ``CONFIG_RTE_LIBRTE_PMD_NTB_RAWDEV`` (default ``y``)\n+\n+   Toggle compilation of the ``ntb`` driver.\n+\n+Limitation\n+----------\n+\n+- The FIFO hasn't been introduced and will come in 19.11 release.\ndiff --git a/doc/guides/rel_notes/release_19_08.rst b/doc/guides/rel_notes/release_19_08.rst\nindex 21934bf01..8cd90e0c3 100644\n--- a/doc/guides/rel_notes/release_19_08.rst\n+++ b/doc/guides/rel_notes/release_19_08.rst\n@@ -129,6 +129,12 @@ New Features\n   of via software, reducing cycles spent copying large blocks of data in\n   applications.\n \n+* **Introduced NTB PMD.**\n+\n+  Added a PMD for Intel NTB (Non-transparent Bridge). This PMD implemented\n+  handshake between two separate hosts and can share local memory for peer\n+  host to directly access.\n+\n * **Updated telemetry library for global metrics support.**\n \n   Updated ``librte_telemetry`` to fetch the global metrics from the\ndiff --git a/drivers/raw/Makefile b/drivers/raw/Makefile\nindex c1b85c8c7..84a13b697 100644\n--- a/drivers/raw/Makefile\n+++ b/drivers/raw/Makefile\n@@ -11,5 +11,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_QDMA_RAWDEV) += dpaa2_qdma\n endif\n DIRS-$(CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV) += ifpga_rawdev\n DIRS-$(CONFIG_RTE_LIBRTE_PMD_IOAT_RAWDEV) += ioat\n+DIRS-$(CONFIG_RTE_LIBRTE_PMD_NTB_RAWDEV) += ntb\n \n include $(RTE_SDK)/mk/rte.subdir.mk\ndiff --git a/drivers/raw/meson.build b/drivers/raw/meson.build\nindex 2af8a70d4..47f0a1d5f 100644\n--- a/drivers/raw/meson.build\n+++ b/drivers/raw/meson.build\n@@ -2,7 +2,7 @@\n # Copyright 2018 NXP\n \n drivers = ['dpaa2_cmdif', 'dpaa2_qdma',\n-\t'ifpga_rawdev', 'ioat',\n+\t'ifpga_rawdev', 'ioat', 'ntb',\n \t'skeleton_rawdev']\n std_deps = ['rawdev']\n config_flag_fmt = 'RTE_LIBRTE_PMD_@0@_RAWDEV'\ndiff --git a/drivers/raw/ntb/Makefile b/drivers/raw/ntb/Makefile\nnew file mode 100644\nindex 000000000..ec53edd33\n--- /dev/null\n+++ b/drivers/raw/ntb/Makefile\n@@ -0,0 +1,27 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2019 Intel Corporation\n+\n+include $(RTE_SDK)/mk/rte.vars.mk\n+\n+#\n+# library name\n+#\n+LIB = librte_pmd_ntb.a\n+\n+CFLAGS += -DALLOW_EXPERIMENTAL_API\n+CFLAGS += -O3\n+CFLAGS += $(WERROR_FLAGS)\n+LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool\n+LDLIBS += -lrte_pci -lrte_bus_pci\n+LDLIBS += -lrte_rawdev\n+\n+EXPORT_MAP := rte_pmd_ntb_version.map\n+\n+LIBABIVER := 1\n+\n+#\n+# all source are stored in SRCS-y\n+#\n+SRCS-$(CONFIG_RTE_LIBRTE_PMD_NTB_RAWDEV) += ntb.c\n+\n+include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/drivers/raw/ntb/meson.build b/drivers/raw/ntb/meson.build\nnew file mode 100644\nindex 000000000..0fb44452c\n--- /dev/null\n+++ b/drivers/raw/ntb/meson.build\n@@ -0,0 +1,7 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2019 Intel Corporation.\n+\n+deps += ['rawdev', 'mbuf', 'mempool',\n+\t 'pci', 'bus_pci']\n+sources = files('ntb.c')\n+allow_experimental_apis = true\ndiff --git a/drivers/raw/ntb/ntb.c b/drivers/raw/ntb/ntb.c\nnew file mode 100644\nindex 000000000..2ae3cbea0\n--- /dev/null\n+++ b/drivers/raw/ntb/ntb.c\n@@ -0,0 +1,488 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation.\n+ */\n+#include <stdint.h>\n+#include <stdio.h>\n+#include <string.h>\n+#include <errno.h>\n+\n+#include <rte_common.h>\n+#include <rte_lcore.h>\n+#include <rte_cycles.h>\n+#include <rte_eal.h>\n+#include <rte_log.h>\n+#include <rte_pci.h>\n+#include <rte_bus_pci.h>\n+#include <rte_memzone.h>\n+#include <rte_memcpy.h>\n+#include <rte_rawdev.h>\n+#include <rte_rawdev_pmd.h>\n+\n+#include \"ntb.h\"\n+\n+int ntb_logtype;\n+\n+static const struct rte_pci_id pci_id_ntb_map[] = {\n+\t{ .vendor_id = 0, /* sentinel */ },\n+};\n+\n+static void\n+ntb_queue_conf_get(struct rte_rawdev *dev __rte_unused,\n+\t\t   uint16_t queue_id __rte_unused,\n+\t\t   rte_rawdev_obj_t queue_conf __rte_unused)\n+{\n+}\n+\n+static int\n+ntb_queue_setup(struct rte_rawdev *dev __rte_unused,\n+\t\tuint16_t queue_id __rte_unused,\n+\t\trte_rawdev_obj_t queue_conf __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ntb_queue_release(struct rte_rawdev *dev __rte_unused,\n+\t\t  uint16_t queue_id __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static uint16_t\n+ntb_queue_count(struct rte_rawdev *dev)\n+{\n+\tstruct ntb_hw *hw = dev->dev_private;\n+\treturn hw->queue_pairs;\n+}\n+\n+static int\n+ntb_enqueue_bufs(struct rte_rawdev *dev,\n+\t\t struct rte_rawdev_buf **buffers,\n+\t\t unsigned int count,\n+\t\t rte_rawdev_obj_t context)\n+{\n+\tRTE_SET_USED(dev);\n+\tRTE_SET_USED(buffers);\n+\tRTE_SET_USED(count);\n+\tRTE_SET_USED(context);\n+\n+\treturn 0;\n+}\n+\n+static int\n+ntb_dequeue_bufs(struct rte_rawdev *dev,\n+\t\t struct rte_rawdev_buf **buffers,\n+\t\t unsigned int count,\n+\t\t rte_rawdev_obj_t context)\n+{\n+\tRTE_SET_USED(dev);\n+\tRTE_SET_USED(buffers);\n+\tRTE_SET_USED(count);\n+\tRTE_SET_USED(context);\n+\n+\treturn 0;\n+}\n+\n+static void\n+ntb_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info)\n+{\n+\tstruct ntb_hw *hw = dev->dev_private;\n+\tstruct ntb_attr *ntb_attrs = dev_info;\n+\n+\tstrncpy(ntb_attrs[NTB_TOPO_ID].name, NTB_TOPO_NAME, NTB_ATTR_NAME_LEN);\n+\tswitch (hw->topo) {\n+\tcase NTB_TOPO_B2B_DSD:\n+\t\tstrncpy(ntb_attrs[NTB_TOPO_ID].value, \"B2B DSD\",\n+\t\t\tNTB_ATTR_VAL_LEN);\n+\t\tbreak;\n+\tcase NTB_TOPO_B2B_USD:\n+\t\tstrncpy(ntb_attrs[NTB_TOPO_ID].value, \"B2B USD\",\n+\t\t\tNTB_ATTR_VAL_LEN);\n+\t\tbreak;\n+\tdefault:\n+\t\tstrncpy(ntb_attrs[NTB_TOPO_ID].value, \"Unsupported\",\n+\t\t\tNTB_ATTR_VAL_LEN);\n+\t}\n+\n+\tstrncpy(ntb_attrs[NTB_LINK_STATUS_ID].name, NTB_LINK_STATUS_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_LINK_STATUS_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->link_status);\n+\n+\tstrncpy(ntb_attrs[NTB_SPEED_ID].name, NTB_SPEED_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_SPEED_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->link_speed);\n+\n+\tstrncpy(ntb_attrs[NTB_WIDTH_ID].name, NTB_WIDTH_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_WIDTH_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->link_width);\n+\n+\tstrncpy(ntb_attrs[NTB_MW_CNT_ID].name, NTB_MW_CNT_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_MW_CNT_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->mw_cnt);\n+\n+\tstrncpy(ntb_attrs[NTB_DB_CNT_ID].name, NTB_DB_CNT_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_DB_CNT_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->db_cnt);\n+\n+\tstrncpy(ntb_attrs[NTB_SPAD_CNT_ID].name, NTB_SPAD_CNT_NAME,\n+\t\tNTB_ATTR_NAME_LEN);\n+\tsnprintf(ntb_attrs[NTB_SPAD_CNT_ID].value, NTB_ATTR_VAL_LEN,\n+\t\t \"%d\", hw->spad_cnt);\n+}\n+\n+static int\n+ntb_dev_configure(const struct rte_rawdev *dev __rte_unused,\n+\t\t  rte_rawdev_obj_t config __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ntb_dev_start(struct rte_rawdev *dev)\n+{\n+\t/* TODO: init queues and start queues. */\n+\tdev->started = 1;\n+\n+\treturn 0;\n+}\n+\n+static void\n+ntb_dev_stop(struct rte_rawdev *dev)\n+{\n+\t/* TODO: stop rx/tx queues. */\n+\tdev->started = 0;\n+}\n+\n+static int\n+ntb_dev_close(struct rte_rawdev *dev)\n+{\n+\tint ret = 0;\n+\n+\tif (dev->started)\n+\t\tntb_dev_stop(dev);\n+\n+\t/* TODO: free queues. */\n+\n+\treturn ret;\n+}\n+\n+static int\n+ntb_dev_reset(struct rte_rawdev *rawdev __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ntb_attr_set(struct rte_rawdev *dev, const char *attr_name,\n+\t\t\t\t uint64_t attr_value)\n+{\n+\tstruct ntb_hw *hw = dev->dev_private;\n+\tint index = 0;\n+\n+\tif (dev == NULL || attr_name == NULL) {\n+\t\tNTB_LOG(ERR, \"Invalid arguments for setting attributes\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_SPAD_USER, NTB_SPAD_USER_LEN)) {\n+\t\tif (hw->ntb_ops->spad_write == NULL)\n+\t\t\treturn -ENOTSUP;\n+\t\tindex = atoi(&attr_name[NTB_SPAD_USER_LEN]);\n+\t\t(*hw->ntb_ops->spad_write)(dev, hw->spad_user_list[index],\n+\t\t\t\t\t   1, attr_value);\n+\t\tNTB_LOG(INFO, \"Set attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\t/* Attribute not found. */\n+\tNTB_LOG(ERR, \"Attribute not found.\");\n+\treturn -EINVAL;\n+}\n+\n+static int\n+ntb_attr_get(struct rte_rawdev *dev, const char *attr_name,\n+\t\t\t\t uint64_t *attr_value)\n+{\n+\tstruct ntb_hw *hw = dev->dev_private;\n+\tint index = 0;\n+\n+\tif (dev == NULL || attr_name == NULL || attr_value == NULL) {\n+\t\tNTB_LOG(ERR, \"Invalid arguments for getting attributes\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_TOPO_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->topo;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_LINK_STATUS_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->link_status;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_SPEED_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->link_speed;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_WIDTH_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->link_width;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_MW_CNT_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->mw_cnt;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_DB_CNT_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->db_cnt;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_SPAD_CNT_NAME, NTB_ATTR_NAME_LEN)) {\n+\t\t*attr_value = hw->spad_cnt;\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!strncmp(attr_name, NTB_SPAD_USER, NTB_SPAD_USER_LEN)) {\n+\t\tif (hw->ntb_ops->spad_read == NULL)\n+\t\t\treturn -ENOTSUP;\n+\t\tindex = atoi(&attr_name[NTB_SPAD_USER_LEN]);\n+\t\t*attr_value = (*hw->ntb_ops->spad_read)(dev,\n+\t\t\t\thw->spad_user_list[index], 0);\n+\t\tNTB_LOG(INFO, \"Attribute (%s) Value (%\" PRIu64 \")\",\n+\t\t\tattr_name, *attr_value);\n+\t\treturn 0;\n+\t}\n+\n+\t/* Attribute not found. */\n+\tNTB_LOG(ERR, \"Attribute not found.\");\n+\treturn -EINVAL;\n+}\n+\n+static int\n+ntb_xstats_get(const struct rte_rawdev *dev __rte_unused,\n+\t       const unsigned int ids[] __rte_unused,\n+\t       uint64_t values[] __rte_unused,\n+\t       unsigned int n __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ntb_xstats_get_names(const struct rte_rawdev *dev __rte_unused,\n+\t\t     struct rte_rawdev_xstats_name *xstats_names __rte_unused,\n+\t\t     unsigned int size __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static uint64_t\n+ntb_xstats_get_by_name(const struct rte_rawdev *dev __rte_unused,\n+\t\t       const char *name __rte_unused,\n+\t\t       unsigned int *id __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ntb_xstats_reset(struct rte_rawdev *dev __rte_unused,\n+\t\t const uint32_t ids[] __rte_unused,\n+\t\t uint32_t nb_ids __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static const struct rte_rawdev_ops ntb_ops = {\n+\t.dev_info_get         = ntb_dev_info_get,\n+\t.dev_configure        = ntb_dev_configure,\n+\t.dev_start            = ntb_dev_start,\n+\t.dev_stop             = ntb_dev_stop,\n+\t.dev_close            = ntb_dev_close,\n+\t.dev_reset            = ntb_dev_reset,\n+\n+\t.queue_def_conf       = ntb_queue_conf_get,\n+\t.queue_setup          = ntb_queue_setup,\n+\t.queue_release        = ntb_queue_release,\n+\t.queue_count          = ntb_queue_count,\n+\n+\t.enqueue_bufs         = ntb_enqueue_bufs,\n+\t.dequeue_bufs         = ntb_dequeue_bufs,\n+\n+\t.attr_get             = ntb_attr_get,\n+\t.attr_set             = ntb_attr_set,\n+\n+\t.xstats_get           = ntb_xstats_get,\n+\t.xstats_get_names     = ntb_xstats_get_names,\n+\t.xstats_get_by_name   = ntb_xstats_get_by_name,\n+\t.xstats_reset         = ntb_xstats_reset,\n+};\n+\n+static int\n+ntb_init_hw(struct rte_rawdev *dev, struct rte_pci_device *pci_dev)\n+{\n+\tstruct ntb_hw *hw = dev->dev_private;\n+\tint ret;\n+\n+\thw->pci_dev = pci_dev;\n+\thw->peer_dev_up = 0;\n+\thw->link_status = NTB_LINK_DOWN;\n+\thw->link_speed = NTB_SPEED_NONE;\n+\thw->link_width = NTB_WIDTH_NONE;\n+\n+\tswitch (pci_dev->id.device_id) {\n+\tdefault:\n+\t\tNTB_LOG(ERR, \"Not supported device.\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (hw->ntb_ops->ntb_dev_init == NULL)\n+\t\treturn -ENOTSUP;\n+\tret = (*hw->ntb_ops->ntb_dev_init)(dev);\n+\tif (ret) {\n+\t\tNTB_LOG(ERR, \"Unable to init ntb dev.\");\n+\t\treturn ret;\n+\t}\n+\n+\tif (hw->ntb_ops->set_link == NULL)\n+\t\treturn -ENOTSUP;\n+\tret = (*hw->ntb_ops->set_link)(dev, 1);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\treturn ret;\n+}\n+\n+static int\n+ntb_create(struct rte_pci_device *pci_dev, int socket_id)\n+{\n+\tchar name[RTE_RAWDEV_NAME_MAX_LEN];\n+\tstruct rte_rawdev *rawdev = NULL;\n+\tint ret;\n+\n+\tif (pci_dev == NULL) {\n+\t\tNTB_LOG(ERR, \"Invalid pci_dev.\");\n+\t\tret = -EINVAL;\n+\t}\n+\n+\tmemset(name, 0, sizeof(name));\n+\tsnprintf(name, RTE_RAWDEV_NAME_MAX_LEN, \"NTB:%x:%02x.%x\",\n+\t\t pci_dev->addr.bus, pci_dev->addr.devid,\n+\t\t pci_dev->addr.function);\n+\n+\tNTB_LOG(INFO, \"Init %s on NUMA node %d\", name, socket_id);\n+\n+\t/* Allocate device structure. */\n+\trawdev = rte_rawdev_pmd_allocate(name, sizeof(struct ntb_hw),\n+\t\t\t\t\t socket_id);\n+\tif (rawdev == NULL) {\n+\t\tNTB_LOG(ERR, \"Unable to allocate rawdev.\");\n+\t\tret = -EINVAL;\n+\t}\n+\n+\trawdev->dev_ops = &ntb_ops;\n+\trawdev->device = &pci_dev->device;\n+\trawdev->driver_name = pci_dev->driver->driver.name;\n+\n+\tret = ntb_init_hw(rawdev, pci_dev);\n+\tif (ret < 0) {\n+\t\tNTB_LOG(ERR, \"Unable to init ntb hw.\");\n+\t\tgoto fail;\n+\t}\n+\n+\treturn ret;\n+\n+fail:\n+\tif (rawdev)\n+\t\trte_rawdev_pmd_release(rawdev);\n+\n+\treturn ret;\n+}\n+\n+static int\n+ntb_destroy(struct rte_pci_device *pci_dev)\n+{\n+\tchar name[RTE_RAWDEV_NAME_MAX_LEN];\n+\tstruct rte_rawdev *rawdev;\n+\tint ret;\n+\n+\tif (pci_dev == NULL) {\n+\t\tNTB_LOG(ERR, \"Invalid pci_dev.\");\n+\t\tret = -EINVAL;\n+\t\treturn ret;\n+\t}\n+\n+\tmemset(name, 0, sizeof(name));\n+\tsnprintf(name, RTE_RAWDEV_NAME_MAX_LEN, \"NTB:%x:%02x.%x\",\n+\t\t pci_dev->addr.bus, pci_dev->addr.devid,\n+\t\t pci_dev->addr.function);\n+\n+\tNTB_LOG(INFO, \"Closing %s on NUMA node %d\", name, rte_socket_id());\n+\n+\trawdev = rte_rawdev_pmd_get_named_dev(name);\n+\tif (rawdev == NULL) {\n+\t\tNTB_LOG(ERR, \"Invalid device name (%s)\", name);\n+\t\tret = -EINVAL;\n+\t\treturn ret;\n+\t}\n+\n+\tret = rte_rawdev_pmd_release(rawdev);\n+\tif (ret)\n+\t\tNTB_LOG(ERR, \"Failed to destroy ntb rawdev.\");\n+\n+\treturn ret;\n+}\n+\n+static int\n+ntb_probe(struct rte_pci_driver *pci_drv __rte_unused,\n+\tstruct rte_pci_device *pci_dev)\n+{\n+\treturn ntb_create(pci_dev, rte_socket_id());\n+}\n+\n+static int\n+ntb_remove(struct rte_pci_device *pci_dev)\n+{\n+\treturn ntb_destroy(pci_dev);\n+}\n+\n+\n+static struct rte_pci_driver rte_ntb_pmd = {\n+\t.id_table = pci_id_ntb_map,\n+\t.drv_flags = RTE_PCI_DRV_NEED_MAPPING,\n+\t.probe = ntb_probe,\n+\t.remove = ntb_remove,\n+};\n+\n+RTE_PMD_REGISTER_PCI(raw_ntb, rte_ntb_pmd);\n+RTE_PMD_REGISTER_PCI_TABLE(raw_ntb, pci_id_ntb_map);\n+RTE_PMD_REGISTER_KMOD_DEP(raw_ntb, \"* igb_uio | uio_pci_generic | vfio-pci\");\n+\n+RTE_INIT(ntb_init_log)\n+{\n+\tntb_logtype = rte_log_register(\"pmd.raw.ntb\");\n+\tif (ntb_logtype >= 0)\n+\t\trte_log_set_level(ntb_logtype, RTE_LOG_DEBUG);\n+}\ndiff --git a/drivers/raw/ntb/ntb.h b/drivers/raw/ntb/ntb.h\nnew file mode 100644\nindex 000000000..d355231b0\n--- /dev/null\n+++ b/drivers/raw/ntb/ntb.h\n@@ -0,0 +1,164 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation.\n+ */\n+\n+#ifndef _NTB_RAWDEV_H_\n+#define _NTB_RAWDEV_H_\n+\n+#include <stdbool.h>\n+\n+extern int ntb_logtype;\n+\n+#define NTB_LOG(level, fmt, args...) \\\n+\trte_log(RTE_LOG_ ## level, ntb_logtype,\t\"%s(): \" fmt \"\\n\", \\\n+\t\t__func__, ##args)\n+\n+/* Vendor ID */\n+#define NTB_INTEL_VENDOR_ID         0x8086\n+\n+/* Device IDs */\n+#define NTB_INTEL_DEV_ID_B2B_SKX    0x201C\n+\n+#define NTB_TOPO_NAME               \"topo\"\n+#define NTB_LINK_STATUS_NAME        \"link_status\"\n+#define NTB_SPEED_NAME              \"speed\"\n+#define NTB_WIDTH_NAME              \"width\"\n+#define NTB_MW_CNT_NAME             \"mw_count\"\n+#define NTB_DB_CNT_NAME             \"db_count\"\n+#define NTB_SPAD_CNT_NAME           \"spad_count\"\n+/* Reserved to app to use. */\n+#define NTB_SPAD_USER               \"spad_user_\"\n+#define NTB_SPAD_USER_LEN           (sizeof(NTB_SPAD_USER) - 1)\n+#define NTB_SPAD_USER_MAX_NUM       10\n+#define NTB_ATTR_NAME_LEN           30\n+#define NTB_ATTR_VAL_LEN            30\n+#define NTB_ATTR_MAX                20\n+\n+/* NTB Attributes */\n+struct ntb_attr {\n+\t/**< Name of the attribute */\n+\tchar name[NTB_ATTR_NAME_LEN];\n+\t/**< Value or reference of value of attribute */\n+\tchar value[NTB_ATTR_NAME_LEN];\n+};\n+\n+enum ntb_attr_idx {\n+\tNTB_TOPO_ID = 0,\n+\tNTB_LINK_STATUS_ID,\n+\tNTB_SPEED_ID,\n+\tNTB_WIDTH_ID,\n+\tNTB_MW_CNT_ID,\n+\tNTB_DB_CNT_ID,\n+\tNTB_SPAD_CNT_ID,\n+};\n+\n+enum ntb_topo {\n+\tNTB_TOPO_NONE = 0,\n+\tNTB_TOPO_B2B_USD,\n+\tNTB_TOPO_B2B_DSD,\n+};\n+\n+enum ntb_link {\n+\tNTB_LINK_DOWN = 0,\n+\tNTB_LINK_UP,\n+};\n+\n+enum ntb_speed {\n+\tNTB_SPEED_NONE = 0,\n+\tNTB_SPEED_GEN1 = 1,\n+\tNTB_SPEED_GEN2 = 2,\n+\tNTB_SPEED_GEN3 = 3,\n+\tNTB_SPEED_GEN4 = 4,\n+};\n+\n+enum ntb_width {\n+\tNTB_WIDTH_NONE = 0,\n+\tNTB_WIDTH_1 = 1,\n+\tNTB_WIDTH_2 = 2,\n+\tNTB_WIDTH_4 = 4,\n+\tNTB_WIDTH_8 = 8,\n+\tNTB_WIDTH_12 = 12,\n+\tNTB_WIDTH_16 = 16,\n+\tNTB_WIDTH_32 = 32,\n+};\n+\n+/* Define spad registers usage. 0 is reserved. */\n+enum ntb_spad_idx {\n+\tSPAD_NUM_MWS = 1,\n+\tSPAD_NUM_QPS,\n+\tSPAD_Q_SZ,\n+\tSPAD_MW0_SZ_H,\n+\tSPAD_MW0_SZ_L,\n+\tSPAD_MW1_SZ_H,\n+\tSPAD_MW1_SZ_L,\n+};\n+\n+/**\n+ * NTB device operations\n+ * @ntb_dev_init: Init ntb dev.\n+ * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].\n+ * @mw_set_trans: Set translation of internal memory that remote can access.\n+ * @get_link_status: get link status, link speed and link width.\n+ * @set_link: Set local side up/down.\n+ * @spad_read: Read local/peer spad register val.\n+ * @spad_write: Write val to local/peer spad register.\n+ * @db_read: Read doorbells status.\n+ * @db_clear: Clear local doorbells.\n+ * @db_set_mask: Set bits in db mask, preventing db interrpts generated\n+ * for those db bits.\n+ * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.\n+ * @vector_bind: Bind vector source [intr] to msix vector [msix].\n+ */\n+struct ntb_dev_ops {\n+\tint (*ntb_dev_init)(struct rte_rawdev *dev);\n+\tvoid *(*get_peer_mw_addr)(struct rte_rawdev *dev, int mw_idx);\n+\tint (*mw_set_trans)(struct rte_rawdev *dev, int mw_idx,\n+\t\t\t    uint64_t addr, uint64_t size);\n+\tint (*get_link_status)(struct rte_rawdev *dev);\n+\tint (*set_link)(struct rte_rawdev *dev, bool up);\n+\tuint32_t (*spad_read)(struct rte_rawdev *dev, int spad, bool peer);\n+\tint (*spad_write)(struct rte_rawdev *dev, int spad,\n+\t\t\t  bool peer, uint32_t spad_v);\n+\tuint64_t (*db_read)(struct rte_rawdev *dev);\n+\tint (*db_clear)(struct rte_rawdev *dev, uint64_t db_bits);\n+\tint (*db_set_mask)(struct rte_rawdev *dev, uint64_t db_mask);\n+\tint (*peer_db_set)(struct rte_rawdev *dev, uint8_t db_bit);\n+\tint (*vector_bind)(struct rte_rawdev *dev, uint8_t intr, uint8_t msix);\n+};\n+\n+/* ntb private data. */\n+struct ntb_hw {\n+\tuint8_t mw_cnt;\n+\tuint8_t peer_mw_cnt;\n+\tuint8_t db_cnt;\n+\tuint8_t spad_cnt;\n+\n+\tuint64_t db_valid_mask;\n+\tuint64_t db_mask;\n+\n+\tenum ntb_topo topo;\n+\n+\tenum ntb_link link_status;\n+\tenum ntb_speed link_speed;\n+\tenum ntb_width link_width;\n+\n+\tconst struct ntb_dev_ops *ntb_ops;\n+\n+\tstruct rte_pci_device *pci_dev;\n+\tchar *hw_addr;\n+\n+\tuint64_t *mw_size;\n+\tuint64_t *peer_mw_size;\n+\tuint8_t peer_dev_up;\n+\n+\tuint16_t queue_pairs;\n+\tuint16_t queue_size;\n+\n+\t/**< mem zone to populate RX ring. */\n+\tconst struct rte_memzone **mz;\n+\n+\t/* Reserve several spad for app to use. */\n+\tint spad_user_list[NTB_SPAD_USER_MAX_NUM];\n+};\n+\n+#endif /* _NTB_RAWDEV_H_ */\ndiff --git a/drivers/raw/ntb/rte_pmd_ntb_version.map b/drivers/raw/ntb/rte_pmd_ntb_version.map\nnew file mode 100644\nindex 000000000..8861484fb\n--- /dev/null\n+++ b/drivers/raw/ntb/rte_pmd_ntb_version.map\n@@ -0,0 +1,4 @@\n+DPDK_19.08 {\n+\n+        local: *;\n+};\ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex 30f9a12da..d3d12350b 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -310,6 +310,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV)   += -lrte_pmd_ifpga_rawdev\n _LDLIBS-$(CONFIG_RTE_LIBRTE_IPN3KE_PMD)       += -lrte_pmd_ipn3ke\n endif # CONFIG_RTE_LIBRTE_IFPGA_BUS\n _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_IOAT_RAWDEV)   += -lrte_pmd_ioat_rawdev\n+_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NTB_RAWDEV) += -lrte_pmd_ntb\n endif # CONFIG_RTE_LIBRTE_RAWDEV\n \n endif # !CONFIG_RTE_BUILD_SHARED_LIBS\n",
    "prefixes": [
        "v11",
        "1/4"
    ]
}