get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 63002,
    "url": "http://patches.dpdk.org/api/patches/63002/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1573722187-148846-6-git-send-email-rosen.xu@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": "<1573722187-148846-6-git-send-email-rosen.xu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1573722187-148846-6-git-send-email-rosen.xu@intel.com",
    "date": "2019-11-14T09:02:53",
    "name": "[v18,05/19] raw/ifpga/base: add device tree support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b738cb5a6a5ad1c836f2dcc5436853b83fae4eee",
    "submitter": {
        "id": 946,
        "url": "http://patches.dpdk.org/api/people/946/?format=api",
        "name": "Xu, Rosen",
        "email": "rosen.xu@intel.com"
    },
    "delegate": {
        "id": 31221,
        "url": "http://patches.dpdk.org/api/users/31221/?format=api",
        "username": "yexl",
        "first_name": "xiaolong",
        "last_name": "ye",
        "email": "xiaolong.ye@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1573722187-148846-6-git-send-email-rosen.xu@intel.com/mbox/",
    "series": [
        {
            "id": 7455,
            "url": "http://patches.dpdk.org/api/series/7455/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7455",
            "date": "2019-11-14T09:02:48",
            "name": "add PCIe AER disable and IRQ support for ipn3ke",
            "version": 18,
            "mbox": "http://patches.dpdk.org/series/7455/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/63002/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/63002/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 09661A04C2;\n\tThu, 14 Nov 2019 10:05:15 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C24A41BE92;\n\tThu, 14 Nov 2019 10:04:37 +0100 (CET)",
            "from mga17.intel.com (mga17.intel.com [192.55.52.151])\n by dpdk.org (Postfix) with ESMTP id 47F9D1B948\n for <dev@dpdk.org>; Thu, 14 Nov 2019 10:04:35 +0100 (CET)",
            "from fmsmga006.fm.intel.com ([10.253.24.20])\n by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n 14 Nov 2019 01:04:34 -0800",
            "from dpdk-rosen-02.sh.intel.com ([10.67.110.156])\n by fmsmga006.fm.intel.com with ESMTP; 14 Nov 2019 01:04:33 -0800"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.68,302,1569308400\"; d=\"scan'208\";a=\"406259510\"",
        "From": "Rosen Xu <rosen.xu@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "rosen.xu@intel.com, tianfei.zhang@intel.com, andy.pei@intel.com,\n xiaolong.ye@intel.com, ferruh.yigit@intel.com",
        "Date": "Thu, 14 Nov 2019 17:02:53 +0800",
        "Message-Id": "<1573722187-148846-6-git-send-email-rosen.xu@intel.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1573722187-148846-1-git-send-email-rosen.xu@intel.com>",
        "References": "<1571917119-149534-2-git-send-email-andy.pei@intel.com>\n <1573722187-148846-1-git-send-email-rosen.xu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v18 05/19] raw/ifpga/base: add device tree support",
        "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 <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 <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Tianfei zhang <tianfei.zhang@intel.com>\n\nIn PAC N3000 card, this is a BMC chip which using MAX10 FPGA\nto manage the board configuration, like sensors, flash controller,\nQSFP, powers. And this is a SPI bus connected between A10 FPGA and\nMAX10, we can access the MAX10 registers over this SPI bus.\n\nIn BMC, there are about 19 sensors in MAX10 chip, including the FPGA\ncore temperature, Board temperature, board current, voltage and so on.\n\nWe use DTB (Device tree table) to describe it. This DTB file is store\nin nor flash partition, which will flashed in Factory when the boards\ndelivery to customers. And the same time, the customers can easy to\ncustomizate the BMC configuration like change the sensors.\n\nAdd device tree support by using libfdt library in Linux distribution.\nThe end-user should pre-install the libfdt and libfdt-devel package\nbefore use DPDK on PAC N3000 Card.\n\nFor Centos 7.x: sudo yum install libfdt libfdt-devel\nFor Ubuntu 18.04: sudo apt install libfdt-dev libfdt1\n\nTo eliminate build error, we currently do not compile raw/ifpga\nand net/ipn3ke. User should install libfdt and libfdt-devel first,\nmodify config/common_linux, CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV=n\nto CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV=y, modify config/common_base,\nCONFIG_RTE_LIBRTE_IPN3KE_PMD=n to CONFIG_RTE_LIBRTE_IPN3KE_PMD=y.\nThen this function can work.\n\nSigned-off-by: Tianfei zhang <tianfei.zhang@intel.com>\nSigned-off-by: Andy Pei <andy.pei@intel.com>\nAcked-by: Bruce Richardson <bruce.richardson@intel.com>\n---\n config/common_base                        |   2 +-\n config/common_linux                       |   2 +-\n drivers/meson.build                       |   6 +-\n drivers/net/ipn3ke/meson.build            |  24 +++-\n drivers/raw/ifpga/base/meson.build        |   2 +-\n drivers/raw/ifpga/base/opae_intel_max10.c | 183 ++++++++++++++++++++++++++++++\n drivers/raw/ifpga/base/opae_intel_max10.h |  10 ++\n drivers/raw/ifpga/meson.build             |  25 ++--\n mk/rte.app.mk                             |   2 +-\n 9 files changed, 235 insertions(+), 21 deletions(-)",
    "diff": "diff --git a/config/common_base b/config/common_base\nindex 36ab13d..7c015f9 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -347,7 +347,7 @@ CONFIG_RTE_LIBRTE_IAVF_16BYTE_RX_DESC=n\n #\n # Compile burst-oriented IPN3KE PMD driver\n #\n-CONFIG_RTE_LIBRTE_IPN3KE_PMD=y\n+CONFIG_RTE_LIBRTE_IPN3KE_PMD=n\n \n #\n # Compile burst-oriented Mellanox ConnectX-3 (MLX4) PMD\ndiff --git a/config/common_linux b/config/common_linux\nindex a78b8c6..c5cf3d6 100644\n--- a/config/common_linux\n+++ b/config/common_linux\n@@ -73,4 +73,4 @@ CONFIG_RTE_LIBRTE_HNS3_PMD=y\n # Compile PMD for Intel FPGA raw device\n # To compile, CONFIG_RTE_EAL_VFIO should be enabled.\n #\n-CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV=y\n+CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV=n\ndiff --git a/drivers/meson.build b/drivers/meson.build\nindex 823e3ef..b7fdfb7 100644\n--- a/drivers/meson.build\n+++ b/drivers/meson.build\n@@ -9,12 +9,12 @@ endif\n dpdk_driver_classes = ['common',\n \t       'bus',\n \t       'mempool', # depends on common and bus.\n-\t       'net',     # depends on common, bus and mempool.\n+\t       'raw',     # depends on common and bus.\n+\t       'net',     # depends on common, bus, mempool and raw.\n \t       'crypto',  # depends on common, bus and mempool (net in future).\n \t       'compress', # depends on common, bus, mempool.\n \t       'event',   # depends on common, bus, mempool and net.\n-\t       'baseband', # depends on common and bus.\n-\t       'raw']     # depends on common, bus, mempool, net and event.\n+\t       'baseband'] # depends on common and bus.\n \n disabled_drivers = get_option('disable_drivers').split(',')\n \ndiff --git a/drivers/net/ipn3ke/meson.build b/drivers/net/ipn3ke/meson.build\nindex 74b4d7c..e3c8a67 100644\n--- a/drivers/net/ipn3ke/meson.build\n+++ b/drivers/net/ipn3ke/meson.build\n@@ -8,10 +8,22 @@\n #  rte_eth_dev_destroy()\n #  rte_eth_switch_domain_free()\n #\n-allow_experimental_apis = true\n \n-sources += files('ipn3ke_ethdev.c',\n-\t'ipn3ke_representor.c',\n-\t'ipn3ke_tm.c',\n-\t'ipn3ke_flow.c')\n-deps += ['bus_ifpga', 'sched']\n+dep = dependency('libfdt', required: false)\n+if not dep.found()\n+\tdep = cc.find_library('libfdt', required: false)\n+endif\n+if not dep.found()\n+\tbuild = false\n+\treason = 'missing dependency, \"libfdt\"'\n+endif\n+\n+if build\n+\tallow_experimental_apis = true\n+\n+\tsources += files('ipn3ke_ethdev.c',\n+\t\t'ipn3ke_representor.c',\n+\t\t'ipn3ke_tm.c',\n+\t\t'ipn3ke_flow.c')\n+\tdeps += ['bus_ifpga', 'sched', 'pmd_i40e', 'rawdev', 'rawdev_ifpga']\n+endif\ndiff --git a/drivers/raw/ifpga/base/meson.build b/drivers/raw/ifpga/base/meson.build\nindex 69f6598..b13e13e 100644\n--- a/drivers/raw/ifpga/base/meson.build\n+++ b/drivers/raw/ifpga/base/meson.build\n@@ -25,5 +25,5 @@ sources = [\n \n base_lib = static_library('ifpga_rawdev_base', sources,\n \tdependencies: static_rte_eal,\n-\tc_args: c_args)\n+\tc_args: cflags)\n base_objs = base_lib.extract_all_objects()\ndiff --git a/drivers/raw/ifpga/base/opae_intel_max10.c b/drivers/raw/ifpga/base/opae_intel_max10.c\nindex 9ed10e2..305baba 100644\n--- a/drivers/raw/ifpga/base/opae_intel_max10.c\n+++ b/drivers/raw/ifpga/base/opae_intel_max10.c\n@@ -3,6 +3,7 @@\n  */\n \n #include \"opae_intel_max10.h\"\n+#include <libfdt.h>\n \n static struct intel_max10_device *g_max10;\n \n@@ -26,6 +27,174 @@ int max10_reg_write(unsigned int reg, unsigned int val)\n \t\t\treg, 4, (unsigned char *)&tmp);\n }\n \n+static struct max10_compatible_id max10_id_table[] = {\n+\t{.compatible = MAX10_PAC,},\n+\t{.compatible = MAX10_PAC_N3000,},\n+\t{.compatible = MAX10_PAC_END,}\n+};\n+\n+static struct max10_compatible_id *max10_match_compatible(const char *fdt_root)\n+{\n+\tstruct max10_compatible_id *id = max10_id_table;\n+\n+\tfor (; strcmp(id->compatible, MAX10_PAC_END); id++) {\n+\t\tif (fdt_node_check_compatible(fdt_root, 0, id->compatible))\n+\t\t\tcontinue;\n+\n+\t\treturn id;\n+\t}\n+\n+\treturn NULL;\n+}\n+\n+static inline bool\n+is_max10_pac_n3000(struct intel_max10_device *max10)\n+{\n+\treturn max10->id && !strcmp(max10->id->compatible,\n+\t\t\tMAX10_PAC_N3000);\n+}\n+\n+static void max10_check_capability(struct intel_max10_device *max10)\n+{\n+\tif (!max10->fdt_root)\n+\t\treturn;\n+\n+\tif (is_max10_pac_n3000(max10)) {\n+\t\tmax10->flags |= MAX10_FLAGS_NO_I2C2 |\n+\t\t\t\tMAX10_FLAGS_NO_BMCIMG_FLASH;\n+\t\tdev_info(max10, \"found %s card\\n\", max10->id->compatible);\n+\t}\n+}\n+\n+static int altera_nor_flash_read(u32 offset,\n+\t\tvoid *buffer, u32 len)\n+{\n+\tint word_len;\n+\tint i;\n+\tunsigned int *buf = (unsigned int *)buffer;\n+\tunsigned int value;\n+\tint ret;\n+\n+\tif (!buffer || len <= 0)\n+\t\treturn -ENODEV;\n+\n+\tword_len = len/4;\n+\n+\tfor (i = 0; i < word_len; i++) {\n+\t\tret = max10_reg_read(offset + i*4,\n+\t\t\t\t&value);\n+\t\tif (ret)\n+\t\t\treturn -EBUSY;\n+\n+\t\t*buf++ = value;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int enable_nor_flash(bool on)\n+{\n+\tunsigned int val = 0;\n+\tint ret;\n+\n+\tret = max10_reg_read(RSU_REG_OFF, &val);\n+\tif (ret) {\n+\t\tdev_err(NULL \"enabling flash error\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tif (on)\n+\t\tval |= RSU_ENABLE;\n+\telse\n+\t\tval &= ~RSU_ENABLE;\n+\n+\treturn max10_reg_write(RSU_REG_OFF, val);\n+}\n+\n+static int init_max10_device_table(struct intel_max10_device *max10)\n+{\n+\tstruct max10_compatible_id *id;\n+\tstruct fdt_header hdr;\n+\tchar *fdt_root = NULL;\n+\n+\tu32 dt_size, dt_addr, val;\n+\tint ret;\n+\n+\tret = max10_reg_read(DT_AVAIL_REG_OFF, &val);\n+\tif (ret) {\n+\t\tdev_err(max10 \"cannot read DT_AVAIL_REG\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tif (!(val & DT_AVAIL)) {\n+\t\tdev_err(max10 \"DT not available\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tret = max10_reg_read(DT_BASE_ADDR_REG_OFF, &dt_addr);\n+\tif (ret) {\n+\t\tdev_info(max10 \"cannot get base addr of device table\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = enable_nor_flash(true);\n+\tif (ret) {\n+\t\tdev_err(max10 \"fail to enable flash\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = altera_nor_flash_read(dt_addr, &hdr, sizeof(hdr));\n+\tif (ret) {\n+\t\tdev_err(max10 \"read fdt header fail\\n\");\n+\t\tgoto done;\n+\t}\n+\n+\tret = fdt_check_header(&hdr);\n+\tif (ret) {\n+\t\tdev_err(max10 \"check fdt header fail\\n\");\n+\t\tgoto done;\n+\t}\n+\n+\tdt_size = fdt_totalsize(&hdr);\n+\tif (dt_size > DFT_MAX_SIZE) {\n+\t\tdev_err(max10 \"invalid device table size\\n\");\n+\t\tret = -EINVAL;\n+\t\tgoto done;\n+\t}\n+\n+\tfdt_root = opae_malloc(dt_size);\n+\tif (!fdt_root) {\n+\t\tret = -ENOMEM;\n+\t\tgoto done;\n+\t}\n+\n+\tret = altera_nor_flash_read(dt_addr, fdt_root, dt_size);\n+\tif (ret) {\n+\t\tdev_err(max10 \"cannot read device table\\n\");\n+\t\tgoto done;\n+\t}\n+\n+\tid = max10_match_compatible(fdt_root);\n+\tif (!id) {\n+\t\tdev_err(max10 \"max10 compatible not found\\n\");\n+\t\tret = -ENODEV;\n+\t\tgoto done;\n+\t}\n+\n+\tmax10->flags |= MAX10_FLAGS_DEVICE_TABLE;\n+\n+\tmax10->id = id;\n+\tmax10->fdt_root = fdt_root;\n+\n+done:\n+\tret = enable_nor_flash(false);\n+\n+\tif (ret && fdt_root)\n+\t\topae_free(fdt_root);\n+\n+\treturn ret;\n+}\n+\n struct intel_max10_device *\n intel_max10_device_probe(struct altera_spi_device *spi,\n \t\tint chipselect)\n@@ -49,6 +218,15 @@ struct intel_max10_device *\n \t/* set the max10 device firstly */\n \tg_max10 = dev;\n \n+\t/* init the MAX10 device table */\n+\tret = init_max10_device_table(dev);\n+\tif (ret) {\n+\t\tdev_err(dev, \"init max10 device table fail\\n\");\n+\t\tgoto free_dev;\n+\t}\n+\n+\tmax10_check_capability(dev);\n+\n \t/* read FPGA loading information */\n \tret = max10_reg_read(FPGA_PAGE_INFO_OFF, &val);\n \tif (ret) {\n@@ -60,6 +238,8 @@ struct intel_max10_device *\n \treturn dev;\n \n spi_tran_fail:\n+\tif (dev->fdt_root)\n+\t\topae_free(dev->fdt_root);\n \tspi_transaction_remove(dev->spi_tran_dev);\n free_dev:\n \tg_max10 = NULL;\n@@ -76,6 +256,9 @@ int intel_max10_device_remove(struct intel_max10_device *dev)\n \tif (dev->spi_tran_dev)\n \t\tspi_transaction_remove(dev->spi_tran_dev);\n \n+\tif (dev->fdt_root)\n+\t\topae_free(dev->fdt_root);\n+\n \tg_max10 = NULL;\n \topae_free(dev);\n \ndiff --git a/drivers/raw/ifpga/base/opae_intel_max10.h b/drivers/raw/ifpga/base/opae_intel_max10.h\nindex 08b387e..a52b63e 100644\n--- a/drivers/raw/ifpga/base/opae_intel_max10.h\n+++ b/drivers/raw/ifpga/base/opae_intel_max10.h\n@@ -8,6 +8,14 @@\n #include \"opae_osdep.h\"\n #include \"opae_spi.h\"\n \n+struct max10_compatible_id {\n+\tchar compatible[128];\n+};\n+\n+#define MAX10_PAC\t\"intel,max10\"\n+#define MAX10_PAC_N3000\t\"intel,max10-pac-n3000\"\n+#define MAX10_PAC_END    \"intel,end\"\n+\n /* max10 capability flags */\n #define MAX10_FLAGS_NO_I2C2\t\tBIT(0)\n #define MAX10_FLAGS_NO_BMCIMG_FLASH\tBIT(1)\n@@ -20,6 +28,8 @@ struct intel_max10_device {\n \tunsigned int flags; /*max10 hardware capability*/\n \tstruct altera_spi_device *spi_master;\n \tstruct spi_transaction_dev *spi_tran_dev;\n+\tstruct max10_compatible_id *id; /*max10 compatible*/\n+\tchar *fdt_root;\n };\n \n /* retimer speed */\ndiff --git a/drivers/raw/ifpga/meson.build b/drivers/raw/ifpga/meson.build\nindex 0ab6fd7..69debff 100644\n--- a/drivers/raw/ifpga/meson.build\n+++ b/drivers/raw/ifpga/meson.build\n@@ -3,18 +3,27 @@\n \n version = 1\n \n-subdir('base')\n-objs = [base_objs]\n-\n dep = dependency('libfdt', required: false)\n if not dep.found()\n+\tdep = cc.find_library('libfdt', required: false)\n+endif\n+if not dep.found()\n \tbuild = false\n \treason = 'missing dependency, \"libfdt\"'\n endif\n-deps += ['rawdev', 'pci', 'bus_pci', 'kvargs',\n-\t'bus_vdev', 'bus_ifpga', 'net']\n-sources = files('ifpga_rawdev.c')\n \n-includes += include_directories('base')\n+if build\n+\tsubdir('base')\n+\tobjs = [base_objs]\n+\n+\tdeps += ['rawdev', 'pci', 'bus_pci', 'kvargs',\n+\t\t'bus_vdev', 'bus_ifpga', 'net']\n+\text_deps += dep\n \n-allow_experimental_apis = true\n+\tsources = files('ifpga_rawdev.c')\n+\n+\tincludes += include_directories('base')\n+\tincludes += include_directories('../../net/ipn3ke')\n+\n+\tallow_experimental_apis = true\n+endif\ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex 683e3a4..a278552 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -330,7 +330,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_DPAA2_QDMA_RAWDEV) += -lrte_rawdev_dpaa2_qdma\n endif # CONFIG_RTE_LIBRTE_FSLMC_BUS\n _LDLIBS-$(CONFIG_RTE_LIBRTE_IFPGA_BUS)      += -lrte_bus_ifpga\n ifeq ($(CONFIG_RTE_LIBRTE_IFPGA_BUS),y)\n-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV)   += -lrte_rawdev_ifpga\n+_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_IFPGA_RAWDEV)   += -lrte_rawdev_ifpga -lfdt\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_rawdev_ioat\n",
    "prefixes": [
        "v18",
        "05/19"
    ]
}