get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 52499,
    "url": "http://patches.dpdk.org/api/patches/52499/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20190409190630.31975-5-vivkong@ca.ibm.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": "<20190409190630.31975-5-vivkong@ca.ibm.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190409190630.31975-5-vivkong@ca.ibm.com",
    "date": "2019-04-09T19:06:22",
    "name": "[RFC,04/12] lpm: add support for s390x architecture",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "48527c7d94892e372df064b2efc9595f0e5b9acd",
    "submitter": {
        "id": 1273,
        "url": "http://patches.dpdk.org/api/people/1273/?format=api",
        "name": "Vivian Kong",
        "email": "vivkong@gmail.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/20190409190630.31975-5-vivkong@ca.ibm.com/mbox/",
    "series": [
        {
            "id": 4211,
            "url": "http://patches.dpdk.org/api/series/4211/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4211",
            "date": "2019-04-09T19:06:18",
            "name": "introduce s390x architecture",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/4211/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/52499/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/52499/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 BE77A5B12;\n\tTue,  9 Apr 2019 21:06:49 +0200 (CEST)",
            "from mail-qt1-f172.google.com (mail-qt1-f172.google.com\n\t[209.85.160.172]) by dpdk.org (Postfix) with ESMTP id F0D295592\n\tfor <dev@dpdk.org>; Tue,  9 Apr 2019 21:06:38 +0200 (CEST)",
            "by mail-qt1-f172.google.com with SMTP id k2so21221822qtm.1\n\tfor <dev@dpdk.org>; Tue, 09 Apr 2019 12:06:38 -0700 (PDT)",
            "from csz25116.canlab.ibm.com ([199.246.40.57])\n\tby smtp.gmail.com with ESMTPSA id\n\tq23sm17934789qkc.16.2019.04.09.12.06.36 for <dev@dpdk.org>\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 09 Apr 2019 12:06:36 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=from:to:subject:date:message-id:in-reply-to:references:reply-to;\n\tbh=zVUjx3HOTjedokw5s2Af2gBPczyuoMlPhCX6K8N66Vw=;\n\tb=qIv9LkTwcW//F6vpdnq2zt+bk/HxBfK1L7vDRsK3ZJIxNwHZFBCT1YTpc2XwMmYPIZ\n\tn4U/fY+bdj9FkmYa6YY0JXggNas9BdPpX234mimP5eipFiPbSh8/HZTbsNcDF+kPhIS8\n\tdY5MkDL0HpKTXDINcEeQQl3yNS8j2sbw830pqdMQkcmzVyKOwIq0vl5jDIGZ1BXa6Koq\n\tJJmzxj02uwJudqG8p9n5qrw2Qm/6/5DS5dCPCjSQoHFHt4eUjjnYDmddDXwtpYbZ4lRG\n\tGjYFqGjMlbNmFv2OBn3j9zQ7VGGaPM8uga9EEXbrwWV+0mgoT7JvkhWiV7U74gOglUjX\n\tjI8g==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:subject:date:message-id:in-reply-to\n\t:references:reply-to;\n\tbh=zVUjx3HOTjedokw5s2Af2gBPczyuoMlPhCX6K8N66Vw=;\n\tb=qy09vSZ1NGuuF5jcDNeA06pc/yM4C2JVKt//rEdF9OvBwF5Rh2Vyy5njkRHAuqg0+5\n\tSzowpy8L3CCI6SL1ibinU9A6mEWJLOHWo2MslYinIIGYPqJNnTJbCP8gRHAa2pgZPmjw\n\tWhjhmVjDWsZh24g8FxV4y711qYAMtqRyYg4bnXCBMzudXaI87IHhvUzMc6fJ6VPPVLUV\n\tJfqmUQtX0nIbWp/8YDyBAfzVAscoQGTDD2thjiBoLhJjVX5fWZ8QFBDRg/96ANMhjrot\n\tFT8T9nWtdFGzFXmSEHMhAKtA2/UoqhhaXy98Za5fekJdFnM2t/G3CGvwBrvslziERRiw\n\tPUDw==",
        "X-Gm-Message-State": "APjAAAVAhZhAnuspVGYvDhfgNjGca/ye4mZimQwYaC+kWkjpkBjUvjnz\n\t4gDMPHGJz33vhFa04VNYfddLJXOlfDI=",
        "X-Google-Smtp-Source": "APXvYqzfenXk5RbqKZYl+jrrBQYqI+CaiqgApYXxNWjDzZJjAeKlghAEHFbHhOhqj6v6Jp1su6mOvg==",
        "X-Received": "by 2002:ac8:348d:: with SMTP id\n\tw13mr33086249qtb.329.1554836797928; \n\tTue, 09 Apr 2019 12:06:37 -0700 (PDT)",
        "From": "Vivian Kong <vivkong@gmail.com>",
        "X-Google-Original-From": "Vivian Kong <vivkong@ca.ibm.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue,  9 Apr 2019 15:06:22 -0400",
        "Message-Id": "<20190409190630.31975-5-vivkong@ca.ibm.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20190409190630.31975-1-vivkong@ca.ibm.com>",
        "References": "<20190409190630.31975-1-vivkong@ca.ibm.com>",
        "Subject": "[dpdk-dev] [RFC 04/12] lpm: add support for s390x architecture",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "Reply-To": "vivkong@ca.ibm.com",
        "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": "Add big endian support for s390x architecture.\n\nSigned-off-by: Vivian Kong <vivkong@ca.ibm.com>\n---\n lib/librte_lpm/Makefile        |   2 +\n lib/librte_lpm/meson.build     |   2 +-\n lib/librte_lpm/rte_lpm.h       |   2 +\n lib/librte_lpm/rte_lpm6.c      |  26 ++++++-\n lib/librte_lpm/rte_lpm_s390x.h | 130 +++++++++++++++++++++++++++++++++\n 5 files changed, 157 insertions(+), 5 deletions(-)\n create mode 100644 lib/librte_lpm/rte_lpm_s390x.h",
    "diff": "diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile\nindex a7946a1c5..16b868304 100644\n--- a/lib/librte_lpm/Makefile\n+++ b/lib/librte_lpm/Makefile\n@@ -26,6 +26,8 @@ else ifeq ($(CONFIG_RTE_ARCH_X86),y)\n SYMLINK-$(CONFIG_RTE_LIBRTE_LPM)-include += rte_lpm_sse.h\n else ifeq ($(CONFIG_RTE_ARCH_PPC_64),y)\n SYMLINK-$(CONFIG_RTE_LIBRTE_LPM)-include += rte_lpm_altivec.h\n+else ifeq ($(CONFIG_RTE_ARCH_S390X),y)\n+SYMLINK-$(CONFIG_RTE_LIBRTE_LPM)-include += rte_lpm_s390x.h\n endif\n \n include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/lib/librte_lpm/meson.build b/lib/librte_lpm/meson.build\nindex a5176d8ae..68317ed52 100644\n--- a/lib/librte_lpm/meson.build\n+++ b/lib/librte_lpm/meson.build\n@@ -6,5 +6,5 @@ sources = files('rte_lpm.c', 'rte_lpm6.c')\n headers = files('rte_lpm.h', 'rte_lpm6.h')\n # since header files have different names, we can install all vector headers\n # without worrying about which architecture we actually need\n-headers += files('rte_lpm_altivec.h', 'rte_lpm_neon.h', 'rte_lpm_sse.h')\n+headers += files('rte_lpm_s390x.h', 'rte_lpm_altivec.h', 'rte_lpm_neon.h', 'rte_lpm_sse.h')\n deps += ['hash']\ndiff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h\nindex 21550444d..aa8a43968 100644\n--- a/lib/librte_lpm/rte_lpm.h\n+++ b/lib/librte_lpm/rte_lpm.h\n@@ -459,6 +459,8 @@ rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],\n #include \"rte_lpm_neon.h\"\n #elif defined(RTE_ARCH_PPC_64)\n #include \"rte_lpm_altivec.h\"\n+#elif defined(RTE_ARCH_S390X)\n+#include \"rte_lpm_s390x.h\"\n #else\n #include \"rte_lpm_sse.h\"\n #endif\ndiff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c\nindex a91803113..7aead4035 100644\n--- a/lib/librte_lpm/rte_lpm6.c\n+++ b/lib/librte_lpm/rte_lpm6.c\n@@ -1,6 +1,7 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  * Copyright(c) 2010-2014 Intel Corporation\n  */\n+\n #include <string.h>\n #include <stdint.h>\n #include <errno.h>\n@@ -24,6 +25,7 @@\n #include <rte_hash.h>\n #include <assert.h>\n #include <rte_jhash.h>\n+#include <rte_byteorder.h>\n \n #include \"rte_lpm6.h\"\n \n@@ -58,17 +60,33 @@ static struct rte_tailq_elem rte_lpm6_tailq = {\n };\n EAL_REGISTER_TAILQ(rte_lpm6_tailq)\n \n+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n+\n /** Tbl entry structure. It is the same for both tbl24 and tbl8 */\n struct rte_lpm6_tbl_entry {\n-\tuint32_t next_hop:\t21;  /**< Next hop / next table to be checked. */\n-\tuint32_t depth\t:8;      /**< Rule depth. */\n+\tuint32_t next_hop :21;  /**< Next hop / next table to be checked. */\n+\tuint32_t depth\t  :8;   /**< Rule depth. */\n+\n+\t/* Flags. */\n+\tuint32_t valid       :1; /**< Validation flag. */\n+\tuint32_t valid_group :1; /**< Group validation flag. */\n+\tuint32_t ext_entry   :1; /**< External entry. */\n+};\n+\n+#else\n \n+struct rte_lpm6_tbl_entry {\n \t/* Flags. */\n-\tuint32_t valid     :1;   /**< Validation flag. */\n+\tuint32_t ext_entry   :1; /**< External entry. */\n \tuint32_t valid_group :1; /**< Group validation flag. */\n-\tuint32_t ext_entry :1;   /**< External entry. */\n+\tuint32_t valid       :1; /**< Validation flag. */\n+\n+\tuint32_t depth    :8;   /**< Rule depth. */\n+\tuint32_t next_hop :21;  /**< Next hop / next table to be checked. */\n };\n \n+#endif\n+\n /** Rules tbl entry structure. */\n struct rte_lpm6_rule {\n \tuint8_t ip[RTE_LPM6_IPV6_ADDR_SIZE]; /**< Rule IP address. */\ndiff --git a/lib/librte_lpm/rte_lpm_s390x.h b/lib/librte_lpm/rte_lpm_s390x.h\nnew file mode 100644\nindex 000000000..eb1fdd450\n--- /dev/null\n+++ b/lib/librte_lpm/rte_lpm_s390x.h\n@@ -0,0 +1,130 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * (c) Copyright IBM Corp. 2016, 2018\n+ */\n+\n+#ifndef _RTE_LPM_S390X_H_\n+#define _RTE_LPM_S390X_H_\n+\n+#include <rte_branch_prediction.h>\n+#include <rte_byteorder.h>\n+#include <rte_common.h>\n+#include <rte_vect.h>\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+static inline void\n+rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],\n+\tuint32_t defv)\n+{\n+\ttypedef int vector_signed_int\n+\t\t__attribute__((vector_size(4*sizeof(int))));\n+\tvector_signed_int i24;\n+\trte_xmm_t i8;\n+\tuint32_t tbl[4];\n+\tuint64_t idx, pt, pt2;\n+\tconst uint32_t *ptbl;\n+\n+\tconst uint32_t mask = UINT8_MAX;\n+\tconst vector_signed_int mask8 = (xmm_t){mask, mask, mask, mask};\n+\n+\t/*\n+\t * RTE_LPM_VALID_EXT_ENTRY_BITMASK for 2 LPM entries\n+\t * as one 64-bit value (0x0300000003000000).\n+\t */\n+\tconst uint64_t mask_xv =\n+\t\t((uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK |\n+\t\t(uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK << 32);\n+\n+\t/*\n+\t * RTE_LPM_LOOKUP_SUCCESS for 2 LPM entries\n+\t * as one 64-bit value (0x0100000001000000).\n+\t */\n+\tconst uint64_t mask_v =\n+\t\t((uint64_t)RTE_LPM_LOOKUP_SUCCESS |\n+\t\t(uint64_t)RTE_LPM_LOOKUP_SUCCESS << 32);\n+\n+\t/* get 4 indexes for tbl24[]. */\n+\ti24[0] = (uint32_t)ip[0] >> 8;\n+\ti24[1] = (uint32_t)ip[1] >> 8;\n+\ti24[2] = (uint32_t)ip[2] >> 8;\n+\ti24[3] = (uint32_t)ip[3] >> 8;\n+\n+\t/* extract values from tbl24[] */\n+\tidx = (uint32_t)i24[0];\n+\tidx = idx < (1<<24) ? idx : (1<<24)-1;\n+\tptbl = (const uint32_t *)&lpm->tbl24[idx];\n+\ttbl[0] = *ptbl;\n+\n+\tidx = (uint32_t) i24[1];\n+\tidx = idx < (1<<24) ? idx : (1<<24)-1;\n+\tptbl = (const uint32_t *)&lpm->tbl24[idx];\n+\ttbl[1] = *ptbl;\n+\n+\tidx = (uint32_t) i24[2];\n+\tidx = idx < (1<<24) ? idx : (1<<24)-1;\n+\tptbl = (const uint32_t *)&lpm->tbl24[idx];\n+\ttbl[2] = *ptbl;\n+\n+\tidx = (uint32_t) i24[3];\n+\tidx = idx < (1<<24) ? idx : (1<<24)-1;\n+\tptbl = (const uint32_t *)&lpm->tbl24[idx];\n+\ttbl[3] = *ptbl;\n+\n+\t/* get 4 indexes for tbl8[]. */\n+\ti8.x = vec_and(ip, mask8);\n+\n+\tpt = (uint64_t)tbl[0] |\n+\t\t(uint64_t)tbl[1] << 32;\n+\tpt2 = (uint64_t)tbl[2] |\n+\t\t(uint64_t)tbl[3] << 32;\n+\n+\t/* search successfully finished for all 4 IP addresses. */\n+\tif (likely((pt & mask_xv) == mask_v) &&\n+\t\t\tlikely((pt2 & mask_xv) == mask_v)) {\n+\t\t*(uint64_t *)hop = pt & RTE_LPM_MASKX4_RES;\n+\t\t*(uint64_t *)(hop + 2) = pt2 & RTE_LPM_MASKX4_RES;\n+\t\treturn;\n+\t}\n+\n+\tif (unlikely((pt & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==\n+\t\t\tRTE_LPM_VALID_EXT_ENTRY_BITMASK)) {\n+\t\ti8.u32[0] = i8.u32[0] +\n+\t\t\t(uint8_t)tbl[0] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;\n+\t\tptbl = (const uint32_t *)&lpm->tbl8[i8.u32[0]];\n+\t\ttbl[0] = *ptbl;\n+\t}\n+\tif (unlikely((pt >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==\n+\t\t\tRTE_LPM_VALID_EXT_ENTRY_BITMASK)) {\n+\t\ti8.u32[1] = i8.u32[1] +\n+\t\t\t(uint8_t)tbl[1] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;\n+\t\tptbl = (const uint32_t *)&lpm->tbl8[i8.u32[1]];\n+\t\ttbl[1] = *ptbl;\n+\t}\n+\tif (unlikely((pt2 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==\n+\t\t\tRTE_LPM_VALID_EXT_ENTRY_BITMASK)) {\n+\t\ti8.u32[2] = i8.u32[2] +\n+\t\t\t(uint8_t)tbl[2] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;\n+\t\tptbl = (const uint32_t *)&lpm->tbl8[i8.u32[2]];\n+\t\ttbl[2] = *ptbl;\n+\t}\n+\tif (unlikely((pt2 >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==\n+\t\t\tRTE_LPM_VALID_EXT_ENTRY_BITMASK)) {\n+\t\ti8.u32[3] = i8.u32[3] +\n+\t\t\t(uint8_t)tbl[3] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES;\n+\t\tptbl = (const uint32_t *)&lpm->tbl8[i8.u32[3]];\n+\t\ttbl[3] = *ptbl;\n+\t}\n+\n+\thop[0] = (tbl[0] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[0] & 0x00FFFFFF : defv;\n+\thop[1] = (tbl[1] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[1] & 0x00FFFFFF : defv;\n+\thop[2] = (tbl[2] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[2] & 0x00FFFFFF : defv;\n+\thop[3] = (tbl[3] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[3] & 0x00FFFFFF : defv;\n+}\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* _RTE_LPM_S390X_H_ */\n",
    "prefixes": [
        "RFC",
        "04/12"
    ]
}