From: Pavan Nikhilesh <pbhagavat...@marvell.com> Add infra to split eventdev framework based on event Tx adapter capability. If event Tx adapter has internal port capability then we use `rte_event_eth_tx_adapter_enqueue` to transmitting packets else we use a SINGLE_LINK event queue to enqueue packets to a service core which is responsible for transmitting packets.
Signed-off-by: Sunil Kumar Kori <sk...@marvell.com> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> --- examples/l2fwd-event/Makefile | 2 ++ examples/l2fwd-event/l2fwd_eventdev.c | 29 +++++++++++++++++++ examples/l2fwd-event/l2fwd_eventdev.h | 20 +++++++++++++ examples/l2fwd-event/l2fwd_eventdev_generic.c | 24 +++++++++++++++ .../l2fwd_eventdev_internal_port.c | 24 +++++++++++++++ examples/l2fwd-event/meson.build | 4 ++- 6 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 examples/l2fwd-event/l2fwd_eventdev_generic.c create mode 100644 examples/l2fwd-event/l2fwd_eventdev_internal_port.c diff --git a/examples/l2fwd-event/Makefile b/examples/l2fwd-event/Makefile index bfe0058a2..c1f700a65 100644 --- a/examples/l2fwd-event/Makefile +++ b/examples/l2fwd-event/Makefile @@ -8,6 +8,8 @@ APP = l2fwd-event # all source are stored in SRCS-y SRCS-y := main.c SRCS-y += l2fwd_eventdev.c +SRCS-y += l2fwd_eventdev_internal_port.c +SRCS-y += l2fwd_eventdev_generic.c # Build using pkg-config variables if possible ifeq ($(shell pkg-config --exists libdpdk && echo 0),0) diff --git a/examples/l2fwd-event/l2fwd_eventdev.c b/examples/l2fwd-event/l2fwd_eventdev.c index 19efb6d1e..df76f1c1f 100644 --- a/examples/l2fwd-event/l2fwd_eventdev.c +++ b/examples/l2fwd-event/l2fwd_eventdev.c @@ -76,6 +76,31 @@ parse_eventdev_args(char **argv, int argc) return 0; } +static void +eventdev_capability_setup(void) +{ + struct eventdev_resources *eventdev_rsrc = get_eventdev_rsrc(); + uint32_t caps = 0; + uint16_t i; + int ret; + + RTE_ETH_FOREACH_DEV(i) { + ret = rte_event_eth_tx_adapter_caps_get(0, i, &caps); + if (ret) + rte_exit(EXIT_FAILURE, + "Invalid capability for Tx adptr port %d\n", + i); + + eventdev_rsrc->tx_mode_q |= !(caps & + RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT); + } + + if (eventdev_rsrc->tx_mode_q) + eventdev_set_generic_ops(&eventdev_rsrc->ops); + else + eventdev_set_internal_port_ops(&eventdev_rsrc->ops); +} + void eventdev_resource_setup(void) { @@ -90,6 +115,10 @@ eventdev_resource_setup(void) if (!rte_event_dev_count()) rte_exit(EXIT_FAILURE, "No Eventdev found"); + + /* Setup eventdev capability callbacks */ + eventdev_capability_setup(); + /* Start event device service */ ret = rte_event_dev_service_id_get(eventdev_rsrc->event_d_id, &service_id); diff --git a/examples/l2fwd-event/l2fwd_eventdev.h b/examples/l2fwd-event/l2fwd_eventdev.h index 2e8d95e67..8b6606b4c 100644 --- a/examples/l2fwd-event/l2fwd_eventdev.h +++ b/examples/l2fwd-event/l2fwd_eventdev.h @@ -18,8 +18,26 @@ enum { CMD_LINE_OPT_EVENTQ_SYNC_NUM, }; +typedef void (*event_queue_setup_cb)(uint16_t ethdev_count, + uint32_t event_queue_cfg); +typedef uint32_t (*eventdev_setup_cb)(uint16_t ethdev_count); +typedef void (*adapter_setup_cb)(uint16_t ethdev_count); +typedef void (*event_port_setup_cb)(void); +typedef void (*service_setup_cb)(void); +typedef void (*event_loop_cb)(void); + +struct eventdev_setup_ops { + event_queue_setup_cb event_queue_setup; + event_port_setup_cb event_port_setup; + eventdev_setup_cb eventdev_setup; + adapter_setup_cb adapter_setup; + service_setup_cb service_setup; + event_loop_cb l2fwd_event_loop; +}; + struct eventdev_resources { struct l2fwd_port_statistics *stats; + struct eventdev_setup_ops ops; struct rte_mempool *pkt_pool; uint64_t timer_period; uint32_t *dst_ports; @@ -58,5 +76,7 @@ get_eventdev_rsrc(void) } void eventdev_resource_setup(void); +void eventdev_set_generic_ops(struct eventdev_setup_ops *ops); +void eventdev_set_internal_port_ops(struct eventdev_setup_ops *ops); #endif /* __L2FWD_EVENTDEV_H__ */ diff --git a/examples/l2fwd-event/l2fwd_eventdev_generic.c b/examples/l2fwd-event/l2fwd_eventdev_generic.c new file mode 100644 index 000000000..e3990f8b0 --- /dev/null +++ b/examples/l2fwd-event/l2fwd_eventdev_generic.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2019 Marvell International Ltd. + */ + +#include <stdbool.h> +#include <getopt.h> + +#include <rte_cycles.h> +#include <rte_ethdev.h> +#include <rte_eventdev.h> +#include <rte_event_eth_rx_adapter.h> +#include <rte_event_eth_tx_adapter.h> +#include <rte_lcore.h> +#include <rte_log.h> +#include <rte_spinlock.h> + +#include "l2fwd_common.h" +#include "l2fwd_eventdev.h" + +void +eventdev_set_generic_ops(struct eventdev_setup_ops *ops) +{ + RTE_SET_USED(ops); +} diff --git a/examples/l2fwd-event/l2fwd_eventdev_internal_port.c b/examples/l2fwd-event/l2fwd_eventdev_internal_port.c new file mode 100644 index 000000000..a0d2111f9 --- /dev/null +++ b/examples/l2fwd-event/l2fwd_eventdev_internal_port.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2019 Marvell International Ltd. + */ + +#include <stdbool.h> +#include <getopt.h> + +#include <rte_cycles.h> +#include <rte_ethdev.h> +#include <rte_eventdev.h> +#include <rte_event_eth_rx_adapter.h> +#include <rte_event_eth_tx_adapter.h> +#include <rte_lcore.h> +#include <rte_log.h> +#include <rte_spinlock.h> + +#include "l2fwd_common.h" +#include "l2fwd_eventdev.h" + +void +eventdev_set_internal_port_ops(struct eventdev_setup_ops *ops) +{ + RTE_SET_USED(ops); +} diff --git a/examples/l2fwd-event/meson.build b/examples/l2fwd-event/meson.build index b1ad48cc5..38560840c 100644 --- a/examples/l2fwd-event/meson.build +++ b/examples/l2fwd-event/meson.build @@ -9,5 +9,7 @@ sources = files( 'main.c', - 'l2fwd_eventdev.c' + 'l2fwd_eventdev.c', + 'l2fwd_eventdev_internal_port.c', + 'l2fwd_eventdev_generic.c' ) -- 2.17.1