get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 55390,
    "url": "http://patches.dpdk.org/api/patches/55390/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190626071224.4819-2-xiaoyun.li@intel.com/",
    "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": "<20190626071224.4819-2-xiaoyun.li@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190626071224.4819-2-xiaoyun.li@intel.com",
    "date": "2019-06-26T07:12:19",
    "name": "[v8,1/6] raw/ntb: introduce ntb rawdev driver",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "48d20bfc00d891199ea525ae42b878089c409197",
    "submitter": {
        "id": 798,
        "url": "http://patches.dpdk.org/api/people/798/?format=api",
        "name": "Li, Xiaoyun",
        "email": "xiaoyun.li@intel.com"
    },
    "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/20190626071224.4819-2-xiaoyun.li@intel.com/mbox/",
    "series": [
        {
            "id": 5171,
            "url": "http://patches.dpdk.org/api/series/5171/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=5171",
            "date": "2019-06-26T07:12:18",
            "name": "rawdev driver for ntb",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/5171/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/55390/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/55390/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 DAFCC5B3A;\n\tWed, 26 Jun 2019 09:13:24 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 496CD5680\n\tfor <dev@dpdk.org>; Wed, 26 Jun 2019 09:13:19 +0200 (CEST)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t26 Jun 2019 00:13:18 -0700",
            "from dpdk-xiaoyun3.sh.intel.com ([10.67.119.190])\n\tby orsmga004.jf.intel.com with ESMTP; 26 Jun 2019 00:13:17 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.63,418,1557212400\"; d=\"scan'208\";a=\"313337180\"",
        "From": "Xiaoyun Li <xiaoyun.li@intel.com>",
        "To": "jingjing.wu@intel.com, keith.wiles@intel.com, cunming.liang@intel.com,\n\tomkar.maslekar@intel.com",
        "Cc": "dev@dpdk.org,\n\tXiaoyun Li <xiaoyun.li@intel.com>",
        "Date": "Wed, 26 Jun 2019 15:12:19 +0800",
        "Message-Id": "<20190626071224.4819-2-xiaoyun.li@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20190626071224.4819-1-xiaoyun.li@intel.com>",
        "References": "<20190620102147.41557-1-xiaoyun.li@intel.com>\n\t<20190626071224.4819-1-xiaoyun.li@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v8 1/6] raw/ntb: introduce ntb rawdev 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": "Introduce 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>\n---\n config/common_base                            |   5 +\n drivers/raw/Makefile                          |   1 +\n drivers/raw/meson.build                       |   2 +-\n drivers/raw/ntb_rawdev/Makefile               |  27 +\n drivers/raw/ntb_rawdev/meson.build            |   7 +\n drivers/raw/ntb_rawdev/ntb_rawdev.c           | 488 ++++++++++++++++++\n drivers/raw/ntb_rawdev/ntb_rawdev.h           | 164 ++++++\n .../ntb_rawdev/rte_pmd_ntb_rawdev_version.map |   4 +\n mk/rte.app.mk                                 |   1 +\n 9 files changed, 698 insertions(+), 1 deletion(-)\n create mode 100644 drivers/raw/ntb_rawdev/Makefile\n create mode 100644 drivers/raw/ntb_rawdev/meson.build\n create mode 100644 drivers/raw/ntb_rawdev/ntb_rawdev.c\n create mode 100644 drivers/raw/ntb_rawdev/ntb_rawdev.h\n create mode 100644 drivers/raw/ntb_rawdev/rte_pmd_ntb_rawdev_version.map",
    "diff": "diff --git a/config/common_base b/config/common_base\nindex fa1ae249a..6feb04602 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -747,6 +747,11 @@ CONFIG_RTE_LIBRTE_PMD_DPAA2_QDMA_RAWDEV=n\n #\n CONFIG_RTE_LIBRTE_PMD_IFPGA_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/drivers/raw/Makefile b/drivers/raw/Makefile\nindex 8e29b4a56..efe61f451 100644\n--- a/drivers/raw/Makefile\n+++ b/drivers/raw/Makefile\n@@ -10,5 +10,6 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_CMDIF_RAWDEV) += dpaa2_cmdif\n 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_NTB_RAWDEV) += ntb_rawdev\n \n include $(RTE_SDK)/mk/rte.subdir.mk\ndiff --git a/drivers/raw/meson.build b/drivers/raw/meson.build\nindex a61cdccef..6abf659d0 100644\n--- a/drivers/raw/meson.build\n+++ b/drivers/raw/meson.build\n@@ -1,7 +1,7 @@\n # SPDX-License-Identifier: BSD-3-Clause\n # Copyright 2018 NXP\n \n-drivers = ['skeleton_rawdev', 'dpaa2_cmdif', 'dpaa2_qdma', 'ifpga_rawdev']\n+drivers = ['skeleton_rawdev', 'dpaa2_cmdif', 'dpaa2_qdma', 'ifpga_rawdev', 'ntb_rawdev']\n std_deps = ['rawdev']\n config_flag_fmt = 'RTE_LIBRTE_PMD_@0@_RAWDEV'\n driver_name_fmt = 'rte_pmd_@0@'\ndiff --git a/drivers/raw/ntb_rawdev/Makefile b/drivers/raw/ntb_rawdev/Makefile\nnew file mode 100644\nindex 000000000..da87a4610\n--- /dev/null\n+++ b/drivers/raw/ntb_rawdev/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_rawdev.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_rawdev_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_rawdev.c\n+\n+include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/drivers/raw/ntb_rawdev/meson.build b/drivers/raw/ntb_rawdev/meson.build\nnew file mode 100644\nindex 000000000..ca905049d\n--- /dev/null\n+++ b/drivers/raw/ntb_rawdev/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_rawdev.c')\n+allow_experimental_apis = true\ndiff --git a/drivers/raw/ntb_rawdev/ntb_rawdev.c b/drivers/raw/ntb_rawdev/ntb_rawdev.c\nnew file mode 100644\nindex 000000000..07ad81d44\n--- /dev/null\n+++ b/drivers/raw/ntb_rawdev/ntb_rawdev.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_rawdev.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_rawdev_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_rawdev_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_rawdev_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_rawdev_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_rawdev_probe(struct rte_pci_driver *pci_drv __rte_unused,\n+\tstruct rte_pci_device *pci_dev)\n+{\n+\treturn ntb_rawdev_create(pci_dev, rte_socket_id());\n+}\n+\n+static int\n+ntb_rawdev_remove(struct rte_pci_device *pci_dev)\n+{\n+\treturn ntb_rawdev_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_rawdev_probe,\n+\t.remove = ntb_rawdev_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_rawdev/ntb_rawdev.h b/drivers/raw/ntb_rawdev/ntb_rawdev.h\nnew file mode 100644\nindex 000000000..d355231b0\n--- /dev/null\n+++ b/drivers/raw/ntb_rawdev/ntb_rawdev.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_rawdev/rte_pmd_ntb_rawdev_version.map b/drivers/raw/ntb_rawdev/rte_pmd_ntb_rawdev_version.map\nnew file mode 100644\nindex 000000000..8861484fb\n--- /dev/null\n+++ b/drivers/raw/ntb_rawdev/rte_pmd_ntb_rawdev_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 81be289a8..568ffe724 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -306,6 +306,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_IFPGA_BUS),y)\n _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_NTB_RAWDEV) += -lrte_pmd_ntb_rawdev\n endif # CONFIG_RTE_LIBRTE_RAWDEV\n \n endif # !CONFIG_RTE_BUILD_SHARED_LIBS\n",
    "prefixes": [
        "v8",
        "1/6"
    ]
}