From patchwork Fri Feb 2 03:04:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 136302 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 81E4043A49; Fri, 2 Feb 2024 04:05:11 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1039D42E1E; Fri, 2 Feb 2024 04:04:53 +0100 (CET) Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2099.outbound.protection.outlook.com [40.107.94.99]) by mails.dpdk.org (Postfix) with ESMTP id 5499542E00 for ; Fri, 2 Feb 2024 04:04:51 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h1pN7Qhd0r0VvffH2+HiyZqDCpYvrqXHSf07KdwsEwfZUTbyIBb+HEoRWPg+YVGI39VeHOsZ3qkhlxQaXHAFWjHQ41Nlol+4ZwgVQc/cSOnZcmmcEE/3TPA6TLEkq7SM076UXV7VwWsbQqVuVhA6Za3JemLxQR/cEy1e1HKl5yd7Q6MLvjANVIJH1yQpiGngxd5vpeFU7KvRFUCbN0HO2r3RYOxkFIjEiou3r5q/BTTfV4C1QjPerRspIq1z3xxjvm1tksV4x+wPj8It+Nd3NNgSHJoJFn7sZQ76q1TsGC14AFKMrZZVel1EPcjQn/FpkLPUtAEW3Bb5W+UBjOgrIg== 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=zp0fJdpiBzHiCWMscHB0du8tHEo925iRHXtIoc6iU2Y=; b=EZidUHzs3kF0TV2WxxW7wAuijXKv270kzSNDHtQPX8uOMV2/HRNrhcC2UpdzthP/G/2sz/lO14MxAPKbEij2QvtSRiPK6uTGfLU1EgVkUy1PPYOMs7B4pcnjYZ1qtbR0J+fjzuECJGu3AKrXLQ/8dcWqm3/GLPczkO4N0z6+AqzbFhwzvJmaHxI2DW8nUFdS7ZQTX4R1tfYP/3EreVwBDJfM5ri9/JPWHhkADdYC9Xun60v7AEf/n0K/JTG6LdQ6an3GnRv4upnl3rKMPyZmgxU/AgPSeEIMqbfoV1Gt/2W5egulnmv6DT91RyBwam6Wtm+8vXUlkqbMqienxXFsdQ== 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=zp0fJdpiBzHiCWMscHB0du8tHEo925iRHXtIoc6iU2Y=; b=Khw8p+hsmDIJpTYdDV5KJwMEqQyg4cj26ZlWQFTiMh81ncfaKco8Ss48th01jMiR3rM7zMl1r7Gv/6eSLGCZfRQvIBfRhdahAfABAKlHGlXilRNTiIAfNBvsqrLnN62dY1q9jsKKVASdtvKZUEsXNN6LznFanzljSWfXOxJbvJA= 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 SN7PR13MB6177.namprd13.prod.outlook.com (2603:10b6:806:2e3::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.30; Fri, 2 Feb 2024 03:04:49 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::8e02:f738:570a:f8aa]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::8e02:f738:570a:f8aa%7]) with mapi id 15.20.7249.024; Fri, 2 Feb 2024 03:04:49 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Long Wu , Chaoyong He , Peng Zhang Subject: [PATCH v2 3/3] net/nfp: flower driver uses one service core Date: Fri, 2 Feb 2024 11:04:15 +0800 Message-Id: <20240202030415.739638-4-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240202030415.739638-1-chaoyong.he@corigine.com> References: <20240124092541.2011874-1-chaoyong.he@corigine.com> <20240202030415.739638-1-chaoyong.he@corigine.com> X-ClientProxiedBy: BYAPR05CA0004.namprd05.prod.outlook.com (2603:10b6:a03:c0::17) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|SN7PR13MB6177:EE_ X-MS-Office365-Filtering-Correlation-Id: ce652371-1503-4330-be2d-08dc239bb7d0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5CTEAbs7zZJ4j/Ivtg2Mj8xvfIzrXTu0Gf5Rw0rNu5XW055QBMplxA4bUHmG+h9ANMnFVYdIKyZ+xsYcTzUiChwTzNs6wEi5fnZpau7UUgiBacYN0waAlwmWJ8daCqzR/KYVKAc4xsRsaRToOaRybJoFhKf7jODRf6Mp9OnRJ8KsP9q/wGksTCY1XU/D6CjPE/lcYdaTwPL/FdzeaN05u5JKq+X0mcm0kluqW4GqOgYpevjCIJ5RX9dUoSu/yXUWFF82dmxYVmx4TkGlZyTzMDxR1q6UXuS+3uhUXJobWoN38vWxB9OiiLH46FM2M17Hx/Q04WtIaH8UTIMEEFQwQCwc2e7/PKpjvTkO7dBxkhxkWSDk26OB1BLpwVZuJEIn7ZjWhNNeOtbiiqEaYISDBmk/wr/L5Q8IMuBp2gl7HqnyXUDhbBewZb3nPACD6GrX8H10gZxO/KiWBkL5wbKvjA9MjMKNV2AxnYyTC88uZidOmrQ6oOyksN+MubNNJutpHLX3BY6Oi3SU/99lL+B0kcn0nwY1CQpNdaOLVV016uMkhknlQSCBDJSpq2pMK3UmhmWWrnyupTFNh61IA+Mry0LOFXl6Oawqe746hWGN4IRPJdQAXY2f3w/8upx0pswt 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:(13230031)(366004)(136003)(376002)(396003)(39840400004)(346002)(230922051799003)(451199024)(186009)(64100799003)(1800799012)(41300700001)(1076003)(107886003)(26005)(2616005)(6916009)(38350700005)(316002)(36756003)(478600001)(6512007)(6486002)(83380400001)(52116002)(6506007)(6666004)(38100700002)(86362001)(2906002)(5660300002)(30864003)(66946007)(54906003)(66476007)(66556008)(8936002)(44832011)(8676002)(4326008); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: KcReKh636kJIqbdum8CMA5SO14zAj6emBPFV7Zhpy+m7970Axa7cHbDMeH961hT4FBhNqQOC7IfnCWdriPYsRntx80G0Qx6+oORj4vwZWeYazl56Ayhd+KWQNYPSD+58cvqE/fx/G6d2B59riETsP5npycsLdAAuOp0JbnjqFFF8jLFd0BLn/s793qEMQE/8Ww4fOLxkwKr2bNqttAzLWQfRHzU0MKJBAf3W8cDgg+T28EBsTKntDWPauE8ZqKjqtxWQkqgldBQmiwtMjoap9qHBF2D4BWFVAFesb4DrVYLZuqJE2KYLkLpaNodEHKkrvSxuSj06fKm4FWcYBFb6KrZlQlYBk7JTfEcrUxYpf8oXzgbOV6v8QFNQ/VOfCcL4Fsb9UsnIFP0ckeOS4UiC4P7aHVGVBItg3kiNEqLFWicmycRDH3asAidep/4ovmJlwXFH308+PHXpTvxi/EZqd02A2OUOvXZNiuKCsg5QowMqLwJ5lHffMGz8gV9JvhcCDE6R68TLXf+wtT5P2NhYOl/ZE9LpDkFzi0RaBaQPGDnSzwhFyiWW1WX6CqwPKHOtnK0gRh33WEbqptKpDkZVeyrACiZ4rWLl/SUvDF0ybDV74YfWLBu/VJ5A9ZxPHzwQiZlVhbFt4SuHJNg9nS4X96N0iQsH/KUOY5qyfBlM8R26BWMucGgBI0958uoQlpGTUEsF5BLCQ36ICHWrEi3H6FQAdzYUW6mrgVanDR5709u0lEiO7KyrYmBwwCI2qmhq9kzGR3w4Z9O0vIxjX4+szUqqkEAL4k//rBFw0EZI1AjWTngAngzrvqX28dBSIzkCKu0E2QdbB+mWz4ngV7+wszuB1kwu59SnenjiB7rJgdEUSEPVq3KpNgJ7rdhcvpoW6i3fkGplBe9rhqBNzPxZ9/IVroflVTjqiKFp56GoeYNloPqsUWkkceclHD7vwxmKlx+n8bre03qgSTBI/GV8sJpJM4ywWspDh50n566B1WFWF6It3PfZlk9+t35Mp5bKgRSYRfqhE0sHk3mR5YFlQ9Nwlf6gNYpFjjpXEiQZfPOU5MNoT4sMj+cqAdCBW/Rp4d8Yo3ypOwU1AWtpNUPhLzSU6fox3VuJE93ABFVF97zwq/xP996VciP7EyCo9fXJ2JlRz8AtjQE+jJb4zx/v9AzoUop9Z7UOJhnM0p65bd1bFpcjCIjSNOz69/BMSUiMkcoiElQTektjqntO+ANXzqQDmyEx6idTMghPPfnw+SGfUxF0HCA3bJpjXo+OVeg12b+2BVYIH9Iuhp9RFci6gEgtOVZ/x0qT2NU5RvhC31qVzVu8GAweZFlYTS4luTdi7ZMZ+VehNxtGrMtrcVbCVhwM0Otr/j7qMMG77H9vH5yjHg5+sO+mITbEMUm/OplVKn3XBg1bb1QRSGN9I3bNMw0T4YADm41QYLxhKTU25Rw37BcbiT5tSv6tz6+Y0HdauIIEyOiEzXLo00Vjc6n44snbwWbo54m+eSrfFrLhRSwl2Xl6Qcvriz6NRo0sW6de3+588usED8OyaA6sig/Gzke2JuwsHPlT7rE6rChdiD4E45RtvYT9z0L+JbZ5DFLNvMpMfwfXhB6xVBw3j39kcA== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: ce652371-1503-4330-be2d-08dc239bb7d0 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2024 03:04:49.3184 (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: cGujUR6c/M37rcp5PKP/VJCxr5/jXhhWdoKmovhy1oi/HJvs6ysIF1hJgWOtxST/laDnkRGCqmKiPFHH6rH5QTN5Wns/H+uaDuF5P648wHo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR13MB6177 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 From: Long Wu Now app must provide a service core for each NFP pci device that uses flower driver to run flower service, which will cause huge resource waste. This patch is to solve this problem and app can only use one core to run NFP flower service though it uses several NFP NICs. Signed-off-by: Long Wu Reviewed-by: Chaoyong He Reviewed-by: Peng Zhang --- drivers/net/nfp/flower/nfp_flower.c | 47 ++--- drivers/net/nfp/flower/nfp_flower_ctrl.c | 20 +- drivers/net/nfp/flower/nfp_flower_ctrl.h | 2 +- .../net/nfp/flower/nfp_flower_representor.c | 4 + drivers/net/nfp/flower/nfp_flower_service.c | 196 ++++++++++++++++++ drivers/net/nfp/flower/nfp_flower_service.h | 17 ++ drivers/net/nfp/meson.build | 1 + drivers/net/nfp/nfp_net_common.h | 6 + drivers/net/nfp/nfpcore/nfp_sync.h | 2 + 9 files changed, 248 insertions(+), 47 deletions(-) create mode 100644 drivers/net/nfp/flower/nfp_flower_service.c create mode 100644 drivers/net/nfp/flower/nfp_flower_service.h diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c index a29edf8ca2..e84e6ebbff 100644 --- a/drivers/net/nfp/flower/nfp_flower.c +++ b/drivers/net/nfp/flower/nfp_flower.c @@ -18,6 +18,7 @@ #include "../nfp_mtr.h" #include "nfp_flower_ctrl.h" #include "nfp_flower_representor.h" +#include "nfp_flower_service.h" #define CTRL_VNIC_NB_DESC 512 @@ -461,6 +462,13 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw) nn_cfg_writeb(&hw->super, NFP_NET_CFG_TXR_SZ(i), rte_log2_u32(CTRL_VNIC_NB_DESC)); } + /* Alloc sync memory zone */ + ret = nfp_flower_service_sync_alloc(app_fw_flower); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Alloc sync memory zone failed"); + goto tx_queue_setup_cleanup; + } + return 0; tx_queue_setup_cleanup: @@ -531,6 +539,7 @@ nfp_flower_cleanup_ctrl_vnic(struct nfp_net_hw *hw) } } + nfp_flower_service_sync_free(app_fw_flower); rte_free(eth_dev->data->tx_queues); rte_free(eth_dev->data->rx_queues); rte_mempool_free(app_fw_flower->ctrl_pktmbuf_pool); @@ -584,38 +593,6 @@ nfp_flower_start_ctrl_vnic(struct nfp_net_hw *net_hw) return 0; } -static int -nfp_flower_ctrl_vnic_service(void *arg) -{ - struct nfp_app_fw_flower *app_fw_flower = arg; - - nfp_flower_ctrl_vnic_poll(app_fw_flower); - - return 0; -} - -static int -nfp_flower_enable_services(struct nfp_app_fw_flower *app_fw_flower) -{ - int ret; - struct nfp_service_info info; - const struct rte_service_spec flower_service = { - .name = "flower_ctrl_vnic_service", - .callback = nfp_flower_ctrl_vnic_service, - .callback_userdata = (void *)app_fw_flower, - }; - - ret = nfp_service_enable(&flower_service, &info); - if (ret != 0) { - PMD_INIT_LOG(ERR, "Could not enable service %s", flower_service.name); - return ret; - } - - app_fw_flower->ctrl_vnic_id = info.id; - - return 0; -} - static void nfp_flower_pkt_add_metadata_register(struct nfp_app_fw_flower *app_fw_flower) { @@ -760,7 +737,7 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev, } /* Start up flower services */ - ret = nfp_flower_enable_services(app_fw_flower); + ret = nfp_flower_service_start(app_fw_flower); if (ret != 0) { PMD_INIT_LOG(ERR, "Could not enable flower services"); ret = -ESRCH; @@ -770,11 +747,13 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev, ret = nfp_flower_repr_create(app_fw_flower); if (ret != 0) { PMD_INIT_LOG(ERR, "Could not create representor ports"); - goto ctrl_vnic_cleanup; + goto ctrl_vnic_service_stop; } return 0; +ctrl_vnic_service_stop: + nfp_flower_service_stop(app_fw_flower); ctrl_vnic_cleanup: nfp_flower_cleanup_ctrl_vnic(app_fw_flower->ctrl_hw); ctrl_cpp_area_cleanup: diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c index c25487c277..bcb325d475 100644 --- a/drivers/net/nfp/flower/nfp_flower_ctrl.c +++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c @@ -12,6 +12,7 @@ #include "../nfp_logs.h" #include "nfp_flower_representor.h" #include "nfp_mtr.h" +#include "nfp_flower_service.h" #define MAX_PKT_BURST 32 @@ -502,26 +503,21 @@ nfp_flower_cmsg_rx(struct nfp_app_fw_flower *app_fw_flower, } void -nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower) +nfp_flower_ctrl_vnic_process(struct nfp_app_fw_flower *app_fw_flower) { 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_fw_flower->ctrl_hw; - ctrl_eth_dev = ctrl_hw->eth_dev; + ctrl_eth_dev = app_fw_flower->ctrl_hw->eth_dev; /* Ctrl vNIC only has a single Rx queue */ rxq = ctrl_eth_dev->data->rx_queues[0]; - - while (rte_service_runstate_get(app_fw_flower->ctrl_vnic_id) != 0) { - count = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST); - if (count != 0) { - app_fw_flower->ctrl_vnic_rx_count += count; - /* Process cmsgs here */ - nfp_flower_cmsg_rx(app_fw_flower, pkts_burst, count); - } + count = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST); + if (count != 0) { + app_fw_flower->ctrl_vnic_rx_count += count; + /* Process cmsgs here */ + nfp_flower_cmsg_rx(app_fw_flower, pkts_burst, count); } } diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.h b/drivers/net/nfp/flower/nfp_flower_ctrl.h index 4c94d36847..131d002ac6 100644 --- a/drivers/net/nfp/flower/nfp_flower_ctrl.h +++ b/drivers/net/nfp/flower/nfp_flower_ctrl.h @@ -8,7 +8,7 @@ #include "nfp_flower.h" -void nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower); +void nfp_flower_ctrl_vnic_process(struct nfp_app_fw_flower *app_fw_flower); uint16_t nfp_flower_ctrl_vnic_xmit(struct nfp_app_fw_flower *app_fw_flower, struct rte_mbuf *mbuf); void nfp_flower_ctrl_vnic_xmit_register(struct nfp_app_fw_flower *app_fw_flower); diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c index 12e8af54fb..4f4df0cd2e 100644 --- a/drivers/net/nfp/flower/nfp_flower_representor.c +++ b/drivers/net/nfp/flower/nfp_flower_representor.c @@ -9,6 +9,7 @@ #include "../nfpcore/nfp_nsp.h" #include "../nfp_logs.h" #include "../nfp_mtr.h" +#include "nfp_flower_service.h" /* Type of representor */ enum nfp_repr_type { @@ -396,6 +397,9 @@ nfp_flower_repr_dev_close(struct rte_eth_dev *dev) if (app_fw_flower->pf_repr != NULL) return 0; + /* Stop flower service first */ + nfp_flower_service_stop(app_fw_flower); + /* Disable cpp service */ nfp_service_disable(&pf_dev->cpp_service_info); diff --git a/drivers/net/nfp/flower/nfp_flower_service.c b/drivers/net/nfp/flower/nfp_flower_service.c new file mode 100644 index 0000000000..5e8811fe24 --- /dev/null +++ b/drivers/net/nfp/flower/nfp_flower_service.c @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2024 Corigine, Inc. + * All rights reserved. + */ + +#include "nfp_flower_service.h" + +#include + +#include "nfp_flower_ctrl.h" +#include "../nfpcore/nfp_cpp.h" +#include "../nfpcore/nfp_sync.h" +#include "../nfp_logs.h" +#include "../nfp_service.h" + +/* Driver limitation, PMD can enlarge it if need. */ +#define MAX_FLOWER_SERVICE_SLOT 8 + +struct nfp_flower_service { + /** Flower service is enabled */ + bool enabled; + /** Flower service info */ + struct nfp_service_info info; + /** Store flower cards' information */ + struct nfp_app_fw_flower *slots[MAX_FLOWER_SERVICE_SLOT]; + /** Spinlock for sync slots when add/remove card */ + rte_spinlock_t spinlock; +}; + +static struct nfp_flower_service * +nfp_flower_service_handle_get(struct nfp_app_fw_flower *app) +{ + return app->pf_hw->pf_dev->process_share.fl_service; +} + +static int +nfp_flower_service_loop(void *arg) +{ + uint16_t slot; + struct nfp_app_fw_flower *app; + struct nfp_flower_service *service_handle; + + service_handle = arg; + /* Waiting for enabling service */ + while (!service_handle->enabled) + rte_delay_ms(1); + + while (rte_service_runstate_get(service_handle->info.id) != 0) { + rte_spinlock_lock(&service_handle->spinlock); + for (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) { + app = service_handle->slots[slot]; + if (app == NULL) + continue; + + nfp_flower_ctrl_vnic_process(app); + } + rte_spinlock_unlock(&service_handle->spinlock); + } + + return 0; +} + +static int +nfp_flower_service_enable(struct nfp_flower_service *service_handle) +{ + int ret; + + const struct rte_service_spec flower_service = { + .name = "flower_ctrl_vnic_service", + .callback = nfp_flower_service_loop, + .callback_userdata = (void *)service_handle, + }; + + ret = nfp_service_enable(&flower_service, &service_handle->info); + if (ret != 0) + return ret; + + rte_spinlock_init(&service_handle->spinlock); + service_handle->enabled = true; + + return 0; +} + +static uint16_t +nfp_flower_service_insert(struct nfp_app_fw_flower *app, + struct nfp_flower_service *service_handle) +{ + uint16_t slot; + + rte_spinlock_lock(&service_handle->spinlock); + for (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) { + if (service_handle->slots[slot] == NULL) { + service_handle->slots[slot] = app; + break; + } + } + rte_spinlock_unlock(&service_handle->spinlock); + + return slot; +} + +int +nfp_flower_service_start(void *app_fw_flower) +{ + int ret; + struct nfp_flower_service *service_handle; + struct nfp_app_fw_flower *app = app_fw_flower; + + service_handle = nfp_flower_service_handle_get(app); + if (service_handle == NULL) { + PMD_DRV_LOG(ERR, "Can not get service handle"); + return -EINVAL; + } + + /* Enable flower service when driver initializes the first NIC */ + if (!service_handle->enabled) { + ret = nfp_flower_service_enable(service_handle); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Could not enable flower service"); + return -ESRCH; + } + } + + /* Insert the NIC to flower service slot */ + ret = nfp_flower_service_insert(app, service_handle); + if (ret == MAX_FLOWER_SERVICE_SLOT) { + PMD_DRV_LOG(ERR, "Flower ctrl vnic service slot over %u", + MAX_FLOWER_SERVICE_SLOT); + return -ENOSPC; + } + + return 0; +} + +void +nfp_flower_service_stop(void *app_fw_flower) +{ + uint16_t slot; + uint16_t count; + struct nfp_flower_service *service_handle; + struct nfp_app_fw_flower *app = app_fw_flower; + + service_handle = nfp_flower_service_handle_get(app); + if (service_handle == NULL) { + PMD_DRV_LOG(ERR, "Can not get service handle"); + return; + } + + rte_spinlock_lock(&service_handle->spinlock); + for (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) { + /* The app only in one slot */ + if (service_handle->slots[slot] != app) + continue; + + service_handle->slots[slot] = NULL; + } + rte_spinlock_unlock(&service_handle->spinlock); + + /* Determine whether to disable service */ + count = nfp_sync_handle_count_get(app->pf_hw->pf_dev->sync, NULL, + service_handle); + if (count > 1) + return; + + if (nfp_service_disable(&service_handle->info) != 0) + PMD_DRV_LOG(ERR, "Could not disable service"); +} + +int +nfp_flower_service_sync_alloc(void *app_fw_flower) +{ + struct nfp_flower_service *service_handle; + struct nfp_app_fw_flower *app = app_fw_flower; + struct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev; + + service_handle = nfp_sync_handle_alloc(pf_dev->sync, NULL, + NFP_SYNC_MAGIC_FL_SERVICE, + sizeof(struct nfp_flower_service)); + if (service_handle == NULL) + return -ENOMEM; + + pf_dev->process_share.fl_service = service_handle; + + return 0; +} + +void +nfp_flower_service_sync_free(void *app_fw_flower) +{ + struct nfp_app_fw_flower *app = app_fw_flower; + struct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev; + + nfp_sync_handle_free(pf_dev->sync, NULL, pf_dev->process_share.fl_service); + + pf_dev->process_share.fl_service = NULL; +} diff --git a/drivers/net/nfp/flower/nfp_flower_service.h b/drivers/net/nfp/flower/nfp_flower_service.h new file mode 100644 index 0000000000..a75780274f --- /dev/null +++ b/drivers/net/nfp/flower/nfp_flower_service.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2024 Corigine, Inc. + * All rights reserved. + */ + +#ifndef __NFP_FLOWER_SERVICE_H__ +#define __NFP_FLOWER_SERVICE_H__ + +struct nfp_flower_service; + +int nfp_flower_service_start(void *app_fw_flower); +void nfp_flower_service_stop(void *app_fw_flower); + +int nfp_flower_service_sync_alloc(void *app_fw_flower); +void nfp_flower_service_sync_free(void *app_fw_flower); + +#endif /* __NFP_FLOWER_SERVICE_H__ */ diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 0f4beccbdf..e376fd328f 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -13,6 +13,7 @@ sources = files( 'flower/nfp_flower_ctrl.c', 'flower/nfp_flower_flow.c', 'flower/nfp_flower_representor.c', + 'flower/nfp_flower_service.c', 'nfd3/nfp_nfd3_dp.c', 'nfdk/nfp_nfdk_dp.c', 'nfpcore/nfp_cppcore.c', diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h index eaa7501e8e..e374739022 100644 --- a/drivers/net/nfp/nfp_net_common.h +++ b/drivers/net/nfp/nfp_net_common.h @@ -12,6 +12,7 @@ #include #include +#include "flower/nfp_flower_service.h" #include "nfpcore/nfp_sync.h" #include "nfp_net_ctrl.h" #include "nfp_service.h" @@ -80,6 +81,10 @@ struct nfp_multi_pf { uint8_t *beat_addr; }; +struct nfp_process_share { + struct nfp_flower_service *fl_service; +}; + struct nfp_pf_dev { /** Backpointer to associated pci device */ struct rte_pci_device *pci_dev; @@ -114,6 +119,7 @@ struct nfp_pf_dev { /** Synchronized info */ struct nfp_sync *sync; + struct nfp_process_share process_share; }; #define NFP_NET_FLOW_LIMIT 1024 diff --git a/drivers/net/nfp/nfpcore/nfp_sync.h b/drivers/net/nfp/nfpcore/nfp_sync.h index 82f01e2652..ff3f60937e 100644 --- a/drivers/net/nfp/nfpcore/nfp_sync.h +++ b/drivers/net/nfp/nfpcore/nfp_sync.h @@ -10,6 +10,8 @@ #include +#define NFP_SYNC_MAGIC_FL_SERVICE 0x53594e41 /**< ASCII - SYNA */ + struct nfp_sync; struct nfp_sync *nfp_sync_alloc(void);