From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EDEBFA00C4; Fri, 5 Aug 2022 08:34:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 98EBC42C9F; Fri, 5 Aug 2022 08:33:20 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2133.outbound.protection.outlook.com [40.107.223.133]) by mails.dpdk.org (Postfix) with ESMTP id A80B642C97 for ; Fri, 5 Aug 2022 08:33:19 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FBe3IM37jQ5VAHeskPkXWpIIZ+I5uI4o/4oUYVQumyhjK8CbeoaVodxxM+EBHa/zRISju/oc9A/Ho++Yx1BD3+rI/pauzZ0dKYCIiNECOVaLNmZa026F5/PtsbId4l7IYG3sq3DZkZk5bjrK2fKSE3kTU9BR/tmQo9DYOgRWzGnRGq5J3fyHnHOzXE+SLIAU6q+fI+C4OUgE42iEXIJSSIu9UZS5eJJqJjZ2i9xTklR76gunkSluzaxp9YpsXPSJG7IifTZd0QDJxwl9s3APFfIOGAk8HeXSdjlylABN7VRmxfJJbR4cwuhdvKj8mxOymYero7Y3ttHjl6rQgGeqrw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bouJMTUZsxWT80zgWqV3grBr4Wz8lsyrkLT8h8eZKsI=; b=fzeFZRGCnpAVC2VcMLoPGUcDcoFUAw8WgEZD8YyGlrb7VUYvmeI8gNO+nLo/bi+HSWZSc9ke6TE0ohyqLQ38vpNl33OfbSjlejMS1TsBRTRqsC+lHS5FqtRmijigLir4X4/CUev0A6bH58xYQqeqg3heMXKxnE+Ze2NCsZWO0POLs4q9bikhOTRZ4smbIaG5WhVOdqBQ5OY1JFl/xF6h+TxQ7MYhK2dJhnQbS9CIQ6DSDizA8qbwDZHS3/7WaeJe2UP0Po4qv6qqFvo87dC3pVqpzPzozmLZ7vN7XREQ9Q4UpJAcAJfBqpkvnRH2aCgzIU3nCvW7NfYjliQE1l7Hfg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bouJMTUZsxWT80zgWqV3grBr4Wz8lsyrkLT8h8eZKsI=; b=Lv6OUNeaIKLZrN2vc681PT8Zhzg8Ytwt4KKOGegkr4y9HyM3jpfcftFV50mFoanwTBo8q2d9CtARakJBElK9MSRQvWJ2hSKJ+eQLhPEPqqryF9JRWnKXuEq86Qn9HatF2UzhXR8M0i6MBAYun+xErtTuUztIQQVlM4M1yS2r7pU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by DM5PR13MB1772.namprd13.prod.outlook.com (2603:10b6:3:135::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.15; Fri, 5 Aug 2022 06:33:18 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::402d:6abc:83a8:2431]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::402d:6abc:83a8:2431%5]) with mapi id 15.20.5504.014; Fri, 5 Aug 2022 06:33:18 +0000 From: Chaoyong He To: dev@dpdk.org Cc: niklas.soderlund@corigine.com, Chaoyong He , Heinrich Kuhn Subject: [PATCH v5 09/12] net/nfp: add flower ctrl VNIC rxtx logic Date: Fri, 5 Aug 2022 14:32:32 +0800 Message-Id: <1659681155-16525-10-git-send-email-chaoyong.he@corigine.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1659681155-16525-1-git-send-email-chaoyong.he@corigine.com> References: <1659681155-16525-1-git-send-email-chaoyong.he@corigine.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SG2PR04CA0157.apcprd04.prod.outlook.com (2603:1096:4::19) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 05c52730-e12f-4965-e962-08da76ac6226 X-MS-TrafficTypeDiagnostic: DM5PR13MB1772:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BQvfvcxRHwdoqOynIdiV4kkNXFgA63V6EgnuiIo9gMUSOnMYh77dMgDlYVdtw6mUzYki5QrrpeyO2CMsSgnZLu835VL/ZAUHlB+YHCrpSsjdOEBaL9l23nXHFp4Y0RRzNckUTS26NxK9+h+mwAO/WK8RiS+0WmBRWCpFwxdYEfpNFt3YgTIdf0Vr7G0QRfPNBhafMmc1yR3SOXjk8ttzQAnWNzdr4VYAu3U2DacSSfu78BPe+e/o3Xah/Up0fpToTcfrP0I/sBwaQiCD7aUyi1kAIBC6/+rLoiBwRDy6D6nhyfyf4ex1+i5Vj2upomGdO7KNEOZxhkdescXw1WXdo9RoGDfnuaseN/P/mq9WM3uvWg29qDKKxtLvD+V/J/UGjFAUmr0AdFoKt7qHD9G0jUdkMTW+WDge9np1IyGhcu89g0g4/2ans5i/OmY8uTBgEe2LZa2FAyC2U5sMdQOISs/FppqHCQU795dfBK9tclx7XzAYihSTQr29Bbn8b/q15bs2NQtTnkpGrEXp6TLKg/+1yJY/YCP0oFVNNaBr/hOVgokxsYnaJCxHYz0L0h1DkS1JXTayNTO2QhHVMGQRbY7ets0ZEAgX1faYprp+PUwpWM20CXcTlN3kH+i8hgy8GpxH4rU/uUUUpSyNSvSM3NHdUoF8n0kY0ctmC+dlE57BLIb/KCF6w1WwnzKXhFEwUOw0MiCmvS1GINnVZmL5iwQXLf2Ag0VELFPDDa0WJJownDCNjVGDDMasdUaqjtAp2iB/rlzH0R5Wvz7t3PtxwbgN1i6KV4VOa8N854kHmlU= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(136003)(396003)(366004)(39840400004)(376002)(346002)(26005)(6512007)(6506007)(2616005)(66574015)(107886003)(5660300002)(52116002)(36756003)(6486002)(44832011)(186003)(6666004)(41300700001)(478600001)(86362001)(38100700002)(38350700002)(83380400001)(66476007)(66556008)(66946007)(54906003)(8936002)(316002)(2906002)(6916009)(4326008)(8676002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?V1hydzREK3NoLzdlL2xkczBvR3diMG9oc2loUFU0SVlndU5CMWpDc3B0empn?= =?utf-8?B?eWphaGZDZ1dWNlRzUDZCS1BYV3BVeXdPSWRQQktNYUo1SzQ1S2RtaWY5eThQ?= =?utf-8?B?bWlyZjZudGwyQ1RJcW9PWVgzVmxnVHJHSTdyN0tOU05VMzl5dzA5VkdUWXJs?= =?utf-8?B?UUJKb1Mvci9iQ1NsR05NR3M0Y2RPaHF4RFZ1WW1VQ3NzOVZ5QlVFcmNweGZ6?= =?utf-8?B?V09ZZE5CSkxWMTN3VFBMb2Q3ei9CZkZIVmd4VjNQdWRKdDQzRGRZK05LOGd6?= =?utf-8?B?eElHeENpUjBSVTZDM3FJQkhDYU5DS1N6MlVVVCtyb0ZnK1IxZXVIb0FJN0s5?= =?utf-8?B?cVlUS3FXMjlKa0FWTjI1ckdsVSsybzlwYmtGbytRaEw0bnhRL2RrZm90K21E?= =?utf-8?B?R0sra0p4VW1HVGVVV2xtNWVCa2hjQ0tjRzBFb0x1NHM3bVBQTzdjdG1BV1Y0?= =?utf-8?B?M29VZGtESFViQ2VtQk1RZEgyK2g4S2VEQ0VvSEdYVHYvQ2xweDRSdFdiekNi?= =?utf-8?B?c1RvV1JaWFZPVnFwMEEvYnYrbHdJSURPZGtaV1FHazBRUU5neU5Kd3NtYThX?= =?utf-8?B?elpOM2k3ZUlZYVZqOTZTWEFOVlZEU2hoNXN0K1hYOFJ3WE5zNTFLVzZHb3N0?= =?utf-8?B?U2NxTlFQbTFiVHhCYytLNXZHUzEvTG5ldVAwRXhWWWRrNUE0ZHdUSEVUM3BU?= =?utf-8?B?bkhlS2J6RG8wS0ZUYWE4bERSTk9oWm84Nmo5YVJWRk15WmtSVHhJRmVNR0Vu?= =?utf-8?B?YVkzZmpWcUIrQlpmNnhkbVVFNmNpV1dQazF2M0FxMC8wYTVybkFKQ2NGS251?= =?utf-8?B?R2hWaHdDaFlKallZa0U4V29hRzQzRDVZdTNmSWJOeGdtL0NUbU0rRjhuczRE?= =?utf-8?B?azBYQnJ5WGlpc2gybm1CNC9BV1BvckUrdlJlLyswRThqVTdRSjI2eXZzM3Ir?= =?utf-8?B?aWxBdTFzby8rRnk3TG5Idkc2bUFWRm1mdUdURHNVZW9Pc3Q1Ry9TL0dFVStT?= =?utf-8?B?TU0rZUxINEtXN2pTVFBiaElPSUV3WjUzZ2RtT0V1eU96US9Kd0lvbURBU0Jk?= =?utf-8?B?eUdFS1FUQ0g2ZjV2alhGQ09WRlorNDZzYW5SWnhyTVBmdTZvOGxwOThaTG56?= =?utf-8?B?cmxacGlobG9UVTdEMU1lbkMxQWdEdHQ3QmRHQXBmN3NMbzNEa2xXbkRkN1E4?= =?utf-8?B?OXVWZ2RGNE8xRDBwQVlLTmVPdzQ0MFlWc0tqR1pPUDM2Zi9BcWpBUlpkZmRO?= =?utf-8?B?bC9DSE9lU3FhTHhjbkJpdER1VjRIa1ZVbVJHS1JYNFFJRVROU1BlbzlLQS9h?= =?utf-8?B?ZHhuMXZLYW5BWjcwMkEvL1ZrNW5BQTErMTU0UEtUUjhSMmxVV2xVMzVxbjkw?= =?utf-8?B?QzJXNmtaTk1pWllRL0dXbkxlOGtrOHg4cVZBb2d6NllPWlRNQWZCa1NzcCt6?= =?utf-8?B?am81RTJXM09VK3R1cFZoajgzQmhTNGk1VnhqTFNXUGxaMm0ydWpwUG1YK3VM?= =?utf-8?B?Z2NtQnNjblJQeTRPcEZpcjNlK1ZyY2hydjBHUWNLbTh2ak1VelBBeFFXS2hx?= =?utf-8?B?MFJ5bTVIMWRYY05xeUgvZ1JPaEhHRHhKMlBpQU9ZYnptOEhHMEc4cGowbE11?= =?utf-8?B?N0pVaDBTVWNIOG4xdkNMRGhlUEppd2xMcEFEc1JTUGhXMTFoQUJwWDlSRWsy?= =?utf-8?B?U0lWRmRHb3ljOVNUZTNNY21pb1QxMkRoRzFIRjhkcHBONGo2ZzhFRjgzSmR3?= =?utf-8?B?eEdjWWQ2ZE1LWGQ0L2VEaU0xSko3bk1OUzkrWkZRekg1WTlaakFPV1k5Wmkz?= =?utf-8?B?dXM2R01KVGNLS25iUTBiL25LV2lTcWp0em1TSTZrdHVNVk55cXpIT1h1anVL?= =?utf-8?B?bXBzdk51OG5wMk85ZjZPMEJuN3BUZHo1SS9xUjV1am1TTm9YN2JYNXkraHdR?= =?utf-8?B?dTU2M2pZbk1BbXFTblBWbVpIekVpakN5S2FPL2l3ZytJZFRHbUpUYkVYVnFM?= =?utf-8?B?Yy9iZ0MwQWN6NE1NQjBLU2RXMjJpUnpBVkl2V1NXdElKd0VhWHBLQnd3TWF6?= =?utf-8?B?SGNHelVVTnRIc1BRWS92bHgxMkprTXRFT1QyRHVyeGNoTVN5V0tBbWhHNGdm?= =?utf-8?B?Wm5aYWVDQUltOWk1ek1PRXppRjF1SzYvQTRlZkYzN2s4K04vb2dhNnVXeWEv?= =?utf-8?B?OFE9PQ==?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 05c52730-e12f-4965-e962-08da76ac6226 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Aug 2022 06:33:18.0921 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 8+zwIWdOoZXtGMgi1YNdtlcTn6cNhPaKgFSnSoYQgaZTtLAWALtk176gewADsyknKK4SSIp7FAOZInXjPSlTUYEeylvbGVGf78KtcuwGnrQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR13MB1772 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add a Rx and Tx function for the control vNIC. The logic is mostly identical to the normal Rx and Tx functionality of the NFP PMD. This commit also makes use of the ctrl vNIC service logic to service the ctrl vNIC Rx path. Signed-off-by: Chaoyong He Signed-off-by: Heinrich Kuhn Reviewed-by: Niklas Söderlund --- drivers/net/nfp/flower/nfp_flower.c | 15 ++ drivers/net/nfp/flower/nfp_flower.h | 15 ++ drivers/net/nfp/flower/nfp_flower_ctrl.c | 252 +++++++++++++++++++++++++++++++ drivers/net/nfp/flower/nfp_flower_ctrl.h | 13 ++ drivers/net/nfp/meson.build | 1 + 5 files changed, 296 insertions(+) create mode 100644 drivers/net/nfp/flower/nfp_flower_ctrl.c create mode 100644 drivers/net/nfp/flower/nfp_flower_ctrl.h diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c index 51df504..5e9c4ef 100644 --- a/drivers/net/nfp/flower/nfp_flower.c +++ b/drivers/net/nfp/flower/nfp_flower.c @@ -21,6 +21,7 @@ #include "../nfpcore/nfp_nsp.h" #include "nfp_flower.h" #include "nfp_flower_ovs_compat.h" +#include "nfp_flower_ctrl.h" #define MAX_PKT_BURST 32 #define MEMPOOL_CACHE_SIZE 512 @@ -216,7 +217,21 @@ .link_update = nfp_flower_pf_link_update, }; +static int +nfp_flower_ctrl_vnic_service(void *arg) +{ + struct nfp_app_flower *app_flower = arg; + + nfp_flower_ctrl_vnic_poll(app_flower); + + return 0; +} + static struct rte_service_spec flower_services[NFP_FLOWER_SERVICE_MAX] = { + [NFP_FLOWER_SERVICE_CTRL] = { + .name = "flower_ctrl_vnic_service", + .callback = nfp_flower_ctrl_vnic_service, + }, }; static int diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h index f11ef6d..bdc64e3 100644 --- a/drivers/net/nfp/flower/nfp_flower.h +++ b/drivers/net/nfp/flower/nfp_flower.h @@ -7,9 +7,18 @@ #define _NFP_FLOWER_H_ enum nfp_flower_service { + NFP_FLOWER_SERVICE_CTRL, NFP_FLOWER_SERVICE_MAX }; +/* + * Flower fallback and ctrl path always adds and removes + * 8 bytes of prepended data. Tx descriptors must point + * to the correct packet data offset after metadata has + * been added + */ +#define FLOWER_PKT_DATA_OFFSET 8 + /* The flower application's private structure */ struct nfp_app_flower { /* List of rte_service ID's for the flower app */ @@ -29,6 +38,12 @@ struct nfp_app_flower { /* the eth table as reported by firmware */ struct nfp_eth_table *nfp_eth_table; + + /* Ctrl vNIC Rx counter */ + uint64_t ctrl_vnic_rx_count; + + /* Ctrl vNIC Tx counter */ + uint64_t ctrl_vnic_tx_count; }; int nfp_init_app_flower(struct nfp_pf_dev *pf_dev); diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c new file mode 100644 index 0000000..e73054e --- /dev/null +++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c @@ -0,0 +1,252 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2022 Corigine, Inc. + * All rights reserved. + */ + +#include +#include + +#include "../nfp_common.h" +#include "../nfp_logs.h" +#include "../nfp_ctrl.h" +#include "../nfp_rxtx.h" +#include "nfp_flower.h" +#include "nfp_flower_ctrl.h" + +#define MAX_PKT_BURST 32 + +static uint16_t +nfp_flower_ctrl_vnic_recv(void *rx_queue, + struct rte_mbuf **rx_pkts, + uint16_t nb_pkts) +{ + uint64_t dma_addr; + uint16_t avail = 0; + struct rte_mbuf *mb; + uint16_t nb_hold = 0; + struct nfp_net_hw *hw; + struct nfp_net_rxq *rxq; + struct rte_mbuf *new_mb; + struct nfp_net_rx_buff *rxb; + struct nfp_net_rx_desc *rxds; + + rxq = rx_queue; + if (unlikely(rxq == NULL)) { + /* + * DPDK just checks the queue is lower than max queues + * enabled. But the queue needs to be configured + */ + PMD_RX_LOG(ERR, "RX Bad queue"); + return 0; + } + + hw = rxq->hw; + while (avail < nb_pkts) { + rxb = &rxq->rxbufs[rxq->rd_p]; + if (unlikely(rxb == NULL)) { + PMD_RX_LOG(ERR, "rxb does not exist!"); + break; + } + + rxds = &rxq->rxds[rxq->rd_p]; + if ((rxds->rxd.meta_len_dd & PCIE_DESC_RX_DD) == 0) + break; + + /* + * Memory barrier to ensure that we won't do other + * reads before the DD bit. + */ + rte_rmb(); + + /* + * We got a packet. Let's alloc a new mbuf for refilling the + * free descriptor ring as soon as possible + */ + new_mb = rte_pktmbuf_alloc(rxq->mem_pool); + if (unlikely(new_mb == NULL)) { + PMD_RX_LOG(ERR, + "RX mbuf alloc failed port_id=%u queue_id=%u", + rxq->port_id, (unsigned int)rxq->qidx); + nfp_net_mbuf_alloc_failed(rxq); + break; + } + + nb_hold++; + + /* + * Grab the mbuf and refill the descriptor with the + * previously allocated mbuf + */ + mb = rxb->mbuf; + rxb->mbuf = new_mb; + + /* Size of this segment */ + mb->data_len = rxds->rxd.data_len - NFP_DESC_META_LEN(rxds); + /* Size of the whole packet. We just support 1 segment */ + mb->pkt_len = mb->data_len; + + if (unlikely((mb->data_len + hw->rx_offset) > rxq->mbuf_size)) { + rte_pktmbuf_free(mb); + /* + * This should not happen and the user has the + * responsibility of avoiding it. But we have + * to give some info about the error + */ + RTE_LOG_DP(ERR, PMD, + "mbuf overflow likely due to the RX offset.\n" + "\t\tYour mbuf size should have extra space for" + " RX offset=%u bytes.\n" + "\t\tCurrently you just have %u bytes available" + " but the received packet is %u bytes long", + hw->rx_offset, + rxq->mbuf_size - hw->rx_offset, + mb->data_len); + break; + } + + /* Filling the received mbuf with packet info */ + if (hw->rx_offset) + mb->data_off = RTE_PKTMBUF_HEADROOM + hw->rx_offset; + else + mb->data_off = RTE_PKTMBUF_HEADROOM + NFP_DESC_META_LEN(rxds); + + /* No scatter mode supported */ + mb->nb_segs = 1; + mb->next = NULL; + mb->port = rxq->port_id; + + rx_pkts[avail++] = mb; + + /* Now resetting and updating the descriptor */ + rxds->vals[0] = 0; + rxds->vals[1] = 0; + dma_addr = rte_cpu_to_le_64(RTE_MBUF_DMA_ADDR_DEFAULT(new_mb)); + rxds->fld.dd = 0; + rxds->fld.dma_addr_hi = (dma_addr >> 32) & 0xff; + rxds->fld.dma_addr_lo = dma_addr & 0xffffffff; + + rxq->rd_p++; + if (unlikely(rxq->rd_p == rxq->rx_count)) /* wrapping?*/ + rxq->rd_p = 0; + } + + if (nb_hold == 0) + return 0; + + nb_hold += rxq->nb_rx_hold; + + /* + * FL descriptors needs to be written before incrementing the + * FL queue WR pointer + */ + rte_wmb(); + if (nb_hold >= rxq->rx_free_thresh) { + PMD_RX_LOG(DEBUG, "port=%hu queue=%d nb_hold=%hu avail=%hu", + rxq->port_id, rxq->qidx, nb_hold, avail); + nfp_qcp_ptr_add(rxq->qcp_fl, NFP_QCP_WRITE_PTR, nb_hold); + nb_hold = 0; + } + + rxq->nb_rx_hold = nb_hold; + + return avail; +} + +uint16_t +nfp_flower_ctrl_vnic_xmit(struct nfp_app_flower *app_flower, + struct rte_mbuf *mbuf) +{ + uint16_t cnt = 0; + uint64_t dma_addr; + uint32_t free_descs; + struct rte_mbuf **lmbuf; + struct nfp_net_txq *txq; + struct nfp_net_hw *ctrl_hw; + struct rte_eth_dev *ctrl_dev; + struct nfp_net_nfd3_tx_desc *txds; + + ctrl_hw = app_flower->ctrl_hw; + ctrl_dev = ctrl_hw->eth_dev; + + /* Flower ctrl vNIC only has a single tx queue */ + txq = ctrl_dev->data->tx_queues[0]; + if (unlikely(txq == NULL)) { + /* + * DPDK just checks the queue is lower than max queues + * enabled. But the queue needs to be configured + */ + PMD_TX_LOG(ERROR, "ctrl dev TX Bad queue"); + goto xmit_end; + } + + txds = &txq->txds[txq->wr_p]; + txds->vals[0] = 0; + txds->vals[1] = 0; + txds->vals[2] = 0; + txds->vals[3] = 0; + + if (nfp_net_nfd3_txq_full(txq)) + nfp_net_tx_free_bufs(txq); + + free_descs = nfp_net_nfd3_free_tx_desc(txq); + if (unlikely(free_descs == 0)) { + PMD_TX_LOG(ERROR, "ctrl dev no free descs"); + goto xmit_end; + } + + lmbuf = &txq->txbufs[txq->wr_p].mbuf; + RTE_MBUF_PREFETCH_TO_FREE(*lmbuf); + if (*lmbuf) + rte_pktmbuf_free_seg(*lmbuf); + + *lmbuf = mbuf; + dma_addr = rte_mbuf_data_iova(mbuf); + + txds->data_len = mbuf->pkt_len; + txds->dma_len = txds->data_len; + txds->dma_addr_hi = (dma_addr >> 32) & 0xff; + txds->dma_addr_lo = (dma_addr & 0xffffffff); + txds->offset_eop = FLOWER_PKT_DATA_OFFSET | PCIE_DESC_TX_EOP; + + txq->wr_p++; + if (unlikely(txq->wr_p == txq->tx_count)) /* wrapping?*/ + txq->wr_p = 0; + + cnt++; + app_flower->ctrl_vnic_tx_count++; + +xmit_end: + rte_wmb(); + nfp_qcp_ptr_add(txq->qcp_q, NFP_QCP_WRITE_PTR, 1); + + return cnt; +} + +void +nfp_flower_ctrl_vnic_poll(struct nfp_app_flower *app_flower) +{ + uint16_t i; + uint16_t count; + struct nfp_net_rxq *rxq; + struct nfp_net_hw *ctrl_hw; + struct rte_eth_dev *ctrl_eth_dev; + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + + ctrl_hw = app_flower->ctrl_hw; + ctrl_eth_dev = ctrl_hw->eth_dev; + + /* ctrl vNIC only has a single Rx queue */ + rxq = ctrl_eth_dev->data->rx_queues[0]; + count = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST); + if (count > MAX_PKT_BURST) { + PMD_RX_LOG(ERR, "nfp_net_ctrl_vnic_recv failed!"); + return; + } + + if (count) { + app_flower->ctrl_vnic_rx_count += count; + /* Process cmsgs here, only free for now */ + for (i = 0; i < count; i++) + rte_pktmbuf_free(pkts_burst[i]); + } +} diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.h b/drivers/net/nfp/flower/nfp_flower_ctrl.h new file mode 100644 index 0000000..74765c9 --- /dev/null +++ b/drivers/net/nfp/flower/nfp_flower_ctrl.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2022 Corigine, Inc. + * All rights reserved. + */ + +#ifndef _NFP_FLOWER_CTRL_H_ +#define _NFP_FLOWER_CTRL_H_ + +void nfp_flower_ctrl_vnic_poll(struct nfp_app_flower *app_flower); +uint16_t nfp_flower_ctrl_vnic_xmit(struct nfp_app_flower *app_flower, + struct rte_mbuf *mbuf); + +#endif /* _NFP_FLOWER_CTRL_H_ */ diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 7ae3115..8710213 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -7,6 +7,7 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64') endif sources = files( 'flower/nfp_flower.c', + 'flower/nfp_flower_ctrl.c', 'nfpcore/nfp_cpp_pcie_ops.c', 'nfpcore/nfp_nsp.c', 'nfpcore/nfp_cppcore.c', -- 1.8.3.1