From patchwork Fri Dec 15 13:08:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Kumar Kori X-Patchwork-Id: 32317 X-Patchwork-Delegate: jerinj@marvell.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 89A8B1B00F; Fri, 15 Dec 2017 13:40:32 +0100 (CET) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0063.outbound.protection.outlook.com [104.47.33.63]) by dpdk.org (Postfix) with ESMTP id 6A1BE1B00B for ; Fri, 15 Dec 2017 13:40:30 +0100 (CET) Received: from BN6PR03CA0076.namprd03.prod.outlook.com (10.164.122.142) by BN3PR03MB2354.namprd03.prod.outlook.com (10.166.74.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.302.9; Fri, 15 Dec 2017 12:40:29 +0000 Received: from BN1BFFO11FD004.protection.gbl (2a01:111:f400:7c10::1:160) by BN6PR03CA0076.outlook.office365.com (2603:10b6:405:6f::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.323.15 via Frontend Transport; Fri, 15 Dec 2017 12:40:29 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1BFFO11FD004.mail.protection.outlook.com (10.58.144.67) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Fri, 15 Dec 2017 12:40:20 +0000 Received: from sunil-OptiPlex-790.ap.freescale.net (sunil-OptiPlex-790.ap.freescale.net [10.232.132.53]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBFCeOFw004484; Fri, 15 Dec 2017 05:40:27 -0700 From: Sunil Kumar Kori To: CC: , Date: Fri, 15 Dec 2017 18:38:23 +0530 Message-ID: <20171215130828.14218-2-sunil.kori@nxp.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20171215130828.14218-1-sunil.kori@nxp.com> References: <20171215130828.14218-1-sunil.kori@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131578152204590118; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(7966004)(39860400002)(396003)(39380400002)(346002)(376002)(2980300002)(1110001)(1109001)(339900001)(189003)(199004)(81156014)(50226002)(8656006)(5660300001)(50466002)(105606002)(48376002)(305945005)(356003)(97736004)(68736007)(59450400001)(77096006)(81166006)(51416003)(8676002)(76176011)(8936002)(86362001)(575784001)(85426001)(316002)(47776003)(54906003)(16586007)(36756003)(1076002)(2906002)(104016004)(53936002)(2351001)(106466001)(498600001)(6916009)(4326008)(6666003)(2950100002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR03MB2354; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD004; 1:AeOucYR0xqIQM2BcQwFMQfPm5GV0TpwBpf7Rco0JK3NQ/RnrhOYwzB/8dSDDVNuRXeWFjCMXU5xsJbGYVzpXab7KLOUGsh1A91hf6X2QfNPupOBRsnI0dpefK8UqWBEQ MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d55728bd-d450-4767-5c26-08d543b900d2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603307); SRVR:BN3PR03MB2354; X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2354; 3:o5ObIwp83eZGVficXi8Bfzp8ggAOa/K6z4auIZ/QLTUOJYIc3viboSM8e2CHYvsfQcb7EjJ4D2iCZ11ZIjvqNaAPQiqJE0HmiA/QwsQqPMc1+dktFA85b+2w3D8TiMG7/nsmIcJJJTnZ8IduI5MSBA1bM9xIoLaCLW41Gg6393PjLi+wQA8kEse3mr7Yy5y2JlPIJW60UxaFdJINbDuXVj3caI6gPi0HHbMKOcQOHdYsgviNtlqs1WfKzHdD3bstEPUeYYegoImmdSgwEP6fN1TKaPk+eR3FHd5Jfd0UiULDFXhMJNFh01yuNn6jsNq2PKa4ZPKbnmpkXsJo4jqxzUCFI9WjGySEV177+aQn5Ec=; 25:nTHRIL8ZzhsZLs3EJKwVJE21xvisGqH9jCAigCJFbjsn0fp3a2fjeJQkpZFJ6dEedjWXJ0Z3m1m6n7xw8563PGs+8lSLpfoFF17kB7JC0l/fE2qHO5z/ouop6J38NlLYtZaP/gjGDiPin/JwxBalmutlL69SwRPNgeEIp71KEmFL3beBOinnJ2H8JdHw+uF6rgQQ5PNZrOzNDu2gZ4Ll+cmqimfXXwub9V/uYQKLeWeyoCk2GuAdNFLZ62s6yEkYW4O9ML+2PmAaMoVkT1t7wXSxXIlv8AR7X+PTdoHKFm4NTGelPYcVtaG8Xc+wr9kF+O4XtGpruk1DtOcKM4rK5A== X-MS-TrafficTypeDiagnostic: BN3PR03MB2354: X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2354; 31:uEYssXqDV7fGndB8aSU2H/u8qbL9mMS5wj1HU8bxyfcKEXYfdR32dUCWkW1Er83WQarmyqnFiJkG8bxANS+qn10Y00bopx811ZEKwu5GUwcRxRuiwHKsLAtqGTsbJ7yTRjzLfsAKg8hh5PwB4OHP7wpoK9if01AwWKex1dDwKskwVkXE+9e/rfog/6CSCe/X0Lay9u0G68G66foUL5PN4lZ7F+KjgxOU1aHBingBErI=; 4:fBBJpGBryiPRH8QYUADj+4WKmx33KBB+Cx+8gZ5swdeactBy6gHOOzgrNbvy6R5lkC+GQ0hgd9DThg0NgX5FzPSmUFSL9B5bvb+l1JHxKQcSlpXpWjj6Xz8j0MHdjaZDXffV5hTeDGC3iZXlxB4Ev+FVIFrLMyb3R+yxS7GNuHVqu4DwMRKF2Kl/d77ZG59LUg2e6p8Go5ODXm+hGwA0XEhiUfEzl+Ft5eNI0aJLXRTa/VIpGaFZaKY9Z9Os3htZiZlpJWrjx+osM44AJreGHHp3FhY+KPb/0bDFSeHRmVNMI1yvIzW0Wb2/DB99P5DUQEfUIdVoEh2+jEqepANl0gGIGih2mlrRc+JlgEZ0CDvCbzezcT0ITmpmX06K7X3H X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(227817650892897)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(8121501046)(5005006)(3231023)(3002001)(93006095)(93001095)(10201501046)(6055026)(6096035)(20161123559100)(20161123565025)(20161123561025)(20161123556025)(20161123563025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(201708071742011); SRVR:BN3PR03MB2354; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:BN3PR03MB2354; X-Forefront-PRVS: 05220145DE X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR03MB2354; 23:EcuYmef+ldNI1eCfZ8UfcULbSIBZdEBvMLo3uD+ZN?= 4vMe0mX9/UM/cWFYuhNOaNwM1QUgmr5uVEkfHRruwIjIjHzjIyX4ELXFxF8RVVRyboVKM8ac7QNVlId6EaLb4OodMjoFngg1RcyeWHzuDBwt1x1tHIuMxwtSlhpAUgAjPrcZqLtdDg6JK2sN7RVg93urmM9bnEjkMEdnun111GLNAoOYR0wJZgkrUQgg92K0CrrceHYfe/UkrPJD5MiaZchsT303KeYGXYG/QwwSBCCUSWXIMRzJ1HebDfIMV1Wv/SSAtsvdm1uWoHJLeRJZ8J48dz0wfncOE1lWWbHTieR+3Y476zajEkFGNUzmsIVa2o+iyqg94K8Uad8tbKMmYCUYRh7EpfOCMhGLhDxr58i0TPHA98HiVkOcF64dibvBJuquM92Vnt5Syqkk6Z0LE/54EhWFHGaK0HF5pTcPyM+nb3HzDppN3Rtasp0OIWcpeU+Ebv9ZAgsnPeNisl1Qye6QbaqoseaWYXiGx4sTkUL0hyVh3jwlMsCfk8e2vDBHNioLGPtYSHFV8X/2d1sMkCjqzVDZOIg/XutnP7r3Nv9Q/HuuVCcyk2d3Gs0sUTdfjkJ1i4cJWXbBosbtBx4xQ6rdDvnmFT7eUOd4kF5OXQ9Yk3sTAZDyaH3JVi4hvnZu5t3C3w6yRbiqCN1uG7A3KhT24Pn0ox1cexOAynbqeWGGXSk1rf3PK4gtezbLi2y6hcj98zOxrQTUcokE/bADDcfYxRJR8jmu9ydIQlPIBBITRvE9TY8Ir3oVJeLHY7Yf+qWIi8TxpbN3n8mCRR6pGWNuof7O5hlWG4nQZa7+JluP4g5ooVV/t8lJTZ2WYsJN58JttKnCydNSsDcDwqNq3ChKBMaeuIGNRwQbz0rMHoUSjIgL0alMbFoQaaVYxXWke4YwjFVuFydaWjxOpwibXjnmN/scFrKOt1U5hugUV2if2GiXsNZcCsSko+Qh+VtNCAQrs4FzZuAx18iu2eHv4fTbDrZu6s7I+wVFM25BJuqpSzuKi2gh3f9k6Frr6fObBTQbN3kKH8O29s3VMqaETqonKN2p4M4CXsoi4GEEkzB3gHTIQxxIyrcvHgsphKmI0KE803azHt/KcL7UOzoO7DyuPJ+pyq2pMeyE3LpGtKpHQ== X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2354; 6:2JV0LeQK4Udbz2rNdrqLpC0VX7ho7Svg/S0uOFR0RsrZDgpYa/U0H9c0UO9A8lpoOOfKez6YLj8ZWRtGXzmxD5cPHvR6ZQRAMLtk4cnMGuMoJ2q32M64WKLTGhg6JRNE1484kyHAcJ5TBXZR0phtox/nr6GT6AP+x1o8xb9eXYyTb1SRHEewm+EHxj1TldtJs35jfyTlNq5KW7tklBzNnsh5bT/d9jM+7rFPrt2Q++GTSR5V+1sJHKumXelpgyWdx0UYx0xKaZKwcCbtY/9HycSc4rhu17K0hEZB45022fFUQyvw8M3s/iQ+n7iigkPG+nd56p9Vh1MbZ8/23Mka088Oj1Fq3bluG0f5m6BKl+o=; 5:rsj2jvUzM2XCe3BJPnPwVVX+O+52kb6V51t+hBMNsW6mTHwoOxXyoyKtBxPJoRh7449cgs8kLFTnEnA2EemkTrBWEG3Ai0NF5BFD9g1RdtdqPk+Pb2oEJ5MP5tqbUa8IE3oR5JOrYi0hRl6nlti79Noi6I9lOH51MzmZFSE8k7o=; 24:NxkPwjOnek7RBI0N8G1j3xZL2ttbMyncv2JctjyFOjJiaPpqNtC4quIsP5oFTcp948EgNgOxHGSZZyOiqJju1EIdcywUToVgc71kcM4wwWo=; 7:+KUjfzevERaSQyBmWULBdT8tSSYYb1IpmRz+I0dZp+jIJA1LrZoDAOtci5g3tAdAMGWqtKlvgWTralegcTQuQZXQoO5o9vq6Vx5irwI1D+G0g/9S+LLITZMPv8r0GkeNzI8qpERGrPlKsTwOHlyXDauVl+tMwXr9h9FEGmlDG6d0DFqwL4pfGhV0x2CaqvvAICWfrw9+of5cybVcnCObHjBjEK5LS0Y1o17tFUbrotYjfXCp1B0i6iW1tQ+JloKZ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Dec 2017 12:40:20.2874 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d55728bd-d450-4767-5c26-08d543b900d2 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB2354 Subject: [dpdk-dev] [PATCH 1/6] bus/dpaa: added event dequeue and consumption support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" To receive events from given event port, corresponding function needs to be added which receives events from portal. Also added function to consume received events based on entry index. Signed-off-by: Sunil Kumar Kori --- drivers/bus/dpaa/base/qbman/qman.c | 90 +++++++++++++++++++++++++++++-- drivers/bus/dpaa/dpaa_bus.c | 1 + drivers/bus/dpaa/include/fsl_qman.h | 26 +++++++-- drivers/bus/dpaa/rte_bus_dpaa_version.map | 5 ++ drivers/bus/dpaa/rte_dpaa_bus.h | 14 +++++ drivers/net/dpaa/dpaa_rxtx.c | 1 + 6 files changed, 128 insertions(+), 9 deletions(-) diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c index 42d509d..f39e618 100644 --- a/drivers/bus/dpaa/base/qbman/qman.c +++ b/drivers/bus/dpaa/base/qbman/qman.c @@ -41,6 +41,7 @@ #include "qman.h" #include #include +#include /* Compilation constants */ #define DQRR_MAXFILL 15 @@ -1144,6 +1145,74 @@ unsigned int qman_portal_poll_rx(unsigned int poll_limit, return limit; } +u32 qman_portal_dequeue(struct rte_event ev[], unsigned int poll_limit, + void **bufs) +{ + const struct qm_dqrr_entry *dq; + struct qman_fq *fq; + enum qman_cb_dqrr_result res; + unsigned int limit = 0; + struct qman_portal *p = get_affine_portal(); +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + struct qm_dqrr_entry *shadow; +#endif + unsigned int rx_number = 0; + + do { + qm_dqrr_pvb_update(&p->p); + dq = qm_dqrr_current(&p->p); + if (!dq) + break; +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + /* + * If running on an LE system the fields of the + * dequeue entry must be swapper. Because the + * QMan HW will ignore writes the DQRR entry is + * copied and the index stored within the copy + */ + shadow = &p->shadow_dqrr[DQRR_PTR2IDX(dq)]; + *shadow = *dq; + dq = shadow; + shadow->fqid = be32_to_cpu(shadow->fqid); + shadow->contextB = be32_to_cpu(shadow->contextB); + shadow->seqnum = be16_to_cpu(shadow->seqnum); + hw_fd_to_cpu(&shadow->fd); +#endif + + /* SDQCR: context_b points to the FQ */ +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + fq = get_fq_table_entry(dq->contextB); +#else + fq = (void *)(uintptr_t)dq->contextB; +#endif + /* Now let the callback do its stuff */ + res = fq->cb.dqrr_dpdk_cb(&ev[rx_number], p, fq, + dq, &bufs[rx_number]); + rx_number++; + /* Interpret 'dq' from a driver perspective. */ + /* + * Parking isn't possible unless HELDACTIVE was set. NB, + * FORCEELIGIBLE implies HELDACTIVE, so we only need to + * check for HELDACTIVE to cover both. + */ + DPAA_ASSERT((dq->stat & QM_DQRR_STAT_FQ_HELDACTIVE) || + (res != qman_cb_dqrr_park)); + if (res != qman_cb_dqrr_defer) + qm_dqrr_cdc_consume_1ptr(&p->p, dq, + res == qman_cb_dqrr_park); + /* Move forward */ + qm_dqrr_next(&p->p); + /* + * Entry processed and consumed, increment our counter. The + * callback can request that we exit after consuming the + * entry, and we also exit if we reach our processing limit, + * so loop back only if neither of these conditions is met. + */ + } while (++limit < poll_limit); + + return limit; +} + struct qm_dqrr_entry *qman_dequeue(struct qman_fq *fq) { struct qman_portal *p = get_affine_portal(); @@ -1262,13 +1331,20 @@ u32 qman_static_dequeue_get(struct qman_portal *qp) return p->sdqcr; } -void qman_dca(struct qm_dqrr_entry *dq, int park_request) +void qman_dca(const struct qm_dqrr_entry *dq, int park_request) { struct qman_portal *p = get_affine_portal(); qm_dqrr_cdc_consume_1ptr(&p->p, dq, park_request); } +void qman_dca_index(u8 index, int park_request) +{ + struct qman_portal *p = get_affine_portal(); + + qm_dqrr_cdc_consume_1(&p->p, index, park_request); +} + /* Frame queue API */ static const char *mcr_result_str(u8 result) { @@ -2116,8 +2192,8 @@ int qman_enqueue(struct qman_fq *fq, const struct qm_fd *fd, u32 flags) } int qman_enqueue_multi(struct qman_fq *fq, - const struct qm_fd *fd, - int frames_to_send) + const struct qm_fd *fd, u32 *flags, + int frames_to_send) { struct qman_portal *p = get_affine_portal(); struct qm_portal *portal = &p->p; @@ -2125,7 +2201,7 @@ int qman_enqueue_multi(struct qman_fq *fq, register struct qm_eqcr *eqcr = &portal->eqcr; struct qm_eqcr_entry *eq = eqcr->cursor, *prev_eq; - u8 i, diff, old_ci, sent = 0; + u8 i = 0, diff, old_ci, sent = 0; /* Update the available entries if no entry is free */ if (!eqcr->available) { @@ -2149,7 +2225,11 @@ int qman_enqueue_multi(struct qman_fq *fq, eq->fd.addr = cpu_to_be40(fd->addr); eq->fd.status = cpu_to_be32(fd->status); eq->fd.opaque = cpu_to_be32(fd->opaque); - + if (flags[i] & QMAN_ENQUEUE_FLAG_DCA) { + eq->dca = QM_EQCR_DCA_ENABLE | + ((flags[i] >> 8) & QM_EQCR_DCA_IDXMASK); + } + i++; eq = (void *)((unsigned long)(eq + 1) & (~(unsigned long)(QM_EQCR_SIZE << 6))); eqcr->available--; diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 8d74643..01b332a 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -80,6 +80,7 @@ pthread_key_t dpaa_portal_key; unsigned int dpaa_svr_family; RTE_DEFINE_PER_LCORE(bool, _dpaa_io); +RTE_DEFINE_PER_LCORE(struct dpaa_portal_dqrr, held_bufs); static inline void dpaa_add_to_device_list(struct rte_dpaa_device *dev) diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h index 7ec07ee..145c1c1 100644 --- a/drivers/bus/dpaa/include/fsl_qman.h +++ b/drivers/bus/dpaa/include/fsl_qman.h @@ -45,6 +45,7 @@ extern "C" { #endif #include +#include /* FQ lookups (turn this on for 64bit user-space) */ #if (__WORDSIZE == 64) @@ -1239,6 +1240,7 @@ struct qman_fq { /* DPDK Interface */ void *dpaa_intf; + struct rte_event ev; /* affined portal in case of static queue */ struct qman_portal *qp; @@ -1329,6 +1331,9 @@ struct qman_cgr { */ int qman_get_portal_index(void); +u32 qman_portal_dequeue(struct rte_event ev[], unsigned int poll_limit, + void **bufs); + /** * qman_affine_channel - return the channel ID of an portal * @cpu: the cpu whose affine portal is the subject of the query @@ -1462,7 +1467,21 @@ u32 qman_static_dequeue_get(struct qman_portal *qp); * function must be called from the same CPU as that which processed the DQRR * entry in the first place. */ -void qman_dca(struct qm_dqrr_entry *dq, int park_request); +void qman_dca(const struct qm_dqrr_entry *dq, int park_request); + +/** + * qman_dca_index - Perform a Discrete Consumption Acknowledgment + * @index: the DQRR index to be consumed + * @park_request: indicates whether the held-active @fq should be parked + * + * Only allowed in DCA-mode portals, for DQRR entries whose handler callback had + * previously returned 'qman_cb_dqrr_defer'. NB, as with the other APIs, this + * does not take a 'portal' argument but implies the core affine portal from the + * cpu that is currently executing the function. For reasons of locking, this + * function must be called from the same CPU as that which processed the DQRR + * entry in the first place. + */ +void qman_dca_index(u8 index, int park_request); /** * qman_eqcr_is_empty - Determine if portal's EQCR is empty @@ -1730,9 +1749,8 @@ int qman_volatile_dequeue(struct qman_fq *fq, u32 flags, u32 vdqcr); */ int qman_enqueue(struct qman_fq *fq, const struct qm_fd *fd, u32 flags); -int qman_enqueue_multi(struct qman_fq *fq, - const struct qm_fd *fd, - int frames_to_send); +int qman_enqueue_multi(struct qman_fq *fq, const struct qm_fd *fd, u32 *flags, + int frames_to_send); typedef int (*qman_cb_precommit) (void *arg); diff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map index 460cfbf..afc40bc 100644 --- a/drivers/bus/dpaa/rte_bus_dpaa_version.map +++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map @@ -69,14 +69,19 @@ DPDK_18.02 { global: dpaa_svr_family; + per_lcore_held_bufs; + qm_channel_pool1; qman_alloc_cgrid_range; qman_alloc_pool_range; qman_create_cgr; + qman_dca_index; qman_delete_cgr; qman_modify_cgr; + qman_portal_dequeue; qman_portal_poll_rx; qman_query_fq_frm_cnt; qman_release_cgrid_range; + qman_static_dequeue_add; rte_dpaa_portal_fq_close; rte_dpaa_portal_fq_init; diff --git a/drivers/bus/dpaa/rte_dpaa_bus.h b/drivers/bus/dpaa/rte_dpaa_bus.h index b0f7d48..6aa9e60 100644 --- a/drivers/bus/dpaa/rte_dpaa_bus.h +++ b/drivers/bus/dpaa/rte_dpaa_bus.h @@ -181,6 +181,20 @@ static void dpaainitfn_ ##nm(void) \ } \ RTE_PMD_EXPORT_NAME(nm, __COUNTER__) +/* Create storage for dqrr entries per lcore */ +#define DPAA_PORTAL_DEQUEUE_DEPTH 16 +struct dpaa_portal_dqrr { + void *mbuf[DPAA_PORTAL_DEQUEUE_DEPTH]; + uint64_t dqrr_held; + uint8_t dqrr_size; +}; + +RTE_DECLARE_PER_LCORE(struct dpaa_portal_dqrr, held_bufs); + +#define DPAA_PER_LCORE_DQRR_SIZE RTE_PER_LCORE(held_bufs).dqrr_size +#define DPAA_PER_LCORE_DQRR_HELD RTE_PER_LCORE(held_bufs).dqrr_held +#define DPAA_PER_LCORE_DQRR_MBUF(i) RTE_PER_LCORE(held_bufs).mbuf[i] + #ifdef __cplusplus } #endif diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c index 088fbe1..1caecf2 100644 --- a/drivers/net/dpaa/dpaa_rxtx.c +++ b/drivers/net/dpaa/dpaa_rxtx.c @@ -800,6 +800,7 @@ dpaa_eth_queue_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) loop = 0; while (loop < frames_to_send) { loop += qman_enqueue_multi(q, &fd_arr[loop], + NULL, frames_to_send - loop); } nb_bufs -= frames_to_send;