From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, niklas.soderlund@corigine.com,
Chaoyong He <chaoyong.he@corigine.com>,
Heinrich Kuhn <heinrich.kuhn@corigine.com>
Subject: [PATCH v9 04/12] net/nfp: add initial flower firmware support
Date: Thu, 15 Sep 2022 18:44:21 +0800 [thread overview]
Message-ID: <1663238669-12244-5-git-send-email-chaoyong.he@corigine.com> (raw)
In-Reply-To: <1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>
Adds the basic probing infrastructure to support the flower firmware
application.
Adds the cpp service, used for some user tools.
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Signed-off-by: Heinrich Kuhn <heinrich.kuhn@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
doc/guides/nics/nfp.rst | 13 +++++
doc/guides/rel_notes/release_22_11.rst | 7 +++
drivers/net/nfp/flower/nfp_flower.c | 45 +++++++++++++++++
drivers/net/nfp/flower/nfp_flower.h | 16 +++++++
drivers/net/nfp/meson.build | 1 +
drivers/net/nfp/nfp_common.h | 1 +
drivers/net/nfp/nfp_cpp_bridge.c | 88 +++++++++++++++++++++++++++++-----
drivers/net/nfp/nfp_cpp_bridge.h | 6 ++-
drivers/net/nfp/nfp_ethdev.c | 31 +++++++++++-
9 files changed, 192 insertions(+), 16 deletions(-)
create mode 100644 drivers/net/nfp/flower/nfp_flower.c
create mode 100644 drivers/net/nfp/flower/nfp_flower.h
diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst
index 55539ac..4faab39 100644
--- a/doc/guides/nics/nfp.rst
+++ b/doc/guides/nics/nfp.rst
@@ -181,3 +181,16 @@ System configuration
-k option shows the device driver, if any, that devices are bound to.
Depending on the modules loaded at this point the new PCI devices may be
bound to nfp_netvf driver.
+
+
+Flow offload
+------------
+
+Use the flower firmware application, some type of Netronome's SmartNICs can
+offload the flow into cards.
+
+The flower firmware application requires the PMD running two services:
+
+ * PF vNIC service: handling the feedback traffic.
+ * ctrl vNIC service: communicate between PMD and firmware through
+ control message.
diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst
index f601617..6a666aa 100644
--- a/doc/guides/rel_notes/release_22_11.rst
+++ b/doc/guides/rel_notes/release_22_11.rst
@@ -55,6 +55,13 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated Netronome nfp driver.**
+
+ Add the needed data structures and logics to support the offload of rte_flow:
+
+ * Added the support of flower firmware.
+ * Added the flower service infrastructure.
+
Removed Items
-------------
diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c
new file mode 100644
index 0000000..87cb922
--- /dev/null
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2022 Corigine, Inc.
+ * All rights reserved.
+ */
+
+#include <rte_common.h>
+#include <ethdev_driver.h>
+#include <rte_service_component.h>
+#include <rte_malloc.h>
+#include <ethdev_pci.h>
+#include <ethdev_driver.h>
+
+#include "../nfp_common.h"
+#include "../nfp_logs.h"
+#include "../nfp_ctrl.h"
+#include "../nfp_cpp_bridge.h"
+#include "nfp_flower.h"
+
+int
+nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev)
+{
+ unsigned int numa_node;
+ struct nfp_app_fw_flower *app_fw_flower;
+
+ numa_node = rte_socket_id();
+
+ /* Allocate memory for the Flower app */
+ app_fw_flower = rte_zmalloc_socket("nfp_app_fw_flower", sizeof(*app_fw_flower),
+ RTE_CACHE_LINE_SIZE, numa_node);
+ if (app_fw_flower == NULL) {
+ PMD_INIT_LOG(ERR, "Could not malloc app fw flower");
+ return -ENOMEM;
+ }
+
+ pf_dev->app_fw_priv = app_fw_flower;
+
+ return 0;
+}
+
+int
+nfp_secondary_init_app_fw_flower(__rte_unused struct nfp_cpp *cpp)
+{
+ PMD_INIT_LOG(ERR, "Flower firmware not supported");
+ return -ENOTSUP;
+}
diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h
new file mode 100644
index 0000000..8b9ef95
--- /dev/null
+++ b/drivers/net/nfp/flower/nfp_flower.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2022 Corigine, Inc.
+ * All rights reserved.
+ */
+
+#ifndef _NFP_FLOWER_H_
+#define _NFP_FLOWER_H_
+
+/* The flower application's private structure */
+struct nfp_app_fw_flower {
+};
+
+int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev);
+int nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp);
+
+#endif /* _NFP_FLOWER_H_ */
diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build
index 810f02a..7ae3115 100644
--- a/drivers/net/nfp/meson.build
+++ b/drivers/net/nfp/meson.build
@@ -6,6 +6,7 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
reason = 'only supported on 64-bit Linux'
endif
sources = files(
+ 'flower/nfp_flower.c',
'nfpcore/nfp_cpp_pcie_ops.c',
'nfpcore/nfp_nsp.c',
'nfpcore/nfp_cppcore.c',
diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h
index 6af8481..cefe717 100644
--- a/drivers/net/nfp/nfp_common.h
+++ b/drivers/net/nfp/nfp_common.h
@@ -114,6 +114,7 @@
/* Firmware application ID's */
enum nfp_app_fw_id {
NFP_APP_FW_CORE_NIC = 0x1,
+ NFP_APP_FW_FLOWER_NIC = 0x3,
};
/* nfp_qcp_ptr - Read or Write Pointer of a queue */
diff --git a/drivers/net/nfp/nfp_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c
index 0922ea9..155628d 100644
--- a/drivers/net/nfp/nfp_cpp_bridge.c
+++ b/drivers/net/nfp/nfp_cpp_bridge.c
@@ -28,22 +28,86 @@
static int nfp_cpp_bridge_serve_write(int sockfd, struct nfp_cpp *cpp);
static int nfp_cpp_bridge_serve_read(int sockfd, struct nfp_cpp *cpp);
static int nfp_cpp_bridge_serve_ioctl(int sockfd, struct nfp_cpp *cpp);
+static int nfp_cpp_bridge_service_func(void *args);
-void nfp_register_cpp_service(struct nfp_cpp *cpp)
+int
+nfp_map_service(uint32_t service_id)
{
- uint32_t *cpp_service_id = NULL;
- struct rte_service_spec service;
+ int32_t ret;
+ uint32_t slcore = 0;
+ int32_t slcore_count;
+ uint8_t service_count;
+ const char *service_name;
+ uint32_t slcore_array[RTE_MAX_LCORE];
+ uint8_t min_service_count = UINT8_MAX;
+
+ slcore_count = rte_service_lcore_list(slcore_array, RTE_MAX_LCORE);
+ if (slcore_count <= 0) {
+ PMD_INIT_LOG(DEBUG, "No service cores found");
+ return -ENOENT;
+ }
+
+ /*
+ * Find a service core with the least number of services already
+ * registered to it
+ */
+ while (slcore_count--) {
+ service_count = rte_service_lcore_count_services(slcore_array[slcore_count]);
+ if (service_count < min_service_count) {
+ slcore = slcore_array[slcore_count];
+ min_service_count = service_count;
+ }
+ }
+
+ service_name = rte_service_get_name(service_id);
+ PMD_INIT_LOG(INFO, "Mapping service %s to core %u", service_name, slcore);
- memset(&service, 0, sizeof(struct rte_service_spec));
- snprintf(service.name, sizeof(service.name), "nfp_cpp_service");
- service.callback = nfp_cpp_bridge_service_func;
- service.callback_userdata = (void *)cpp;
+ ret = rte_service_map_lcore_set(service_id, slcore, 1);
+ if (ret != 0) {
+ PMD_INIT_LOG(DEBUG, "Could not map flower service");
+ return -ENOENT;
+ }
- if (rte_service_component_register(&service,
- cpp_service_id))
- RTE_LOG(WARNING, PMD, "NFP CPP bridge service register() failed");
+ rte_service_runstate_set(service_id, 1);
+ rte_service_component_runstate_set(service_id, 1);
+ rte_service_lcore_start(slcore);
+ if (rte_service_may_be_active(slcore))
+ PMD_INIT_LOG(INFO, "The service %s is running", service_name);
else
- RTE_LOG(DEBUG, PMD, "NFP CPP bridge service registered");
+ PMD_INIT_LOG(ERR, "The service %s is not running", service_name);
+
+ return 0;
+}
+
+int
+nfp_enable_cpp_service(struct nfp_cpp *cpp)
+{
+ int ret;
+ uint32_t service_id = 0;
+ struct rte_service_spec cpp_service = {
+ .name = "nfp_cpp_service",
+ .callback = nfp_cpp_bridge_service_func,
+ };
+
+ cpp_service.callback_userdata = (void *)cpp;
+
+ /* Register the cpp service */
+ ret = rte_service_component_register(&cpp_service, &service_id);
+ if (ret != 0) {
+ PMD_INIT_LOG(WARNING, "Could not register nfp cpp service");
+ return -EINVAL;
+ }
+
+ PMD_INIT_LOG(INFO, "NFP cpp service registered");
+
+ /* Map it to available service core*/
+ ret = nfp_map_service(service_id);
+ if (ret != 0) {
+ PMD_INIT_LOG(DEBUG, "Could not map nfp cpp service");
+ return -EINVAL;
+ }
+
+ return 0;
}
/*
@@ -307,7 +371,7 @@ void nfp_register_cpp_service(struct nfp_cpp *cpp)
* unaware of the CPP bridge performing the NFP kernel char driver for CPP
* accesses.
*/
-int32_t
+static int
nfp_cpp_bridge_service_func(void *args)
{
struct sockaddr address;
diff --git a/drivers/net/nfp/nfp_cpp_bridge.h b/drivers/net/nfp/nfp_cpp_bridge.h
index aea5fdc..7fee3a9 100644
--- a/drivers/net/nfp/nfp_cpp_bridge.h
+++ b/drivers/net/nfp/nfp_cpp_bridge.h
@@ -16,6 +16,8 @@
#ifndef _NFP_CPP_BRIDGE_H_
#define _NFP_CPP_BRIDGE_H_
+#include "nfp_common.h"
+
#define NFP_CPP_MEMIO_BOUNDARY (1 << 20)
#define NFP_BRIDGE_OP_READ 20
#define NFP_BRIDGE_OP_WRITE 30
@@ -24,8 +26,8 @@
#define NFP_IOCTL 'n'
#define NFP_IOCTL_CPP_IDENTIFICATION _IOW(NFP_IOCTL, 0x8f, uint32_t)
-void nfp_register_cpp_service(struct nfp_cpp *cpp);
-int32_t nfp_cpp_bridge_service_func(void *args);
+int nfp_enable_cpp_service(struct nfp_cpp *cpp);
+int nfp_map_service(uint32_t service_id);
#endif /* _NFP_CPP_BRIDGE_H_ */
/*
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 0d09a69..ddfe495 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -38,6 +38,8 @@
#include "nfp_ctrl.h"
#include "nfp_cpp_bridge.h"
+#include "flower/nfp_flower.h"
+
static int
nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic, int port)
{
@@ -967,6 +969,14 @@
goto hwqueues_cleanup;
}
break;
+ case NFP_APP_FW_FLOWER_NIC:
+ PMD_INIT_LOG(INFO, "Initializing Flower");
+ ret = nfp_init_app_fw_flower(pf_dev);
+ if (ret != 0) {
+ PMD_INIT_LOG(ERR, "Could not initialize Flower!");
+ goto hwqueues_cleanup;
+ }
+ break;
default:
PMD_INIT_LOG(ERR, "Unsupported Firmware loaded");
ret = -EINVAL;
@@ -974,7 +984,12 @@
}
/* register the CPP bridge service here for primary use */
- nfp_register_cpp_service(pf_dev->cpp);
+ ret = nfp_enable_cpp_service(pf_dev->cpp);
+ if (ret != 0) {
+ PMD_INIT_LOG(ERR, "Enable cpp service failed.");
+ ret = -EINVAL;
+ goto hwqueues_cleanup;
+ }
return 0;
@@ -1098,6 +1113,14 @@
goto sym_tbl_cleanup;
}
break;
+ case NFP_APP_FW_FLOWER_NIC:
+ PMD_INIT_LOG(INFO, "Initializing Flower");
+ ret = nfp_secondary_init_app_fw_flower(cpp);
+ if (ret != 0) {
+ PMD_INIT_LOG(ERR, "Could not initialize Flower!");
+ goto sym_tbl_cleanup;
+ }
+ break;
default:
PMD_INIT_LOG(ERR, "Unsupported Firmware loaded");
ret = -EINVAL;
@@ -1105,7 +1128,11 @@
}
/* Register the CPP bridge service for the secondary too */
- nfp_register_cpp_service(cpp);
+ ret = nfp_enable_cpp_service(cpp);
+ if (ret != 0) {
+ PMD_INIT_LOG(ERR, "Enable cpp service failed.");
+ ret = -EINVAL;
+ }
sym_tbl_cleanup:
free(sym_tbl);
--
1.8.3.1
next prev parent reply other threads:[~2022-09-15 10:45 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-15 10:44 [PATCH v9 00/12] preparation for the rte_flow offload of nfp PMD Chaoyong He
2022-09-15 10:44 ` [PATCH v9 01/12] net/nfp: move app specific attributes to own struct Chaoyong He
2022-09-15 10:44 ` [PATCH v9 02/12] net/nfp: simplify initialization and remove dead code Chaoyong He
2022-09-15 10:44 ` [PATCH v9 03/12] net/nfp: move app specific init logic to own function Chaoyong He
2022-09-15 10:44 ` Chaoyong He [this message]
2022-09-15 10:44 ` [PATCH v9 05/12] net/nfp: add flower PF setup logic Chaoyong He
2022-09-20 14:57 ` Ferruh Yigit
2022-09-21 2:50 ` Chaoyong He
2022-09-21 7:35 ` Thomas Monjalon
2022-09-21 7:47 ` Chaoyong He
2022-09-15 10:44 ` [PATCH v9 06/12] net/nfp: add flower PF related routines Chaoyong He
2022-09-15 10:44 ` [PATCH v9 07/12] net/nfp: add flower ctrl VNIC related logics Chaoyong He
2022-09-20 14:56 ` Ferruh Yigit
2022-09-21 2:02 ` Chaoyong He
2022-09-21 7:29 ` Thomas Monjalon
2022-09-21 7:42 ` Chaoyong He
2022-09-15 10:44 ` [PATCH v9 08/12] net/nfp: move common rxtx function for flower use Chaoyong He
2022-09-15 10:44 ` [PATCH v9 09/12] net/nfp: add flower ctrl VNIC rxtx logic Chaoyong He
2022-09-15 10:44 ` [PATCH v9 10/12] net/nfp: add flower representor framework Chaoyong He
2022-09-15 10:44 ` [PATCH v9 11/12] net/nfp: move rxtx function to header file Chaoyong He
2022-09-15 10:44 ` [PATCH v9 12/12] net/nfp: add flower PF rxtx logic Chaoyong He
2022-09-20 14:56 ` [PATCH v9 00/12] preparation for the rte_flow offload of nfp PMD Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1663238669-12244-5-git-send-email-chaoyong.he@corigine.com \
--to=chaoyong.he@corigine.com \
--cc=dev@dpdk.org \
--cc=heinrich.kuhn@corigine.com \
--cc=niklas.soderlund@corigine.com \
--cc=oss-drivers@corigine.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.