get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 94725,
    "url": "https://patches.dpdk.org/api/patches/94725/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210623044702.4240-30-ndabilpuram@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210623044702.4240-30-ndabilpuram@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210623044702.4240-30-ndabilpuram@marvell.com",
    "date": "2021-06-23T04:46:29",
    "name": "[v4,29/62] net/cnxk: add Tx multi-segment version for cn10k",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "67bbdb77d636127f2e7b3514512b62e4e1ded691",
    "submitter": {
        "id": 1202,
        "url": "https://patches.dpdk.org/api/people/1202/?format=api",
        "name": "Nithin Dabilpuram",
        "email": "ndabilpuram@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "https://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210623044702.4240-30-ndabilpuram@marvell.com/mbox/",
    "series": [
        {
            "id": 17449,
            "url": "https://patches.dpdk.org/api/series/17449/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17449",
            "date": "2021-06-23T04:46:00",
            "name": "Marvell CNXK Ethdev Driver",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/17449/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/94725/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/94725/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 2083AA0C41;\n\tWed, 23 Jun 2021 06:50:46 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 928FF41136;\n\tWed, 23 Jun 2021 06:48:57 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 4484A41182\n for <dev@dpdk.org>; Wed, 23 Jun 2021 06:48:56 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 15N4k6fW025518 for <dev@dpdk.org>; Tue, 22 Jun 2021 21:48:55 -0700",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 39bptj1gps-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Tue, 22 Jun 2021 21:48:55 -0700",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Tue, 22 Jun 2021 21:48:53 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.18 via Frontend\n Transport; Tue, 22 Jun 2021 21:48:53 -0700",
            "from hyd1588t430.marvell.com (unknown [10.29.52.204])\n by maili.marvell.com (Postfix) with ESMTP id 858CA5B6936;\n Tue, 22 Jun 2021 21:48:50 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-type; s=pfpt0220; bh=9Ux4XyZXYBJHdcna2GVILdeqHZDvpAI7jZUZs6V9+og=;\n b=i3OUtuW+pKC4+AkFv8OSL7K34YbwIz4vXxIuoUk/hsOvl5Gl7Br0ZDhqoCVFcxGl2tSg\n ve3Q9GyTmmaYX/GnugWTAzbjwJsXFqprdkOY0kBlNqw2RhmTlyOVnTdKJQGsfZOSWu6/\n h106kVKAsvG1b2rOO+La6Q4nOUN4+uSF3cFKB9ATwTJ4e02wAsdsgkPq6hoLdBihpJQh\n FF8mXn0OGqM/Wy3M0d/U2HGIMi0IZ/KvkMvzZjWzfKfQ5CSaxfdm0tTTm75QZ2DgDyfo\n vZQeev6mq7K0jlf3e5wAixSnWdf7mWjtb7J2QAU8GHgcS4qBvY+wBmH3i710rId9Wkoa Fw==",
        "From": "Nithin Dabilpuram <ndabilpuram@marvell.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<jerinj@marvell.com>, <skori@marvell.com>, <skoteshwar@marvell.com>,\n <pbhagavatula@marvell.com>, <kirankumark@marvell.com>,\n <psatheesh@marvell.com>, <asekhar@marvell.com>, <hkalra@marvell.com>,\n \"Nithin Dabilpuram\" <ndabilpuram@marvell.com>",
        "Date": "Wed, 23 Jun 2021 10:16:29 +0530",
        "Message-ID": "<20210623044702.4240-30-ndabilpuram@marvell.com>",
        "X-Mailer": "git-send-email 2.8.4",
        "In-Reply-To": "<20210623044702.4240-1-ndabilpuram@marvell.com>",
        "References": "<20210306153404.10781-1-ndabilpuram@marvell.com>\n <20210623044702.4240-1-ndabilpuram@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "s18y1fi5CzaFOoaZdQpnreZEctgYxhyR",
        "X-Proofpoint-GUID": "s18y1fi5CzaFOoaZdQpnreZEctgYxhyR",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.391, 18.0.790\n definitions=2021-06-23_01:2021-06-22,\n 2021-06-23 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v4 29/62] net/cnxk: add Tx multi-segment version\n for cn10k",
        "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": "Add Tx burst multi-segment version for CN10K.\n\nSigned-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>\nSigned-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>\n---\n drivers/net/cnxk/cn10k_tx.c      |  18 ++++-\n drivers/net/cnxk/cn10k_tx.h      | 171 +++++++++++++++++++++++++++++++++++++++\n drivers/net/cnxk/cn10k_tx_mseg.c |  25 ++++++\n drivers/net/cnxk/meson.build     |   3 +-\n 4 files changed, 215 insertions(+), 2 deletions(-)\n create mode 100644 drivers/net/cnxk/cn10k_tx_mseg.c",
    "diff": "diff --git a/drivers/net/cnxk/cn10k_tx.c b/drivers/net/cnxk/cn10k_tx.c\nindex 13c605f..9803002 100644\n--- a/drivers/net/cnxk/cn10k_tx.c\n+++ b/drivers/net/cnxk/cn10k_tx.c\n@@ -40,6 +40,8 @@ pick_tx_func(struct rte_eth_dev *eth_dev,\n void\n cn10k_eth_set_tx_function(struct rte_eth_dev *eth_dev)\n {\n+\tstruct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);\n+\n \tconst eth_tx_burst_t nix_eth_tx_burst[2][2][2][2][2] = {\n #define T(name, f4, f3, f2, f1, f0, sz, flags)                         \\\n \t[f4][f3][f2][f1][f0] = cn10k_nix_xmit_pkts_##name,\n@@ -48,7 +50,21 @@ cn10k_eth_set_tx_function(struct rte_eth_dev *eth_dev)\n #undef T\n \t};\n \n-\tpick_tx_func(eth_dev, nix_eth_tx_burst);\n+\tconst eth_tx_burst_t nix_eth_tx_burst_mseg[2][2][2][2][2] = {\n+#define T(name, f4, f3, f2, f1, f0, sz, flags)\t\t\t\t\\\n+\t[f4][f3][f2][f1][f0] = cn10k_nix_xmit_pkts_mseg_##name,\n+\n+\t\tNIX_TX_FASTPATH_MODES\n+#undef T\n+\t};\n+\n+\tif (dev->scalar_ena ||\n+\t    (dev->tx_offload_flags &\n+\t     (NIX_TX_OFFLOAD_VLAN_QINQ_F | NIX_TX_OFFLOAD_TSO_F)))\n+\t\tpick_tx_func(eth_dev, nix_eth_tx_burst);\n+\n+\tif (dev->tx_offloads & DEV_TX_OFFLOAD_MULTI_SEGS)\n+\t\tpick_tx_func(eth_dev, nix_eth_tx_burst_mseg);\n \n \trte_mb();\n }\ndiff --git a/drivers/net/cnxk/cn10k_tx.h b/drivers/net/cnxk/cn10k_tx.h\nindex c54fbfe..63e9848 100644\n--- a/drivers/net/cnxk/cn10k_tx.h\n+++ b/drivers/net/cnxk/cn10k_tx.h\n@@ -339,6 +339,77 @@ cn10k_nix_xmit_prepare(struct rte_mbuf *m, uint64_t *cmd, uintptr_t lmt_addr,\n }\n \n static __rte_always_inline uint16_t\n+cn10k_nix_prepare_mseg(struct rte_mbuf *m, uint64_t *cmd, const uint16_t flags)\n+{\n+\tstruct nix_send_hdr_s *send_hdr;\n+\tunion nix_send_sg_s *sg;\n+\tstruct rte_mbuf *m_next;\n+\tuint64_t *slist, sg_u;\n+\tuint64_t nb_segs;\n+\tuint64_t segdw;\n+\tuint8_t off, i;\n+\n+\tsend_hdr = (struct nix_send_hdr_s *)cmd;\n+\tsend_hdr->w0.total = m->pkt_len;\n+\tsend_hdr->w0.aura = roc_npa_aura_handle_to_aura(m->pool->pool_id);\n+\n+\tif (flags & NIX_TX_NEED_EXT_HDR)\n+\t\toff = 2;\n+\telse\n+\t\toff = 0;\n+\n+\tsg = (union nix_send_sg_s *)&cmd[2 + off];\n+\t/* Clear sg->u header before use */\n+\tsg->u &= 0xFC00000000000000;\n+\tsg_u = sg->u;\n+\tslist = &cmd[3 + off];\n+\n+\ti = 0;\n+\tnb_segs = m->nb_segs;\n+\n+\t/* Fill mbuf segments */\n+\tdo {\n+\t\tm_next = m->next;\n+\t\tsg_u = sg_u | ((uint64_t)m->data_len << (i << 4));\n+\t\t*slist = rte_mbuf_data_iova(m);\n+\t\t/* Set invert df if buffer is not to be freed by H/W */\n+\t\tif (flags & NIX_TX_OFFLOAD_MBUF_NOFF_F)\n+\t\t\tsg_u |= (cnxk_nix_prefree_seg(m) << (i + 55));\n+\t\t\t/* Mark mempool object as \"put\" since it is freed by NIX\n+\t\t\t */\n+#ifdef RTE_LIBRTE_MEMPOOL_DEBUG\n+\t\tif (!(sg_u & (1ULL << (i + 55))))\n+\t\t\t__mempool_check_cookies(m->pool, (void **)&m, 1, 0);\n+#endif\n+\t\tslist++;\n+\t\ti++;\n+\t\tnb_segs--;\n+\t\tif (i > 2 && nb_segs) {\n+\t\t\ti = 0;\n+\t\t\t/* Next SG subdesc */\n+\t\t\t*(uint64_t *)slist = sg_u & 0xFC00000000000000;\n+\t\t\tsg->u = sg_u;\n+\t\t\tsg->segs = 3;\n+\t\t\tsg = (union nix_send_sg_s *)slist;\n+\t\t\tsg_u = sg->u;\n+\t\t\tslist++;\n+\t\t}\n+\t\tm = m_next;\n+\t} while (nb_segs);\n+\n+\tsg->u = sg_u;\n+\tsg->segs = i;\n+\tsegdw = (uint64_t *)slist - (uint64_t *)&cmd[2 + off];\n+\t/* Roundup extra dwords to multiple of 2 */\n+\tsegdw = (segdw >> 1) + (segdw & 0x1);\n+\t/* Default dwords */\n+\tsegdw += (off >> 1) + 1;\n+\tsend_hdr->w0.sizem1 = segdw - 1;\n+\n+\treturn segdw;\n+}\n+\n+static __rte_always_inline uint16_t\n cn10k_nix_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t pkts,\n \t\t    uint64_t *cmd, const uint16_t flags)\n {\n@@ -421,6 +492,103 @@ cn10k_nix_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t pkts,\n \treturn pkts;\n }\n \n+static __rte_always_inline uint16_t\n+cn10k_nix_xmit_pkts_mseg(void *tx_queue, struct rte_mbuf **tx_pkts,\n+\t\t\t uint16_t pkts, uint64_t *cmd, const uint16_t flags)\n+{\n+\tstruct cn10k_eth_txq *txq = tx_queue;\n+\tuintptr_t pa0, pa1, lmt_addr = txq->lmt_base;\n+\tconst rte_iova_t io_addr = txq->io_addr;\n+\tuint16_t segdw, lmt_id, burst, left, i;\n+\tuint64_t data0, data1;\n+\tuint64_t lso_tun_fmt;\n+\t__uint128_t data128;\n+\tuint16_t shft;\n+\n+\tNIX_XMIT_FC_OR_RETURN(txq, pkts);\n+\n+\tcn10k_nix_tx_skeleton(txq, cmd, flags);\n+\n+\t/* Reduce the cached count */\n+\ttxq->fc_cache_pkts -= pkts;\n+\n+\tif (flags & NIX_TX_OFFLOAD_TSO_F)\n+\t\tlso_tun_fmt = txq->lso_tun_fmt;\n+\n+\t/* Get LMT base address and LMT ID as lcore id */\n+\tROC_LMT_BASE_ID_GET(lmt_addr, lmt_id);\n+\tleft = pkts;\n+again:\n+\tburst = left > 32 ? 32 : left;\n+\tshft = 16;\n+\tdata128 = 0;\n+\tfor (i = 0; i < burst; i++) {\n+\t\t/* Perform header writes for TSO, barrier at\n+\t\t * lmt steorl will suffice.\n+\t\t */\n+\t\tif (flags & NIX_TX_OFFLOAD_TSO_F)\n+\t\t\tcn10k_nix_xmit_prepare_tso(tx_pkts[i], flags);\n+\n+\t\tcn10k_nix_xmit_prepare(tx_pkts[i], cmd, lmt_addr, flags,\n+\t\t\t\t       lso_tun_fmt);\n+\t\t/* Store sg list directly on lmt line */\n+\t\tsegdw = cn10k_nix_prepare_mseg(tx_pkts[i], (uint64_t *)lmt_addr,\n+\t\t\t\t\t       flags);\n+\t\tlmt_addr += (1ULL << ROC_LMT_LINE_SIZE_LOG2);\n+\t\tdata128 |= (((__uint128_t)(segdw - 1)) << shft);\n+\t\tshft += 3;\n+\t}\n+\n+\tdata0 = (uint64_t)data128;\n+\tdata1 = (uint64_t)(data128 >> 64);\n+\t/* Make data0 similar to data1 */\n+\tdata0 >>= 16;\n+\t/* Trigger LMTST */\n+\tif (burst > 16) {\n+\t\tpa0 = io_addr | (data0 & 0x7) << 4;\n+\t\tdata0 &= ~0x7ULL;\n+\t\t/* Move lmtst1..15 sz to bits 63:19 */\n+\t\tdata0 <<= 16;\n+\t\tdata0 |= (15ULL << 12);\n+\t\tdata0 |= (uint64_t)lmt_id;\n+\n+\t\t/* STEOR0 */\n+\t\troc_lmt_submit_steorl(data0, pa0);\n+\n+\t\tpa1 = io_addr | (data1 & 0x7) << 4;\n+\t\tdata1 &= ~0x7ULL;\n+\t\tdata1 <<= 16;\n+\t\tdata1 |= ((uint64_t)(burst - 17)) << 12;\n+\t\tdata1 |= (uint64_t)(lmt_id + 16);\n+\n+\t\t/* STEOR1 */\n+\t\troc_lmt_submit_steorl(data1, pa1);\n+\t} else if (burst) {\n+\t\tpa0 = io_addr | (data0 & 0x7) << 4;\n+\t\tdata0 &= ~0x7ULL;\n+\t\t/* Move lmtst1..15 sz to bits 63:19 */\n+\t\tdata0 <<= 16;\n+\t\tdata0 |= ((burst - 1) << 12);\n+\t\tdata0 |= (uint64_t)lmt_id;\n+\n+\t\t/* STEOR0 */\n+\t\troc_lmt_submit_steorl(data0, pa0);\n+\t}\n+\n+\tleft -= burst;\n+\trte_io_wmb();\n+\tif (left) {\n+\t\t/* Start processing another burst */\n+\t\ttx_pkts += burst;\n+\t\t/* Reset lmt base addr */\n+\t\tlmt_addr -= (1ULL << ROC_LMT_LINE_SIZE_LOG2);\n+\t\tlmt_addr &= (~(BIT_ULL(ROC_LMT_BASE_PER_CORE_LOG2) - 1));\n+\t\tgoto again;\n+\t}\n+\n+\treturn pkts;\n+}\n+\n #define L3L4CSUM_F   NIX_TX_OFFLOAD_L3_L4_CSUM_F\n #define OL3OL4CSUM_F NIX_TX_OFFLOAD_OL3_OL4_CSUM_F\n #define VLAN_F\t     NIX_TX_OFFLOAD_VLAN_QINQ_F\n@@ -496,6 +664,9 @@ T(tso_noff_vlan_ol3ol4csum_l3l4csum,\t1, 1, 1, 1, 1,\t6,\t\t\\\n \n #define T(name, f4, f3, f2, f1, f0, sz, flags)                                 \\\n \tuint16_t __rte_noinline __rte_hot cn10k_nix_xmit_pkts_##name(          \\\n+\t\tvoid *tx_queue, struct rte_mbuf **tx_pkts, uint16_t pkts);     \\\n+\t\t\t\t\t\t\t\t\t       \\\n+\tuint16_t __rte_noinline __rte_hot cn10k_nix_xmit_pkts_mseg_##name(     \\\n \t\tvoid *tx_queue, struct rte_mbuf **tx_pkts, uint16_t pkts);\n \n NIX_TX_FASTPATH_MODES\ndiff --git a/drivers/net/cnxk/cn10k_tx_mseg.c b/drivers/net/cnxk/cn10k_tx_mseg.c\nnew file mode 100644\nindex 0000000..6ae6907\n--- /dev/null\n+++ b/drivers/net/cnxk/cn10k_tx_mseg.c\n@@ -0,0 +1,25 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#include \"cn10k_ethdev.h\"\n+#include \"cn10k_tx.h\"\n+\n+#define T(name, f4, f3, f2, f1, f0, sz, flags)\t\t\t\t       \\\n+\tuint16_t __rte_noinline __rte_hot\t\t\t\t       \\\n+\t\tcn10k_nix_xmit_pkts_mseg_##name(void *tx_queue,                \\\n+\t\t\t\t\t\tstruct rte_mbuf **tx_pkts,     \\\n+\t\t\t\t\t\tuint16_t pkts)                 \\\n+\t{                                                                      \\\n+\t\tuint64_t cmd[(sz)];                                            \\\n+\t\t\t\t\t\t\t\t\t       \\\n+\t\t/* For TSO inner checksum is a must */                         \\\n+\t\tif (((flags) & NIX_TX_OFFLOAD_TSO_F) &&\t\t\t       \\\n+\t\t    !((flags) & NIX_TX_OFFLOAD_L3_L4_CSUM_F))\t\t       \\\n+\t\t\treturn 0;                                              \\\n+\t\treturn cn10k_nix_xmit_pkts_mseg(tx_queue, tx_pkts, pkts, cmd,  \\\n+\t\t\t\t\t\t(flags) | NIX_TX_MULTI_SEG_F); \\\n+\t}\n+\n+NIX_TX_FASTPATH_MODES\n+#undef T\ndiff --git a/drivers/net/cnxk/meson.build b/drivers/net/cnxk/meson.build\nindex b1ba824..21e5676 100644\n--- a/drivers/net/cnxk/meson.build\n+++ b/drivers/net/cnxk/meson.build\n@@ -27,7 +27,8 @@ sources += files('cn10k_ethdev.c',\n \t\t 'cn10k_rx.c',\n \t\t 'cn10k_rx_mseg.c',\n \t\t 'cn10k_rx_vec.c',\n-\t\t 'cn10k_tx.c')\n+\t\t 'cn10k_tx.c',\n+\t\t 'cn10k_tx_mseg.c')\n \n deps += ['bus_pci', 'cryptodev', 'eventdev', 'security']\n deps += ['common_cnxk', 'mempool_cnxk']\n",
    "prefixes": [
        "v4",
        "29/62"
    ]
}