get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 63004,
    "url": "http://patches.dpdk.org/api/patches/63004/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1573722187-148846-8-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-8-git-send-email-rosen.xu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1573722187-148846-8-git-send-email-rosen.xu@intel.com",
    "date": "2019-11-14T09:02:55",
    "name": "[v18,07/19] raw/ifpga/base: add sensor support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "6bf5b58c054328bcc98dcaf485adc2562509041c",
    "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-8-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/63004/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/63004/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 EC8B5A04C2;\n\tThu, 14 Nov 2019 10:05:36 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 3B99F1BEB9;\n\tThu, 14 Nov 2019 10:04:43 +0100 (CET)",
            "from mga17.intel.com (mga17.intel.com [192.55.52.151])\n by dpdk.org (Postfix) with ESMTP id 184302BC8\n for <dev@dpdk.org>; Thu, 14 Nov 2019 10:04:38 +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:38 -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:37 -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=\"406259528\"",
        "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:55 +0800",
        "Message-Id": "<1573722187-148846-8-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 07/19] raw/ifpga/base: add sensor 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\nThe sensor devices are connected in MAX10 FPGA. we used the\ndevice tree to describe those sensor devices. Parse the device\ntree to get the sensor devices and add them into a list.\n\nSigned-off-by: Tianfei zhang <tianfei.zhang@intel.com>\nSigned-off-by: Andy Pei <andy.pei@intel.com>\n---\n drivers/raw/ifpga/base/opae_intel_max10.c | 279 ++++++++++++++++++++++++++++++\n drivers/raw/ifpga/base/opae_intel_max10.h |  56 ++++++\n 2 files changed, 335 insertions(+)",
    "diff": "diff --git a/drivers/raw/ifpga/base/opae_intel_max10.c b/drivers/raw/ifpga/base/opae_intel_max10.c\nindex 305baba..ae7a8df 100644\n--- a/drivers/raw/ifpga/base/opae_intel_max10.c\n+++ b/drivers/raw/ifpga/base/opae_intel_max10.c\n@@ -7,6 +7,9 @@\n \n static struct intel_max10_device *g_max10;\n \n+struct opae_sensor_list opae_sensor_list =\n+\tTAILQ_HEAD_INITIALIZER(opae_sensor_list);\n+\n int max10_reg_read(unsigned int reg, unsigned int *val)\n {\n \tif (!g_max10)\n@@ -195,6 +198,277 @@ static int init_max10_device_table(struct intel_max10_device *max10)\n \treturn ret;\n }\n \n+static u64 fdt_get_number(const fdt32_t *cell, int size)\n+{\n+\tu64 r = 0;\n+\n+\twhile (size--)\n+\t\tr = (r << 32) | fdt32_to_cpu(*cell++);\n+\n+\treturn r;\n+}\n+\n+static int fdt_get_reg(const void *fdt, int node, unsigned int idx,\n+\t\tu64 *start, u64 *size)\n+{\n+\tconst fdt32_t *prop, *end;\n+\tint na = 0, ns = 0, len = 0, parent;\n+\n+\tparent = fdt_parent_offset(fdt, node);\n+\tif (parent < 0)\n+\t\treturn parent;\n+\n+\tprop = fdt_getprop(fdt, parent, \"#address-cells\", NULL);\n+\tna = prop ? fdt32_to_cpu(*prop) : 2;\n+\n+\tprop = fdt_getprop(fdt, parent, \"#size-cells\", NULL);\n+\tns = prop ? fdt32_to_cpu(*prop) : 2;\n+\n+\tprop = fdt_getprop(fdt, node, \"reg\", &len);\n+\tif (!prop)\n+\t\treturn -FDT_ERR_NOTFOUND;\n+\n+\tend = prop + len/sizeof(*prop);\n+\tprop = prop + (na + ns) * idx;\n+\n+\tif (prop + na + ns > end)\n+\t\treturn -FDT_ERR_NOTFOUND;\n+\n+\t*start = fdt_get_number(prop, na);\n+\t*size = fdt_get_number(prop + na, ns);\n+\n+\treturn 0;\n+}\n+\n+static int __fdt_stringlist_search(const void *fdt, int offset,\n+\t\tconst char *prop, const char *string)\n+{\n+\tint length, len, index = 0;\n+\tconst char *list, *end;\n+\n+\tlist = fdt_getprop(fdt, offset, prop, &length);\n+\tif (!list)\n+\t\treturn length;\n+\n+\tlen = strlen(string) + 1;\n+\tend = list + length;\n+\n+\twhile (list < end) {\n+\t\tlength = strnlen(list, end - list) + 1;\n+\n+\t\tif (list + length > end)\n+\t\t\treturn -FDT_ERR_BADVALUE;\n+\n+\t\tif (length == len && memcmp(list, string, length) == 0)\n+\t\t\treturn index;\n+\n+\t\tlist += length;\n+\t\tindex++;\n+\t}\n+\n+\treturn -FDT_ERR_NOTFOUND;\n+}\n+\n+static int fdt_get_named_reg(const void *fdt, int node, const char *name,\n+\t\tu64 *start, u64 *size)\n+{\n+\tint idx;\n+\n+\tidx = __fdt_stringlist_search(fdt, node, \"reg-names\", name);\n+\tif (idx < 0)\n+\t\treturn idx;\n+\n+\treturn fdt_get_reg(fdt, node, idx, start, size);\n+}\n+\n+static void max10_sensor_uinit(void)\n+{\n+\tstruct opae_sensor_info *info;\n+\n+\tTAILQ_FOREACH(info, &opae_sensor_list, node) {\n+\t\tTAILQ_REMOVE(&opae_sensor_list, info, node);\n+\t\topae_free(info);\n+\t}\n+}\n+\n+static bool sensor_reg_valid(struct sensor_reg *reg)\n+{\n+\treturn !!reg->size;\n+}\n+\n+static int max10_add_sensor(struct raw_sensor_info *info,\n+\t\tstruct opae_sensor_info *sensor)\n+{\n+\tint i;\n+\tint ret = 0;\n+\tunsigned int val;\n+\n+\tif (!info || !sensor)\n+\t\treturn -ENODEV;\n+\n+\tsensor->id = info->id;\n+\tsensor->name = info->name;\n+\tsensor->type = info->type;\n+\tsensor->multiplier = info->multiplier;\n+\n+\tfor (i = SENSOR_REG_VALUE; i < SENSOR_REG_MAX; i++) {\n+\t\tif (!sensor_reg_valid(&info->regs[i]))\n+\t\t\tcontinue;\n+\n+\t\tret = max10_reg_read(info->regs[i].regoff, &val);\n+\t\tif (ret)\n+\t\t\tbreak;\n+\n+\t\tif (val == 0xdeadbeef)\n+\t\t\tcontinue;\n+\n+\t\tval *= info->multiplier;\n+\n+\t\tswitch (i) {\n+\t\tcase SENSOR_REG_VALUE:\n+\t\t\tsensor->value_reg = info->regs[i].regoff;\n+\t\t\tsensor->flags |= OPAE_SENSOR_VALID;\n+\t\t\tbreak;\n+\t\tcase SENSOR_REG_HIGH_WARN:\n+\t\t\tsensor->high_warn = val;\n+\t\t\tsensor->flags |= OPAE_SENSOR_HIGH_WARN_VALID;\n+\t\t\tbreak;\n+\t\tcase SENSOR_REG_HIGH_FATAL:\n+\t\t\tsensor->high_fatal = val;\n+\t\t\tsensor->flags |= OPAE_SENSOR_HIGH_FATAL_VALID;\n+\t\t\tbreak;\n+\t\tcase SENSOR_REG_LOW_WARN:\n+\t\t\tsensor->low_warn = val;\n+\t\t\tsensor->flags |= OPAE_SENSOR_LOW_WARN_VALID;\n+\t\t\tbreak;\n+\t\tcase SENSOR_REG_LOW_FATAL:\n+\t\t\tsensor->low_fatal = val;\n+\t\t\tsensor->flags |= OPAE_SENSOR_LOW_FATAL_VALID;\n+\t\t\tbreak;\n+\t\tcase SENSOR_REG_HYSTERESIS:\n+\t\t\tsensor->hysteresis = val;\n+\t\t\tsensor->flags |= OPAE_SENSOR_HYSTERESIS_VALID;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static int max10_sensor_init(struct intel_max10_device *dev)\n+{\n+\tint i, ret = 0, offset = 0;\n+\tconst fdt32_t *num;\n+\tconst char *ptr;\n+\tu64 start, size;\n+\tstruct raw_sensor_info *raw;\n+\tstruct opae_sensor_info *sensor;\n+\tchar *fdt_root = dev->fdt_root;\n+\n+\tif (!fdt_root) {\n+\t\tdev_debug(dev, \"skip sensor init as not find Device Tree\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tfdt_for_each_subnode(offset, fdt_root, 0) {\n+\t\tptr = fdt_get_name(fdt_root, offset, NULL);\n+\t\tif (!ptr) {\n+\t\t\tdev_err(dev, \"failed to fdt get name\\n\");\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (!strstr(ptr, \"sensor\")) {\n+\t\t\tdev_debug(dev, \"%s is not a sensor node\\n\", ptr);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tdev_debug(dev, \"found sensor node %s\\n\", ptr);\n+\n+\t\traw = (struct raw_sensor_info *)opae_zmalloc(sizeof(*raw));\n+\t\tif (!raw) {\n+\t\t\tret = -ENOMEM;\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\traw->name = fdt_getprop(fdt_root, offset, \"sensor_name\", NULL);\n+\t\tif (!raw->name) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\traw->type = fdt_getprop(fdt_root, offset, \"type\", NULL);\n+\t\tif (!raw->type) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\tfor (i = SENSOR_REG_VALUE; i < SENSOR_REG_MAX; i++) {\n+\t\t\tret = fdt_get_named_reg(fdt_root, offset,\n+\t\t\t\t\tsensor_reg_name[i], &start,\n+\t\t\t\t\t&size);\n+\t\t\tif (ret) {\n+\t\t\t\tdev_debug(dev, \"no found %d: sensor node %s, %s\\n\",\n+\t\t\t\t\t\tret, ptr, sensor_reg_name[i]);\n+\t\t\t\tif (i == SENSOR_REG_VALUE) {\n+\t\t\t\t\tret = -EINVAL;\n+\t\t\t\t\tgoto free_sensor;\n+\t\t\t\t}\n+\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\traw->regs[i].regoff = start;\n+\t\t\traw->regs[i].size = size;\n+\t\t}\n+\n+\t\tnum = fdt_getprop(fdt_root, offset, \"id\", NULL);\n+\t\tif (!num) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\traw->id = fdt32_to_cpu(*num);\n+\t\tnum = fdt_getprop(fdt_root, offset, \"multiplier\", NULL);\n+\t\traw->multiplier = num ? fdt32_to_cpu(*num) : 1;\n+\n+\t\tdev_info(dev, \"found sensor from DTB: %s: %s: %u: %u\\n\",\n+\t\t\t\traw->name, raw->type,\n+\t\t\t\traw->id, raw->multiplier);\n+\n+\t\tfor (i = SENSOR_REG_VALUE; i < SENSOR_REG_MAX; i++)\n+\t\t\tdev_debug(dev, \"sensor reg[%d]: %x: %zu\\n\",\n+\t\t\t\t\ti, raw->regs[i].regoff,\n+\t\t\t\t\traw->regs[i].size);\n+\n+\t\tsensor = opae_zmalloc(sizeof(*sensor));\n+\t\tif (!sensor) {\n+\t\t\tret = -EINVAL;\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\tif (max10_add_sensor(raw, sensor)) {\n+\t\t\tret = -EINVAL;\n+\t\t\topae_free(sensor);\n+\t\t\tgoto free_sensor;\n+\t\t}\n+\n+\t\tif (sensor->flags & OPAE_SENSOR_VALID)\n+\t\t\tTAILQ_INSERT_TAIL(&opae_sensor_list, sensor, node);\n+\t\telse\n+\t\t\topae_free(sensor);\n+\n+\t\topae_free(raw);\n+\t}\n+\n+\treturn 0;\n+\n+free_sensor:\n+\tif (raw)\n+\t\topae_free(raw);\n+\tmax10_sensor_uinit();\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@@ -235,6 +509,9 @@ struct intel_max10_device *\n \t}\n \tdev_info(dev, \"FPGA loaded from %s Image\\n\", val ? \"User\" : \"Factory\");\n \n+\n+\tmax10_sensor_init(dev);\n+\n \treturn dev;\n \n spi_tran_fail:\n@@ -253,6 +530,8 @@ int intel_max10_device_remove(struct intel_max10_device *dev)\n \tif (!dev)\n \t\treturn 0;\n \n+\tmax10_sensor_uinit();\n+\n \tif (dev->spi_tran_dev)\n \t\tspi_transaction_remove(dev->spi_tran_dev);\n \ndiff --git a/drivers/raw/ifpga/base/opae_intel_max10.h b/drivers/raw/ifpga/base/opae_intel_max10.h\nindex a52b63e..90bf098 100644\n--- a/drivers/raw/ifpga/base/opae_intel_max10.h\n+++ b/drivers/raw/ifpga/base/opae_intel_max10.h\n@@ -103,4 +103,60 @@ struct intel_max10_device *\n \t\tint chipselect);\n int intel_max10_device_remove(struct intel_max10_device *dev);\n \n+/** List of opae sensors */\n+TAILQ_HEAD(opae_sensor_list, opae_sensor_info);\n+\n+#define SENSOR_REG_VALUE 0x0\n+#define SENSOR_REG_HIGH_WARN 0x1\n+#define SENSOR_REG_HIGH_FATAL 0x2\n+#define SENSOR_REG_LOW_WARN 0x3\n+#define SENSOR_REG_LOW_FATAL 0x4\n+#define SENSOR_REG_HYSTERESIS 0x5\n+#define SENSOR_REG_MAX 0x6\n+\n+static const char * const sensor_reg_name[] = {\n+\t\"value\",\n+\t\"high_warn\",\n+\t\"high_fatal\",\n+\t\"low_warn\",\n+\t\"low_fatal\",\n+\t\"hysteresis\",\n+};\n+\n+struct sensor_reg {\n+\tunsigned int regoff;\n+\tsize_t size;\n+};\n+\n+struct raw_sensor_info {\n+\tconst char *name;\n+\tconst char *type;\n+\tunsigned int id;\n+\tunsigned int multiplier;\n+\tstruct sensor_reg regs[SENSOR_REG_MAX];\n+};\n+\n+#define OPAE_SENSOR_VALID 0x1\n+#define OPAE_SENSOR_HIGH_WARN_VALID 0x2\n+#define OPAE_SENSOR_HIGH_FATAL_VALID 0x4\n+#define OPAE_SENSOR_LOW_WARN_VALID 0x8\n+#define OPAE_SENSOR_LOW_FATAL_VALID 0x10\n+#define OPAE_SENSOR_HYSTERESIS_VALID 0x20\n+\n+struct opae_sensor_info {\n+\tTAILQ_ENTRY(opae_sensor_info) node;\n+\tconst char *name;\n+\tconst char *type;\n+\tunsigned int id;\n+\tunsigned int high_fatal;\n+\tunsigned int high_warn;\n+\tunsigned int low_fatal;\n+\tunsigned int low_warn;\n+\tunsigned int hysteresis;\n+\tunsigned int multiplier;\n+\tunsigned int flags;\n+\tunsigned int value;\n+\tunsigned int value_reg;\n+};\n+\n #endif\n",
    "prefixes": [
        "v18",
        "07/19"
    ]
}