get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 99779,
    "url": "http://patchwork.dpdk.org/api/patches/99779/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20210927122650.30881-7-nipun.gupta@nxp.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20210927122650.30881-7-nipun.gupta@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210927122650.30881-7-nipun.gupta@nxp.com",
    "date": "2021-09-27T12:26:45",
    "name": "[06/11] net/dpaa2: add function to generate HW hash key",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9e95162ad8ea99cc9429636e0bb2ba75e1f70a68",
    "submitter": {
        "id": 471,
        "url": "http://patchwork.dpdk.org/api/people/471/?format=api",
        "name": "Nipun Gupta",
        "email": "nipun.gupta@nxp.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20210927122650.30881-7-nipun.gupta@nxp.com/mbox/",
    "series": [
        {
            "id": 19191,
            "url": "http://patchwork.dpdk.org/api/series/19191/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=19191",
            "date": "2021-09-27T12:26:39",
            "name": "NXP DPAAx Bus and PMD changes",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/19191/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/99779/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/99779/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 6C2C3A0548;\n\tMon, 27 Sep 2021 14:27:33 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0A6754111D;\n\tMon, 27 Sep 2021 14:27:03 +0200 (CEST)",
            "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by mails.dpdk.org (Postfix) with ESMTP id DC3D540E3C\n for <dev@dpdk.org>; Mon, 27 Sep 2021 14:26:55 +0200 (CEST)",
            "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id BC19A1A2612;\n Mon, 27 Sep 2021 14:26:55 +0200 (CEST)",
            "from aprdc01srsp001v.ap-rdc01.nxp.com\n (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 42AF41A165D;\n Mon, 27 Sep 2021 14:26:55 +0200 (CEST)",
            "from lsv03274.swis.in-blr01.nxp.com (lsv03274.swis.in-blr01.nxp.com\n [92.120.147.114])\n by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id 2E557183AD14;\n Mon, 27 Sep 2021 20:26:54 +0800 (+08)"
        ],
        "From": "nipun.gupta@nxp.com",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, ferruh.yigit@intel.com, hemant.agrawal@nxp.com,\n sachin.saxena@nxp.com",
        "Date": "Mon, 27 Sep 2021 17:56:45 +0530",
        "Message-Id": "<20210927122650.30881-7-nipun.gupta@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210927122650.30881-1-nipun.gupta@nxp.com>",
        "References": "<20210927122650.30881-1-nipun.gupta@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH 06/11] net/dpaa2: add function to generate HW\n hash key",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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: Hemant Agrawal <hemant.agrawal@nxp.com>\n\nThis patch add support to generate the hash key in software\nequivalent to WRIOP key generation.\n\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n drivers/net/dpaa2/base/dpaa2_tlu_hash.c | 149 ++++++++++++++++++++++++\n drivers/net/dpaa2/meson.build           |   1 +\n drivers/net/dpaa2/rte_pmd_dpaa2.h       |  19 +++\n drivers/net/dpaa2/version.map           |   2 +\n 4 files changed, 171 insertions(+)\n create mode 100644 drivers/net/dpaa2/base/dpaa2_tlu_hash.c",
    "diff": "diff --git a/drivers/net/dpaa2/base/dpaa2_tlu_hash.c b/drivers/net/dpaa2/base/dpaa2_tlu_hash.c\nnew file mode 100644\nindex 0000000000..e92f4f03ed\n--- /dev/null\n+++ b/drivers/net/dpaa2/base/dpaa2_tlu_hash.c\n@@ -0,0 +1,149 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2021 NXP\n+ */\n+#include <stdio.h>\n+#include <inttypes.h>\n+#include <unistd.h>\n+#include <rte_pmd_dpaa2.h>\n+\n+static unsigned int sbox(unsigned int x)\n+{\n+\tunsigned int a, b, c, d;\n+\tunsigned int oa, ob, oc, od;\n+\n+\ta = x & 0x1;\n+\tb = (x >> 1) & 0x1;\n+\tc = (x >> 2) & 0x1;\n+\td = (x >> 3) & 0x1;\n+\n+\toa = ((a & ~b & ~c & d) | (~a & b) | (~a & ~c & ~d) | (b & c)) & 0x1;\n+\tob = ((a & ~b & d) | (~a & c & ~d) | (b & ~c)) & 0x1;\n+\toc = ((a & ~b & c) | (a & ~b & ~d) | (~a & b & ~d) | (~a & c & ~d) |\n+\t     (b & c & d)) & 0x1;\n+\tod = ((a & ~b & c) | (~a & b & ~c) | (a & b & ~d) | (~a & c & d)) & 0x1;\n+\n+\treturn ((od << 3) | (oc << 2) | (ob << 1) | oa);\n+}\n+\n+static unsigned int sbox_tbl[16];\n+\n+static int pbox_tbl[16] = {5, 9, 0, 13,\n+\t\t\t7, 2, 11, 14,\n+\t\t\t1, 4, 12, 8,\n+\t\t\t3, 15, 6, 10 };\n+\n+static unsigned int mix_tbl[8][16];\n+\n+static unsigned int stage(unsigned int input)\n+{\n+\tint sbox_out = 0;\n+\tint pbox_out = 0;\n+\n+\t// mix\n+\tinput ^= input >> 16; // xor lower\n+\tinput ^= input << 16; // move original lower to upper\n+\n+\t// printf(\"%08x\\n\",input);\n+\n+\tfor (int i = 0; i < 32; i += 4)// sbox stage\n+\t\tsbox_out |= (sbox_tbl[(input >> i) & 0xf]) << i;\n+\n+\t// permutation\n+\tfor (int i = 0; i < 16; i++)\n+\t\tpbox_out |= ((sbox_out >> i) & 0x10001) << pbox_tbl[i];\n+\n+\treturn pbox_out;\n+}\n+\n+static unsigned int fast_stage(unsigned int input)\n+{\n+\tint pbox_out = 0;\n+\n+\t// mix\n+\tinput ^= input >> 16; // xor lower\n+\tinput ^= input << 16; // move original lower to upper\n+\n+\tfor (int i = 0; i < 32; i += 4) // sbox stage\n+\t\tpbox_out |= mix_tbl[i >> 2][(input >> i) & 0xf];\n+\n+\treturn pbox_out;\n+}\n+\n+static unsigned int fast_hash32(unsigned int x)\n+{\n+\tfor (int i = 0; i < 4; i++)\n+\t\tx = fast_stage(x);\n+\treturn x;\n+}\n+\n+static unsigned int\n+byte_crc32(unsigned char data/* new byte for the crc calculation */,\n+\t   unsigned old_crc/* crc result of the last iteration */)\n+{\n+\tint i;\n+\tunsigned int crc, polynom = 0xedb88320;\n+\t/* the polynomial is built on the reversed version of\n+\t * the CRC polynomial with out the x64 element.\n+\t */\n+\n+\tcrc = old_crc;\n+\tfor (i = 0; i < 8; i++, data >>= 1)\n+\t\tcrc = (crc >> 1) ^ (((crc ^ data) & 0x1) ? polynom : 0);\n+\t\t/* xor with polynomial is lsb of crc^data is 1 */\n+\n+\treturn crc;\n+}\n+\n+static unsigned int crc32_table[256];\n+\n+static void init_crc32_table(void)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < 256; i++)\n+\t\tcrc32_table[i] = byte_crc32((unsigned char)i, 0LL);\n+}\n+\n+static unsigned int\n+crc32_string(unsigned char *data,\n+\t     int size, unsigned int old_crc)\n+{\n+\tunsigned int crc;\n+\n+\tcrc = old_crc;\n+\tfor (int i = 0; i < size; i++)\n+\t\tcrc = (crc >> 8) ^ crc32_table[(crc ^ data[i]) & 0xff];\n+\n+\treturn crc;\n+}\n+\n+static void hash_init(void)\n+{\n+\tinit_crc32_table();\n+\n+\tfor (int i = 0; i < 16; i++)\n+\t\tsbox_tbl[i] = sbox(i);\n+\n+\tfor (int i = 0; i < 32; i += 4)\n+\t\tfor (int j = 0; j < 16; j++) {\n+\t\t\t// (a,b)\n+\t\t\t// (b,a^b)=(X,Y)\n+\t\t\t// (X^Y,X)\n+\t\t\tunsigned int input = (0x88888888 ^ (8 << i)) | (j << i);\n+\n+\t\t\tinput ^= input << 16; // (X^Y,Y)\n+\t\t\tinput ^= input >> 16; // (X^Y,X)\n+\t\t\tmix_tbl[i >> 2][j] = stage(input);\n+\t\t\t//printf(\"aaa %08x\\n\", stage(input));\n+\t\t}\n+}\n+\n+uint32_t rte_pmd_dpaa2_get_tlu_hash(uint8_t *data, int size)\n+{\n+\tstatic int init;\n+\n+\tif (~init)\n+\t\thash_init();\n+\tinit = 1;\n+\treturn fast_hash32(crc32_string(data, size, 0x0));\n+}\ndiff --git a/drivers/net/dpaa2/meson.build b/drivers/net/dpaa2/meson.build\nindex 20eaf0b8e4..4a6397d09e 100644\n--- a/drivers/net/dpaa2/meson.build\n+++ b/drivers/net/dpaa2/meson.build\n@@ -20,6 +20,7 @@ sources = files(\n         'mc/dpkg.c',\n         'mc/dpdmux.c',\n         'mc/dpni.c',\n+\t'base/dpaa2_tlu_hash.c',\n )\n \n includes += include_directories('base', 'mc')\ndiff --git a/drivers/net/dpaa2/rte_pmd_dpaa2.h b/drivers/net/dpaa2/rte_pmd_dpaa2.h\nindex a68244c974..8ea42ee130 100644\n--- a/drivers/net/dpaa2/rte_pmd_dpaa2.h\n+++ b/drivers/net/dpaa2/rte_pmd_dpaa2.h\n@@ -82,4 +82,23 @@ __rte_experimental\n void\n rte_pmd_dpaa2_thread_init(void);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice\n+ *\n+ * Generate the DPAA2 WRIOP based hash value\n+ *\n+ * @param key\n+ *    Array of key data\n+ * @param size\n+ *    Size of the hash input key in bytes\n+ *\n+ * @return\n+ *   - 0 if successful.\n+ *   - Negative in case of failure.\n+ */\n+\n+__rte_experimental\n+uint32_t\n+rte_pmd_dpaa2_get_tlu_hash(uint8_t *key, int size);\n #endif /* _RTE_PMD_DPAA2_H */\ndiff --git a/drivers/net/dpaa2/version.map b/drivers/net/dpaa2/version.map\nindex f9786af7e4..2059fc5ae8 100644\n--- a/drivers/net/dpaa2/version.map\n+++ b/drivers/net/dpaa2/version.map\n@@ -10,6 +10,8 @@ DPDK_22 {\n EXPERIMENTAL {\n \tglobal:\n \n+\t# added in 21.11\n+\trte_pmd_dpaa2_get_tlu_hash;\n \t# added in 21.05\n \trte_pmd_dpaa2_mux_rx_frame_len;\n \t# added in 21.08\n",
    "prefixes": [
        "06/11"
    ]
}