xref: /dpdk/drivers/event/sw/sw_evdev_selftest.c (revision 08966fe7f79fdaa5019b7559eebe84a1e3787b89)
185fb515bSPavan Nikhilesh /* SPDX-License-Identifier: BSD-3-Clause
285fb515bSPavan Nikhilesh  * Copyright(c) 2016-2017 Intel Corporation
385fb515bSPavan Nikhilesh  */
485fb515bSPavan Nikhilesh 
5*08966fe7STyler Retzlaff #include <stdalign.h>
685fb515bSPavan Nikhilesh #include <stdio.h>
785fb515bSPavan Nikhilesh #include <string.h>
885fb515bSPavan Nikhilesh #include <stdint.h>
972b452c5SDmitry Kozlyuk #include <stdlib.h>
1085fb515bSPavan Nikhilesh #include <errno.h>
1185fb515bSPavan Nikhilesh #include <unistd.h>
1285fb515bSPavan Nikhilesh #include <sys/queue.h>
1385fb515bSPavan Nikhilesh 
1485fb515bSPavan Nikhilesh #include <rte_memory.h>
1585fb515bSPavan Nikhilesh #include <rte_launch.h>
1685fb515bSPavan Nikhilesh #include <rte_eal.h>
1785fb515bSPavan Nikhilesh #include <rte_per_lcore.h>
1885fb515bSPavan Nikhilesh #include <rte_lcore.h>
1985fb515bSPavan Nikhilesh #include <rte_debug.h>
2085fb515bSPavan Nikhilesh #include <rte_ethdev.h>
2185fb515bSPavan Nikhilesh #include <rte_cycles.h>
2285fb515bSPavan Nikhilesh #include <rte_eventdev.h>
2385fb515bSPavan Nikhilesh #include <rte_pause.h>
2485fb515bSPavan Nikhilesh #include <rte_service.h>
2585fb515bSPavan Nikhilesh #include <rte_service_component.h>
264851ef2bSDavid Marchand #include <bus_vdev_driver.h>
2785fb515bSPavan Nikhilesh 
285e6eb5ccSPavan Nikhilesh #include "sw_evdev.h"
2985fb515bSPavan Nikhilesh 
3085fb515bSPavan Nikhilesh #define MAX_PORTS 16
3185fb515bSPavan Nikhilesh #define MAX_QIDS 16
32aee48294SBruce Richardson #define NUM_PACKETS (1 << 17)
338490488aSGage Eads #define DEQUEUE_DEPTH 128
3485fb515bSPavan Nikhilesh 
3585fb515bSPavan Nikhilesh static int evdev;
3685fb515bSPavan Nikhilesh 
3785fb515bSPavan Nikhilesh struct test {
3885fb515bSPavan Nikhilesh 	struct rte_mempool *mbuf_pool;
3985fb515bSPavan Nikhilesh 	uint8_t port[MAX_PORTS];
4085fb515bSPavan Nikhilesh 	uint8_t qid[MAX_QIDS];
4185fb515bSPavan Nikhilesh 	int nb_qids;
4285fb515bSPavan Nikhilesh 	uint32_t service_id;
4385fb515bSPavan Nikhilesh };
4485fb515bSPavan Nikhilesh 
4570418e32SThomas Monjalon typedef uint8_t counter_dynfield_t;
4670418e32SThomas Monjalon static int counter_dynfield_offset = -1;
4770418e32SThomas Monjalon 
4870418e32SThomas Monjalon static inline counter_dynfield_t *
counter_field(struct rte_mbuf * mbuf)4970418e32SThomas Monjalon counter_field(struct rte_mbuf *mbuf)
5070418e32SThomas Monjalon {
5170418e32SThomas Monjalon 	return RTE_MBUF_DYNFIELD(mbuf, \
5270418e32SThomas Monjalon 			counter_dynfield_offset, counter_dynfield_t *);
5370418e32SThomas Monjalon }
5470418e32SThomas Monjalon 
5585fb515bSPavan Nikhilesh static struct rte_event release_ev;
5685fb515bSPavan Nikhilesh 
5785fb515bSPavan Nikhilesh static inline struct rte_mbuf *
rte_gen_arp(int portid,struct rte_mempool * mp)5885fb515bSPavan Nikhilesh rte_gen_arp(int portid, struct rte_mempool *mp)
5985fb515bSPavan Nikhilesh {
6085fb515bSPavan Nikhilesh 	/*
6185fb515bSPavan Nikhilesh 	 * len = 14 + 46
6285fb515bSPavan Nikhilesh 	 * ARP, Request who-has 10.0.0.1 tell 10.0.0.2, length 46
6385fb515bSPavan Nikhilesh 	 */
6485fb515bSPavan Nikhilesh 	static const uint8_t arp_request[] = {
6585fb515bSPavan Nikhilesh 		/*0x0000:*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8,
6685fb515bSPavan Nikhilesh 		0x6b, 0xfd, 0x02, 0x29, 0x08, 0x06, 0x00, 0x01,
6785fb515bSPavan Nikhilesh 		/*0x0010:*/ 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xec, 0xa8,
6885fb515bSPavan Nikhilesh 		0x6b, 0xfd, 0x02, 0x29, 0x0a, 0x00, 0x00, 0x01,
6985fb515bSPavan Nikhilesh 		/*0x0020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
7085fb515bSPavan Nikhilesh 		0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7185fb515bSPavan Nikhilesh 		/*0x0030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7285fb515bSPavan Nikhilesh 		0x00, 0x00, 0x00, 0x00
7385fb515bSPavan Nikhilesh 	};
7485fb515bSPavan Nikhilesh 	struct rte_mbuf *m;
7585fb515bSPavan Nikhilesh 	int pkt_len = sizeof(arp_request) - 1;
7685fb515bSPavan Nikhilesh 
7785fb515bSPavan Nikhilesh 	m = rte_pktmbuf_alloc(mp);
7885fb515bSPavan Nikhilesh 	if (!m)
7985fb515bSPavan Nikhilesh 		return 0;
8085fb515bSPavan Nikhilesh 
8185fb515bSPavan Nikhilesh 	memcpy((void *)((uintptr_t)m->buf_addr + m->data_off),
8285fb515bSPavan Nikhilesh 		arp_request, pkt_len);
8385fb515bSPavan Nikhilesh 	rte_pktmbuf_pkt_len(m) = pkt_len;
8485fb515bSPavan Nikhilesh 	rte_pktmbuf_data_len(m) = pkt_len;
8585fb515bSPavan Nikhilesh 
8685fb515bSPavan Nikhilesh 	RTE_SET_USED(portid);
8785fb515bSPavan Nikhilesh 
8885fb515bSPavan Nikhilesh 	return m;
8985fb515bSPavan Nikhilesh }
9085fb515bSPavan Nikhilesh 
9185fb515bSPavan Nikhilesh static void
xstats_print(void)9285fb515bSPavan Nikhilesh xstats_print(void)
9385fb515bSPavan Nikhilesh {
9485fb515bSPavan Nikhilesh 	const uint32_t XSTATS_MAX = 1024;
9585fb515bSPavan Nikhilesh 	uint32_t i;
961bdfe4d7SPavan Nikhilesh 	uint64_t ids[XSTATS_MAX];
9785fb515bSPavan Nikhilesh 	uint64_t values[XSTATS_MAX];
9885fb515bSPavan Nikhilesh 	struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX];
9985fb515bSPavan Nikhilesh 
10085fb515bSPavan Nikhilesh 	for (i = 0; i < XSTATS_MAX; i++)
10185fb515bSPavan Nikhilesh 		ids[i] = i;
10285fb515bSPavan Nikhilesh 
10385fb515bSPavan Nikhilesh 	/* Device names / values */
10485fb515bSPavan Nikhilesh 	int ret = rte_event_dev_xstats_names_get(evdev,
10585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE, 0,
10685fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
10785fb515bSPavan Nikhilesh 	if (ret < 0) {
10885fb515bSPavan Nikhilesh 		printf("%d: xstats names get() returned error\n",
10985fb515bSPavan Nikhilesh 			__LINE__);
11085fb515bSPavan Nikhilesh 		return;
11185fb515bSPavan Nikhilesh 	}
11285fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
11385fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
11485fb515bSPavan Nikhilesh 					0, ids, values, ret);
11585fb515bSPavan Nikhilesh 	if (ret > (signed int)XSTATS_MAX)
11685fb515bSPavan Nikhilesh 		printf("%s %d: more xstats available than space\n",
11785fb515bSPavan Nikhilesh 				__func__, __LINE__);
11885fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
11985fb515bSPavan Nikhilesh 		printf("%d : %s : %"PRIu64"\n",
12085fb515bSPavan Nikhilesh 				i, xstats_names[i].name, values[i]);
12185fb515bSPavan Nikhilesh 	}
12285fb515bSPavan Nikhilesh 
12385fb515bSPavan Nikhilesh 	/* Port names / values */
12485fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_names_get(evdev,
12585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, 0,
12685fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
12785fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
12885fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, 1,
12985fb515bSPavan Nikhilesh 					ids, values, ret);
13085fb515bSPavan Nikhilesh 	if (ret > (signed int)XSTATS_MAX)
13185fb515bSPavan Nikhilesh 		printf("%s %d: more xstats available than space\n",
13285fb515bSPavan Nikhilesh 				__func__, __LINE__);
13385fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
13485fb515bSPavan Nikhilesh 		printf("%d : %s : %"PRIu64"\n",
13585fb515bSPavan Nikhilesh 				i, xstats_names[i].name, values[i]);
13685fb515bSPavan Nikhilesh 	}
13785fb515bSPavan Nikhilesh 
13885fb515bSPavan Nikhilesh 	/* Queue names / values */
13985fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_names_get(evdev,
14085fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE, 0,
14185fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
14285fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
14385fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE,
14485fb515bSPavan Nikhilesh 					1, ids, values, ret);
14585fb515bSPavan Nikhilesh 	if (ret > (signed int)XSTATS_MAX)
14685fb515bSPavan Nikhilesh 		printf("%s %d: more xstats available than space\n",
14785fb515bSPavan Nikhilesh 				__func__, __LINE__);
14885fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
14985fb515bSPavan Nikhilesh 		printf("%d : %s : %"PRIu64"\n",
15085fb515bSPavan Nikhilesh 				i, xstats_names[i].name, values[i]);
15185fb515bSPavan Nikhilesh 	}
15285fb515bSPavan Nikhilesh }
15385fb515bSPavan Nikhilesh 
15485fb515bSPavan Nikhilesh /* initialization and config */
15585fb515bSPavan Nikhilesh static inline int
init(struct test * t,int nb_queues,int nb_ports)15685fb515bSPavan Nikhilesh init(struct test *t, int nb_queues, int nb_ports)
15785fb515bSPavan Nikhilesh {
15885fb515bSPavan Nikhilesh 	struct rte_event_dev_config config = {
15985fb515bSPavan Nikhilesh 			.nb_event_queues = nb_queues,
16085fb515bSPavan Nikhilesh 			.nb_event_ports = nb_ports,
16185fb515bSPavan Nikhilesh 			.nb_event_queue_flows = 1024,
16285fb515bSPavan Nikhilesh 			.nb_events_limit = 4096,
1638490488aSGage Eads 			.nb_event_port_dequeue_depth = DEQUEUE_DEPTH,
16485fb515bSPavan Nikhilesh 			.nb_event_port_enqueue_depth = 128,
16585fb515bSPavan Nikhilesh 	};
16685fb515bSPavan Nikhilesh 	int ret;
16785fb515bSPavan Nikhilesh 
16885fb515bSPavan Nikhilesh 	void *temp = t->mbuf_pool; /* save and restore mbuf pool */
16985fb515bSPavan Nikhilesh 
17085fb515bSPavan Nikhilesh 	memset(t, 0, sizeof(*t));
17185fb515bSPavan Nikhilesh 	t->mbuf_pool = temp;
17285fb515bSPavan Nikhilesh 
17385fb515bSPavan Nikhilesh 	ret = rte_event_dev_configure(evdev, &config);
17485fb515bSPavan Nikhilesh 	if (ret < 0)
17585fb515bSPavan Nikhilesh 		printf("%d: Error configuring device\n", __LINE__);
17685fb515bSPavan Nikhilesh 	return ret;
17785fb515bSPavan Nikhilesh };
17885fb515bSPavan Nikhilesh 
17985fb515bSPavan Nikhilesh static inline int
create_ports(struct test * t,int num_ports)18085fb515bSPavan Nikhilesh create_ports(struct test *t, int num_ports)
18185fb515bSPavan Nikhilesh {
18285fb515bSPavan Nikhilesh 	int i;
18385fb515bSPavan Nikhilesh 	static const struct rte_event_port_conf conf = {
18485fb515bSPavan Nikhilesh 			.new_event_threshold = 1024,
18585fb515bSPavan Nikhilesh 			.dequeue_depth = 32,
18685fb515bSPavan Nikhilesh 			.enqueue_depth = 64,
18785fb515bSPavan Nikhilesh 	};
18885fb515bSPavan Nikhilesh 	if (num_ports > MAX_PORTS)
18985fb515bSPavan Nikhilesh 		return -1;
19085fb515bSPavan Nikhilesh 
19185fb515bSPavan Nikhilesh 	for (i = 0; i < num_ports; i++) {
19285fb515bSPavan Nikhilesh 		if (rte_event_port_setup(evdev, i, &conf) < 0) {
19385fb515bSPavan Nikhilesh 			printf("Error setting up port %d\n", i);
19485fb515bSPavan Nikhilesh 			return -1;
19585fb515bSPavan Nikhilesh 		}
19685fb515bSPavan Nikhilesh 		t->port[i] = i;
19785fb515bSPavan Nikhilesh 	}
19885fb515bSPavan Nikhilesh 
19985fb515bSPavan Nikhilesh 	return 0;
20085fb515bSPavan Nikhilesh }
20185fb515bSPavan Nikhilesh 
20285fb515bSPavan Nikhilesh static inline int
create_lb_qids(struct test * t,int num_qids,uint32_t flags)20385fb515bSPavan Nikhilesh create_lb_qids(struct test *t, int num_qids, uint32_t flags)
20485fb515bSPavan Nikhilesh {
20585fb515bSPavan Nikhilesh 	int i;
20685fb515bSPavan Nikhilesh 
20785fb515bSPavan Nikhilesh 	/* Q creation */
20885fb515bSPavan Nikhilesh 	const struct rte_event_queue_conf conf = {
20985fb515bSPavan Nikhilesh 			.schedule_type = flags,
21085fb515bSPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
21185fb515bSPavan Nikhilesh 			.nb_atomic_flows = 1024,
21285fb515bSPavan Nikhilesh 			.nb_atomic_order_sequences = 1024,
21385fb515bSPavan Nikhilesh 	};
21485fb515bSPavan Nikhilesh 
21585fb515bSPavan Nikhilesh 	for (i = t->nb_qids; i < t->nb_qids + num_qids; i++) {
21685fb515bSPavan Nikhilesh 		if (rte_event_queue_setup(evdev, i, &conf) < 0) {
21785fb515bSPavan Nikhilesh 			printf("%d: error creating qid %d\n", __LINE__, i);
21885fb515bSPavan Nikhilesh 			return -1;
21985fb515bSPavan Nikhilesh 		}
22085fb515bSPavan Nikhilesh 		t->qid[i] = i;
22185fb515bSPavan Nikhilesh 	}
22285fb515bSPavan Nikhilesh 	t->nb_qids += num_qids;
22385fb515bSPavan Nikhilesh 	if (t->nb_qids > MAX_QIDS)
22485fb515bSPavan Nikhilesh 		return -1;
22585fb515bSPavan Nikhilesh 
22685fb515bSPavan Nikhilesh 	return 0;
22785fb515bSPavan Nikhilesh }
22885fb515bSPavan Nikhilesh 
22985fb515bSPavan Nikhilesh static inline int
create_atomic_qids(struct test * t,int num_qids)23085fb515bSPavan Nikhilesh create_atomic_qids(struct test *t, int num_qids)
23185fb515bSPavan Nikhilesh {
23285fb515bSPavan Nikhilesh 	return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_ATOMIC);
23385fb515bSPavan Nikhilesh }
23485fb515bSPavan Nikhilesh 
23585fb515bSPavan Nikhilesh static inline int
create_ordered_qids(struct test * t,int num_qids)23685fb515bSPavan Nikhilesh create_ordered_qids(struct test *t, int num_qids)
23785fb515bSPavan Nikhilesh {
23885fb515bSPavan Nikhilesh 	return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_ORDERED);
23985fb515bSPavan Nikhilesh }
24085fb515bSPavan Nikhilesh 
24185fb515bSPavan Nikhilesh 
24285fb515bSPavan Nikhilesh static inline int
create_unordered_qids(struct test * t,int num_qids)24385fb515bSPavan Nikhilesh create_unordered_qids(struct test *t, int num_qids)
24485fb515bSPavan Nikhilesh {
24585fb515bSPavan Nikhilesh 	return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_PARALLEL);
24685fb515bSPavan Nikhilesh }
24785fb515bSPavan Nikhilesh 
24885fb515bSPavan Nikhilesh static inline int
create_directed_qids(struct test * t,int num_qids,const uint8_t ports[])24985fb515bSPavan Nikhilesh create_directed_qids(struct test *t, int num_qids, const uint8_t ports[])
25085fb515bSPavan Nikhilesh {
25185fb515bSPavan Nikhilesh 	int i;
25285fb515bSPavan Nikhilesh 
25385fb515bSPavan Nikhilesh 	/* Q creation */
25485fb515bSPavan Nikhilesh 	static const struct rte_event_queue_conf conf = {
25585fb515bSPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
25685fb515bSPavan Nikhilesh 			.event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK,
25785fb515bSPavan Nikhilesh 	};
25885fb515bSPavan Nikhilesh 
25985fb515bSPavan Nikhilesh 	for (i = t->nb_qids; i < t->nb_qids + num_qids; i++) {
26085fb515bSPavan Nikhilesh 		if (rte_event_queue_setup(evdev, i, &conf) < 0) {
26185fb515bSPavan Nikhilesh 			printf("%d: error creating qid %d\n", __LINE__, i);
26285fb515bSPavan Nikhilesh 			return -1;
26385fb515bSPavan Nikhilesh 		}
26485fb515bSPavan Nikhilesh 		t->qid[i] = i;
26585fb515bSPavan Nikhilesh 
26685fb515bSPavan Nikhilesh 		if (rte_event_port_link(evdev, ports[i - t->nb_qids],
26785fb515bSPavan Nikhilesh 				&t->qid[i], NULL, 1) != 1) {
26885fb515bSPavan Nikhilesh 			printf("%d: error creating link for qid %d\n",
26985fb515bSPavan Nikhilesh 					__LINE__, i);
27085fb515bSPavan Nikhilesh 			return -1;
27185fb515bSPavan Nikhilesh 		}
27285fb515bSPavan Nikhilesh 	}
27385fb515bSPavan Nikhilesh 	t->nb_qids += num_qids;
27485fb515bSPavan Nikhilesh 	if (t->nb_qids > MAX_QIDS)
27585fb515bSPavan Nikhilesh 		return -1;
27685fb515bSPavan Nikhilesh 
27785fb515bSPavan Nikhilesh 	return 0;
27885fb515bSPavan Nikhilesh }
27985fb515bSPavan Nikhilesh 
28085fb515bSPavan Nikhilesh /* destruction */
28185fb515bSPavan Nikhilesh static inline int
cleanup(struct test * t __rte_unused)28285fb515bSPavan Nikhilesh cleanup(struct test *t __rte_unused)
28385fb515bSPavan Nikhilesh {
28485fb515bSPavan Nikhilesh 	rte_event_dev_stop(evdev);
28585fb515bSPavan Nikhilesh 	rte_event_dev_close(evdev);
28685fb515bSPavan Nikhilesh 	return 0;
28785fb515bSPavan Nikhilesh };
28885fb515bSPavan Nikhilesh 
28985fb515bSPavan Nikhilesh struct test_event_dev_stats {
29085fb515bSPavan Nikhilesh 	uint64_t rx_pkts;       /**< Total packets received */
29185fb515bSPavan Nikhilesh 	uint64_t rx_dropped;    /**< Total packets dropped (Eg Invalid QID) */
29285fb515bSPavan Nikhilesh 	uint64_t tx_pkts;       /**< Total packets transmitted */
29385fb515bSPavan Nikhilesh 
29485fb515bSPavan Nikhilesh 	/** Packets received on this port */
29585fb515bSPavan Nikhilesh 	uint64_t port_rx_pkts[MAX_PORTS];
29685fb515bSPavan Nikhilesh 	/** Packets dropped on this port */
29785fb515bSPavan Nikhilesh 	uint64_t port_rx_dropped[MAX_PORTS];
29885fb515bSPavan Nikhilesh 	/** Packets inflight on this port */
29985fb515bSPavan Nikhilesh 	uint64_t port_inflight[MAX_PORTS];
30085fb515bSPavan Nikhilesh 	/** Packets transmitted on this port */
30185fb515bSPavan Nikhilesh 	uint64_t port_tx_pkts[MAX_PORTS];
30285fb515bSPavan Nikhilesh 	/** Packets received on this qid */
30385fb515bSPavan Nikhilesh 	uint64_t qid_rx_pkts[MAX_QIDS];
30485fb515bSPavan Nikhilesh 	/** Packets dropped on this qid */
30585fb515bSPavan Nikhilesh 	uint64_t qid_rx_dropped[MAX_QIDS];
30685fb515bSPavan Nikhilesh 	/** Packets transmitted on this qid */
30785fb515bSPavan Nikhilesh 	uint64_t qid_tx_pkts[MAX_QIDS];
30885fb515bSPavan Nikhilesh };
30985fb515bSPavan Nikhilesh 
31085fb515bSPavan Nikhilesh static inline int
test_event_dev_stats_get(int dev_id,struct test_event_dev_stats * stats)31185fb515bSPavan Nikhilesh test_event_dev_stats_get(int dev_id, struct test_event_dev_stats *stats)
31285fb515bSPavan Nikhilesh {
31385fb515bSPavan Nikhilesh 	static uint32_t i;
3141bdfe4d7SPavan Nikhilesh 	static uint64_t total_ids[3]; /* rx, tx and drop */
3151bdfe4d7SPavan Nikhilesh 	static uint64_t port_rx_pkts_ids[MAX_PORTS];
3161bdfe4d7SPavan Nikhilesh 	static uint64_t port_rx_dropped_ids[MAX_PORTS];
3171bdfe4d7SPavan Nikhilesh 	static uint64_t port_inflight_ids[MAX_PORTS];
3181bdfe4d7SPavan Nikhilesh 	static uint64_t port_tx_pkts_ids[MAX_PORTS];
3191bdfe4d7SPavan Nikhilesh 	static uint64_t qid_rx_pkts_ids[MAX_QIDS];
3201bdfe4d7SPavan Nikhilesh 	static uint64_t qid_rx_dropped_ids[MAX_QIDS];
3211bdfe4d7SPavan Nikhilesh 	static uint64_t qid_tx_pkts_ids[MAX_QIDS];
32285fb515bSPavan Nikhilesh 
32385fb515bSPavan Nikhilesh 	stats->rx_pkts = rte_event_dev_xstats_by_name_get(dev_id,
32485fb515bSPavan Nikhilesh 			"dev_rx", &total_ids[0]);
32585fb515bSPavan Nikhilesh 	stats->rx_dropped = rte_event_dev_xstats_by_name_get(dev_id,
32685fb515bSPavan Nikhilesh 			"dev_drop", &total_ids[1]);
32785fb515bSPavan Nikhilesh 	stats->tx_pkts = rte_event_dev_xstats_by_name_get(dev_id,
32885fb515bSPavan Nikhilesh 			"dev_tx", &total_ids[2]);
32985fb515bSPavan Nikhilesh 	for (i = 0; i < MAX_PORTS; i++) {
33085fb515bSPavan Nikhilesh 		char name[32];
33185fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "port_%u_rx", i);
33285fb515bSPavan Nikhilesh 		stats->port_rx_pkts[i] = rte_event_dev_xstats_by_name_get(
33385fb515bSPavan Nikhilesh 				dev_id, name, &port_rx_pkts_ids[i]);
33485fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "port_%u_drop", i);
33585fb515bSPavan Nikhilesh 		stats->port_rx_dropped[i] = rte_event_dev_xstats_by_name_get(
33685fb515bSPavan Nikhilesh 				dev_id, name, &port_rx_dropped_ids[i]);
33785fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "port_%u_inflight", i);
33885fb515bSPavan Nikhilesh 		stats->port_inflight[i] = rte_event_dev_xstats_by_name_get(
33985fb515bSPavan Nikhilesh 				dev_id, name, &port_inflight_ids[i]);
34085fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "port_%u_tx", i);
34185fb515bSPavan Nikhilesh 		stats->port_tx_pkts[i] = rte_event_dev_xstats_by_name_get(
34285fb515bSPavan Nikhilesh 				dev_id, name, &port_tx_pkts_ids[i]);
34385fb515bSPavan Nikhilesh 	}
34485fb515bSPavan Nikhilesh 	for (i = 0; i < MAX_QIDS; i++) {
34585fb515bSPavan Nikhilesh 		char name[32];
34685fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "qid_%u_rx", i);
34785fb515bSPavan Nikhilesh 		stats->qid_rx_pkts[i] = rte_event_dev_xstats_by_name_get(
34885fb515bSPavan Nikhilesh 				dev_id, name, &qid_rx_pkts_ids[i]);
34985fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "qid_%u_drop", i);
35085fb515bSPavan Nikhilesh 		stats->qid_rx_dropped[i] = rte_event_dev_xstats_by_name_get(
35185fb515bSPavan Nikhilesh 				dev_id, name, &qid_rx_dropped_ids[i]);
35285fb515bSPavan Nikhilesh 		snprintf(name, sizeof(name), "qid_%u_tx", i);
35385fb515bSPavan Nikhilesh 		stats->qid_tx_pkts[i] = rte_event_dev_xstats_by_name_get(
35485fb515bSPavan Nikhilesh 				dev_id, name, &qid_tx_pkts_ids[i]);
35585fb515bSPavan Nikhilesh 	}
35685fb515bSPavan Nikhilesh 
35785fb515bSPavan Nikhilesh 	return 0;
35885fb515bSPavan Nikhilesh }
35985fb515bSPavan Nikhilesh 
36085fb515bSPavan Nikhilesh /* run_prio_packet_test
36185fb515bSPavan Nikhilesh  * This performs a basic packet priority check on the test instance passed in.
36285fb515bSPavan Nikhilesh  * It is factored out of the main priority tests as the same tests must be
36385fb515bSPavan Nikhilesh  * performed to ensure prioritization of each type of QID.
36485fb515bSPavan Nikhilesh  *
36585fb515bSPavan Nikhilesh  * Requirements:
36685fb515bSPavan Nikhilesh  *  - An initialized test structure, including mempool
36785fb515bSPavan Nikhilesh  *  - t->port[0] is initialized for both Enq / Deq of packets to the QID
36885fb515bSPavan Nikhilesh  *  - t->qid[0] is the QID to be tested
36985fb515bSPavan Nikhilesh  *  - if LB QID, the CQ must be mapped to the QID.
37085fb515bSPavan Nikhilesh  */
37185fb515bSPavan Nikhilesh static int
run_prio_packet_test(struct test * t)37285fb515bSPavan Nikhilesh run_prio_packet_test(struct test *t)
37385fb515bSPavan Nikhilesh {
37485fb515bSPavan Nikhilesh 	int err;
37585fb515bSPavan Nikhilesh 	const uint32_t MAGIC_SEQN[] = {4711, 1234};
37685fb515bSPavan Nikhilesh 	const uint32_t PRIORITY[] = {
37785fb515bSPavan Nikhilesh 		RTE_EVENT_DEV_PRIORITY_NORMAL,
37885fb515bSPavan Nikhilesh 		RTE_EVENT_DEV_PRIORITY_HIGHEST
37985fb515bSPavan Nikhilesh 	};
38085fb515bSPavan Nikhilesh 	unsigned int i;
38185fb515bSPavan Nikhilesh 	for (i = 0; i < RTE_DIM(MAGIC_SEQN); i++) {
38285fb515bSPavan Nikhilesh 		/* generate pkt and enqueue */
38385fb515bSPavan Nikhilesh 		struct rte_event ev;
38485fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
38585fb515bSPavan Nikhilesh 		if (!arp) {
38685fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
38785fb515bSPavan Nikhilesh 			return -1;
38885fb515bSPavan Nikhilesh 		}
389ca4355e4SDavid Marchand 		*rte_event_pmd_selftest_seqn(arp) = MAGIC_SEQN[i];
39085fb515bSPavan Nikhilesh 
39185fb515bSPavan Nikhilesh 		ev = (struct rte_event){
39285fb515bSPavan Nikhilesh 			.priority = PRIORITY[i],
39385fb515bSPavan Nikhilesh 			.op = RTE_EVENT_OP_NEW,
39485fb515bSPavan Nikhilesh 			.queue_id = t->qid[0],
39585fb515bSPavan Nikhilesh 			.mbuf = arp
39685fb515bSPavan Nikhilesh 		};
39785fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1);
3981b03e292SHarry van Haaren 		if (err != 1) {
39985fb515bSPavan Nikhilesh 			printf("%d: error failed to enqueue\n", __LINE__);
40085fb515bSPavan Nikhilesh 			return -1;
40185fb515bSPavan Nikhilesh 		}
40285fb515bSPavan Nikhilesh 	}
40385fb515bSPavan Nikhilesh 
40485fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
40585fb515bSPavan Nikhilesh 
40685fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
40785fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
40885fb515bSPavan Nikhilesh 	if (err) {
40985fb515bSPavan Nikhilesh 		printf("%d: error failed to get stats\n", __LINE__);
41085fb515bSPavan Nikhilesh 		return -1;
41185fb515bSPavan Nikhilesh 	}
41285fb515bSPavan Nikhilesh 
41385fb515bSPavan Nikhilesh 	if (stats.port_rx_pkts[t->port[0]] != 2) {
41485fb515bSPavan Nikhilesh 		printf("%d: error stats incorrect for directed port\n",
41585fb515bSPavan Nikhilesh 				__LINE__);
41685fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
41785fb515bSPavan Nikhilesh 		return -1;
41885fb515bSPavan Nikhilesh 	}
41985fb515bSPavan Nikhilesh 
42085fb515bSPavan Nikhilesh 	struct rte_event ev, ev2;
42185fb515bSPavan Nikhilesh 	uint32_t deq_pkts;
42285fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, t->port[0], &ev, 1, 0);
42385fb515bSPavan Nikhilesh 	if (deq_pkts != 1) {
42485fb515bSPavan Nikhilesh 		printf("%d: error failed to deq\n", __LINE__);
42585fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
42685fb515bSPavan Nikhilesh 		return -1;
42785fb515bSPavan Nikhilesh 	}
428ca4355e4SDavid Marchand 	if (*rte_event_pmd_selftest_seqn(ev.mbuf) != MAGIC_SEQN[1]) {
42985fb515bSPavan Nikhilesh 		printf("%d: first packet out not highest priority\n",
43085fb515bSPavan Nikhilesh 				__LINE__);
43185fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
43285fb515bSPavan Nikhilesh 		return -1;
43385fb515bSPavan Nikhilesh 	}
43485fb515bSPavan Nikhilesh 	rte_pktmbuf_free(ev.mbuf);
43585fb515bSPavan Nikhilesh 
43685fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, t->port[0], &ev2, 1, 0);
43785fb515bSPavan Nikhilesh 	if (deq_pkts != 1) {
43885fb515bSPavan Nikhilesh 		printf("%d: error failed to deq\n", __LINE__);
43985fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
44085fb515bSPavan Nikhilesh 		return -1;
44185fb515bSPavan Nikhilesh 	}
442ca4355e4SDavid Marchand 	if (*rte_event_pmd_selftest_seqn(ev2.mbuf) != MAGIC_SEQN[0]) {
44385fb515bSPavan Nikhilesh 		printf("%d: second packet out not lower priority\n",
44485fb515bSPavan Nikhilesh 				__LINE__);
44585fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
44685fb515bSPavan Nikhilesh 		return -1;
44785fb515bSPavan Nikhilesh 	}
44885fb515bSPavan Nikhilesh 	rte_pktmbuf_free(ev2.mbuf);
44985fb515bSPavan Nikhilesh 
45085fb515bSPavan Nikhilesh 	cleanup(t);
45185fb515bSPavan Nikhilesh 	return 0;
45285fb515bSPavan Nikhilesh }
45385fb515bSPavan Nikhilesh 
45485fb515bSPavan Nikhilesh static int
test_single_directed_packet(struct test * t)45585fb515bSPavan Nikhilesh test_single_directed_packet(struct test *t)
45685fb515bSPavan Nikhilesh {
45785fb515bSPavan Nikhilesh 	const int rx_enq = 0;
45885fb515bSPavan Nikhilesh 	const int wrk_enq = 2;
45985fb515bSPavan Nikhilesh 	int err;
46085fb515bSPavan Nikhilesh 
46185fb515bSPavan Nikhilesh 	/* Create instance with 3 directed QIDs going to 3 ports */
46285fb515bSPavan Nikhilesh 	if (init(t, 3, 3) < 0 ||
46385fb515bSPavan Nikhilesh 			create_ports(t, 3) < 0 ||
46485fb515bSPavan Nikhilesh 			create_directed_qids(t, 3, t->port) < 0)
46585fb515bSPavan Nikhilesh 		return -1;
46685fb515bSPavan Nikhilesh 
46785fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
46885fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
46985fb515bSPavan Nikhilesh 		return -1;
47085fb515bSPavan Nikhilesh 	}
47185fb515bSPavan Nikhilesh 
47285fb515bSPavan Nikhilesh 	/************** FORWARD ****************/
47385fb515bSPavan Nikhilesh 	struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
47485fb515bSPavan Nikhilesh 	struct rte_event ev = {
47585fb515bSPavan Nikhilesh 			.op = RTE_EVENT_OP_NEW,
47685fb515bSPavan Nikhilesh 			.queue_id = wrk_enq,
47785fb515bSPavan Nikhilesh 			.mbuf = arp,
47885fb515bSPavan Nikhilesh 	};
47985fb515bSPavan Nikhilesh 
48085fb515bSPavan Nikhilesh 	if (!arp) {
48185fb515bSPavan Nikhilesh 		printf("%d: gen of pkt failed\n", __LINE__);
48285fb515bSPavan Nikhilesh 		return -1;
48385fb515bSPavan Nikhilesh 	}
48485fb515bSPavan Nikhilesh 
48585fb515bSPavan Nikhilesh 	const uint32_t MAGIC_SEQN = 4711;
486ca4355e4SDavid Marchand 	*rte_event_pmd_selftest_seqn(arp) = MAGIC_SEQN;
48785fb515bSPavan Nikhilesh 
48885fb515bSPavan Nikhilesh 	/* generate pkt and enqueue */
48985fb515bSPavan Nikhilesh 	err = rte_event_enqueue_burst(evdev, rx_enq, &ev, 1);
4901b03e292SHarry van Haaren 	if (err != 1) {
49185fb515bSPavan Nikhilesh 		printf("%d: error failed to enqueue\n", __LINE__);
49285fb515bSPavan Nikhilesh 		return -1;
49385fb515bSPavan Nikhilesh 	}
49485fb515bSPavan Nikhilesh 
49585fb515bSPavan Nikhilesh 	/* Run schedule() as dir packets may need to be re-ordered */
49685fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
49785fb515bSPavan Nikhilesh 
49885fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
49985fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
50085fb515bSPavan Nikhilesh 	if (err) {
50185fb515bSPavan Nikhilesh 		printf("%d: error failed to get stats\n", __LINE__);
50285fb515bSPavan Nikhilesh 		return -1;
50385fb515bSPavan Nikhilesh 	}
50485fb515bSPavan Nikhilesh 
50585fb515bSPavan Nikhilesh 	if (stats.port_rx_pkts[rx_enq] != 1) {
50685fb515bSPavan Nikhilesh 		printf("%d: error stats incorrect for directed port\n",
50785fb515bSPavan Nikhilesh 				__LINE__);
50885fb515bSPavan Nikhilesh 		return -1;
50985fb515bSPavan Nikhilesh 	}
51085fb515bSPavan Nikhilesh 
51185fb515bSPavan Nikhilesh 	uint32_t deq_pkts;
51285fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, wrk_enq, &ev, 1, 0);
51385fb515bSPavan Nikhilesh 	if (deq_pkts != 1) {
51485fb515bSPavan Nikhilesh 		printf("%d: error failed to deq\n", __LINE__);
51585fb515bSPavan Nikhilesh 		return -1;
51685fb515bSPavan Nikhilesh 	}
51785fb515bSPavan Nikhilesh 
51885fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
51985fb515bSPavan Nikhilesh 	if (stats.port_rx_pkts[wrk_enq] != 0 &&
52085fb515bSPavan Nikhilesh 			stats.port_rx_pkts[wrk_enq] != 1) {
52185fb515bSPavan Nikhilesh 		printf("%d: error directed stats post-dequeue\n", __LINE__);
52285fb515bSPavan Nikhilesh 		return -1;
52385fb515bSPavan Nikhilesh 	}
52485fb515bSPavan Nikhilesh 
525ca4355e4SDavid Marchand 	if (*rte_event_pmd_selftest_seqn(ev.mbuf) != MAGIC_SEQN) {
52685fb515bSPavan Nikhilesh 		printf("%d: error magic sequence number not dequeued\n",
52785fb515bSPavan Nikhilesh 				__LINE__);
52885fb515bSPavan Nikhilesh 		return -1;
52985fb515bSPavan Nikhilesh 	}
53085fb515bSPavan Nikhilesh 
53185fb515bSPavan Nikhilesh 	rte_pktmbuf_free(ev.mbuf);
53285fb515bSPavan Nikhilesh 	cleanup(t);
53385fb515bSPavan Nikhilesh 	return 0;
53485fb515bSPavan Nikhilesh }
53585fb515bSPavan Nikhilesh 
53685fb515bSPavan Nikhilesh static int
test_directed_forward_credits(struct test * t)53785fb515bSPavan Nikhilesh test_directed_forward_credits(struct test *t)
53885fb515bSPavan Nikhilesh {
53985fb515bSPavan Nikhilesh 	uint32_t i;
54085fb515bSPavan Nikhilesh 	int32_t err;
54185fb515bSPavan Nikhilesh 
54285fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
54385fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0 ||
54485fb515bSPavan Nikhilesh 			create_directed_qids(t, 1, t->port) < 0)
54585fb515bSPavan Nikhilesh 		return -1;
54685fb515bSPavan Nikhilesh 
54785fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
54885fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
54985fb515bSPavan Nikhilesh 		return -1;
55085fb515bSPavan Nikhilesh 	}
55185fb515bSPavan Nikhilesh 
55285fb515bSPavan Nikhilesh 	struct rte_event ev = {
55385fb515bSPavan Nikhilesh 			.op = RTE_EVENT_OP_NEW,
55485fb515bSPavan Nikhilesh 			.queue_id = 0,
55585fb515bSPavan Nikhilesh 	};
55685fb515bSPavan Nikhilesh 
55785fb515bSPavan Nikhilesh 	for (i = 0; i < 1000; i++) {
55885fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, 0, &ev, 1);
5591b03e292SHarry van Haaren 		if (err != 1) {
56085fb515bSPavan Nikhilesh 			printf("%d: error failed to enqueue\n", __LINE__);
56185fb515bSPavan Nikhilesh 			return -1;
56285fb515bSPavan Nikhilesh 		}
56385fb515bSPavan Nikhilesh 		rte_service_run_iter_on_app_lcore(t->service_id, 1);
56485fb515bSPavan Nikhilesh 
56585fb515bSPavan Nikhilesh 		uint32_t deq_pkts;
56685fb515bSPavan Nikhilesh 		deq_pkts = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0);
56785fb515bSPavan Nikhilesh 		if (deq_pkts != 1) {
56885fb515bSPavan Nikhilesh 			printf("%d: error failed to deq\n", __LINE__);
56985fb515bSPavan Nikhilesh 			return -1;
57085fb515bSPavan Nikhilesh 		}
57185fb515bSPavan Nikhilesh 
57285fb515bSPavan Nikhilesh 		/* re-write event to be a forward, and continue looping it */
57385fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_FORWARD;
57485fb515bSPavan Nikhilesh 	}
57585fb515bSPavan Nikhilesh 
57685fb515bSPavan Nikhilesh 	cleanup(t);
57785fb515bSPavan Nikhilesh 	return 0;
57885fb515bSPavan Nikhilesh }
57985fb515bSPavan Nikhilesh 
58085fb515bSPavan Nikhilesh 
58185fb515bSPavan Nikhilesh static int
test_priority_directed(struct test * t)58285fb515bSPavan Nikhilesh test_priority_directed(struct test *t)
58385fb515bSPavan Nikhilesh {
58485fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
58585fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0 ||
58685fb515bSPavan Nikhilesh 			create_directed_qids(t, 1, t->port) < 0) {
58785fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
58885fb515bSPavan Nikhilesh 		return -1;
58985fb515bSPavan Nikhilesh 	}
59085fb515bSPavan Nikhilesh 
59185fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
59285fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
59385fb515bSPavan Nikhilesh 		return -1;
59485fb515bSPavan Nikhilesh 	}
59585fb515bSPavan Nikhilesh 
59685fb515bSPavan Nikhilesh 	return run_prio_packet_test(t);
59785fb515bSPavan Nikhilesh }
59885fb515bSPavan Nikhilesh 
59985fb515bSPavan Nikhilesh static int
test_priority_atomic(struct test * t)60085fb515bSPavan Nikhilesh test_priority_atomic(struct test *t)
60185fb515bSPavan Nikhilesh {
60285fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
60385fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0 ||
60485fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
60585fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
60685fb515bSPavan Nikhilesh 		return -1;
60785fb515bSPavan Nikhilesh 	}
60885fb515bSPavan Nikhilesh 
60985fb515bSPavan Nikhilesh 	/* map the QID */
61085fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) {
61185fb515bSPavan Nikhilesh 		printf("%d: error mapping qid to port\n", __LINE__);
61285fb515bSPavan Nikhilesh 		return -1;
61385fb515bSPavan Nikhilesh 	}
61485fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
61585fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
61685fb515bSPavan Nikhilesh 		return -1;
61785fb515bSPavan Nikhilesh 	}
61885fb515bSPavan Nikhilesh 
61985fb515bSPavan Nikhilesh 	return run_prio_packet_test(t);
62085fb515bSPavan Nikhilesh }
62185fb515bSPavan Nikhilesh 
62285fb515bSPavan Nikhilesh static int
test_priority_ordered(struct test * t)62385fb515bSPavan Nikhilesh test_priority_ordered(struct test *t)
62485fb515bSPavan Nikhilesh {
62585fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
62685fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0 ||
62785fb515bSPavan Nikhilesh 			create_ordered_qids(t, 1) < 0) {
62885fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
62985fb515bSPavan Nikhilesh 		return -1;
63085fb515bSPavan Nikhilesh 	}
63185fb515bSPavan Nikhilesh 
63285fb515bSPavan Nikhilesh 	/* map the QID */
63385fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) {
63485fb515bSPavan Nikhilesh 		printf("%d: error mapping qid to port\n", __LINE__);
63585fb515bSPavan Nikhilesh 		return -1;
63685fb515bSPavan Nikhilesh 	}
63785fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
63885fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
63985fb515bSPavan Nikhilesh 		return -1;
64085fb515bSPavan Nikhilesh 	}
64185fb515bSPavan Nikhilesh 
64285fb515bSPavan Nikhilesh 	return run_prio_packet_test(t);
64385fb515bSPavan Nikhilesh }
64485fb515bSPavan Nikhilesh 
64585fb515bSPavan Nikhilesh static int
test_priority_unordered(struct test * t)64685fb515bSPavan Nikhilesh test_priority_unordered(struct test *t)
64785fb515bSPavan Nikhilesh {
64885fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
64985fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0 ||
65085fb515bSPavan Nikhilesh 			create_unordered_qids(t, 1) < 0) {
65185fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
65285fb515bSPavan Nikhilesh 		return -1;
65385fb515bSPavan Nikhilesh 	}
65485fb515bSPavan Nikhilesh 
65585fb515bSPavan Nikhilesh 	/* map the QID */
65685fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) {
65785fb515bSPavan Nikhilesh 		printf("%d: error mapping qid to port\n", __LINE__);
65885fb515bSPavan Nikhilesh 		return -1;
65985fb515bSPavan Nikhilesh 	}
66085fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
66185fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
66285fb515bSPavan Nikhilesh 		return -1;
66385fb515bSPavan Nikhilesh 	}
66485fb515bSPavan Nikhilesh 
66585fb515bSPavan Nikhilesh 	return run_prio_packet_test(t);
66685fb515bSPavan Nikhilesh }
66785fb515bSPavan Nikhilesh 
66885fb515bSPavan Nikhilesh static int
burst_packets(struct test * t)66985fb515bSPavan Nikhilesh burst_packets(struct test *t)
67085fb515bSPavan Nikhilesh {
67185fb515bSPavan Nikhilesh 	/************** CONFIG ****************/
67285fb515bSPavan Nikhilesh 	uint32_t i;
67385fb515bSPavan Nikhilesh 	int err;
67485fb515bSPavan Nikhilesh 	int ret;
67585fb515bSPavan Nikhilesh 
67685fb515bSPavan Nikhilesh 	/* Create instance with 2 ports and 2 queues */
67785fb515bSPavan Nikhilesh 	if (init(t, 2, 2) < 0 ||
67885fb515bSPavan Nikhilesh 			create_ports(t, 2) < 0 ||
67985fb515bSPavan Nikhilesh 			create_atomic_qids(t, 2) < 0) {
68085fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
68185fb515bSPavan Nikhilesh 		return -1;
68285fb515bSPavan Nikhilesh 	}
68385fb515bSPavan Nikhilesh 
68485fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
68585fb515bSPavan Nikhilesh 	ret = rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1);
68685fb515bSPavan Nikhilesh 	if (ret != 1) {
68785fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid0\n", __LINE__);
68885fb515bSPavan Nikhilesh 		return -1;
68985fb515bSPavan Nikhilesh 	}
69085fb515bSPavan Nikhilesh 	ret = rte_event_port_link(evdev, t->port[1], &t->qid[1], NULL, 1);
69185fb515bSPavan Nikhilesh 	if (ret != 1) {
69285fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid1\n", __LINE__);
69385fb515bSPavan Nikhilesh 		return -1;
69485fb515bSPavan Nikhilesh 	}
69585fb515bSPavan Nikhilesh 
69685fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
69785fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
69885fb515bSPavan Nikhilesh 		return -1;
69985fb515bSPavan Nikhilesh 	}
70085fb515bSPavan Nikhilesh 
70185fb515bSPavan Nikhilesh 	/************** FORWARD ****************/
70285fb515bSPavan Nikhilesh 	const uint32_t rx_port = 0;
70385fb515bSPavan Nikhilesh 	const uint32_t NUM_PKTS = 2;
70485fb515bSPavan Nikhilesh 
70585fb515bSPavan Nikhilesh 	for (i = 0; i < NUM_PKTS; i++) {
70685fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
70785fb515bSPavan Nikhilesh 		if (!arp) {
70885fb515bSPavan Nikhilesh 			printf("%d: error generating pkt\n", __LINE__);
70985fb515bSPavan Nikhilesh 			return -1;
71085fb515bSPavan Nikhilesh 		}
71185fb515bSPavan Nikhilesh 
71285fb515bSPavan Nikhilesh 		struct rte_event ev = {
71385fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
71485fb515bSPavan Nikhilesh 				.queue_id = i % 2,
71585fb515bSPavan Nikhilesh 				.flow_id = i % 3,
71685fb515bSPavan Nikhilesh 				.mbuf = arp,
71785fb515bSPavan Nikhilesh 		};
71885fb515bSPavan Nikhilesh 		/* generate pkt and enqueue */
71985fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_port], &ev, 1);
7201b03e292SHarry van Haaren 		if (err != 1) {
72185fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
72285fb515bSPavan Nikhilesh 			return -1;
72385fb515bSPavan Nikhilesh 		}
72485fb515bSPavan Nikhilesh 	}
72585fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
72685fb515bSPavan Nikhilesh 
72785fb515bSPavan Nikhilesh 	/* Check stats for all NUM_PKTS arrived to sched core */
72885fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
72985fb515bSPavan Nikhilesh 
73085fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
73185fb515bSPavan Nikhilesh 	if (err) {
73285fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
73385fb515bSPavan Nikhilesh 		return -1;
73485fb515bSPavan Nikhilesh 	}
73585fb515bSPavan Nikhilesh 	if (stats.rx_pkts != NUM_PKTS || stats.tx_pkts != NUM_PKTS) {
73685fb515bSPavan Nikhilesh 		printf("%d: Sched core didn't receive all %d pkts\n",
73785fb515bSPavan Nikhilesh 				__LINE__, NUM_PKTS);
73885fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
73985fb515bSPavan Nikhilesh 		return -1;
74085fb515bSPavan Nikhilesh 	}
74185fb515bSPavan Nikhilesh 
74285fb515bSPavan Nikhilesh 	uint32_t deq_pkts;
74385fb515bSPavan Nikhilesh 	int p;
74485fb515bSPavan Nikhilesh 
74585fb515bSPavan Nikhilesh 	deq_pkts = 0;
74685fb515bSPavan Nikhilesh 	/******** DEQ QID 1 *******/
74785fb515bSPavan Nikhilesh 	do {
74885fb515bSPavan Nikhilesh 		struct rte_event ev;
74985fb515bSPavan Nikhilesh 		p = rte_event_dequeue_burst(evdev, t->port[0], &ev, 1, 0);
75085fb515bSPavan Nikhilesh 		deq_pkts += p;
75185fb515bSPavan Nikhilesh 		rte_pktmbuf_free(ev.mbuf);
75285fb515bSPavan Nikhilesh 	} while (p);
75385fb515bSPavan Nikhilesh 
75485fb515bSPavan Nikhilesh 	if (deq_pkts != NUM_PKTS/2) {
75585fb515bSPavan Nikhilesh 		printf("%d: Half of NUM_PKTS didn't arrive at port 1\n",
75685fb515bSPavan Nikhilesh 				__LINE__);
75785fb515bSPavan Nikhilesh 		return -1;
75885fb515bSPavan Nikhilesh 	}
75985fb515bSPavan Nikhilesh 
76085fb515bSPavan Nikhilesh 	/******** DEQ QID 2 *******/
76185fb515bSPavan Nikhilesh 	deq_pkts = 0;
76285fb515bSPavan Nikhilesh 	do {
76385fb515bSPavan Nikhilesh 		struct rte_event ev;
76485fb515bSPavan Nikhilesh 		p = rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0);
76585fb515bSPavan Nikhilesh 		deq_pkts += p;
76685fb515bSPavan Nikhilesh 		rte_pktmbuf_free(ev.mbuf);
76785fb515bSPavan Nikhilesh 	} while (p);
76885fb515bSPavan Nikhilesh 	if (deq_pkts != NUM_PKTS/2) {
76985fb515bSPavan Nikhilesh 		printf("%d: Half of NUM_PKTS didn't arrive at port 2\n",
77085fb515bSPavan Nikhilesh 				__LINE__);
77185fb515bSPavan Nikhilesh 		return -1;
77285fb515bSPavan Nikhilesh 	}
77385fb515bSPavan Nikhilesh 
77485fb515bSPavan Nikhilesh 	cleanup(t);
77585fb515bSPavan Nikhilesh 	return 0;
77685fb515bSPavan Nikhilesh }
77785fb515bSPavan Nikhilesh 
77885fb515bSPavan Nikhilesh static int
abuse_inflights(struct test * t)77985fb515bSPavan Nikhilesh abuse_inflights(struct test *t)
78085fb515bSPavan Nikhilesh {
78185fb515bSPavan Nikhilesh 	const int rx_enq = 0;
78285fb515bSPavan Nikhilesh 	const int wrk_enq = 2;
78385fb515bSPavan Nikhilesh 	int err;
78485fb515bSPavan Nikhilesh 
78585fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
78685fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
78785fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
78885fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
78985fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
79085fb515bSPavan Nikhilesh 		return -1;
79185fb515bSPavan Nikhilesh 	}
79285fb515bSPavan Nikhilesh 
79385fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
79485fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0);
79585fb515bSPavan Nikhilesh 	if (err != 1) {
79685fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
79785fb515bSPavan Nikhilesh 		cleanup(t);
79885fb515bSPavan Nikhilesh 		return -1;
79985fb515bSPavan Nikhilesh 	}
80085fb515bSPavan Nikhilesh 
80185fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
80285fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
80385fb515bSPavan Nikhilesh 		return -1;
80485fb515bSPavan Nikhilesh 	}
80585fb515bSPavan Nikhilesh 
80685fb515bSPavan Nikhilesh 	/* Enqueue op only */
80785fb515bSPavan Nikhilesh 	err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &release_ev, 1);
8081b03e292SHarry van Haaren 	if (err != 1) {
80985fb515bSPavan Nikhilesh 		printf("%d: Failed to enqueue\n", __LINE__);
81085fb515bSPavan Nikhilesh 		return -1;
81185fb515bSPavan Nikhilesh 	}
81285fb515bSPavan Nikhilesh 
81385fb515bSPavan Nikhilesh 	/* schedule */
81485fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
81585fb515bSPavan Nikhilesh 
81685fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
81785fb515bSPavan Nikhilesh 
81885fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
81985fb515bSPavan Nikhilesh 	if (err) {
82085fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
82185fb515bSPavan Nikhilesh 		return -1;
82285fb515bSPavan Nikhilesh 	}
82385fb515bSPavan Nikhilesh 
82485fb515bSPavan Nikhilesh 	if (stats.rx_pkts != 0 ||
82585fb515bSPavan Nikhilesh 			stats.tx_pkts != 0 ||
82685fb515bSPavan Nikhilesh 			stats.port_inflight[wrk_enq] != 0) {
82785fb515bSPavan Nikhilesh 		printf("%d: Sched core didn't handle pkt as expected\n",
82885fb515bSPavan Nikhilesh 				__LINE__);
82985fb515bSPavan Nikhilesh 		return -1;
83085fb515bSPavan Nikhilesh 	}
83185fb515bSPavan Nikhilesh 
83285fb515bSPavan Nikhilesh 	cleanup(t);
83385fb515bSPavan Nikhilesh 	return 0;
83485fb515bSPavan Nikhilesh }
83585fb515bSPavan Nikhilesh 
83685fb515bSPavan Nikhilesh static int
xstats_tests(struct test * t)83785fb515bSPavan Nikhilesh xstats_tests(struct test *t)
83885fb515bSPavan Nikhilesh {
83985fb515bSPavan Nikhilesh 	const int wrk_enq = 2;
84085fb515bSPavan Nikhilesh 	int err;
84185fb515bSPavan Nikhilesh 
84285fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
84385fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
84485fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
84585fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
84685fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
84785fb515bSPavan Nikhilesh 		return -1;
84885fb515bSPavan Nikhilesh 	}
84985fb515bSPavan Nikhilesh 
85085fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
85185fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0);
85285fb515bSPavan Nikhilesh 	if (err != 1) {
85385fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
85485fb515bSPavan Nikhilesh 		cleanup(t);
85585fb515bSPavan Nikhilesh 		return -1;
85685fb515bSPavan Nikhilesh 	}
85785fb515bSPavan Nikhilesh 
85885fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
85985fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
86085fb515bSPavan Nikhilesh 		return -1;
86185fb515bSPavan Nikhilesh 	}
86285fb515bSPavan Nikhilesh 
86385fb515bSPavan Nikhilesh 	const uint32_t XSTATS_MAX = 1024;
86485fb515bSPavan Nikhilesh 
86585fb515bSPavan Nikhilesh 	uint32_t i;
8661bdfe4d7SPavan Nikhilesh 	uint64_t ids[XSTATS_MAX];
86785fb515bSPavan Nikhilesh 	uint64_t values[XSTATS_MAX];
86885fb515bSPavan Nikhilesh 	struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX];
86985fb515bSPavan Nikhilesh 
87085fb515bSPavan Nikhilesh 	for (i = 0; i < XSTATS_MAX; i++)
87185fb515bSPavan Nikhilesh 		ids[i] = i;
87285fb515bSPavan Nikhilesh 
87385fb515bSPavan Nikhilesh 	/* Device names / values */
87485fb515bSPavan Nikhilesh 	int ret = rte_event_dev_xstats_names_get(evdev,
87585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
87685fb515bSPavan Nikhilesh 					0, xstats_names, ids, XSTATS_MAX);
877324b37e6SHarry van Haaren 	if (ret != 8) {
878324b37e6SHarry van Haaren 		printf("%d: expected 8 stats, got return %d\n", __LINE__, ret);
87985fb515bSPavan Nikhilesh 		return -1;
88085fb515bSPavan Nikhilesh 	}
88185fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
88285fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
88385fb515bSPavan Nikhilesh 					0, ids, values, ret);
884324b37e6SHarry van Haaren 	if (ret != 8) {
885324b37e6SHarry van Haaren 		printf("%d: expected 8 stats, got return %d\n", __LINE__, ret);
88685fb515bSPavan Nikhilesh 		return -1;
88785fb515bSPavan Nikhilesh 	}
88885fb515bSPavan Nikhilesh 
88985fb515bSPavan Nikhilesh 	/* Port names / values */
89085fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_names_get(evdev,
89185fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, 0,
89285fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
89385fb515bSPavan Nikhilesh 	if (ret != 21) {
89485fb515bSPavan Nikhilesh 		printf("%d: expected 21 stats, got return %d\n", __LINE__, ret);
89585fb515bSPavan Nikhilesh 		return -1;
89685fb515bSPavan Nikhilesh 	}
89785fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
89885fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, 0,
89985fb515bSPavan Nikhilesh 					ids, values, ret);
90085fb515bSPavan Nikhilesh 	if (ret != 21) {
90185fb515bSPavan Nikhilesh 		printf("%d: expected 21 stats, got return %d\n", __LINE__, ret);
90285fb515bSPavan Nikhilesh 		return -1;
90385fb515bSPavan Nikhilesh 	}
90485fb515bSPavan Nikhilesh 
90585fb515bSPavan Nikhilesh 	/* Queue names / values */
90685fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_names_get(evdev,
90785fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE,
90885fb515bSPavan Nikhilesh 					0, xstats_names, ids, XSTATS_MAX);
90985fb515bSPavan Nikhilesh 	if (ret != 16) {
91085fb515bSPavan Nikhilesh 		printf("%d: expected 16 stats, got return %d\n", __LINE__, ret);
91185fb515bSPavan Nikhilesh 		return -1;
91285fb515bSPavan Nikhilesh 	}
91385fb515bSPavan Nikhilesh 
91485fb515bSPavan Nikhilesh 	/* NEGATIVE TEST: with wrong queue passed, 0 stats should be returned */
91585fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
91685fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE,
91785fb515bSPavan Nikhilesh 					1, ids, values, ret);
91885fb515bSPavan Nikhilesh 	if (ret != -EINVAL) {
91985fb515bSPavan Nikhilesh 		printf("%d: expected 0 stats, got return %d\n", __LINE__, ret);
92085fb515bSPavan Nikhilesh 		return -1;
92185fb515bSPavan Nikhilesh 	}
92285fb515bSPavan Nikhilesh 
92385fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
92485fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE,
92585fb515bSPavan Nikhilesh 					0, ids, values, ret);
92685fb515bSPavan Nikhilesh 	if (ret != 16) {
92785fb515bSPavan Nikhilesh 		printf("%d: expected 16 stats, got return %d\n", __LINE__, ret);
92885fb515bSPavan Nikhilesh 		return -1;
92985fb515bSPavan Nikhilesh 	}
93085fb515bSPavan Nikhilesh 
93185fb515bSPavan Nikhilesh 	/* enqueue packets to check values */
93285fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
93385fb515bSPavan Nikhilesh 		struct rte_event ev;
93485fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
93585fb515bSPavan Nikhilesh 		if (!arp) {
93685fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
93785fb515bSPavan Nikhilesh 			return -1;
93885fb515bSPavan Nikhilesh 		}
93985fb515bSPavan Nikhilesh 		ev.queue_id = t->qid[i];
94085fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
94185fb515bSPavan Nikhilesh 		ev.mbuf = arp;
94285fb515bSPavan Nikhilesh 		ev.flow_id = 7;
943ca4355e4SDavid Marchand 		*rte_event_pmd_selftest_seqn(arp) = i;
94485fb515bSPavan Nikhilesh 
94585fb515bSPavan Nikhilesh 		int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1);
94685fb515bSPavan Nikhilesh 		if (err != 1) {
94785fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
94885fb515bSPavan Nikhilesh 			return -1;
94985fb515bSPavan Nikhilesh 		}
95085fb515bSPavan Nikhilesh 	}
95185fb515bSPavan Nikhilesh 
95285fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
95385fb515bSPavan Nikhilesh 
95485fb515bSPavan Nikhilesh 	/* Device names / values */
95585fb515bSPavan Nikhilesh 	int num_stats = rte_event_dev_xstats_names_get(evdev,
95685fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE, 0,
95785fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
95885fb515bSPavan Nikhilesh 	if (num_stats < 0)
95985fb515bSPavan Nikhilesh 		goto fail;
96085fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
96185fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
96285fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
963324b37e6SHarry van Haaren 	static const uint64_t expected[] = {3, 3, 0, 1, 0, 0, 4, 1};
96485fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
96585fb515bSPavan Nikhilesh 		if (expected[i] != values[i]) {
9661bdfe4d7SPavan Nikhilesh 			printf("%d Error xstat %d (id %" PRIu64
9671bdfe4d7SPavan Nikhilesh 			       ") %s : %" PRIu64 ", expect %" PRIu64 "\n",
96885fb515bSPavan Nikhilesh 			       __LINE__, i, ids[i], xstats_names[i].name,
96985fb515bSPavan Nikhilesh 			       values[i], expected[i]);
97085fb515bSPavan Nikhilesh 			goto fail;
97185fb515bSPavan Nikhilesh 		}
97285fb515bSPavan Nikhilesh 	}
97385fb515bSPavan Nikhilesh 
97485fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_reset(evdev, RTE_EVENT_DEV_XSTATS_DEVICE,
97585fb515bSPavan Nikhilesh 					0, NULL, 0);
97685fb515bSPavan Nikhilesh 
97785fb515bSPavan Nikhilesh 	/* ensure reset statistics are zero-ed */
978324b37e6SHarry van Haaren 	static const uint64_t expected_zero[] = {0, 0, 0, 0, 0, 0, 0, 0};
97985fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
98085fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
98185fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
98285fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
98385fb515bSPavan Nikhilesh 		if (expected_zero[i] != values[i]) {
9841bdfe4d7SPavan Nikhilesh 			printf("%d Error, xstat %d (id %" PRIu64
9851bdfe4d7SPavan Nikhilesh 			       ") %s : %" PRIu64 ", expect %" PRIu64 "\n",
98685fb515bSPavan Nikhilesh 			       __LINE__, i, ids[i], xstats_names[i].name,
98785fb515bSPavan Nikhilesh 			       values[i], expected_zero[i]);
98885fb515bSPavan Nikhilesh 			goto fail;
98985fb515bSPavan Nikhilesh 		}
99085fb515bSPavan Nikhilesh 	}
99185fb515bSPavan Nikhilesh 
99285fb515bSPavan Nikhilesh 	/* port reset checks */
99385fb515bSPavan Nikhilesh 	num_stats = rte_event_dev_xstats_names_get(evdev,
99485fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, 0,
99585fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
99685fb515bSPavan Nikhilesh 	if (num_stats < 0)
99785fb515bSPavan Nikhilesh 		goto fail;
99885fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_PORT,
99985fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
100085fb515bSPavan Nikhilesh 
100185fb515bSPavan Nikhilesh 	static const uint64_t port_expected[] = {
100285fb515bSPavan Nikhilesh 		3 /* rx */,
100385fb515bSPavan Nikhilesh 		0 /* tx */,
100485fb515bSPavan Nikhilesh 		0 /* drop */,
100585fb515bSPavan Nikhilesh 		0 /* inflights */,
100685fb515bSPavan Nikhilesh 		0 /* avg pkt cycles */,
100785fb515bSPavan Nikhilesh 		29 /* credits */,
100885fb515bSPavan Nikhilesh 		0 /* rx ring used */,
100985fb515bSPavan Nikhilesh 		4096 /* rx ring free */,
101085fb515bSPavan Nikhilesh 		0 /* cq ring used */,
101185fb515bSPavan Nikhilesh 		32 /* cq ring free */,
101285fb515bSPavan Nikhilesh 		0 /* dequeue calls */,
101385fb515bSPavan Nikhilesh 		/* 10 dequeue burst buckets */
101485fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
101585fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
101685fb515bSPavan Nikhilesh 	};
101785fb515bSPavan Nikhilesh 	if (ret != RTE_DIM(port_expected)) {
101885fb515bSPavan Nikhilesh 		printf(
101985fb515bSPavan Nikhilesh 			"%s %d: wrong number of port stats (%d), expected %zu\n",
102085fb515bSPavan Nikhilesh 			__func__, __LINE__, ret, RTE_DIM(port_expected));
102185fb515bSPavan Nikhilesh 	}
102285fb515bSPavan Nikhilesh 
102385fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
102485fb515bSPavan Nikhilesh 		if (port_expected[i] != values[i]) {
102585fb515bSPavan Nikhilesh 			printf(
102685fb515bSPavan Nikhilesh 				"%s : %d: Error stat %s is %"PRIu64
102785fb515bSPavan Nikhilesh 				", expected %"PRIu64"\n",
102885fb515bSPavan Nikhilesh 				__func__, __LINE__, xstats_names[i].name,
102985fb515bSPavan Nikhilesh 				values[i], port_expected[i]);
103085fb515bSPavan Nikhilesh 			goto fail;
103185fb515bSPavan Nikhilesh 		}
103285fb515bSPavan Nikhilesh 	}
103385fb515bSPavan Nikhilesh 
103485fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_reset(evdev, RTE_EVENT_DEV_XSTATS_PORT,
103585fb515bSPavan Nikhilesh 					0, NULL, 0);
103685fb515bSPavan Nikhilesh 
103785fb515bSPavan Nikhilesh 	/* ensure reset statistics are zero-ed */
103885fb515bSPavan Nikhilesh 	static const uint64_t port_expected_zero[] = {
103985fb515bSPavan Nikhilesh 		0 /* rx */,
104085fb515bSPavan Nikhilesh 		0 /* tx */,
104185fb515bSPavan Nikhilesh 		0 /* drop */,
104285fb515bSPavan Nikhilesh 		0 /* inflights */,
104385fb515bSPavan Nikhilesh 		0 /* avg pkt cycles */,
104485fb515bSPavan Nikhilesh 		29 /* credits */,
104585fb515bSPavan Nikhilesh 		0 /* rx ring used */,
104685fb515bSPavan Nikhilesh 		4096 /* rx ring free */,
104785fb515bSPavan Nikhilesh 		0 /* cq ring used */,
104885fb515bSPavan Nikhilesh 		32 /* cq ring free */,
104985fb515bSPavan Nikhilesh 		0 /* dequeue calls */,
105085fb515bSPavan Nikhilesh 		/* 10 dequeue burst buckets */
105185fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
105285fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
105385fb515bSPavan Nikhilesh 	};
105485fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
105585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT,
105685fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
105785fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
105885fb515bSPavan Nikhilesh 		if (port_expected_zero[i] != values[i]) {
10591bdfe4d7SPavan Nikhilesh 			printf("%d, Error, xstat %d (id %" PRIu64
10601bdfe4d7SPavan Nikhilesh 			       ") %s : %" PRIu64 ", expect %" PRIu64 "\n",
106185fb515bSPavan Nikhilesh 			       __LINE__, i, ids[i], xstats_names[i].name,
106285fb515bSPavan Nikhilesh 			       values[i], port_expected_zero[i]);
106385fb515bSPavan Nikhilesh 			goto fail;
106485fb515bSPavan Nikhilesh 		}
106585fb515bSPavan Nikhilesh 	}
106685fb515bSPavan Nikhilesh 
106785fb515bSPavan Nikhilesh 	/* QUEUE STATS TESTS */
106885fb515bSPavan Nikhilesh 	num_stats = rte_event_dev_xstats_names_get(evdev,
106985fb515bSPavan Nikhilesh 						RTE_EVENT_DEV_XSTATS_QUEUE, 0,
107085fb515bSPavan Nikhilesh 						xstats_names, ids, XSTATS_MAX);
107185fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE,
107285fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
107385fb515bSPavan Nikhilesh 	if (ret < 0) {
107485fb515bSPavan Nikhilesh 		printf("xstats get returned %d\n", ret);
107585fb515bSPavan Nikhilesh 		goto fail;
107685fb515bSPavan Nikhilesh 	}
107785fb515bSPavan Nikhilesh 	if ((unsigned int)ret > XSTATS_MAX)
107885fb515bSPavan Nikhilesh 		printf("%s %d: more xstats available than space\n",
107985fb515bSPavan Nikhilesh 				__func__, __LINE__);
108085fb515bSPavan Nikhilesh 
108185fb515bSPavan Nikhilesh 	static const uint64_t queue_expected[] = {
108285fb515bSPavan Nikhilesh 		3 /* rx */,
108385fb515bSPavan Nikhilesh 		3 /* tx */,
108485fb515bSPavan Nikhilesh 		0 /* drop */,
108585fb515bSPavan Nikhilesh 		3 /* inflights */,
108685fb515bSPavan Nikhilesh 		0, 0, 0, 0, /* iq 0, 1, 2, 3 used */
108785fb515bSPavan Nikhilesh 		/* QID-to-Port: pinned_flows, packets */
108885fb515bSPavan Nikhilesh 		0, 0,
108985fb515bSPavan Nikhilesh 		0, 0,
109085fb515bSPavan Nikhilesh 		1, 3,
109185fb515bSPavan Nikhilesh 		0, 0,
109285fb515bSPavan Nikhilesh 	};
109385fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
109485fb515bSPavan Nikhilesh 		if (queue_expected[i] != values[i]) {
10951bdfe4d7SPavan Nikhilesh 			printf("%d, Error, xstat %d (id %" PRIu64
10961bdfe4d7SPavan Nikhilesh 			       ") %s : %" PRIu64 ", expect %" PRIu64 "\n",
109785fb515bSPavan Nikhilesh 			       __LINE__, i, ids[i], xstats_names[i].name,
109885fb515bSPavan Nikhilesh 			       values[i], queue_expected[i]);
109985fb515bSPavan Nikhilesh 			goto fail;
110085fb515bSPavan Nikhilesh 		}
110185fb515bSPavan Nikhilesh 	}
110285fb515bSPavan Nikhilesh 
110385fb515bSPavan Nikhilesh 	/* Reset the queue stats here */
110485fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_reset(evdev,
110585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE, 0,
110685fb515bSPavan Nikhilesh 					NULL,
110785fb515bSPavan Nikhilesh 					0);
110885fb515bSPavan Nikhilesh 
11097be78d02SJosh Soref 	/* Verify that the resettable stats are reset, and others are not */
111085fb515bSPavan Nikhilesh 	static const uint64_t queue_expected_zero[] = {
111185fb515bSPavan Nikhilesh 		0 /* rx */,
111285fb515bSPavan Nikhilesh 		0 /* tx */,
111385fb515bSPavan Nikhilesh 		0 /* drop */,
111485fb515bSPavan Nikhilesh 		3 /* inflight */,
111585fb515bSPavan Nikhilesh 		0, 0, 0, 0, /* 4 iq used */
111685fb515bSPavan Nikhilesh 		/* QID-to-Port: pinned_flows, packets */
111785fb515bSPavan Nikhilesh 		0, 0,
111885fb515bSPavan Nikhilesh 		0, 0,
111985fb515bSPavan Nikhilesh 		1, 0,
112085fb515bSPavan Nikhilesh 		0, 0,
112185fb515bSPavan Nikhilesh 	};
112285fb515bSPavan Nikhilesh 
112385fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE, 0,
112485fb515bSPavan Nikhilesh 					ids, values, num_stats);
112585fb515bSPavan Nikhilesh 	int fails = 0;
112685fb515bSPavan Nikhilesh 	for (i = 0; (signed int)i < ret; i++) {
112785fb515bSPavan Nikhilesh 		if (queue_expected_zero[i] != values[i]) {
11281bdfe4d7SPavan Nikhilesh 			printf("%d, Error, xstat %d (id %" PRIu64
11291bdfe4d7SPavan Nikhilesh 			       ") %s : %" PRIu64 ", expect %" PRIu64 "\n",
113085fb515bSPavan Nikhilesh 			       __LINE__, i, ids[i], xstats_names[i].name,
113185fb515bSPavan Nikhilesh 			       values[i], queue_expected_zero[i]);
113285fb515bSPavan Nikhilesh 			fails++;
113385fb515bSPavan Nikhilesh 		}
113485fb515bSPavan Nikhilesh 	}
113585fb515bSPavan Nikhilesh 	if (fails) {
113685fb515bSPavan Nikhilesh 		printf("%d : %d of values were not as expected above\n",
113785fb515bSPavan Nikhilesh 				__LINE__, fails);
113885fb515bSPavan Nikhilesh 		goto fail;
113985fb515bSPavan Nikhilesh 	}
114085fb515bSPavan Nikhilesh 
114185fb515bSPavan Nikhilesh 	cleanup(t);
114285fb515bSPavan Nikhilesh 	return 0;
114385fb515bSPavan Nikhilesh 
114485fb515bSPavan Nikhilesh fail:
114585fb515bSPavan Nikhilesh 	rte_event_dev_dump(0, stdout);
114685fb515bSPavan Nikhilesh 	cleanup(t);
114785fb515bSPavan Nikhilesh 	return -1;
114885fb515bSPavan Nikhilesh }
114985fb515bSPavan Nikhilesh 
115085fb515bSPavan Nikhilesh 
115185fb515bSPavan Nikhilesh static int
xstats_id_abuse_tests(struct test * t)115285fb515bSPavan Nikhilesh xstats_id_abuse_tests(struct test *t)
115385fb515bSPavan Nikhilesh {
115485fb515bSPavan Nikhilesh 	int err;
115585fb515bSPavan Nikhilesh 	const uint32_t XSTATS_MAX = 1024;
115685fb515bSPavan Nikhilesh 	const uint32_t link_port = 2;
115785fb515bSPavan Nikhilesh 
11581bdfe4d7SPavan Nikhilesh 	uint64_t ids[XSTATS_MAX];
115985fb515bSPavan Nikhilesh 	struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX];
116085fb515bSPavan Nikhilesh 
116185fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
116285fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
116385fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
116485fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
116585fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
116685fb515bSPavan Nikhilesh 		goto fail;
116785fb515bSPavan Nikhilesh 	}
116885fb515bSPavan Nikhilesh 
116985fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[link_port], NULL, NULL, 0);
117085fb515bSPavan Nikhilesh 	if (err != 1) {
117185fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
117285fb515bSPavan Nikhilesh 		goto fail;
117385fb515bSPavan Nikhilesh 	}
117485fb515bSPavan Nikhilesh 
117585fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
117685fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
117785fb515bSPavan Nikhilesh 		goto fail;
117885fb515bSPavan Nikhilesh 	}
117985fb515bSPavan Nikhilesh 
118085fb515bSPavan Nikhilesh 	/* no test for device, as it ignores the port/q number */
118185fb515bSPavan Nikhilesh 	int num_stats = rte_event_dev_xstats_names_get(evdev,
118285fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT,
118385fb515bSPavan Nikhilesh 					UINT8_MAX-1, xstats_names, ids,
118485fb515bSPavan Nikhilesh 					XSTATS_MAX);
118585fb515bSPavan Nikhilesh 	if (num_stats != 0) {
118685fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n", __LINE__,
118785fb515bSPavan Nikhilesh 				0, num_stats);
118885fb515bSPavan Nikhilesh 		goto fail;
118985fb515bSPavan Nikhilesh 	}
119085fb515bSPavan Nikhilesh 
119185fb515bSPavan Nikhilesh 	num_stats = rte_event_dev_xstats_names_get(evdev,
119285fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE,
119385fb515bSPavan Nikhilesh 					UINT8_MAX-1, xstats_names, ids,
119485fb515bSPavan Nikhilesh 					XSTATS_MAX);
119585fb515bSPavan Nikhilesh 	if (num_stats != 0) {
119685fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n", __LINE__,
119785fb515bSPavan Nikhilesh 				0, num_stats);
119885fb515bSPavan Nikhilesh 		goto fail;
119985fb515bSPavan Nikhilesh 	}
120085fb515bSPavan Nikhilesh 
120185fb515bSPavan Nikhilesh 	cleanup(t);
120285fb515bSPavan Nikhilesh 	return 0;
120385fb515bSPavan Nikhilesh fail:
120485fb515bSPavan Nikhilesh 	cleanup(t);
120585fb515bSPavan Nikhilesh 	return -1;
120685fb515bSPavan Nikhilesh }
120785fb515bSPavan Nikhilesh 
120885fb515bSPavan Nikhilesh static int
port_reconfig_credits(struct test * t)120985fb515bSPavan Nikhilesh port_reconfig_credits(struct test *t)
121085fb515bSPavan Nikhilesh {
121185fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0) {
121285fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
121385fb515bSPavan Nikhilesh 		return -1;
121485fb515bSPavan Nikhilesh 	}
121585fb515bSPavan Nikhilesh 
121685fb515bSPavan Nikhilesh 	uint32_t i;
121785fb515bSPavan Nikhilesh 	const uint32_t NUM_ITERS = 32;
121885fb515bSPavan Nikhilesh 	for (i = 0; i < NUM_ITERS; i++) {
121985fb515bSPavan Nikhilesh 		const struct rte_event_queue_conf conf = {
122085fb515bSPavan Nikhilesh 			.schedule_type = RTE_SCHED_TYPE_ATOMIC,
122185fb515bSPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
122285fb515bSPavan Nikhilesh 			.nb_atomic_flows = 1024,
122385fb515bSPavan Nikhilesh 			.nb_atomic_order_sequences = 1024,
122485fb515bSPavan Nikhilesh 		};
122585fb515bSPavan Nikhilesh 		if (rte_event_queue_setup(evdev, 0, &conf) < 0) {
122685fb515bSPavan Nikhilesh 			printf("%d: error creating qid\n", __LINE__);
122785fb515bSPavan Nikhilesh 			return -1;
122885fb515bSPavan Nikhilesh 		}
122985fb515bSPavan Nikhilesh 		t->qid[0] = 0;
123085fb515bSPavan Nikhilesh 
123185fb515bSPavan Nikhilesh 		static const struct rte_event_port_conf port_conf = {
123285fb515bSPavan Nikhilesh 				.new_event_threshold = 128,
123385fb515bSPavan Nikhilesh 				.dequeue_depth = 32,
123485fb515bSPavan Nikhilesh 				.enqueue_depth = 64,
123585fb515bSPavan Nikhilesh 		};
123685fb515bSPavan Nikhilesh 		if (rte_event_port_setup(evdev, 0, &port_conf) < 0) {
123785fb515bSPavan Nikhilesh 			printf("%d Error setting up port\n", __LINE__);
123885fb515bSPavan Nikhilesh 			return -1;
123985fb515bSPavan Nikhilesh 		}
124085fb515bSPavan Nikhilesh 
124185fb515bSPavan Nikhilesh 		int links = rte_event_port_link(evdev, 0, NULL, NULL, 0);
124285fb515bSPavan Nikhilesh 		if (links != 1) {
124385fb515bSPavan Nikhilesh 			printf("%d: error mapping lb qid\n", __LINE__);
124485fb515bSPavan Nikhilesh 			goto fail;
124585fb515bSPavan Nikhilesh 		}
124685fb515bSPavan Nikhilesh 
124785fb515bSPavan Nikhilesh 		if (rte_event_dev_start(evdev) < 0) {
124885fb515bSPavan Nikhilesh 			printf("%d: Error with start call\n", __LINE__);
124985fb515bSPavan Nikhilesh 			goto fail;
125085fb515bSPavan Nikhilesh 		}
125185fb515bSPavan Nikhilesh 
125285fb515bSPavan Nikhilesh 		const uint32_t NPKTS = 1;
125385fb515bSPavan Nikhilesh 		uint32_t j;
125485fb515bSPavan Nikhilesh 		for (j = 0; j < NPKTS; j++) {
125585fb515bSPavan Nikhilesh 			struct rte_event ev;
125685fb515bSPavan Nikhilesh 			struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
125785fb515bSPavan Nikhilesh 			if (!arp) {
125885fb515bSPavan Nikhilesh 				printf("%d: gen of pkt failed\n", __LINE__);
125985fb515bSPavan Nikhilesh 				goto fail;
126085fb515bSPavan Nikhilesh 			}
126185fb515bSPavan Nikhilesh 			ev.queue_id = t->qid[0];
126285fb515bSPavan Nikhilesh 			ev.op = RTE_EVENT_OP_NEW;
126385fb515bSPavan Nikhilesh 			ev.mbuf = arp;
126485fb515bSPavan Nikhilesh 			int err = rte_event_enqueue_burst(evdev, 0, &ev, 1);
126585fb515bSPavan Nikhilesh 			if (err != 1) {
126685fb515bSPavan Nikhilesh 				printf("%d: Failed to enqueue\n", __LINE__);
126785fb515bSPavan Nikhilesh 				rte_event_dev_dump(0, stdout);
126885fb515bSPavan Nikhilesh 				goto fail;
126985fb515bSPavan Nikhilesh 			}
127085fb515bSPavan Nikhilesh 		}
127185fb515bSPavan Nikhilesh 
127285fb515bSPavan Nikhilesh 		rte_service_run_iter_on_app_lcore(t->service_id, 1);
127385fb515bSPavan Nikhilesh 
127485fb515bSPavan Nikhilesh 		struct rte_event ev[NPKTS];
127585fb515bSPavan Nikhilesh 		int deq = rte_event_dequeue_burst(evdev, t->port[0], ev,
127685fb515bSPavan Nikhilesh 							NPKTS, 0);
127785fb515bSPavan Nikhilesh 		if (deq != 1)
127885fb515bSPavan Nikhilesh 			printf("%d error; no packet dequeued\n", __LINE__);
127985fb515bSPavan Nikhilesh 
128085fb515bSPavan Nikhilesh 		/* let cleanup below stop the device on last iter */
128185fb515bSPavan Nikhilesh 		if (i != NUM_ITERS-1)
128285fb515bSPavan Nikhilesh 			rte_event_dev_stop(evdev);
128385fb515bSPavan Nikhilesh 	}
128485fb515bSPavan Nikhilesh 
128585fb515bSPavan Nikhilesh 	cleanup(t);
128685fb515bSPavan Nikhilesh 	return 0;
128785fb515bSPavan Nikhilesh fail:
128885fb515bSPavan Nikhilesh 	cleanup(t);
128985fb515bSPavan Nikhilesh 	return -1;
129085fb515bSPavan Nikhilesh }
129185fb515bSPavan Nikhilesh 
129285fb515bSPavan Nikhilesh static int
port_single_lb_reconfig(struct test * t)129385fb515bSPavan Nikhilesh port_single_lb_reconfig(struct test *t)
129485fb515bSPavan Nikhilesh {
129585fb515bSPavan Nikhilesh 	if (init(t, 2, 2) < 0) {
129685fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
129785fb515bSPavan Nikhilesh 		goto fail;
129885fb515bSPavan Nikhilesh 	}
129985fb515bSPavan Nikhilesh 
130085fb515bSPavan Nikhilesh 	static const struct rte_event_queue_conf conf_lb_atomic = {
130185fb515bSPavan Nikhilesh 		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
130285fb515bSPavan Nikhilesh 		.schedule_type = RTE_SCHED_TYPE_ATOMIC,
130385fb515bSPavan Nikhilesh 		.nb_atomic_flows = 1024,
130485fb515bSPavan Nikhilesh 		.nb_atomic_order_sequences = 1024,
130585fb515bSPavan Nikhilesh 	};
130685fb515bSPavan Nikhilesh 	if (rte_event_queue_setup(evdev, 0, &conf_lb_atomic) < 0) {
130785fb515bSPavan Nikhilesh 		printf("%d: error creating qid\n", __LINE__);
130885fb515bSPavan Nikhilesh 		goto fail;
130985fb515bSPavan Nikhilesh 	}
131085fb515bSPavan Nikhilesh 
131185fb515bSPavan Nikhilesh 	static const struct rte_event_queue_conf conf_single_link = {
131285fb515bSPavan Nikhilesh 		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
131385fb515bSPavan Nikhilesh 		.event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK,
131485fb515bSPavan Nikhilesh 	};
131585fb515bSPavan Nikhilesh 	if (rte_event_queue_setup(evdev, 1, &conf_single_link) < 0) {
131685fb515bSPavan Nikhilesh 		printf("%d: error creating qid\n", __LINE__);
131785fb515bSPavan Nikhilesh 		goto fail;
131885fb515bSPavan Nikhilesh 	}
131985fb515bSPavan Nikhilesh 
132085fb515bSPavan Nikhilesh 	struct rte_event_port_conf port_conf = {
132185fb515bSPavan Nikhilesh 		.new_event_threshold = 128,
132285fb515bSPavan Nikhilesh 		.dequeue_depth = 32,
132385fb515bSPavan Nikhilesh 		.enqueue_depth = 64,
132485fb515bSPavan Nikhilesh 	};
132585fb515bSPavan Nikhilesh 	if (rte_event_port_setup(evdev, 0, &port_conf) < 0) {
132685fb515bSPavan Nikhilesh 		printf("%d Error setting up port\n", __LINE__);
132785fb515bSPavan Nikhilesh 		goto fail;
132885fb515bSPavan Nikhilesh 	}
132985fb515bSPavan Nikhilesh 	if (rte_event_port_setup(evdev, 1, &port_conf) < 0) {
133085fb515bSPavan Nikhilesh 		printf("%d Error setting up port\n", __LINE__);
133185fb515bSPavan Nikhilesh 		goto fail;
133285fb515bSPavan Nikhilesh 	}
133385fb515bSPavan Nikhilesh 
133485fb515bSPavan Nikhilesh 	/* link port to lb queue */
133585fb515bSPavan Nikhilesh 	uint8_t queue_id = 0;
133685fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, 0, &queue_id, NULL, 1) != 1) {
133785fb515bSPavan Nikhilesh 		printf("%d: error creating link for qid\n", __LINE__);
133885fb515bSPavan Nikhilesh 		goto fail;
133985fb515bSPavan Nikhilesh 	}
134085fb515bSPavan Nikhilesh 
134185fb515bSPavan Nikhilesh 	int ret = rte_event_port_unlink(evdev, 0, &queue_id, 1);
134285fb515bSPavan Nikhilesh 	if (ret != 1) {
134385fb515bSPavan Nikhilesh 		printf("%d: Error unlinking lb port\n", __LINE__);
134485fb515bSPavan Nikhilesh 		goto fail;
134585fb515bSPavan Nikhilesh 	}
134685fb515bSPavan Nikhilesh 
134785fb515bSPavan Nikhilesh 	queue_id = 1;
134885fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, 0, &queue_id, NULL, 1) != 1) {
134985fb515bSPavan Nikhilesh 		printf("%d: error creating link for qid\n", __LINE__);
135085fb515bSPavan Nikhilesh 		goto fail;
135185fb515bSPavan Nikhilesh 	}
135285fb515bSPavan Nikhilesh 
135385fb515bSPavan Nikhilesh 	queue_id = 0;
135485fb515bSPavan Nikhilesh 	int err = rte_event_port_link(evdev, 1, &queue_id, NULL, 1);
135585fb515bSPavan Nikhilesh 	if (err != 1) {
135685fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
135785fb515bSPavan Nikhilesh 		goto fail;
135885fb515bSPavan Nikhilesh 	}
135985fb515bSPavan Nikhilesh 
136085fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
136185fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
136285fb515bSPavan Nikhilesh 		goto fail;
136385fb515bSPavan Nikhilesh 	}
136485fb515bSPavan Nikhilesh 
136585fb515bSPavan Nikhilesh 	cleanup(t);
136685fb515bSPavan Nikhilesh 	return 0;
136785fb515bSPavan Nikhilesh fail:
136885fb515bSPavan Nikhilesh 	cleanup(t);
136985fb515bSPavan Nikhilesh 	return -1;
137085fb515bSPavan Nikhilesh }
137185fb515bSPavan Nikhilesh 
137285fb515bSPavan Nikhilesh static int
xstats_brute_force(struct test * t)137385fb515bSPavan Nikhilesh xstats_brute_force(struct test *t)
137485fb515bSPavan Nikhilesh {
137585fb515bSPavan Nikhilesh 	uint32_t i;
137685fb515bSPavan Nikhilesh 	const uint32_t XSTATS_MAX = 1024;
13771bdfe4d7SPavan Nikhilesh 	uint64_t ids[XSTATS_MAX];
137885fb515bSPavan Nikhilesh 	uint64_t values[XSTATS_MAX];
137985fb515bSPavan Nikhilesh 	struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX];
138085fb515bSPavan Nikhilesh 
138185fb515bSPavan Nikhilesh 
138285fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
138385fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
138485fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
138585fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
138685fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
138785fb515bSPavan Nikhilesh 		return -1;
138885fb515bSPavan Nikhilesh 	}
138985fb515bSPavan Nikhilesh 
139085fb515bSPavan Nikhilesh 	int err = rte_event_port_link(evdev, t->port[0], NULL, NULL, 0);
139185fb515bSPavan Nikhilesh 	if (err != 1) {
139285fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
139385fb515bSPavan Nikhilesh 		goto fail;
139485fb515bSPavan Nikhilesh 	}
139585fb515bSPavan Nikhilesh 
139685fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
139785fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
139885fb515bSPavan Nikhilesh 		goto fail;
139985fb515bSPavan Nikhilesh 	}
140085fb515bSPavan Nikhilesh 
140185fb515bSPavan Nikhilesh 	for (i = 0; i < XSTATS_MAX; i++)
140285fb515bSPavan Nikhilesh 		ids[i] = i;
140385fb515bSPavan Nikhilesh 
140485fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
140585fb515bSPavan Nikhilesh 		uint32_t mode = RTE_EVENT_DEV_XSTATS_DEVICE + i;
140685fb515bSPavan Nikhilesh 		uint32_t j;
140785fb515bSPavan Nikhilesh 		for (j = 0; j < UINT8_MAX; j++) {
140885fb515bSPavan Nikhilesh 			rte_event_dev_xstats_names_get(evdev, mode,
140985fb515bSPavan Nikhilesh 				j, xstats_names, ids, XSTATS_MAX);
141085fb515bSPavan Nikhilesh 
141185fb515bSPavan Nikhilesh 			rte_event_dev_xstats_get(evdev, mode, j, ids,
141285fb515bSPavan Nikhilesh 						 values, XSTATS_MAX);
141385fb515bSPavan Nikhilesh 		}
141485fb515bSPavan Nikhilesh 	}
141585fb515bSPavan Nikhilesh 
141685fb515bSPavan Nikhilesh 	cleanup(t);
141785fb515bSPavan Nikhilesh 	return 0;
141885fb515bSPavan Nikhilesh fail:
141985fb515bSPavan Nikhilesh 	cleanup(t);
142085fb515bSPavan Nikhilesh 	return -1;
142185fb515bSPavan Nikhilesh }
142285fb515bSPavan Nikhilesh 
142385fb515bSPavan Nikhilesh static int
xstats_id_reset_tests(struct test * t)142485fb515bSPavan Nikhilesh xstats_id_reset_tests(struct test *t)
142585fb515bSPavan Nikhilesh {
142685fb515bSPavan Nikhilesh 	const int wrk_enq = 2;
142785fb515bSPavan Nikhilesh 	int err;
142885fb515bSPavan Nikhilesh 
142985fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
143085fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
143185fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
143285fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
143385fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
143485fb515bSPavan Nikhilesh 		return -1;
143585fb515bSPavan Nikhilesh 	}
143685fb515bSPavan Nikhilesh 
143785fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
143885fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0);
143985fb515bSPavan Nikhilesh 	if (err != 1) {
144085fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
144185fb515bSPavan Nikhilesh 		goto fail;
144285fb515bSPavan Nikhilesh 	}
144385fb515bSPavan Nikhilesh 
144485fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
144585fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
144685fb515bSPavan Nikhilesh 		goto fail;
144785fb515bSPavan Nikhilesh 	}
144885fb515bSPavan Nikhilesh 
144985fb515bSPavan Nikhilesh #define XSTATS_MAX 1024
145085fb515bSPavan Nikhilesh 	int ret;
145185fb515bSPavan Nikhilesh 	uint32_t i;
14521bdfe4d7SPavan Nikhilesh 	uint64_t ids[XSTATS_MAX];
145385fb515bSPavan Nikhilesh 	uint64_t values[XSTATS_MAX];
145485fb515bSPavan Nikhilesh 	struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX];
145585fb515bSPavan Nikhilesh 
145685fb515bSPavan Nikhilesh 	for (i = 0; i < XSTATS_MAX; i++)
145785fb515bSPavan Nikhilesh 		ids[i] = i;
145885fb515bSPavan Nikhilesh 
1459324b37e6SHarry van Haaren #define NUM_DEV_STATS 8
146085fb515bSPavan Nikhilesh 	/* Device names / values */
146185fb515bSPavan Nikhilesh 	int num_stats = rte_event_dev_xstats_names_get(evdev,
146285fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
146385fb515bSPavan Nikhilesh 					0, xstats_names, ids, XSTATS_MAX);
146485fb515bSPavan Nikhilesh 	if (num_stats != NUM_DEV_STATS) {
146585fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n", __LINE__,
146685fb515bSPavan Nikhilesh 				NUM_DEV_STATS, num_stats);
146785fb515bSPavan Nikhilesh 		goto fail;
146885fb515bSPavan Nikhilesh 	}
146985fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev,
147085fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_DEVICE,
147185fb515bSPavan Nikhilesh 					0, ids, values, num_stats);
147285fb515bSPavan Nikhilesh 	if (ret != NUM_DEV_STATS) {
147385fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n", __LINE__,
147485fb515bSPavan Nikhilesh 				NUM_DEV_STATS, ret);
147585fb515bSPavan Nikhilesh 		goto fail;
147685fb515bSPavan Nikhilesh 	}
147785fb515bSPavan Nikhilesh 
147885fb515bSPavan Nikhilesh #define NPKTS 7
147985fb515bSPavan Nikhilesh 	for (i = 0; i < NPKTS; i++) {
148085fb515bSPavan Nikhilesh 		struct rte_event ev;
148185fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
148285fb515bSPavan Nikhilesh 		if (!arp) {
148385fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
148485fb515bSPavan Nikhilesh 			goto fail;
148585fb515bSPavan Nikhilesh 		}
148685fb515bSPavan Nikhilesh 		ev.queue_id = t->qid[i];
1487ab059e82SOlivier Matz 		ev.flow_id = 0;
148885fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
148985fb515bSPavan Nikhilesh 		ev.mbuf = arp;
1490ca4355e4SDavid Marchand 		*rte_event_pmd_selftest_seqn(arp) = i;
149185fb515bSPavan Nikhilesh 
149285fb515bSPavan Nikhilesh 		int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1);
149385fb515bSPavan Nikhilesh 		if (err != 1) {
149485fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
149585fb515bSPavan Nikhilesh 			goto fail;
149685fb515bSPavan Nikhilesh 		}
149785fb515bSPavan Nikhilesh 	}
149885fb515bSPavan Nikhilesh 
149985fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
150085fb515bSPavan Nikhilesh 
150185fb515bSPavan Nikhilesh 	static const char * const dev_names[] = {
150285fb515bSPavan Nikhilesh 		"dev_rx", "dev_tx", "dev_drop", "dev_sched_calls",
150385fb515bSPavan Nikhilesh 		"dev_sched_no_iq_enq", "dev_sched_no_cq_enq",
1504324b37e6SHarry van Haaren 		"dev_sched_last_iter_bitmask",
1505324b37e6SHarry van Haaren 		"dev_sched_progress_last_iter"
150685fb515bSPavan Nikhilesh 	};
1507324b37e6SHarry van Haaren 	uint64_t dev_expected[] = {NPKTS, NPKTS, 0, 1, 0, 0, 4, 1};
150885fb515bSPavan Nikhilesh 	for (i = 0; (int)i < ret; i++) {
15091bdfe4d7SPavan Nikhilesh 		uint64_t id;
151085fb515bSPavan Nikhilesh 		uint64_t val = rte_event_dev_xstats_by_name_get(evdev,
151185fb515bSPavan Nikhilesh 								dev_names[i],
151285fb515bSPavan Nikhilesh 								&id);
151385fb515bSPavan Nikhilesh 		if (id != i) {
15141bdfe4d7SPavan Nikhilesh 			printf("%d: %s id incorrect, expected %d got %" PRIu64
15151bdfe4d7SPavan Nikhilesh 			       "\n",
151685fb515bSPavan Nikhilesh 			       __LINE__, dev_names[i], i, id);
151785fb515bSPavan Nikhilesh 			goto fail;
151885fb515bSPavan Nikhilesh 		}
151985fb515bSPavan Nikhilesh 		if (val != dev_expected[i]) {
152085fb515bSPavan Nikhilesh 			printf("%d: %s value incorrect, expected %"
1521324b37e6SHarry van Haaren 				PRIu64" got %"PRIu64"\n", __LINE__,
1522324b37e6SHarry van Haaren 				dev_names[i], dev_expected[i], val);
152385fb515bSPavan Nikhilesh 			goto fail;
152485fb515bSPavan Nikhilesh 		}
152585fb515bSPavan Nikhilesh 		/* reset to zero */
152685fb515bSPavan Nikhilesh 		int reset_ret = rte_event_dev_xstats_reset(evdev,
152785fb515bSPavan Nikhilesh 						RTE_EVENT_DEV_XSTATS_DEVICE, 0,
152885fb515bSPavan Nikhilesh 						&id,
152985fb515bSPavan Nikhilesh 						1);
153085fb515bSPavan Nikhilesh 		if (reset_ret) {
153185fb515bSPavan Nikhilesh 			printf("%d: failed to reset successfully\n", __LINE__);
153285fb515bSPavan Nikhilesh 			goto fail;
153385fb515bSPavan Nikhilesh 		}
153485fb515bSPavan Nikhilesh 		dev_expected[i] = 0;
153585fb515bSPavan Nikhilesh 		/* check value again */
153685fb515bSPavan Nikhilesh 		val = rte_event_dev_xstats_by_name_get(evdev, dev_names[i], 0);
153785fb515bSPavan Nikhilesh 		if (val != dev_expected[i]) {
153885fb515bSPavan Nikhilesh 			printf("%d: %s value incorrect, expected %"PRIu64
153985fb515bSPavan Nikhilesh 				" got %"PRIu64"\n", __LINE__, dev_names[i],
154085fb515bSPavan Nikhilesh 				dev_expected[i], val);
154185fb515bSPavan Nikhilesh 			goto fail;
154285fb515bSPavan Nikhilesh 		}
154385fb515bSPavan Nikhilesh 	};
154485fb515bSPavan Nikhilesh 
1545324b37e6SHarry van Haaren /* 49 is stat offset from start of the devices whole xstats.
154685fb515bSPavan Nikhilesh  * This WILL break every time we add a statistic to a port
154785fb515bSPavan Nikhilesh  * or the device, but there is no other way to test
154885fb515bSPavan Nikhilesh  */
1549324b37e6SHarry van Haaren #define PORT_OFF 50
155085fb515bSPavan Nikhilesh /* num stats for the tested port. CQ size adds more stats to a port */
155185fb515bSPavan Nikhilesh #define NUM_PORT_STATS 21
155285fb515bSPavan Nikhilesh /* the port to test. */
155385fb515bSPavan Nikhilesh #define PORT 2
155485fb515bSPavan Nikhilesh 	num_stats = rte_event_dev_xstats_names_get(evdev,
155585fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_PORT, PORT,
155685fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
155785fb515bSPavan Nikhilesh 	if (num_stats != NUM_PORT_STATS) {
155885fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n",
155985fb515bSPavan Nikhilesh 			__LINE__, NUM_PORT_STATS, num_stats);
156085fb515bSPavan Nikhilesh 		goto fail;
156185fb515bSPavan Nikhilesh 	}
156285fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_PORT, PORT,
156385fb515bSPavan Nikhilesh 					ids, values, num_stats);
156485fb515bSPavan Nikhilesh 
156585fb515bSPavan Nikhilesh 	if (ret != NUM_PORT_STATS) {
156685fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n",
156785fb515bSPavan Nikhilesh 				__LINE__, NUM_PORT_STATS, ret);
156885fb515bSPavan Nikhilesh 		goto fail;
156985fb515bSPavan Nikhilesh 	}
157085fb515bSPavan Nikhilesh 	static const char * const port_names[] = {
157185fb515bSPavan Nikhilesh 		"port_2_rx",
157285fb515bSPavan Nikhilesh 		"port_2_tx",
157385fb515bSPavan Nikhilesh 		"port_2_drop",
157485fb515bSPavan Nikhilesh 		"port_2_inflight",
157585fb515bSPavan Nikhilesh 		"port_2_avg_pkt_cycles",
157685fb515bSPavan Nikhilesh 		"port_2_credits",
157785fb515bSPavan Nikhilesh 		"port_2_rx_ring_used",
157885fb515bSPavan Nikhilesh 		"port_2_rx_ring_free",
157985fb515bSPavan Nikhilesh 		"port_2_cq_ring_used",
158085fb515bSPavan Nikhilesh 		"port_2_cq_ring_free",
158185fb515bSPavan Nikhilesh 		"port_2_dequeue_calls",
158285fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_0",
158385fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_1-4",
158485fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_5-8",
158585fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_9-12",
158685fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_13-16",
158785fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_17-20",
158885fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_21-24",
158985fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_25-28",
159085fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_29-32",
159185fb515bSPavan Nikhilesh 		"port_2_dequeues_returning_33-36",
159285fb515bSPavan Nikhilesh 	};
159385fb515bSPavan Nikhilesh 	uint64_t port_expected[] = {
159485fb515bSPavan Nikhilesh 		0, /* rx */
159585fb515bSPavan Nikhilesh 		NPKTS, /* tx */
159685fb515bSPavan Nikhilesh 		0, /* drop */
159785fb515bSPavan Nikhilesh 		NPKTS, /* inflight */
159885fb515bSPavan Nikhilesh 		0, /* avg pkt cycles */
159985fb515bSPavan Nikhilesh 		0, /* credits */
160085fb515bSPavan Nikhilesh 		0, /* rx ring used */
160185fb515bSPavan Nikhilesh 		4096, /* rx ring free */
160285fb515bSPavan Nikhilesh 		NPKTS,  /* cq ring used */
160385fb515bSPavan Nikhilesh 		25, /* cq ring free */
160485fb515bSPavan Nikhilesh 		0, /* dequeue zero calls */
160585fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0, /* 10 dequeue buckets */
160685fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
160785fb515bSPavan Nikhilesh 	};
160885fb515bSPavan Nikhilesh 	uint64_t port_expected_zero[] = {
160985fb515bSPavan Nikhilesh 		0, /* rx */
161085fb515bSPavan Nikhilesh 		0, /* tx */
161185fb515bSPavan Nikhilesh 		0, /* drop */
161285fb515bSPavan Nikhilesh 		NPKTS, /* inflight */
161385fb515bSPavan Nikhilesh 		0, /* avg pkt cycles */
161485fb515bSPavan Nikhilesh 		0, /* credits */
161585fb515bSPavan Nikhilesh 		0, /* rx ring used */
161685fb515bSPavan Nikhilesh 		4096, /* rx ring free */
161785fb515bSPavan Nikhilesh 		NPKTS,  /* cq ring used */
161885fb515bSPavan Nikhilesh 		25, /* cq ring free */
161985fb515bSPavan Nikhilesh 		0, /* dequeue zero calls */
162085fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0, /* 10 dequeue buckets */
162185fb515bSPavan Nikhilesh 		0, 0, 0, 0, 0,
162285fb515bSPavan Nikhilesh 	};
162385fb515bSPavan Nikhilesh 	if (RTE_DIM(port_expected) != NUM_PORT_STATS ||
162485fb515bSPavan Nikhilesh 			RTE_DIM(port_names) != NUM_PORT_STATS) {
162585fb515bSPavan Nikhilesh 		printf("%d: port array of wrong size\n", __LINE__);
162685fb515bSPavan Nikhilesh 		goto fail;
162785fb515bSPavan Nikhilesh 	}
162885fb515bSPavan Nikhilesh 
162985fb515bSPavan Nikhilesh 	int failed = 0;
163085fb515bSPavan Nikhilesh 	for (i = 0; (int)i < ret; i++) {
16311bdfe4d7SPavan Nikhilesh 		uint64_t id;
163285fb515bSPavan Nikhilesh 		uint64_t val = rte_event_dev_xstats_by_name_get(evdev,
163385fb515bSPavan Nikhilesh 								port_names[i],
163485fb515bSPavan Nikhilesh 								&id);
163585fb515bSPavan Nikhilesh 		if (id != i + PORT_OFF) {
16361bdfe4d7SPavan Nikhilesh 			printf("%d: %s id incorrect, expected %d got %" PRIu64
16371bdfe4d7SPavan Nikhilesh 			       "\n",
16381bdfe4d7SPavan Nikhilesh 			       __LINE__, port_names[i], i + PORT_OFF, id);
163985fb515bSPavan Nikhilesh 			failed = 1;
164085fb515bSPavan Nikhilesh 		}
164185fb515bSPavan Nikhilesh 		if (val != port_expected[i]) {
164285fb515bSPavan Nikhilesh 			printf("%d: %s value incorrect, expected %" PRIu64
16431bdfe4d7SPavan Nikhilesh 			       " got %" PRIu64 "\n",
164405d22d4eSOlivier Matz 			       __LINE__, port_names[i], port_expected[i], val);
164585fb515bSPavan Nikhilesh 			failed = 1;
164685fb515bSPavan Nikhilesh 		}
164785fb515bSPavan Nikhilesh 		/* reset to zero */
164885fb515bSPavan Nikhilesh 		int reset_ret = rte_event_dev_xstats_reset(evdev,
164985fb515bSPavan Nikhilesh 						RTE_EVENT_DEV_XSTATS_PORT, PORT,
165085fb515bSPavan Nikhilesh 						&id,
165185fb515bSPavan Nikhilesh 						1);
165285fb515bSPavan Nikhilesh 		if (reset_ret) {
165385fb515bSPavan Nikhilesh 			printf("%d: failed to reset successfully\n", __LINE__);
165485fb515bSPavan Nikhilesh 			failed = 1;
165585fb515bSPavan Nikhilesh 		}
165685fb515bSPavan Nikhilesh 		/* check value again */
165785fb515bSPavan Nikhilesh 		val = rte_event_dev_xstats_by_name_get(evdev, port_names[i], 0);
165885fb515bSPavan Nikhilesh 		if (val != port_expected_zero[i]) {
165985fb515bSPavan Nikhilesh 			printf("%d: %s value incorrect, expected %"PRIu64
166085fb515bSPavan Nikhilesh 				" got %"PRIu64"\n", __LINE__, port_names[i],
166185fb515bSPavan Nikhilesh 				port_expected_zero[i], val);
166285fb515bSPavan Nikhilesh 			failed = 1;
166385fb515bSPavan Nikhilesh 		}
166485fb515bSPavan Nikhilesh 	};
166585fb515bSPavan Nikhilesh 	if (failed)
166685fb515bSPavan Nikhilesh 		goto fail;
166785fb515bSPavan Nikhilesh 
166885fb515bSPavan Nikhilesh /* num queue stats */
166985fb515bSPavan Nikhilesh #define NUM_Q_STATS 16
167085fb515bSPavan Nikhilesh /* queue offset from start of the devices whole xstats.
167185fb515bSPavan Nikhilesh  * This will break every time we add a statistic to a device/port/queue
167285fb515bSPavan Nikhilesh  */
1673324b37e6SHarry van Haaren #define QUEUE_OFF 92
167485fb515bSPavan Nikhilesh 	const uint32_t queue = 0;
167585fb515bSPavan Nikhilesh 	num_stats = rte_event_dev_xstats_names_get(evdev,
167685fb515bSPavan Nikhilesh 					RTE_EVENT_DEV_XSTATS_QUEUE, queue,
167785fb515bSPavan Nikhilesh 					xstats_names, ids, XSTATS_MAX);
167885fb515bSPavan Nikhilesh 	if (num_stats != NUM_Q_STATS) {
167985fb515bSPavan Nikhilesh 		printf("%d: expected %d stats, got return %d\n",
168085fb515bSPavan Nikhilesh 			__LINE__, NUM_Q_STATS, num_stats);
168185fb515bSPavan Nikhilesh 		goto fail;
168285fb515bSPavan Nikhilesh 	}
168385fb515bSPavan Nikhilesh 	ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE,
168485fb515bSPavan Nikhilesh 					queue, ids, values, num_stats);
168585fb515bSPavan Nikhilesh 	if (ret != NUM_Q_STATS) {
168685fb515bSPavan Nikhilesh 		printf("%d: expected 21 stats, got return %d\n", __LINE__, ret);
168785fb515bSPavan Nikhilesh 		goto fail;
168885fb515bSPavan Nikhilesh 	}
168985fb515bSPavan Nikhilesh 	static const char * const queue_names[] = {
169085fb515bSPavan Nikhilesh 		"qid_0_rx",
169185fb515bSPavan Nikhilesh 		"qid_0_tx",
169285fb515bSPavan Nikhilesh 		"qid_0_drop",
169385fb515bSPavan Nikhilesh 		"qid_0_inflight",
169485fb515bSPavan Nikhilesh 		"qid_0_iq_0_used",
169585fb515bSPavan Nikhilesh 		"qid_0_iq_1_used",
169685fb515bSPavan Nikhilesh 		"qid_0_iq_2_used",
169785fb515bSPavan Nikhilesh 		"qid_0_iq_3_used",
169885fb515bSPavan Nikhilesh 		"qid_0_port_0_pinned_flows",
169985fb515bSPavan Nikhilesh 		"qid_0_port_0_packets",
170085fb515bSPavan Nikhilesh 		"qid_0_port_1_pinned_flows",
170185fb515bSPavan Nikhilesh 		"qid_0_port_1_packets",
170285fb515bSPavan Nikhilesh 		"qid_0_port_2_pinned_flows",
170385fb515bSPavan Nikhilesh 		"qid_0_port_2_packets",
170485fb515bSPavan Nikhilesh 		"qid_0_port_3_pinned_flows",
170585fb515bSPavan Nikhilesh 		"qid_0_port_3_packets",
170685fb515bSPavan Nikhilesh 	};
170785fb515bSPavan Nikhilesh 	uint64_t queue_expected[] = {
170885fb515bSPavan Nikhilesh 		7, /* rx */
170985fb515bSPavan Nikhilesh 		7, /* tx */
171085fb515bSPavan Nikhilesh 		0, /* drop */
171185fb515bSPavan Nikhilesh 		7, /* inflight */
171285fb515bSPavan Nikhilesh 		0, /* iq 0 used */
171385fb515bSPavan Nikhilesh 		0, /* iq 1 used */
171485fb515bSPavan Nikhilesh 		0, /* iq 2 used */
171585fb515bSPavan Nikhilesh 		0, /* iq 3 used */
171685fb515bSPavan Nikhilesh 		/* QID-to-Port: pinned_flows, packets */
171785fb515bSPavan Nikhilesh 		0, 0,
171885fb515bSPavan Nikhilesh 		0, 0,
171985fb515bSPavan Nikhilesh 		1, 7,
172085fb515bSPavan Nikhilesh 		0, 0,
172185fb515bSPavan Nikhilesh 	};
172285fb515bSPavan Nikhilesh 	uint64_t queue_expected_zero[] = {
172385fb515bSPavan Nikhilesh 		0, /* rx */
172485fb515bSPavan Nikhilesh 		0, /* tx */
172585fb515bSPavan Nikhilesh 		0, /* drop */
172685fb515bSPavan Nikhilesh 		7, /* inflight */
172785fb515bSPavan Nikhilesh 		0, /* iq 0 used */
172885fb515bSPavan Nikhilesh 		0, /* iq 1 used */
172985fb515bSPavan Nikhilesh 		0, /* iq 2 used */
173085fb515bSPavan Nikhilesh 		0, /* iq 3 used */
173185fb515bSPavan Nikhilesh 		/* QID-to-Port: pinned_flows, packets */
173285fb515bSPavan Nikhilesh 		0, 0,
173385fb515bSPavan Nikhilesh 		0, 0,
173485fb515bSPavan Nikhilesh 		1, 0,
173585fb515bSPavan Nikhilesh 		0, 0,
173685fb515bSPavan Nikhilesh 	};
173785fb515bSPavan Nikhilesh 	if (RTE_DIM(queue_expected) != NUM_Q_STATS ||
173885fb515bSPavan Nikhilesh 			RTE_DIM(queue_expected_zero) != NUM_Q_STATS ||
173985fb515bSPavan Nikhilesh 			RTE_DIM(queue_names) != NUM_Q_STATS) {
174085fb515bSPavan Nikhilesh 		printf("%d : queue array of wrong size\n", __LINE__);
174185fb515bSPavan Nikhilesh 		goto fail;
174285fb515bSPavan Nikhilesh 	}
174385fb515bSPavan Nikhilesh 
174485fb515bSPavan Nikhilesh 	failed = 0;
174585fb515bSPavan Nikhilesh 	for (i = 0; (int)i < ret; i++) {
17461bdfe4d7SPavan Nikhilesh 		uint64_t id;
174785fb515bSPavan Nikhilesh 		uint64_t val = rte_event_dev_xstats_by_name_get(evdev,
174885fb515bSPavan Nikhilesh 								queue_names[i],
174985fb515bSPavan Nikhilesh 								&id);
175085fb515bSPavan Nikhilesh 		if (id != i + QUEUE_OFF) {
17511bdfe4d7SPavan Nikhilesh 			printf("%d: %s id incorrect, expected %d got %" PRIu64
17521bdfe4d7SPavan Nikhilesh 			       "\n",
17531bdfe4d7SPavan Nikhilesh 			       __LINE__, queue_names[i], i + QUEUE_OFF, id);
175485fb515bSPavan Nikhilesh 			failed = 1;
175585fb515bSPavan Nikhilesh 		}
175685fb515bSPavan Nikhilesh 		if (val != queue_expected[i]) {
175785fb515bSPavan Nikhilesh 			printf("%d: %d: %s value , expected %"PRIu64
175885fb515bSPavan Nikhilesh 				" got %"PRIu64"\n", i, __LINE__,
175985fb515bSPavan Nikhilesh 				queue_names[i], queue_expected[i], val);
176085fb515bSPavan Nikhilesh 			failed = 1;
176185fb515bSPavan Nikhilesh 		}
176285fb515bSPavan Nikhilesh 		/* reset to zero */
176385fb515bSPavan Nikhilesh 		int reset_ret = rte_event_dev_xstats_reset(evdev,
176485fb515bSPavan Nikhilesh 						RTE_EVENT_DEV_XSTATS_QUEUE,
176585fb515bSPavan Nikhilesh 						queue, &id, 1);
176685fb515bSPavan Nikhilesh 		if (reset_ret) {
176785fb515bSPavan Nikhilesh 			printf("%d: failed to reset successfully\n", __LINE__);
176885fb515bSPavan Nikhilesh 			failed = 1;
176985fb515bSPavan Nikhilesh 		}
177085fb515bSPavan Nikhilesh 		/* check value again */
177185fb515bSPavan Nikhilesh 		val = rte_event_dev_xstats_by_name_get(evdev, queue_names[i],
177285fb515bSPavan Nikhilesh 							0);
177385fb515bSPavan Nikhilesh 		if (val != queue_expected_zero[i]) {
177485fb515bSPavan Nikhilesh 			printf("%d: %s value incorrect, expected %"PRIu64
177585fb515bSPavan Nikhilesh 				" got %"PRIu64"\n", __LINE__, queue_names[i],
177685fb515bSPavan Nikhilesh 				queue_expected_zero[i], val);
177785fb515bSPavan Nikhilesh 			failed = 1;
177885fb515bSPavan Nikhilesh 		}
177985fb515bSPavan Nikhilesh 	};
178085fb515bSPavan Nikhilesh 
178185fb515bSPavan Nikhilesh 	if (failed)
178285fb515bSPavan Nikhilesh 		goto fail;
178385fb515bSPavan Nikhilesh 
178485fb515bSPavan Nikhilesh 	cleanup(t);
178585fb515bSPavan Nikhilesh 	return 0;
178685fb515bSPavan Nikhilesh fail:
178785fb515bSPavan Nikhilesh 	cleanup(t);
178885fb515bSPavan Nikhilesh 	return -1;
178985fb515bSPavan Nikhilesh }
179085fb515bSPavan Nikhilesh 
179185fb515bSPavan Nikhilesh static int
ordered_reconfigure(struct test * t)179285fb515bSPavan Nikhilesh ordered_reconfigure(struct test *t)
179385fb515bSPavan Nikhilesh {
179485fb515bSPavan Nikhilesh 	if (init(t, 1, 1) < 0 ||
179585fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0) {
179685fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
179785fb515bSPavan Nikhilesh 		return -1;
179885fb515bSPavan Nikhilesh 	}
179985fb515bSPavan Nikhilesh 
180085fb515bSPavan Nikhilesh 	const struct rte_event_queue_conf conf = {
180185fb515bSPavan Nikhilesh 			.schedule_type = RTE_SCHED_TYPE_ORDERED,
180285fb515bSPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
180385fb515bSPavan Nikhilesh 			.nb_atomic_flows = 1024,
180485fb515bSPavan Nikhilesh 			.nb_atomic_order_sequences = 1024,
180585fb515bSPavan Nikhilesh 	};
180685fb515bSPavan Nikhilesh 
180785fb515bSPavan Nikhilesh 	if (rte_event_queue_setup(evdev, 0, &conf) < 0) {
180885fb515bSPavan Nikhilesh 		printf("%d: error creating qid\n", __LINE__);
180985fb515bSPavan Nikhilesh 		goto failed;
181085fb515bSPavan Nikhilesh 	}
181185fb515bSPavan Nikhilesh 
181285fb515bSPavan Nikhilesh 	if (rte_event_queue_setup(evdev, 0, &conf) < 0) {
181385fb515bSPavan Nikhilesh 		printf("%d: error creating qid, for 2nd time\n", __LINE__);
181485fb515bSPavan Nikhilesh 		goto failed;
181585fb515bSPavan Nikhilesh 	}
181685fb515bSPavan Nikhilesh 
181785fb515bSPavan Nikhilesh 	rte_event_port_link(evdev, t->port[0], NULL, NULL, 0);
181885fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
181985fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
182085fb515bSPavan Nikhilesh 		return -1;
182185fb515bSPavan Nikhilesh 	}
182285fb515bSPavan Nikhilesh 
182385fb515bSPavan Nikhilesh 	cleanup(t);
182485fb515bSPavan Nikhilesh 	return 0;
182585fb515bSPavan Nikhilesh failed:
182685fb515bSPavan Nikhilesh 	cleanup(t);
182785fb515bSPavan Nikhilesh 	return -1;
182885fb515bSPavan Nikhilesh }
182985fb515bSPavan Nikhilesh 
183085fb515bSPavan Nikhilesh static int
qid_priorities(struct test * t)183185fb515bSPavan Nikhilesh qid_priorities(struct test *t)
183285fb515bSPavan Nikhilesh {
183385fb515bSPavan Nikhilesh 	/* Test works by having a CQ with enough empty space for all packets,
183485fb515bSPavan Nikhilesh 	 * and enqueueing 3 packets to 3 QIDs. They must return based on the
183585fb515bSPavan Nikhilesh 	 * priority of the QID, not the ingress order, to pass the test
183685fb515bSPavan Nikhilesh 	 */
183785fb515bSPavan Nikhilesh 	unsigned int i;
183885fb515bSPavan Nikhilesh 	/* Create instance with 1 ports, and 3 qids */
183985fb515bSPavan Nikhilesh 	if (init(t, 3, 1) < 0 ||
184085fb515bSPavan Nikhilesh 			create_ports(t, 1) < 0) {
184185fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
184285fb515bSPavan Nikhilesh 		return -1;
184385fb515bSPavan Nikhilesh 	}
184485fb515bSPavan Nikhilesh 
184585fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
184685fb515bSPavan Nikhilesh 		/* Create QID */
184785fb515bSPavan Nikhilesh 		const struct rte_event_queue_conf conf = {
184885fb515bSPavan Nikhilesh 			.schedule_type = RTE_SCHED_TYPE_ATOMIC,
184985fb515bSPavan Nikhilesh 			/* increase priority (0 == highest), as we go */
185085fb515bSPavan Nikhilesh 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL - i,
185185fb515bSPavan Nikhilesh 			.nb_atomic_flows = 1024,
185285fb515bSPavan Nikhilesh 			.nb_atomic_order_sequences = 1024,
185385fb515bSPavan Nikhilesh 		};
185485fb515bSPavan Nikhilesh 
185585fb515bSPavan Nikhilesh 		if (rte_event_queue_setup(evdev, i, &conf) < 0) {
185685fb515bSPavan Nikhilesh 			printf("%d: error creating qid %d\n", __LINE__, i);
185785fb515bSPavan Nikhilesh 			return -1;
185885fb515bSPavan Nikhilesh 		}
185985fb515bSPavan Nikhilesh 		t->qid[i] = i;
186085fb515bSPavan Nikhilesh 	}
186185fb515bSPavan Nikhilesh 	t->nb_qids = i;
186285fb515bSPavan Nikhilesh 	/* map all QIDs to port */
186385fb515bSPavan Nikhilesh 	rte_event_port_link(evdev, t->port[0], NULL, NULL, 0);
186485fb515bSPavan Nikhilesh 
186585fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
186685fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
186785fb515bSPavan Nikhilesh 		return -1;
186885fb515bSPavan Nikhilesh 	}
186985fb515bSPavan Nikhilesh 
187085fb515bSPavan Nikhilesh 	/* enqueue 3 packets, setting seqn and QID to check priority */
187185fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
187285fb515bSPavan Nikhilesh 		struct rte_event ev;
187385fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
187485fb515bSPavan Nikhilesh 		if (!arp) {
187585fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
187685fb515bSPavan Nikhilesh 			return -1;
187785fb515bSPavan Nikhilesh 		}
187885fb515bSPavan Nikhilesh 		ev.queue_id = t->qid[i];
187985fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
188085fb515bSPavan Nikhilesh 		ev.mbuf = arp;
1881ca4355e4SDavid Marchand 		*rte_event_pmd_selftest_seqn(arp) = i;
188285fb515bSPavan Nikhilesh 
188385fb515bSPavan Nikhilesh 		int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1);
188485fb515bSPavan Nikhilesh 		if (err != 1) {
188585fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
188685fb515bSPavan Nikhilesh 			return -1;
188785fb515bSPavan Nikhilesh 		}
188885fb515bSPavan Nikhilesh 	}
188985fb515bSPavan Nikhilesh 
189085fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
189185fb515bSPavan Nikhilesh 
189285fb515bSPavan Nikhilesh 	/* dequeue packets, verify priority was upheld */
189385fb515bSPavan Nikhilesh 	struct rte_event ev[32];
189485fb515bSPavan Nikhilesh 	uint32_t deq_pkts =
189585fb515bSPavan Nikhilesh 		rte_event_dequeue_burst(evdev, t->port[0], ev, 32, 0);
189685fb515bSPavan Nikhilesh 	if (deq_pkts != 3) {
189785fb515bSPavan Nikhilesh 		printf("%d: failed to deq packets\n", __LINE__);
189885fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
189985fb515bSPavan Nikhilesh 		return -1;
190085fb515bSPavan Nikhilesh 	}
190185fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
1902ca4355e4SDavid Marchand 		if (*rte_event_pmd_selftest_seqn(ev[i].mbuf) != 2-i) {
190385fb515bSPavan Nikhilesh 			printf(
190485fb515bSPavan Nikhilesh 				"%d: qid priority test: seqn %d incorrectly prioritized\n",
190585fb515bSPavan Nikhilesh 					__LINE__, i);
190685fb515bSPavan Nikhilesh 		}
190785fb515bSPavan Nikhilesh 	}
190885fb515bSPavan Nikhilesh 
190985fb515bSPavan Nikhilesh 	cleanup(t);
191085fb515bSPavan Nikhilesh 	return 0;
191185fb515bSPavan Nikhilesh }
191285fb515bSPavan Nikhilesh 
191385fb515bSPavan Nikhilesh static int
unlink_in_progress(struct test * t)19141638261aSHarry van Haaren unlink_in_progress(struct test *t)
19151638261aSHarry van Haaren {
19161638261aSHarry van Haaren 	/* Test unlinking API, in particular that when an unlink request has
19171638261aSHarry van Haaren 	 * not yet been seen by the scheduler thread, that the
19181638261aSHarry van Haaren 	 * unlink_in_progress() function returns the number of unlinks.
19191638261aSHarry van Haaren 	 */
19201638261aSHarry van Haaren 	unsigned int i;
19211638261aSHarry van Haaren 	/* Create instance with 1 ports, and 3 qids */
19221638261aSHarry van Haaren 	if (init(t, 3, 1) < 0 ||
19231638261aSHarry van Haaren 			create_ports(t, 1) < 0) {
19241638261aSHarry van Haaren 		printf("%d: Error initializing device\n", __LINE__);
19251638261aSHarry van Haaren 		return -1;
19261638261aSHarry van Haaren 	}
19271638261aSHarry van Haaren 
19281638261aSHarry van Haaren 	for (i = 0; i < 3; i++) {
19291638261aSHarry van Haaren 		/* Create QID */
19301638261aSHarry van Haaren 		const struct rte_event_queue_conf conf = {
19311638261aSHarry van Haaren 			.schedule_type = RTE_SCHED_TYPE_ATOMIC,
19321638261aSHarry van Haaren 			/* increase priority (0 == highest), as we go */
19331638261aSHarry van Haaren 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL - i,
19341638261aSHarry van Haaren 			.nb_atomic_flows = 1024,
19351638261aSHarry van Haaren 			.nb_atomic_order_sequences = 1024,
19361638261aSHarry van Haaren 		};
19371638261aSHarry van Haaren 
19381638261aSHarry van Haaren 		if (rte_event_queue_setup(evdev, i, &conf) < 0) {
19391638261aSHarry van Haaren 			printf("%d: error creating qid %d\n", __LINE__, i);
19401638261aSHarry van Haaren 			return -1;
19411638261aSHarry van Haaren 		}
19421638261aSHarry van Haaren 		t->qid[i] = i;
19431638261aSHarry van Haaren 	}
19441638261aSHarry van Haaren 	t->nb_qids = i;
19451638261aSHarry van Haaren 	/* map all QIDs to port */
19461638261aSHarry van Haaren 	rte_event_port_link(evdev, t->port[0], NULL, NULL, 0);
19471638261aSHarry van Haaren 
19481638261aSHarry van Haaren 	if (rte_event_dev_start(evdev) < 0) {
19491638261aSHarry van Haaren 		printf("%d: Error with start call\n", __LINE__);
19501638261aSHarry van Haaren 		return -1;
19511638261aSHarry van Haaren 	}
19521638261aSHarry van Haaren 
19531638261aSHarry van Haaren 	/* unlink all ports to have outstanding unlink requests */
19541638261aSHarry van Haaren 	int ret = rte_event_port_unlink(evdev, t->port[0], NULL, 0);
19551638261aSHarry van Haaren 	if (ret < 0) {
19561638261aSHarry van Haaren 		printf("%d: Failed to unlink queues\n", __LINE__);
19571638261aSHarry van Haaren 		return -1;
19581638261aSHarry van Haaren 	}
19591638261aSHarry van Haaren 
19601638261aSHarry van Haaren 	/* get active unlinks here, expect 3 */
19611638261aSHarry van Haaren 	int unlinks_in_progress =
19621638261aSHarry van Haaren 		rte_event_port_unlinks_in_progress(evdev, t->port[0]);
19631638261aSHarry van Haaren 	if (unlinks_in_progress != 3) {
19641638261aSHarry van Haaren 		printf("%d: Expected num unlinks in progress == 3, got %d\n",
19651638261aSHarry van Haaren 				__LINE__, unlinks_in_progress);
19661638261aSHarry van Haaren 		return -1;
19671638261aSHarry van Haaren 	}
19681638261aSHarry van Haaren 
19691638261aSHarry van Haaren 	/* run scheduler service on this thread to ack the unlinks */
19701638261aSHarry van Haaren 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
19711638261aSHarry van Haaren 
19721638261aSHarry van Haaren 	/* active unlinks expected as 0 as scheduler thread has acked */
19731638261aSHarry van Haaren 	unlinks_in_progress =
19741638261aSHarry van Haaren 		rte_event_port_unlinks_in_progress(evdev, t->port[0]);
19751638261aSHarry van Haaren 	if (unlinks_in_progress != 0) {
19761638261aSHarry van Haaren 		printf("%d: Expected num unlinks in progress == 0, got %d\n",
19771638261aSHarry van Haaren 				__LINE__, unlinks_in_progress);
19781638261aSHarry van Haaren 	}
19791638261aSHarry van Haaren 
19801638261aSHarry van Haaren 	cleanup(t);
19811638261aSHarry van Haaren 	return 0;
19821638261aSHarry van Haaren }
19831638261aSHarry van Haaren 
19841638261aSHarry van Haaren static int
load_balancing(struct test * t)198585fb515bSPavan Nikhilesh load_balancing(struct test *t)
198685fb515bSPavan Nikhilesh {
198785fb515bSPavan Nikhilesh 	const int rx_enq = 0;
198885fb515bSPavan Nikhilesh 	int err;
198985fb515bSPavan Nikhilesh 	uint32_t i;
199085fb515bSPavan Nikhilesh 
199185fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
199285fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
199385fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
199485fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
199585fb515bSPavan Nikhilesh 		return -1;
199685fb515bSPavan Nikhilesh 	}
199785fb515bSPavan Nikhilesh 
199885fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
199985fb515bSPavan Nikhilesh 		/* map port 1 - 3 inclusive */
200085fb515bSPavan Nikhilesh 		if (rte_event_port_link(evdev, t->port[i+1], &t->qid[0],
200185fb515bSPavan Nikhilesh 				NULL, 1) != 1) {
200285fb515bSPavan Nikhilesh 			printf("%d: error mapping qid to port %d\n",
200385fb515bSPavan Nikhilesh 					__LINE__, i);
200485fb515bSPavan Nikhilesh 			return -1;
200585fb515bSPavan Nikhilesh 		}
200685fb515bSPavan Nikhilesh 	}
200785fb515bSPavan Nikhilesh 
200885fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
200985fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
201085fb515bSPavan Nikhilesh 		return -1;
201185fb515bSPavan Nikhilesh 	}
201285fb515bSPavan Nikhilesh 
201385fb515bSPavan Nikhilesh 	/************** FORWARD ****************/
201485fb515bSPavan Nikhilesh 	/*
201585fb515bSPavan Nikhilesh 	 * Create a set of flows that test the load-balancing operation of the
201685fb515bSPavan Nikhilesh 	 * implementation. Fill CQ 0 and 1 with flows 0 and 1, and test
201785fb515bSPavan Nikhilesh 	 * with a new flow, which should be sent to the 3rd mapped CQ
201885fb515bSPavan Nikhilesh 	 */
201985fb515bSPavan Nikhilesh 	static uint32_t flows[] = {0, 1, 1, 0, 0, 2, 2, 0, 2};
202085fb515bSPavan Nikhilesh 
202185fb515bSPavan Nikhilesh 	for (i = 0; i < RTE_DIM(flows); i++) {
202285fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
202385fb515bSPavan Nikhilesh 		if (!arp) {
202485fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
202585fb515bSPavan Nikhilesh 			return -1;
202685fb515bSPavan Nikhilesh 		}
202785fb515bSPavan Nikhilesh 
202885fb515bSPavan Nikhilesh 		struct rte_event ev = {
202985fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
203085fb515bSPavan Nikhilesh 				.queue_id = t->qid[0],
203185fb515bSPavan Nikhilesh 				.flow_id = flows[i],
203285fb515bSPavan Nikhilesh 				.mbuf = arp,
203385fb515bSPavan Nikhilesh 		};
203485fb515bSPavan Nikhilesh 		/* generate pkt and enqueue */
203585fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
20361b03e292SHarry van Haaren 		if (err != 1) {
203785fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
203885fb515bSPavan Nikhilesh 			return -1;
203985fb515bSPavan Nikhilesh 		}
204085fb515bSPavan Nikhilesh 	}
204185fb515bSPavan Nikhilesh 
204285fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
204385fb515bSPavan Nikhilesh 
204485fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
204585fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
204685fb515bSPavan Nikhilesh 	if (err) {
204785fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
204885fb515bSPavan Nikhilesh 		return -1;
204985fb515bSPavan Nikhilesh 	}
205085fb515bSPavan Nikhilesh 
205185fb515bSPavan Nikhilesh 	if (stats.port_inflight[1] != 4) {
205285fb515bSPavan Nikhilesh 		printf("%d:%s: port 1 inflight not correct\n", __LINE__,
205385fb515bSPavan Nikhilesh 				__func__);
205485fb515bSPavan Nikhilesh 		return -1;
205585fb515bSPavan Nikhilesh 	}
205685fb515bSPavan Nikhilesh 	if (stats.port_inflight[2] != 2) {
205785fb515bSPavan Nikhilesh 		printf("%d:%s: port 2 inflight not correct\n", __LINE__,
205885fb515bSPavan Nikhilesh 				__func__);
205985fb515bSPavan Nikhilesh 		return -1;
206085fb515bSPavan Nikhilesh 	}
206185fb515bSPavan Nikhilesh 	if (stats.port_inflight[3] != 3) {
206285fb515bSPavan Nikhilesh 		printf("%d:%s: port 3 inflight not correct\n", __LINE__,
206385fb515bSPavan Nikhilesh 				__func__);
206485fb515bSPavan Nikhilesh 		return -1;
206585fb515bSPavan Nikhilesh 	}
206685fb515bSPavan Nikhilesh 
206785fb515bSPavan Nikhilesh 	cleanup(t);
206885fb515bSPavan Nikhilesh 	return 0;
206985fb515bSPavan Nikhilesh }
207085fb515bSPavan Nikhilesh 
207185fb515bSPavan Nikhilesh static int
load_balancing_history(struct test * t)207285fb515bSPavan Nikhilesh load_balancing_history(struct test *t)
207385fb515bSPavan Nikhilesh {
207485fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats = {0};
207585fb515bSPavan Nikhilesh 	const int rx_enq = 0;
207685fb515bSPavan Nikhilesh 	int err;
207785fb515bSPavan Nikhilesh 	uint32_t i;
207885fb515bSPavan Nikhilesh 
207985fb515bSPavan Nikhilesh 	/* Create instance with 1 atomic QID going to 3 ports + 1 prod port */
208085fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
208185fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
208285fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0)
208385fb515bSPavan Nikhilesh 		return -1;
208485fb515bSPavan Nikhilesh 
208585fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
208685fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[1], &t->qid[0], NULL, 1) != 1) {
208785fb515bSPavan Nikhilesh 		printf("%d: error mapping port 1 qid\n", __LINE__);
208885fb515bSPavan Nikhilesh 		return -1;
208985fb515bSPavan Nikhilesh 	}
209085fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[2], &t->qid[0], NULL, 1) != 1) {
209185fb515bSPavan Nikhilesh 		printf("%d: error mapping port 2 qid\n", __LINE__);
209285fb515bSPavan Nikhilesh 		return -1;
209385fb515bSPavan Nikhilesh 	}
209485fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[3], &t->qid[0], NULL, 1) != 1) {
209585fb515bSPavan Nikhilesh 		printf("%d: error mapping port 3 qid\n", __LINE__);
209685fb515bSPavan Nikhilesh 		return -1;
209785fb515bSPavan Nikhilesh 	}
209885fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
209985fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
210085fb515bSPavan Nikhilesh 		return -1;
210185fb515bSPavan Nikhilesh 	}
210285fb515bSPavan Nikhilesh 
210385fb515bSPavan Nikhilesh 	/*
210485fb515bSPavan Nikhilesh 	 * Create a set of flows that test the load-balancing operation of the
210585fb515bSPavan Nikhilesh 	 * implementation. Fill CQ 0, 1 and 2 with flows 0, 1 and 2, drop
210685fb515bSPavan Nikhilesh 	 * the packet from CQ 0, send in a new set of flows. Ensure that:
210785fb515bSPavan Nikhilesh 	 *  1. The new flow 3 gets into the empty CQ0
210885fb515bSPavan Nikhilesh 	 *  2. packets for existing flow gets added into CQ1
210985fb515bSPavan Nikhilesh 	 *  3. Next flow 0 pkt is now onto CQ2, since CQ0 and CQ1 now contain
211085fb515bSPavan Nikhilesh 	 *     more outstanding pkts
211185fb515bSPavan Nikhilesh 	 *
211285fb515bSPavan Nikhilesh 	 *  This test makes sure that when a flow ends (i.e. all packets
211385fb515bSPavan Nikhilesh 	 *  have been completed for that flow), that the flow can be moved
211485fb515bSPavan Nikhilesh 	 *  to a different CQ when new packets come in for that flow.
211585fb515bSPavan Nikhilesh 	 */
211685fb515bSPavan Nikhilesh 	static uint32_t flows1[] = {0, 1, 1, 2};
211785fb515bSPavan Nikhilesh 
211885fb515bSPavan Nikhilesh 	for (i = 0; i < RTE_DIM(flows1); i++) {
211985fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
212085fb515bSPavan Nikhilesh 		struct rte_event ev = {
212185fb515bSPavan Nikhilesh 				.flow_id = flows1[i],
212285fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
212385fb515bSPavan Nikhilesh 				.queue_id = t->qid[0],
212485fb515bSPavan Nikhilesh 				.event_type = RTE_EVENT_TYPE_CPU,
212585fb515bSPavan Nikhilesh 				.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
212685fb515bSPavan Nikhilesh 				.mbuf = arp
212785fb515bSPavan Nikhilesh 		};
212885fb515bSPavan Nikhilesh 
212985fb515bSPavan Nikhilesh 		if (!arp) {
213085fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
213185fb515bSPavan Nikhilesh 			return -1;
213285fb515bSPavan Nikhilesh 		}
213385fb515bSPavan Nikhilesh 		arp->hash.rss = flows1[i];
213485fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
21351b03e292SHarry van Haaren 		if (err != 1) {
213685fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
213785fb515bSPavan Nikhilesh 			return -1;
213885fb515bSPavan Nikhilesh 		}
213985fb515bSPavan Nikhilesh 	}
214085fb515bSPavan Nikhilesh 
214185fb515bSPavan Nikhilesh 	/* call the scheduler */
214285fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
214385fb515bSPavan Nikhilesh 
214485fb515bSPavan Nikhilesh 	/* Dequeue the flow 0 packet from port 1, so that we can then drop */
214585fb515bSPavan Nikhilesh 	struct rte_event ev;
214685fb515bSPavan Nikhilesh 	if (!rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0)) {
214785fb515bSPavan Nikhilesh 		printf("%d: failed to dequeue\n", __LINE__);
214885fb515bSPavan Nikhilesh 		return -1;
214985fb515bSPavan Nikhilesh 	}
215085fb515bSPavan Nikhilesh 	if (ev.mbuf->hash.rss != flows1[0]) {
215185fb515bSPavan Nikhilesh 		printf("%d: unexpected flow received\n", __LINE__);
215285fb515bSPavan Nikhilesh 		return -1;
215385fb515bSPavan Nikhilesh 	}
215485fb515bSPavan Nikhilesh 
215585fb515bSPavan Nikhilesh 	/* drop the flow 0 packet from port 1 */
215685fb515bSPavan Nikhilesh 	rte_event_enqueue_burst(evdev, t->port[1], &release_ev, 1);
215785fb515bSPavan Nikhilesh 
215885fb515bSPavan Nikhilesh 	/* call the scheduler */
215985fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
216085fb515bSPavan Nikhilesh 
216185fb515bSPavan Nikhilesh 	/*
216285fb515bSPavan Nikhilesh 	 * Set up the next set of flows, first a new flow to fill up
216385fb515bSPavan Nikhilesh 	 * CQ 0, so that the next flow 0 packet should go to CQ2
216485fb515bSPavan Nikhilesh 	 */
216585fb515bSPavan Nikhilesh 	static uint32_t flows2[] = { 3, 3, 3, 1, 1, 0 };
216685fb515bSPavan Nikhilesh 
216785fb515bSPavan Nikhilesh 	for (i = 0; i < RTE_DIM(flows2); i++) {
216885fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
216985fb515bSPavan Nikhilesh 		struct rte_event ev = {
217085fb515bSPavan Nikhilesh 				.flow_id = flows2[i],
217185fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
217285fb515bSPavan Nikhilesh 				.queue_id = t->qid[0],
217385fb515bSPavan Nikhilesh 				.event_type = RTE_EVENT_TYPE_CPU,
217485fb515bSPavan Nikhilesh 				.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
217585fb515bSPavan Nikhilesh 				.mbuf = arp
217685fb515bSPavan Nikhilesh 		};
217785fb515bSPavan Nikhilesh 
217885fb515bSPavan Nikhilesh 		if (!arp) {
217985fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
218085fb515bSPavan Nikhilesh 			return -1;
218185fb515bSPavan Nikhilesh 		}
218285fb515bSPavan Nikhilesh 		arp->hash.rss = flows2[i];
218385fb515bSPavan Nikhilesh 
218485fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
21851b03e292SHarry van Haaren 		if (err != 1) {
218685fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
218785fb515bSPavan Nikhilesh 			return -1;
218885fb515bSPavan Nikhilesh 		}
218985fb515bSPavan Nikhilesh 	}
219085fb515bSPavan Nikhilesh 
219185fb515bSPavan Nikhilesh 	/* schedule */
219285fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
219385fb515bSPavan Nikhilesh 
219485fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
219585fb515bSPavan Nikhilesh 	if (err) {
219685fb515bSPavan Nikhilesh 		printf("%d:failed to get stats\n", __LINE__);
219785fb515bSPavan Nikhilesh 		return -1;
219885fb515bSPavan Nikhilesh 	}
219985fb515bSPavan Nikhilesh 
220085fb515bSPavan Nikhilesh 	/*
220185fb515bSPavan Nikhilesh 	 * Now check the resulting inflights on each port.
220285fb515bSPavan Nikhilesh 	 */
220385fb515bSPavan Nikhilesh 	if (stats.port_inflight[1] != 3) {
220485fb515bSPavan Nikhilesh 		printf("%d:%s: port 1 inflight not correct\n", __LINE__,
220585fb515bSPavan Nikhilesh 				__func__);
220685fb515bSPavan Nikhilesh 		printf("Inflights, ports 1, 2, 3: %u, %u, %u\n",
220785fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[1],
220885fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[2],
220985fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[3]);
221085fb515bSPavan Nikhilesh 		return -1;
221185fb515bSPavan Nikhilesh 	}
221285fb515bSPavan Nikhilesh 	if (stats.port_inflight[2] != 4) {
221385fb515bSPavan Nikhilesh 		printf("%d:%s: port 2 inflight not correct\n", __LINE__,
221485fb515bSPavan Nikhilesh 				__func__);
221585fb515bSPavan Nikhilesh 		printf("Inflights, ports 1, 2, 3: %u, %u, %u\n",
221685fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[1],
221785fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[2],
221885fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[3]);
221985fb515bSPavan Nikhilesh 		return -1;
222085fb515bSPavan Nikhilesh 	}
222185fb515bSPavan Nikhilesh 	if (stats.port_inflight[3] != 2) {
222285fb515bSPavan Nikhilesh 		printf("%d:%s: port 3 inflight not correct\n", __LINE__,
222385fb515bSPavan Nikhilesh 				__func__);
222485fb515bSPavan Nikhilesh 		printf("Inflights, ports 1, 2, 3: %u, %u, %u\n",
222585fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[1],
222685fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[2],
222785fb515bSPavan Nikhilesh 				(unsigned int)stats.port_inflight[3]);
222885fb515bSPavan Nikhilesh 		return -1;
222985fb515bSPavan Nikhilesh 	}
223085fb515bSPavan Nikhilesh 
223185fb515bSPavan Nikhilesh 	for (i = 1; i <= 3; i++) {
223285fb515bSPavan Nikhilesh 		struct rte_event ev;
223385fb515bSPavan Nikhilesh 		while (rte_event_dequeue_burst(evdev, i, &ev, 1, 0))
223485fb515bSPavan Nikhilesh 			rte_event_enqueue_burst(evdev, i, &release_ev, 1);
223585fb515bSPavan Nikhilesh 	}
223685fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
223785fb515bSPavan Nikhilesh 
223885fb515bSPavan Nikhilesh 	cleanup(t);
223985fb515bSPavan Nikhilesh 	return 0;
224085fb515bSPavan Nikhilesh }
224185fb515bSPavan Nikhilesh 
224285fb515bSPavan Nikhilesh static int
invalid_qid(struct test * t)224385fb515bSPavan Nikhilesh invalid_qid(struct test *t)
224485fb515bSPavan Nikhilesh {
224585fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
224685fb515bSPavan Nikhilesh 	const int rx_enq = 0;
224785fb515bSPavan Nikhilesh 	int err;
224885fb515bSPavan Nikhilesh 	uint32_t i;
224985fb515bSPavan Nikhilesh 
225085fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
225185fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
225285fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
225385fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
225485fb515bSPavan Nikhilesh 		return -1;
225585fb515bSPavan Nikhilesh 	}
225685fb515bSPavan Nikhilesh 
225785fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
225885fb515bSPavan Nikhilesh 	for (i = 0; i < 4; i++) {
225985fb515bSPavan Nikhilesh 		err = rte_event_port_link(evdev, t->port[i], &t->qid[0],
226085fb515bSPavan Nikhilesh 				NULL, 1);
226185fb515bSPavan Nikhilesh 		if (err != 1) {
226285fb515bSPavan Nikhilesh 			printf("%d: error mapping port 1 qid\n", __LINE__);
226385fb515bSPavan Nikhilesh 			return -1;
226485fb515bSPavan Nikhilesh 		}
226585fb515bSPavan Nikhilesh 	}
226685fb515bSPavan Nikhilesh 
226785fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
226885fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
226985fb515bSPavan Nikhilesh 		return -1;
227085fb515bSPavan Nikhilesh 	}
227185fb515bSPavan Nikhilesh 
227285fb515bSPavan Nikhilesh 	/*
227385fb515bSPavan Nikhilesh 	 * Send in a packet with an invalid qid to the scheduler.
227485fb515bSPavan Nikhilesh 	 * We should see the packed enqueued OK, but the inflights for
227585fb515bSPavan Nikhilesh 	 * that packet should not be incremented, and the rx_dropped
227685fb515bSPavan Nikhilesh 	 * should be incremented.
227785fb515bSPavan Nikhilesh 	 */
227885fb515bSPavan Nikhilesh 	static uint32_t flows1[] = {20};
227985fb515bSPavan Nikhilesh 
228085fb515bSPavan Nikhilesh 	for (i = 0; i < RTE_DIM(flows1); i++) {
228185fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
228285fb515bSPavan Nikhilesh 		if (!arp) {
228385fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
228485fb515bSPavan Nikhilesh 			return -1;
228585fb515bSPavan Nikhilesh 		}
228685fb515bSPavan Nikhilesh 
228785fb515bSPavan Nikhilesh 		struct rte_event ev = {
228885fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
228985fb515bSPavan Nikhilesh 				.queue_id = t->qid[0] + flows1[i],
229085fb515bSPavan Nikhilesh 				.flow_id = i,
229185fb515bSPavan Nikhilesh 				.mbuf = arp,
229285fb515bSPavan Nikhilesh 		};
229385fb515bSPavan Nikhilesh 		/* generate pkt and enqueue */
229485fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
22951b03e292SHarry van Haaren 		if (err != 1) {
229685fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
229785fb515bSPavan Nikhilesh 			return -1;
229885fb515bSPavan Nikhilesh 		}
229985fb515bSPavan Nikhilesh 	}
230085fb515bSPavan Nikhilesh 
230185fb515bSPavan Nikhilesh 	/* call the scheduler */
230285fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
230385fb515bSPavan Nikhilesh 
230485fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
230585fb515bSPavan Nikhilesh 	if (err) {
230685fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
230785fb515bSPavan Nikhilesh 		return -1;
230885fb515bSPavan Nikhilesh 	}
230985fb515bSPavan Nikhilesh 
231085fb515bSPavan Nikhilesh 	/*
231185fb515bSPavan Nikhilesh 	 * Now check the resulting inflights on the port, and the rx_dropped.
231285fb515bSPavan Nikhilesh 	 */
231385fb515bSPavan Nikhilesh 	if (stats.port_inflight[0] != 0) {
231485fb515bSPavan Nikhilesh 		printf("%d:%s: port 1 inflight count not correct\n", __LINE__,
231585fb515bSPavan Nikhilesh 				__func__);
231685fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
231785fb515bSPavan Nikhilesh 		return -1;
231885fb515bSPavan Nikhilesh 	}
231985fb515bSPavan Nikhilesh 	if (stats.port_rx_dropped[0] != 1) {
232085fb515bSPavan Nikhilesh 		printf("%d:%s: port 1 drops\n", __LINE__, __func__);
232185fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
232285fb515bSPavan Nikhilesh 		return -1;
232385fb515bSPavan Nikhilesh 	}
232485fb515bSPavan Nikhilesh 	/* each packet drop should only be counted in one place - port or dev */
232585fb515bSPavan Nikhilesh 	if (stats.rx_dropped != 0) {
232685fb515bSPavan Nikhilesh 		printf("%d:%s: port 1 dropped count not correct\n", __LINE__,
232785fb515bSPavan Nikhilesh 				__func__);
232885fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
232985fb515bSPavan Nikhilesh 		return -1;
233085fb515bSPavan Nikhilesh 	}
233185fb515bSPavan Nikhilesh 
233285fb515bSPavan Nikhilesh 	cleanup(t);
233385fb515bSPavan Nikhilesh 	return 0;
233485fb515bSPavan Nikhilesh }
233585fb515bSPavan Nikhilesh 
233685fb515bSPavan Nikhilesh static int
single_packet(struct test * t)233785fb515bSPavan Nikhilesh single_packet(struct test *t)
233885fb515bSPavan Nikhilesh {
233985fb515bSPavan Nikhilesh 	const uint32_t MAGIC_SEQN = 7321;
234085fb515bSPavan Nikhilesh 	struct rte_event ev;
234185fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
234285fb515bSPavan Nikhilesh 	const int rx_enq = 0;
234385fb515bSPavan Nikhilesh 	const int wrk_enq = 2;
234485fb515bSPavan Nikhilesh 	int err;
234585fb515bSPavan Nikhilesh 
234685fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
234785fb515bSPavan Nikhilesh 	if (init(t, 1, 4) < 0 ||
234885fb515bSPavan Nikhilesh 			create_ports(t, 4) < 0 ||
234985fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
235085fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
235185fb515bSPavan Nikhilesh 		return -1;
235285fb515bSPavan Nikhilesh 	}
235385fb515bSPavan Nikhilesh 
235485fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
235585fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0);
235685fb515bSPavan Nikhilesh 	if (err != 1) {
235785fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
235885fb515bSPavan Nikhilesh 		cleanup(t);
235985fb515bSPavan Nikhilesh 		return -1;
236085fb515bSPavan Nikhilesh 	}
236185fb515bSPavan Nikhilesh 
236285fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
236385fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
236485fb515bSPavan Nikhilesh 		return -1;
236585fb515bSPavan Nikhilesh 	}
236685fb515bSPavan Nikhilesh 
236785fb515bSPavan Nikhilesh 	/************** Gen pkt and enqueue ****************/
236885fb515bSPavan Nikhilesh 	struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
236985fb515bSPavan Nikhilesh 	if (!arp) {
237085fb515bSPavan Nikhilesh 		printf("%d: gen of pkt failed\n", __LINE__);
237185fb515bSPavan Nikhilesh 		return -1;
237285fb515bSPavan Nikhilesh 	}
237385fb515bSPavan Nikhilesh 
237485fb515bSPavan Nikhilesh 	ev.op = RTE_EVENT_OP_NEW;
237585fb515bSPavan Nikhilesh 	ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
237685fb515bSPavan Nikhilesh 	ev.mbuf = arp;
237785fb515bSPavan Nikhilesh 	ev.queue_id = 0;
237885fb515bSPavan Nikhilesh 	ev.flow_id = 3;
2379ca4355e4SDavid Marchand 	*rte_event_pmd_selftest_seqn(arp) = MAGIC_SEQN;
238085fb515bSPavan Nikhilesh 
238185fb515bSPavan Nikhilesh 	err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
23821b03e292SHarry van Haaren 	if (err != 1) {
238385fb515bSPavan Nikhilesh 		printf("%d: Failed to enqueue\n", __LINE__);
238485fb515bSPavan Nikhilesh 		return -1;
238585fb515bSPavan Nikhilesh 	}
238685fb515bSPavan Nikhilesh 
238785fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
238885fb515bSPavan Nikhilesh 
238985fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
239085fb515bSPavan Nikhilesh 	if (err) {
239185fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
239285fb515bSPavan Nikhilesh 		return -1;
239385fb515bSPavan Nikhilesh 	}
239485fb515bSPavan Nikhilesh 
239585fb515bSPavan Nikhilesh 	if (stats.rx_pkts != 1 ||
239685fb515bSPavan Nikhilesh 			stats.tx_pkts != 1 ||
239785fb515bSPavan Nikhilesh 			stats.port_inflight[wrk_enq] != 1) {
239885fb515bSPavan Nikhilesh 		printf("%d: Sched core didn't handle pkt as expected\n",
239985fb515bSPavan Nikhilesh 				__LINE__);
240085fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
240185fb515bSPavan Nikhilesh 		return -1;
240285fb515bSPavan Nikhilesh 	}
240385fb515bSPavan Nikhilesh 
240485fb515bSPavan Nikhilesh 	uint32_t deq_pkts;
240585fb515bSPavan Nikhilesh 
240685fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, t->port[wrk_enq], &ev, 1, 0);
240785fb515bSPavan Nikhilesh 	if (deq_pkts < 1) {
240885fb515bSPavan Nikhilesh 		printf("%d: Failed to deq\n", __LINE__);
240985fb515bSPavan Nikhilesh 		return -1;
241085fb515bSPavan Nikhilesh 	}
241185fb515bSPavan Nikhilesh 
241285fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
241385fb515bSPavan Nikhilesh 	if (err) {
241485fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
241585fb515bSPavan Nikhilesh 		return -1;
241685fb515bSPavan Nikhilesh 	}
241785fb515bSPavan Nikhilesh 
241885fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
2419ca4355e4SDavid Marchand 	if (*rte_event_pmd_selftest_seqn(ev.mbuf) != MAGIC_SEQN) {
242085fb515bSPavan Nikhilesh 		printf("%d: magic sequence number not dequeued\n", __LINE__);
242185fb515bSPavan Nikhilesh 		return -1;
242285fb515bSPavan Nikhilesh 	}
242385fb515bSPavan Nikhilesh 
242485fb515bSPavan Nikhilesh 	rte_pktmbuf_free(ev.mbuf);
242585fb515bSPavan Nikhilesh 	err = rte_event_enqueue_burst(evdev, t->port[wrk_enq], &release_ev, 1);
24261b03e292SHarry van Haaren 	if (err != 1) {
242785fb515bSPavan Nikhilesh 		printf("%d: Failed to enqueue\n", __LINE__);
242885fb515bSPavan Nikhilesh 		return -1;
242985fb515bSPavan Nikhilesh 	}
243085fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
243185fb515bSPavan Nikhilesh 
243285fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
243385fb515bSPavan Nikhilesh 	if (stats.port_inflight[wrk_enq] != 0) {
243485fb515bSPavan Nikhilesh 		printf("%d: port inflight not correct\n", __LINE__);
243585fb515bSPavan Nikhilesh 		return -1;
243685fb515bSPavan Nikhilesh 	}
243785fb515bSPavan Nikhilesh 
243885fb515bSPavan Nikhilesh 	cleanup(t);
243985fb515bSPavan Nikhilesh 	return 0;
244085fb515bSPavan Nikhilesh }
244185fb515bSPavan Nikhilesh 
244285fb515bSPavan Nikhilesh static int
inflight_counts(struct test * t)244385fb515bSPavan Nikhilesh inflight_counts(struct test *t)
244485fb515bSPavan Nikhilesh {
244585fb515bSPavan Nikhilesh 	struct rte_event ev;
244685fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
244785fb515bSPavan Nikhilesh 	const int rx_enq = 0;
244885fb515bSPavan Nikhilesh 	const int p1 = 1;
244985fb515bSPavan Nikhilesh 	const int p2 = 2;
245085fb515bSPavan Nikhilesh 	int err;
245185fb515bSPavan Nikhilesh 	int i;
245285fb515bSPavan Nikhilesh 
245385fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
245485fb515bSPavan Nikhilesh 	if (init(t, 2, 3) < 0 ||
245585fb515bSPavan Nikhilesh 			create_ports(t, 3) < 0 ||
245685fb515bSPavan Nikhilesh 			create_atomic_qids(t, 2) < 0) {
245785fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
245885fb515bSPavan Nikhilesh 		return -1;
245985fb515bSPavan Nikhilesh 	}
246085fb515bSPavan Nikhilesh 
246185fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
246285fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[p1], &t->qid[0], NULL, 1);
246385fb515bSPavan Nikhilesh 	if (err != 1) {
246485fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
246585fb515bSPavan Nikhilesh 		cleanup(t);
246685fb515bSPavan Nikhilesh 		return -1;
246785fb515bSPavan Nikhilesh 	}
246885fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[p2], &t->qid[1], NULL, 1);
246985fb515bSPavan Nikhilesh 	if (err != 1) {
247085fb515bSPavan Nikhilesh 		printf("%d: error mapping lb qid\n", __LINE__);
247185fb515bSPavan Nikhilesh 		cleanup(t);
247285fb515bSPavan Nikhilesh 		return -1;
247385fb515bSPavan Nikhilesh 	}
247485fb515bSPavan Nikhilesh 
247585fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
247685fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
247785fb515bSPavan Nikhilesh 		return -1;
247885fb515bSPavan Nikhilesh 	}
247985fb515bSPavan Nikhilesh 
248085fb515bSPavan Nikhilesh 	/************** FORWARD ****************/
248185fb515bSPavan Nikhilesh #define QID1_NUM 5
248285fb515bSPavan Nikhilesh 	for (i = 0; i < QID1_NUM; i++) {
248385fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
248485fb515bSPavan Nikhilesh 
248585fb515bSPavan Nikhilesh 		if (!arp) {
248685fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
248785fb515bSPavan Nikhilesh 			goto err;
248885fb515bSPavan Nikhilesh 		}
248985fb515bSPavan Nikhilesh 
249085fb515bSPavan Nikhilesh 		ev.queue_id =  t->qid[0];
249185fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
249285fb515bSPavan Nikhilesh 		ev.mbuf = arp;
249385fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
249485fb515bSPavan Nikhilesh 		if (err != 1) {
249585fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
249685fb515bSPavan Nikhilesh 			goto err;
249785fb515bSPavan Nikhilesh 		}
249885fb515bSPavan Nikhilesh 	}
249985fb515bSPavan Nikhilesh #define QID2_NUM 3
250085fb515bSPavan Nikhilesh 	for (i = 0; i < QID2_NUM; i++) {
250185fb515bSPavan Nikhilesh 		struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool);
250285fb515bSPavan Nikhilesh 
250385fb515bSPavan Nikhilesh 		if (!arp) {
250485fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
250585fb515bSPavan Nikhilesh 			goto err;
250685fb515bSPavan Nikhilesh 		}
250785fb515bSPavan Nikhilesh 		ev.queue_id =  t->qid[1];
250885fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
250985fb515bSPavan Nikhilesh 		ev.mbuf = arp;
251085fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
251185fb515bSPavan Nikhilesh 		if (err != 1) {
251285fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
251385fb515bSPavan Nikhilesh 			goto err;
251485fb515bSPavan Nikhilesh 		}
251585fb515bSPavan Nikhilesh 	}
251685fb515bSPavan Nikhilesh 
251785fb515bSPavan Nikhilesh 	/* schedule */
251885fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
251985fb515bSPavan Nikhilesh 
252085fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
252185fb515bSPavan Nikhilesh 	if (err) {
252285fb515bSPavan Nikhilesh 		printf("%d: failed to get stats\n", __LINE__);
252385fb515bSPavan Nikhilesh 		goto err;
252485fb515bSPavan Nikhilesh 	}
252585fb515bSPavan Nikhilesh 
252685fb515bSPavan Nikhilesh 	if (stats.rx_pkts != QID1_NUM + QID2_NUM ||
252785fb515bSPavan Nikhilesh 			stats.tx_pkts != QID1_NUM + QID2_NUM) {
252885fb515bSPavan Nikhilesh 		printf("%d: Sched core didn't handle pkt as expected\n",
252985fb515bSPavan Nikhilesh 				__LINE__);
253085fb515bSPavan Nikhilesh 		goto err;
253185fb515bSPavan Nikhilesh 	}
253285fb515bSPavan Nikhilesh 
253385fb515bSPavan Nikhilesh 	if (stats.port_inflight[p1] != QID1_NUM) {
253485fb515bSPavan Nikhilesh 		printf("%d: %s port 1 inflight not correct\n", __LINE__,
253585fb515bSPavan Nikhilesh 				__func__);
253685fb515bSPavan Nikhilesh 		goto err;
253785fb515bSPavan Nikhilesh 	}
253885fb515bSPavan Nikhilesh 	if (stats.port_inflight[p2] != QID2_NUM) {
253985fb515bSPavan Nikhilesh 		printf("%d: %s port 2 inflight not correct\n", __LINE__,
254085fb515bSPavan Nikhilesh 				__func__);
254185fb515bSPavan Nikhilesh 		goto err;
254285fb515bSPavan Nikhilesh 	}
254385fb515bSPavan Nikhilesh 
254485fb515bSPavan Nikhilesh 	/************** DEQUEUE INFLIGHT COUNT CHECKS  ****************/
254585fb515bSPavan Nikhilesh 	/* port 1 */
254685fb515bSPavan Nikhilesh 	struct rte_event events[QID1_NUM + QID2_NUM];
254785fb515bSPavan Nikhilesh 	uint32_t deq_pkts = rte_event_dequeue_burst(evdev, t->port[p1], events,
254885fb515bSPavan Nikhilesh 			RTE_DIM(events), 0);
254985fb515bSPavan Nikhilesh 
255085fb515bSPavan Nikhilesh 	if (deq_pkts != QID1_NUM) {
255185fb515bSPavan Nikhilesh 		printf("%d: Port 1: DEQUEUE inflight failed\n", __LINE__);
255285fb515bSPavan Nikhilesh 		goto err;
255385fb515bSPavan Nikhilesh 	}
255485fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
255585fb515bSPavan Nikhilesh 	if (stats.port_inflight[p1] != QID1_NUM) {
255685fb515bSPavan Nikhilesh 		printf("%d: port 1 inflight decrement after DEQ != 0\n",
255785fb515bSPavan Nikhilesh 				__LINE__);
255885fb515bSPavan Nikhilesh 		goto err;
255985fb515bSPavan Nikhilesh 	}
256085fb515bSPavan Nikhilesh 	for (i = 0; i < QID1_NUM; i++) {
256185fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[p1], &release_ev,
256285fb515bSPavan Nikhilesh 				1);
256385fb515bSPavan Nikhilesh 		if (err != 1) {
256485fb515bSPavan Nikhilesh 			printf("%d: %s rte enqueue of inf release failed\n",
256585fb515bSPavan Nikhilesh 				__LINE__, __func__);
256685fb515bSPavan Nikhilesh 			goto err;
256785fb515bSPavan Nikhilesh 		}
256885fb515bSPavan Nikhilesh 	}
256985fb515bSPavan Nikhilesh 
257085fb515bSPavan Nikhilesh 	/*
257185fb515bSPavan Nikhilesh 	 * As the scheduler core decrements inflights, it needs to run to
257285fb515bSPavan Nikhilesh 	 * process packets to act on the drop messages
257385fb515bSPavan Nikhilesh 	 */
257485fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
257585fb515bSPavan Nikhilesh 
257685fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
257785fb515bSPavan Nikhilesh 	if (stats.port_inflight[p1] != 0) {
257885fb515bSPavan Nikhilesh 		printf("%d: port 1 inflight NON NULL after DROP\n", __LINE__);
257985fb515bSPavan Nikhilesh 		goto err;
258085fb515bSPavan Nikhilesh 	}
258185fb515bSPavan Nikhilesh 
258285fb515bSPavan Nikhilesh 	/* port2 */
258385fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, t->port[p2], events,
258485fb515bSPavan Nikhilesh 			RTE_DIM(events), 0);
258585fb515bSPavan Nikhilesh 	if (deq_pkts != QID2_NUM) {
258685fb515bSPavan Nikhilesh 		printf("%d: Port 2: DEQUEUE inflight failed\n", __LINE__);
258785fb515bSPavan Nikhilesh 		goto err;
258885fb515bSPavan Nikhilesh 	}
258985fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
259085fb515bSPavan Nikhilesh 	if (stats.port_inflight[p2] != QID2_NUM) {
259185fb515bSPavan Nikhilesh 		printf("%d: port 1 inflight decrement after DEQ != 0\n",
259285fb515bSPavan Nikhilesh 				__LINE__);
259385fb515bSPavan Nikhilesh 		goto err;
259485fb515bSPavan Nikhilesh 	}
259585fb515bSPavan Nikhilesh 	for (i = 0; i < QID2_NUM; i++) {
259685fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[p2], &release_ev,
259785fb515bSPavan Nikhilesh 				1);
259885fb515bSPavan Nikhilesh 		if (err != 1) {
259985fb515bSPavan Nikhilesh 			printf("%d: %s rte enqueue of inf release failed\n",
260085fb515bSPavan Nikhilesh 				__LINE__, __func__);
260185fb515bSPavan Nikhilesh 			goto err;
260285fb515bSPavan Nikhilesh 		}
260385fb515bSPavan Nikhilesh 	}
260485fb515bSPavan Nikhilesh 
260585fb515bSPavan Nikhilesh 	/*
260685fb515bSPavan Nikhilesh 	 * As the scheduler core decrements inflights, it needs to run to
260785fb515bSPavan Nikhilesh 	 * process packets to act on the drop messages
260885fb515bSPavan Nikhilesh 	 */
260985fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
261085fb515bSPavan Nikhilesh 
261185fb515bSPavan Nikhilesh 	err = test_event_dev_stats_get(evdev, &stats);
261285fb515bSPavan Nikhilesh 	if (stats.port_inflight[p2] != 0) {
261385fb515bSPavan Nikhilesh 		printf("%d: port 2 inflight NON NULL after DROP\n", __LINE__);
261485fb515bSPavan Nikhilesh 		goto err;
261585fb515bSPavan Nikhilesh 	}
261685fb515bSPavan Nikhilesh 	cleanup(t);
261785fb515bSPavan Nikhilesh 	return 0;
261885fb515bSPavan Nikhilesh 
261985fb515bSPavan Nikhilesh err:
262085fb515bSPavan Nikhilesh 	rte_event_dev_dump(evdev, stdout);
262185fb515bSPavan Nikhilesh 	cleanup(t);
262285fb515bSPavan Nikhilesh 	return -1;
262385fb515bSPavan Nikhilesh }
262485fb515bSPavan Nikhilesh 
262585fb515bSPavan Nikhilesh static int
parallel_basic(struct test * t,int check_order)262685fb515bSPavan Nikhilesh parallel_basic(struct test *t, int check_order)
262785fb515bSPavan Nikhilesh {
262885fb515bSPavan Nikhilesh 	const uint8_t rx_port = 0;
262985fb515bSPavan Nikhilesh 	const uint8_t w1_port = 1;
263085fb515bSPavan Nikhilesh 	const uint8_t w3_port = 3;
263185fb515bSPavan Nikhilesh 	const uint8_t tx_port = 4;
263285fb515bSPavan Nikhilesh 	int err;
263385fb515bSPavan Nikhilesh 	int i;
263485fb515bSPavan Nikhilesh 	uint32_t deq_pkts, j;
263585fb515bSPavan Nikhilesh 	struct rte_mbuf *mbufs[3];
263685fb515bSPavan Nikhilesh 	struct rte_mbuf *mbufs_out[3] = { 0 };
263785fb515bSPavan Nikhilesh 	const uint32_t MAGIC_SEQN = 1234;
263885fb515bSPavan Nikhilesh 
263985fb515bSPavan Nikhilesh 	/* Create instance with 4 ports */
264085fb515bSPavan Nikhilesh 	if (init(t, 2, tx_port + 1) < 0 ||
264185fb515bSPavan Nikhilesh 			create_ports(t, tx_port + 1) < 0 ||
264285fb515bSPavan Nikhilesh 			(check_order ?  create_ordered_qids(t, 1) :
264385fb515bSPavan Nikhilesh 				create_unordered_qids(t, 1)) < 0 ||
264485fb515bSPavan Nikhilesh 			create_directed_qids(t, 1, &tx_port)) {
264585fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
264685fb515bSPavan Nikhilesh 		return -1;
264785fb515bSPavan Nikhilesh 	}
264885fb515bSPavan Nikhilesh 
264985fb515bSPavan Nikhilesh 	/*
265085fb515bSPavan Nikhilesh 	 * CQ mapping to QID
265185fb515bSPavan Nikhilesh 	 * We need three ports, all mapped to the same ordered qid0. Then we'll
265285fb515bSPavan Nikhilesh 	 * take a packet out to each port, re-enqueue in reverse order,
265385fb515bSPavan Nikhilesh 	 * then make sure the reordering has taken place properly when we
265485fb515bSPavan Nikhilesh 	 * dequeue from the tx_port.
265585fb515bSPavan Nikhilesh 	 *
265685fb515bSPavan Nikhilesh 	 * Simplified test setup diagram:
265785fb515bSPavan Nikhilesh 	 *
265885fb515bSPavan Nikhilesh 	 * rx_port        w1_port
265985fb515bSPavan Nikhilesh 	 *        \     /         \
266085fb515bSPavan Nikhilesh 	 *         qid0 - w2_port - qid1
266185fb515bSPavan Nikhilesh 	 *              \         /     \
266285fb515bSPavan Nikhilesh 	 *                w3_port        tx_port
266385fb515bSPavan Nikhilesh 	 */
266485fb515bSPavan Nikhilesh 	/* CQ mapping to QID for LB ports (directed mapped on create) */
266585fb515bSPavan Nikhilesh 	for (i = w1_port; i <= w3_port; i++) {
266685fb515bSPavan Nikhilesh 		err = rte_event_port_link(evdev, t->port[i], &t->qid[0], NULL,
266785fb515bSPavan Nikhilesh 				1);
266885fb515bSPavan Nikhilesh 		if (err != 1) {
266985fb515bSPavan Nikhilesh 			printf("%d: error mapping lb qid\n", __LINE__);
267085fb515bSPavan Nikhilesh 			cleanup(t);
267185fb515bSPavan Nikhilesh 			return -1;
267285fb515bSPavan Nikhilesh 		}
267385fb515bSPavan Nikhilesh 	}
267485fb515bSPavan Nikhilesh 
267585fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
267685fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
267785fb515bSPavan Nikhilesh 		return -1;
267885fb515bSPavan Nikhilesh 	}
267985fb515bSPavan Nikhilesh 
268085fb515bSPavan Nikhilesh 	/* Enqueue 3 packets to the rx port */
268185fb515bSPavan Nikhilesh 	for (i = 0; i < 3; i++) {
268285fb515bSPavan Nikhilesh 		struct rte_event ev;
268385fb515bSPavan Nikhilesh 		mbufs[i] = rte_gen_arp(0, t->mbuf_pool);
268485fb515bSPavan Nikhilesh 		if (!mbufs[i]) {
268585fb515bSPavan Nikhilesh 			printf("%d: gen of pkt failed\n", __LINE__);
268685fb515bSPavan Nikhilesh 			return -1;
268785fb515bSPavan Nikhilesh 		}
268885fb515bSPavan Nikhilesh 
268985fb515bSPavan Nikhilesh 		ev.queue_id = t->qid[0];
269085fb515bSPavan Nikhilesh 		ev.op = RTE_EVENT_OP_NEW;
269185fb515bSPavan Nikhilesh 		ev.mbuf = mbufs[i];
2692ca4355e4SDavid Marchand 		*rte_event_pmd_selftest_seqn(mbufs[i]) = MAGIC_SEQN + i;
269385fb515bSPavan Nikhilesh 
269485fb515bSPavan Nikhilesh 		/* generate pkt and enqueue */
269585fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[rx_port], &ev, 1);
269685fb515bSPavan Nikhilesh 		if (err != 1) {
269785fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue pkt %u, retval = %u\n",
269885fb515bSPavan Nikhilesh 					__LINE__, i, err);
269985fb515bSPavan Nikhilesh 			return -1;
270085fb515bSPavan Nikhilesh 		}
270185fb515bSPavan Nikhilesh 	}
270285fb515bSPavan Nikhilesh 
270385fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
270485fb515bSPavan Nikhilesh 
270585fb515bSPavan Nikhilesh 	/* use extra slot to make logic in loops easier */
270685fb515bSPavan Nikhilesh 	struct rte_event deq_ev[w3_port + 1];
270785fb515bSPavan Nikhilesh 
270885fb515bSPavan Nikhilesh 	/* Dequeue the 3 packets, one from each worker port */
270985fb515bSPavan Nikhilesh 	for (i = w1_port; i <= w3_port; i++) {
271085fb515bSPavan Nikhilesh 		deq_pkts = rte_event_dequeue_burst(evdev, t->port[i],
271185fb515bSPavan Nikhilesh 				&deq_ev[i], 1, 0);
271285fb515bSPavan Nikhilesh 		if (deq_pkts != 1) {
271385fb515bSPavan Nikhilesh 			printf("%d: Failed to deq\n", __LINE__);
271485fb515bSPavan Nikhilesh 			rte_event_dev_dump(evdev, stdout);
271585fb515bSPavan Nikhilesh 			return -1;
271685fb515bSPavan Nikhilesh 		}
271785fb515bSPavan Nikhilesh 	}
271885fb515bSPavan Nikhilesh 
271985fb515bSPavan Nikhilesh 	/* Enqueue each packet in reverse order, flushing after each one */
272085fb515bSPavan Nikhilesh 	for (i = w3_port; i >= w1_port; i--) {
272185fb515bSPavan Nikhilesh 
272285fb515bSPavan Nikhilesh 		deq_ev[i].op = RTE_EVENT_OP_FORWARD;
272385fb515bSPavan Nikhilesh 		deq_ev[i].queue_id = t->qid[1];
272485fb515bSPavan Nikhilesh 		err = rte_event_enqueue_burst(evdev, t->port[i], &deq_ev[i], 1);
272585fb515bSPavan Nikhilesh 		if (err != 1) {
272685fb515bSPavan Nikhilesh 			printf("%d: Failed to enqueue\n", __LINE__);
272785fb515bSPavan Nikhilesh 			return -1;
272885fb515bSPavan Nikhilesh 		}
272985fb515bSPavan Nikhilesh 	}
273085fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
273185fb515bSPavan Nikhilesh 
273285fb515bSPavan Nikhilesh 	/* dequeue from the tx ports, we should get 3 packets */
273385fb515bSPavan Nikhilesh 	deq_pkts = rte_event_dequeue_burst(evdev, t->port[tx_port], deq_ev,
273485fb515bSPavan Nikhilesh 			3, 0);
273585fb515bSPavan Nikhilesh 
273685fb515bSPavan Nikhilesh 	/* Check to see if we've got all 3 packets */
273785fb515bSPavan Nikhilesh 	if (deq_pkts != 3) {
273885fb515bSPavan Nikhilesh 		printf("%d: expected 3 pkts at tx port got %d from port %d\n",
273985fb515bSPavan Nikhilesh 			__LINE__, deq_pkts, tx_port);
274085fb515bSPavan Nikhilesh 		rte_event_dev_dump(evdev, stdout);
274185fb515bSPavan Nikhilesh 		return 1;
274285fb515bSPavan Nikhilesh 	}
274385fb515bSPavan Nikhilesh 
274485fb515bSPavan Nikhilesh 	/* Check to see if the sequence numbers are in expected order */
274585fb515bSPavan Nikhilesh 	if (check_order) {
274685fb515bSPavan Nikhilesh 		for (j = 0 ; j < deq_pkts ; j++) {
2747ca4355e4SDavid Marchand 			if (*rte_event_pmd_selftest_seqn(deq_ev[j].mbuf) !=
2748ca4355e4SDavid Marchand 					MAGIC_SEQN + j) {
2749ca4355e4SDavid Marchand 				printf("%d: Incorrect sequence number(%d) from port %d\n",
2750ca4355e4SDavid Marchand 					__LINE__,
2751ca4355e4SDavid Marchand 					*rte_event_pmd_selftest_seqn(mbufs_out[j]),
2752ca4355e4SDavid Marchand 					tx_port);
275385fb515bSPavan Nikhilesh 				return -1;
275485fb515bSPavan Nikhilesh 			}
275585fb515bSPavan Nikhilesh 		}
275685fb515bSPavan Nikhilesh 	}
275785fb515bSPavan Nikhilesh 
275885fb515bSPavan Nikhilesh 	/* Destroy the instance */
275985fb515bSPavan Nikhilesh 	cleanup(t);
276085fb515bSPavan Nikhilesh 	return 0;
276185fb515bSPavan Nikhilesh }
276285fb515bSPavan Nikhilesh 
276385fb515bSPavan Nikhilesh static int
ordered_basic(struct test * t)276485fb515bSPavan Nikhilesh ordered_basic(struct test *t)
276585fb515bSPavan Nikhilesh {
276685fb515bSPavan Nikhilesh 	return parallel_basic(t, 1);
276785fb515bSPavan Nikhilesh }
276885fb515bSPavan Nikhilesh 
276985fb515bSPavan Nikhilesh static int
unordered_basic(struct test * t)277085fb515bSPavan Nikhilesh unordered_basic(struct test *t)
277185fb515bSPavan Nikhilesh {
277285fb515bSPavan Nikhilesh 	return parallel_basic(t, 0);
277385fb515bSPavan Nikhilesh }
277485fb515bSPavan Nikhilesh 
277585fb515bSPavan Nikhilesh static int
holb(struct test * t)277685fb515bSPavan Nikhilesh holb(struct test *t) /* test to check we avoid basic head-of-line blocking */
277785fb515bSPavan Nikhilesh {
277885fb515bSPavan Nikhilesh 	const struct rte_event new_ev = {
277985fb515bSPavan Nikhilesh 			.op = RTE_EVENT_OP_NEW
278085fb515bSPavan Nikhilesh 			/* all other fields zero */
278185fb515bSPavan Nikhilesh 	};
278285fb515bSPavan Nikhilesh 	struct rte_event ev = new_ev;
278385fb515bSPavan Nikhilesh 	unsigned int rx_port = 0; /* port we get the first flow on */
278485fb515bSPavan Nikhilesh 	char rx_port_used_stat[64];
278585fb515bSPavan Nikhilesh 	char rx_port_free_stat[64];
278685fb515bSPavan Nikhilesh 	char other_port_used_stat[64];
278785fb515bSPavan Nikhilesh 
278885fb515bSPavan Nikhilesh 	if (init(t, 1, 2) < 0 ||
278985fb515bSPavan Nikhilesh 			create_ports(t, 2) < 0 ||
279085fb515bSPavan Nikhilesh 			create_atomic_qids(t, 1) < 0) {
279185fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
279285fb515bSPavan Nikhilesh 		return -1;
279385fb515bSPavan Nikhilesh 	}
279485fb515bSPavan Nikhilesh 	int nb_links = rte_event_port_link(evdev, t->port[1], NULL, NULL, 0);
279585fb515bSPavan Nikhilesh 	if (rte_event_port_link(evdev, t->port[0], NULL, NULL, 0) != 1 ||
279685fb515bSPavan Nikhilesh 			nb_links != 1) {
279785fb515bSPavan Nikhilesh 		printf("%d: Error links queue to ports\n", __LINE__);
279885fb515bSPavan Nikhilesh 		goto err;
279985fb515bSPavan Nikhilesh 	}
280085fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
280185fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
280285fb515bSPavan Nikhilesh 		goto err;
280385fb515bSPavan Nikhilesh 	}
280485fb515bSPavan Nikhilesh 
280585fb515bSPavan Nikhilesh 	/* send one packet and see where it goes, port 0 or 1 */
280685fb515bSPavan Nikhilesh 	if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) {
280785fb515bSPavan Nikhilesh 		printf("%d: Error doing first enqueue\n", __LINE__);
280885fb515bSPavan Nikhilesh 		goto err;
280985fb515bSPavan Nikhilesh 	}
281085fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
281185fb515bSPavan Nikhilesh 
281285fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, "port_0_cq_ring_used", NULL)
281385fb515bSPavan Nikhilesh 			!= 1)
281485fb515bSPavan Nikhilesh 		rx_port = 1;
281585fb515bSPavan Nikhilesh 
281685fb515bSPavan Nikhilesh 	snprintf(rx_port_used_stat, sizeof(rx_port_used_stat),
281785fb515bSPavan Nikhilesh 			"port_%u_cq_ring_used", rx_port);
281885fb515bSPavan Nikhilesh 	snprintf(rx_port_free_stat, sizeof(rx_port_free_stat),
281985fb515bSPavan Nikhilesh 			"port_%u_cq_ring_free", rx_port);
282085fb515bSPavan Nikhilesh 	snprintf(other_port_used_stat, sizeof(other_port_used_stat),
282185fb515bSPavan Nikhilesh 			"port_%u_cq_ring_used", rx_port ^ 1);
282285fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, rx_port_used_stat, NULL)
282385fb515bSPavan Nikhilesh 			!= 1) {
282485fb515bSPavan Nikhilesh 		printf("%d: Error, first event not scheduled\n", __LINE__);
282585fb515bSPavan Nikhilesh 		goto err;
282685fb515bSPavan Nikhilesh 	}
282785fb515bSPavan Nikhilesh 
282885fb515bSPavan Nikhilesh 	/* now fill up the rx port's queue with one flow to cause HOLB */
282985fb515bSPavan Nikhilesh 	do {
283085fb515bSPavan Nikhilesh 		ev = new_ev;
283185fb515bSPavan Nikhilesh 		if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) {
283285fb515bSPavan Nikhilesh 			printf("%d: Error with enqueue\n", __LINE__);
283385fb515bSPavan Nikhilesh 			goto err;
283485fb515bSPavan Nikhilesh 		}
283585fb515bSPavan Nikhilesh 		rte_service_run_iter_on_app_lcore(t->service_id, 1);
283685fb515bSPavan Nikhilesh 	} while (rte_event_dev_xstats_by_name_get(evdev,
283785fb515bSPavan Nikhilesh 				rx_port_free_stat, NULL) != 0);
283885fb515bSPavan Nikhilesh 
283985fb515bSPavan Nikhilesh 	/* one more packet, which needs to stay in IQ - i.e. HOLB */
284085fb515bSPavan Nikhilesh 	ev = new_ev;
284185fb515bSPavan Nikhilesh 	if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) {
284285fb515bSPavan Nikhilesh 		printf("%d: Error with enqueue\n", __LINE__);
284385fb515bSPavan Nikhilesh 		goto err;
284485fb515bSPavan Nikhilesh 	}
284585fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
284685fb515bSPavan Nikhilesh 
284785fb515bSPavan Nikhilesh 	/* check that the other port still has an empty CQ */
284885fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, other_port_used_stat, NULL)
284985fb515bSPavan Nikhilesh 			!= 0) {
285085fb515bSPavan Nikhilesh 		printf("%d: Error, second port CQ is not empty\n", __LINE__);
285185fb515bSPavan Nikhilesh 		goto err;
285285fb515bSPavan Nikhilesh 	}
285385fb515bSPavan Nikhilesh 	/* check IQ now has one packet */
285485fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, "qid_0_iq_0_used", NULL)
285585fb515bSPavan Nikhilesh 			!= 1) {
285685fb515bSPavan Nikhilesh 		printf("%d: Error, QID does not have exactly 1 packet\n",
285785fb515bSPavan Nikhilesh 			__LINE__);
285885fb515bSPavan Nikhilesh 		goto err;
285985fb515bSPavan Nikhilesh 	}
286085fb515bSPavan Nikhilesh 
286185fb515bSPavan Nikhilesh 	/* send another flow, which should pass the other IQ entry */
286285fb515bSPavan Nikhilesh 	ev = new_ev;
286385fb515bSPavan Nikhilesh 	ev.flow_id = 1;
286485fb515bSPavan Nikhilesh 	if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) {
286585fb515bSPavan Nikhilesh 		printf("%d: Error with enqueue\n", __LINE__);
286685fb515bSPavan Nikhilesh 		goto err;
286785fb515bSPavan Nikhilesh 	}
286885fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
286985fb515bSPavan Nikhilesh 
287085fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, other_port_used_stat, NULL)
287185fb515bSPavan Nikhilesh 			!= 1) {
287285fb515bSPavan Nikhilesh 		printf("%d: Error, second flow did not pass out first\n",
287385fb515bSPavan Nikhilesh 			__LINE__);
287485fb515bSPavan Nikhilesh 		goto err;
287585fb515bSPavan Nikhilesh 	}
287685fb515bSPavan Nikhilesh 
287785fb515bSPavan Nikhilesh 	if (rte_event_dev_xstats_by_name_get(evdev, "qid_0_iq_0_used", NULL)
287885fb515bSPavan Nikhilesh 			!= 1) {
287985fb515bSPavan Nikhilesh 		printf("%d: Error, QID does not have exactly 1 packet\n",
288085fb515bSPavan Nikhilesh 			__LINE__);
288185fb515bSPavan Nikhilesh 		goto err;
288285fb515bSPavan Nikhilesh 	}
288385fb515bSPavan Nikhilesh 	cleanup(t);
288485fb515bSPavan Nikhilesh 	return 0;
288585fb515bSPavan Nikhilesh err:
288685fb515bSPavan Nikhilesh 	rte_event_dev_dump(evdev, stdout);
288785fb515bSPavan Nikhilesh 	cleanup(t);
288885fb515bSPavan Nikhilesh 	return -1;
288985fb515bSPavan Nikhilesh }
289085fb515bSPavan Nikhilesh 
28918490488aSGage Eads static void
flush(uint8_t dev_id __rte_unused,struct rte_event event,void * arg)28928490488aSGage Eads flush(uint8_t dev_id __rte_unused, struct rte_event event, void *arg)
28938490488aSGage Eads {
28948490488aSGage Eads 	*((uint8_t *) arg) += (event.u64 == 0xCA11BACC) ? 1 : 0;
28958490488aSGage Eads }
28968490488aSGage Eads 
28978490488aSGage Eads static int
dev_stop_flush(struct test * t)28988490488aSGage Eads dev_stop_flush(struct test *t) /* test to check we can properly flush events */
28998490488aSGage Eads {
29008490488aSGage Eads 	const struct rte_event new_ev = {
29018490488aSGage Eads 		.op = RTE_EVENT_OP_NEW,
29028490488aSGage Eads 		.u64 = 0xCA11BACC,
29038490488aSGage Eads 		.queue_id = 0
29048490488aSGage Eads 	};
29058490488aSGage Eads 	struct rte_event ev = new_ev;
29068490488aSGage Eads 	uint8_t count = 0;
29078490488aSGage Eads 	int i;
29088490488aSGage Eads 
29098490488aSGage Eads 	if (init(t, 1, 1) < 0 ||
29108490488aSGage Eads 	    create_ports(t, 1) < 0 ||
29118490488aSGage Eads 	    create_atomic_qids(t, 1) < 0) {
29128490488aSGage Eads 		printf("%d: Error initializing device\n", __LINE__);
29138490488aSGage Eads 		return -1;
29148490488aSGage Eads 	}
29158490488aSGage Eads 
29168490488aSGage Eads 	/* Link the queue so *_start() doesn't error out */
29178490488aSGage Eads 	if (rte_event_port_link(evdev, t->port[0], NULL, NULL, 0) != 1) {
29188490488aSGage Eads 		printf("%d: Error linking queue to port\n", __LINE__);
29198490488aSGage Eads 		goto err;
29208490488aSGage Eads 	}
29218490488aSGage Eads 
29228490488aSGage Eads 	if (rte_event_dev_start(evdev) < 0) {
29238490488aSGage Eads 		printf("%d: Error with start call\n", __LINE__);
29248490488aSGage Eads 		goto err;
29258490488aSGage Eads 	}
29268490488aSGage Eads 
29278490488aSGage Eads 	for (i = 0; i < DEQUEUE_DEPTH + 1; i++) {
29288490488aSGage Eads 		if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) {
29298490488aSGage Eads 			printf("%d: Error enqueuing events\n", __LINE__);
29308490488aSGage Eads 			goto err;
29318490488aSGage Eads 		}
29328490488aSGage Eads 	}
29338490488aSGage Eads 
29348490488aSGage Eads 	/* Schedule the events from the port to the IQ. At least one event
29358490488aSGage Eads 	 * should be remaining in the queue.
29368490488aSGage Eads 	 */
29378490488aSGage Eads 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
29388490488aSGage Eads 
29398490488aSGage Eads 	if (rte_event_dev_stop_flush_callback_register(evdev, flush, &count)) {
29408490488aSGage Eads 		printf("%d: Error installing the flush callback\n", __LINE__);
29418490488aSGage Eads 		goto err;
29428490488aSGage Eads 	}
29438490488aSGage Eads 
29448490488aSGage Eads 	cleanup(t);
29458490488aSGage Eads 
29468490488aSGage Eads 	if (count == 0) {
29478490488aSGage Eads 		printf("%d: Error executing the flush callback\n", __LINE__);
29488490488aSGage Eads 		goto err;
29498490488aSGage Eads 	}
29508490488aSGage Eads 
29518490488aSGage Eads 	if (rte_event_dev_stop_flush_callback_register(evdev, NULL, NULL)) {
29528490488aSGage Eads 		printf("%d: Error uninstalling the flush callback\n", __LINE__);
29538490488aSGage Eads 		goto err;
29548490488aSGage Eads 	}
29558490488aSGage Eads 
29568490488aSGage Eads 	return 0;
29578490488aSGage Eads err:
29588490488aSGage Eads 	rte_event_dev_dump(evdev, stdout);
29598490488aSGage Eads 	cleanup(t);
29608490488aSGage Eads 	return -1;
29618490488aSGage Eads }
29628490488aSGage Eads 
296385fb515bSPavan Nikhilesh static int
ordered_atomic_hist_completion(struct test * t)2964a812a475SHarry van Haaren ordered_atomic_hist_completion(struct test *t)
2965a812a475SHarry van Haaren {
2966a812a475SHarry van Haaren 	const int rx_enq = 0;
2967a812a475SHarry van Haaren 	int err;
2968a812a475SHarry van Haaren 
2969a812a475SHarry van Haaren 	/* Create instance with 1 atomic QID going to 3 ports + 1 prod port */
2970a812a475SHarry van Haaren 	if (init(t, 2, 2) < 0 ||
2971a812a475SHarry van Haaren 			create_ports(t, 2) < 0 ||
2972a812a475SHarry van Haaren 			create_ordered_qids(t, 1) < 0 ||
2973a812a475SHarry van Haaren 			create_atomic_qids(t, 1) < 0)
2974a812a475SHarry van Haaren 		return -1;
2975a812a475SHarry van Haaren 
2976a812a475SHarry van Haaren 	/* Helpers to identify queues */
2977a812a475SHarry van Haaren 	const uint8_t qid_ordered = t->qid[0];
2978a812a475SHarry van Haaren 	const uint8_t qid_atomic = t->qid[1];
2979a812a475SHarry van Haaren 
2980a812a475SHarry van Haaren 	/* CQ mapping to QID */
2981a812a475SHarry van Haaren 	if (rte_event_port_link(evdev, t->port[1], &t->qid[0], NULL, 1) != 1) {
2982a812a475SHarry van Haaren 		printf("%d: error mapping port 1 qid\n", __LINE__);
2983a812a475SHarry van Haaren 		return -1;
2984a812a475SHarry van Haaren 	}
2985a812a475SHarry van Haaren 	if (rte_event_port_link(evdev, t->port[1], &t->qid[1], NULL, 1) != 1) {
2986a812a475SHarry van Haaren 		printf("%d: error mapping port 1 qid\n", __LINE__);
2987a812a475SHarry van Haaren 		return -1;
2988a812a475SHarry van Haaren 	}
2989a812a475SHarry van Haaren 	if (rte_event_dev_start(evdev) < 0) {
2990a812a475SHarry van Haaren 		printf("%d: Error with start call\n", __LINE__);
2991a812a475SHarry van Haaren 		return -1;
2992a812a475SHarry van Haaren 	}
2993a812a475SHarry van Haaren 
2994a812a475SHarry van Haaren 	/* Enqueue 1x ordered event, to be RELEASE-ed by the worker
2995a812a475SHarry van Haaren 	 * CPU, which may cause hist-list corruption (by not comleting)
2996a812a475SHarry van Haaren 	 */
2997a812a475SHarry van Haaren 	struct rte_event ord_ev = {
2998a812a475SHarry van Haaren 		.op = RTE_EVENT_OP_NEW,
2999a812a475SHarry van Haaren 		.queue_id = qid_ordered,
3000a812a475SHarry van Haaren 		.event_type = RTE_EVENT_TYPE_CPU,
3001a812a475SHarry van Haaren 		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
3002a812a475SHarry van Haaren 	};
3003a812a475SHarry van Haaren 	err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ord_ev, 1);
3004a812a475SHarry van Haaren 	if (err != 1) {
3005a812a475SHarry van Haaren 		printf("%d: Failed to enqueue\n", __LINE__);
3006a812a475SHarry van Haaren 		return -1;
3007a812a475SHarry van Haaren 	}
3008a812a475SHarry van Haaren 
3009a812a475SHarry van Haaren 	/* call the scheduler. This schedules the above event as a single
3010a812a475SHarry van Haaren 	 * event in an ORDERED queue, to the worker.
3011a812a475SHarry van Haaren 	 */
3012a812a475SHarry van Haaren 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
3013a812a475SHarry van Haaren 
3014a812a475SHarry van Haaren 	/* Dequeue ORDERED event 0 from port 1, so that we can then drop */
3015a812a475SHarry van Haaren 	struct rte_event ev;
3016a812a475SHarry van Haaren 	if (!rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0)) {
3017a812a475SHarry van Haaren 		printf("%d: failed to dequeue\n", __LINE__);
3018a812a475SHarry van Haaren 		return -1;
3019a812a475SHarry van Haaren 	}
3020a812a475SHarry van Haaren 
3021a812a475SHarry van Haaren 	/* drop the ORDERED event. Here the history list should be completed,
3022a812a475SHarry van Haaren 	 * but might not be if the hist-list bug exists. Call scheduler to make
3023a812a475SHarry van Haaren 	 * it act on the RELEASE that was enqueued.
3024a812a475SHarry van Haaren 	 */
3025a812a475SHarry van Haaren 	rte_event_enqueue_burst(evdev, t->port[1], &release_ev, 1);
3026a812a475SHarry van Haaren 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
3027a812a475SHarry van Haaren 
3028a812a475SHarry van Haaren 	/* Enqueue 1x atomic event, to then FORWARD to trigger atomic hist-list
3029a812a475SHarry van Haaren 	 * completion. If the bug exists, the ORDERED entry may be completed in
3030a812a475SHarry van Haaren 	 * error (aka, using the ORDERED-ROB for the ATOMIC event). This is the
3031a812a475SHarry van Haaren 	 * main focus of this unit test.
3032a812a475SHarry van Haaren 	 */
3033a812a475SHarry van Haaren 	{
3034a812a475SHarry van Haaren 		struct rte_event ev = {
3035a812a475SHarry van Haaren 			.op = RTE_EVENT_OP_NEW,
3036a812a475SHarry van Haaren 			.queue_id = qid_atomic,
3037a812a475SHarry van Haaren 			.event_type = RTE_EVENT_TYPE_CPU,
3038a812a475SHarry van Haaren 			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
3039a812a475SHarry van Haaren 			.flow_id = 123,
3040a812a475SHarry van Haaren 		};
3041a812a475SHarry van Haaren 
3042a812a475SHarry van Haaren 		err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1);
3043a812a475SHarry van Haaren 		if (err != 1) {
3044a812a475SHarry van Haaren 			printf("%d: Failed to enqueue\n", __LINE__);
3045a812a475SHarry van Haaren 			return -1;
3046a812a475SHarry van Haaren 		}
3047a812a475SHarry van Haaren 	}
3048a812a475SHarry van Haaren 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
3049a812a475SHarry van Haaren 
3050a812a475SHarry van Haaren 	/* Deq ATM event, then forward it for more than HIST_LIST_SIZE times,
3051a812a475SHarry van Haaren 	 * to re-use the history list entry that may be corrupted previously.
3052a812a475SHarry van Haaren 	 */
3053a812a475SHarry van Haaren 	for (int i = 0; i < SW_PORT_HIST_LIST + 2; i++) {
3054a812a475SHarry van Haaren 		if (!rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0)) {
3055a812a475SHarry van Haaren 			printf("%d: failed to dequeue, did corrupt ORD hist "
3056a812a475SHarry van Haaren 				"list steal this ATM event?\n", __LINE__);
3057a812a475SHarry van Haaren 			return -1;
3058a812a475SHarry van Haaren 		}
3059a812a475SHarry van Haaren 
3060a812a475SHarry van Haaren 		/* Re-enqueue the ATM event as FWD, trigger hist-list. */
3061a812a475SHarry van Haaren 		ev.op = RTE_EVENT_OP_FORWARD;
3062a812a475SHarry van Haaren 		err = rte_event_enqueue_burst(evdev, t->port[1], &ev, 1);
3063a812a475SHarry van Haaren 		if (err != 1) {
3064a812a475SHarry van Haaren 			printf("%d: Failed to enqueue\n", __LINE__);
3065a812a475SHarry van Haaren 			return -1;
3066a812a475SHarry van Haaren 		}
3067a812a475SHarry van Haaren 
3068a812a475SHarry van Haaren 		rte_service_run_iter_on_app_lcore(t->service_id, 1);
3069a812a475SHarry van Haaren 	}
3070a812a475SHarry van Haaren 
3071a812a475SHarry van Haaren 	/* If HIST-LIST + N count of dequeues succeed above, the hist list
3072a812a475SHarry van Haaren 	 * has not been corrupted. If it is corrupted, the ATM event is pushed
3073a812a475SHarry van Haaren 	 * into the ORDERED-ROB and will not dequeue.
3074a812a475SHarry van Haaren 	 */
3075a812a475SHarry van Haaren 
3076a812a475SHarry van Haaren 	/* release the ATM event that's been forwarded HIST_LIST times */
3077a812a475SHarry van Haaren 	err = rte_event_enqueue_burst(evdev, t->port[1], &release_ev, 1);
3078a812a475SHarry van Haaren 	if (err != 1) {
3079a812a475SHarry van Haaren 		printf("%d: Failed to enqueue\n", __LINE__);
3080a812a475SHarry van Haaren 		return -1;
3081a812a475SHarry van Haaren 	}
3082a812a475SHarry van Haaren 
3083a812a475SHarry van Haaren 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
3084a812a475SHarry van Haaren 
3085a812a475SHarry van Haaren 	cleanup(t);
3086a812a475SHarry van Haaren 	return 0;
3087a812a475SHarry van Haaren }
3088a812a475SHarry van Haaren 
3089a812a475SHarry van Haaren static int
worker_loopback_worker_fn(void * arg)309085fb515bSPavan Nikhilesh worker_loopback_worker_fn(void *arg)
309185fb515bSPavan Nikhilesh {
309285fb515bSPavan Nikhilesh 	struct test *t = arg;
309385fb515bSPavan Nikhilesh 	uint8_t port = t->port[1];
309485fb515bSPavan Nikhilesh 	int count = 0;
309585fb515bSPavan Nikhilesh 	int enqd;
309685fb515bSPavan Nikhilesh 
309785fb515bSPavan Nikhilesh 	/*
309885fb515bSPavan Nikhilesh 	 * Takes packets from the input port and then loops them back through
309985fb515bSPavan Nikhilesh 	 * the Eventdev. Each packet gets looped through QIDs 0-8, 16 times
310085fb515bSPavan Nikhilesh 	 * so each packet goes through 8*16 = 128 times.
310185fb515bSPavan Nikhilesh 	 */
310285fb515bSPavan Nikhilesh 	printf("%d: \tWorker function started\n", __LINE__);
310385fb515bSPavan Nikhilesh 	while (count < NUM_PACKETS) {
310485fb515bSPavan Nikhilesh #define BURST_SIZE 32
310585fb515bSPavan Nikhilesh 		struct rte_event ev[BURST_SIZE];
310685fb515bSPavan Nikhilesh 		uint16_t i, nb_rx = rte_event_dequeue_burst(evdev, port, ev,
310785fb515bSPavan Nikhilesh 				BURST_SIZE, 0);
310885fb515bSPavan Nikhilesh 		if (nb_rx == 0) {
310985fb515bSPavan Nikhilesh 			rte_pause();
311085fb515bSPavan Nikhilesh 			continue;
311185fb515bSPavan Nikhilesh 		}
311285fb515bSPavan Nikhilesh 
311385fb515bSPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
311485fb515bSPavan Nikhilesh 			ev[i].queue_id++;
311585fb515bSPavan Nikhilesh 			if (ev[i].queue_id != 8) {
311685fb515bSPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_FORWARD;
311785fb515bSPavan Nikhilesh 				enqd = rte_event_enqueue_burst(evdev, port,
311885fb515bSPavan Nikhilesh 						&ev[i], 1);
311985fb515bSPavan Nikhilesh 				if (enqd != 1) {
312085fb515bSPavan Nikhilesh 					printf("%d: Can't enqueue FWD!!\n",
312185fb515bSPavan Nikhilesh 							__LINE__);
312285fb515bSPavan Nikhilesh 					return -1;
312385fb515bSPavan Nikhilesh 				}
312485fb515bSPavan Nikhilesh 				continue;
312585fb515bSPavan Nikhilesh 			}
312685fb515bSPavan Nikhilesh 
312785fb515bSPavan Nikhilesh 			ev[i].queue_id = 0;
312870418e32SThomas Monjalon 			(*counter_field(ev[i].mbuf))++;
312970418e32SThomas Monjalon 			if (*counter_field(ev[i].mbuf) != 16) {
313085fb515bSPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_FORWARD;
313185fb515bSPavan Nikhilesh 				enqd = rte_event_enqueue_burst(evdev, port,
313285fb515bSPavan Nikhilesh 						&ev[i], 1);
313385fb515bSPavan Nikhilesh 				if (enqd != 1) {
313485fb515bSPavan Nikhilesh 					printf("%d: Can't enqueue FWD!!\n",
313585fb515bSPavan Nikhilesh 							__LINE__);
313685fb515bSPavan Nikhilesh 					return -1;
313785fb515bSPavan Nikhilesh 				}
313885fb515bSPavan Nikhilesh 				continue;
313985fb515bSPavan Nikhilesh 			}
314085fb515bSPavan Nikhilesh 			/* we have hit 16 iterations through system - drop */
314185fb515bSPavan Nikhilesh 			rte_pktmbuf_free(ev[i].mbuf);
314285fb515bSPavan Nikhilesh 			count++;
314385fb515bSPavan Nikhilesh 			ev[i].op = RTE_EVENT_OP_RELEASE;
314485fb515bSPavan Nikhilesh 			enqd = rte_event_enqueue_burst(evdev, port, &ev[i], 1);
314585fb515bSPavan Nikhilesh 			if (enqd != 1) {
314685fb515bSPavan Nikhilesh 				printf("%d drop enqueue failed\n", __LINE__);
314785fb515bSPavan Nikhilesh 				return -1;
314885fb515bSPavan Nikhilesh 			}
314985fb515bSPavan Nikhilesh 		}
315085fb515bSPavan Nikhilesh 	}
315185fb515bSPavan Nikhilesh 
315285fb515bSPavan Nikhilesh 	return 0;
315385fb515bSPavan Nikhilesh }
315485fb515bSPavan Nikhilesh 
315585fb515bSPavan Nikhilesh static int
worker_loopback_producer_fn(void * arg)315685fb515bSPavan Nikhilesh worker_loopback_producer_fn(void *arg)
315785fb515bSPavan Nikhilesh {
315885fb515bSPavan Nikhilesh 	struct test *t = arg;
315985fb515bSPavan Nikhilesh 	uint8_t port = t->port[0];
316085fb515bSPavan Nikhilesh 	uint64_t count = 0;
316185fb515bSPavan Nikhilesh 
316285fb515bSPavan Nikhilesh 	printf("%d: \tProducer function started\n", __LINE__);
316385fb515bSPavan Nikhilesh 	while (count < NUM_PACKETS) {
316485fb515bSPavan Nikhilesh 		struct rte_mbuf *m = 0;
316585fb515bSPavan Nikhilesh 		do {
316685fb515bSPavan Nikhilesh 			m = rte_pktmbuf_alloc(t->mbuf_pool);
316785fb515bSPavan Nikhilesh 		} while (m == NULL);
316885fb515bSPavan Nikhilesh 
316970418e32SThomas Monjalon 		*counter_field(m) = 0;
317085fb515bSPavan Nikhilesh 
317185fb515bSPavan Nikhilesh 		struct rte_event ev = {
317285fb515bSPavan Nikhilesh 				.op = RTE_EVENT_OP_NEW,
317385fb515bSPavan Nikhilesh 				.queue_id = t->qid[0],
317485fb515bSPavan Nikhilesh 				.flow_id = (uintptr_t)m & 0xFFFF,
317585fb515bSPavan Nikhilesh 				.mbuf = m,
317685fb515bSPavan Nikhilesh 		};
317785fb515bSPavan Nikhilesh 
317885fb515bSPavan Nikhilesh 		if (rte_event_enqueue_burst(evdev, port, &ev, 1) != 1) {
317985fb515bSPavan Nikhilesh 			while (rte_event_enqueue_burst(evdev, port, &ev, 1) !=
318085fb515bSPavan Nikhilesh 					1)
318185fb515bSPavan Nikhilesh 				rte_pause();
318285fb515bSPavan Nikhilesh 		}
318385fb515bSPavan Nikhilesh 
318485fb515bSPavan Nikhilesh 		count++;
318585fb515bSPavan Nikhilesh 	}
318685fb515bSPavan Nikhilesh 
318785fb515bSPavan Nikhilesh 	return 0;
318885fb515bSPavan Nikhilesh }
318985fb515bSPavan Nikhilesh 
319085fb515bSPavan Nikhilesh static int
worker_loopback(struct test * t,uint8_t disable_implicit_release)319185fb515bSPavan Nikhilesh worker_loopback(struct test *t, uint8_t disable_implicit_release)
319285fb515bSPavan Nikhilesh {
319385fb515bSPavan Nikhilesh 	/* use a single producer core, and a worker core to see what happens
319485fb515bSPavan Nikhilesh 	 * if the worker loops packets back multiple times
319585fb515bSPavan Nikhilesh 	 */
319685fb515bSPavan Nikhilesh 	struct test_event_dev_stats stats;
319785fb515bSPavan Nikhilesh 	uint64_t print_cycles = 0, cycles = 0;
319885fb515bSPavan Nikhilesh 	uint64_t tx_pkts = 0;
319985fb515bSPavan Nikhilesh 	int err;
320085fb515bSPavan Nikhilesh 	int w_lcore, p_lcore;
320185fb515bSPavan Nikhilesh 
320270418e32SThomas Monjalon 	static const struct rte_mbuf_dynfield counter_dynfield_desc = {
320370418e32SThomas Monjalon 		.name = "rte_event_sw_dynfield_selftest_counter",
320470418e32SThomas Monjalon 		.size = sizeof(counter_dynfield_t),
3205*08966fe7STyler Retzlaff 		.align = alignof(counter_dynfield_t),
320670418e32SThomas Monjalon 	};
320770418e32SThomas Monjalon 	counter_dynfield_offset =
320870418e32SThomas Monjalon 		rte_mbuf_dynfield_register(&counter_dynfield_desc);
320970418e32SThomas Monjalon 	if (counter_dynfield_offset < 0) {
321070418e32SThomas Monjalon 		printf("Error registering mbuf field\n");
321170418e32SThomas Monjalon 		return -rte_errno;
321270418e32SThomas Monjalon 	}
321370418e32SThomas Monjalon 
321485fb515bSPavan Nikhilesh 	if (init(t, 8, 2) < 0 ||
321585fb515bSPavan Nikhilesh 			create_atomic_qids(t, 8) < 0) {
321685fb515bSPavan Nikhilesh 		printf("%d: Error initializing device\n", __LINE__);
321785fb515bSPavan Nikhilesh 		return -1;
321885fb515bSPavan Nikhilesh 	}
321985fb515bSPavan Nikhilesh 
322085fb515bSPavan Nikhilesh 	/* RX with low max events */
322185fb515bSPavan Nikhilesh 	static struct rte_event_port_conf conf = {
322285fb515bSPavan Nikhilesh 			.dequeue_depth = 32,
322385fb515bSPavan Nikhilesh 			.enqueue_depth = 64,
322485fb515bSPavan Nikhilesh 	};
322585fb515bSPavan Nikhilesh 	/* beware: this cannot be initialized in the static above as it would
322685fb515bSPavan Nikhilesh 	 * only be initialized once - and this needs to be set for multiple runs
322785fb515bSPavan Nikhilesh 	 */
322885fb515bSPavan Nikhilesh 	conf.new_event_threshold = 512;
322975d11313STimothy McDaniel 	conf.event_port_cfg = disable_implicit_release ?
323075d11313STimothy McDaniel 		RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL : 0;
323185fb515bSPavan Nikhilesh 
323285fb515bSPavan Nikhilesh 	if (rte_event_port_setup(evdev, 0, &conf) < 0) {
323385fb515bSPavan Nikhilesh 		printf("Error setting up RX port\n");
323485fb515bSPavan Nikhilesh 		return -1;
323585fb515bSPavan Nikhilesh 	}
323685fb515bSPavan Nikhilesh 	t->port[0] = 0;
323785fb515bSPavan Nikhilesh 	/* TX with higher max events */
323885fb515bSPavan Nikhilesh 	conf.new_event_threshold = 4096;
323985fb515bSPavan Nikhilesh 	if (rte_event_port_setup(evdev, 1, &conf) < 0) {
324085fb515bSPavan Nikhilesh 		printf("Error setting up TX port\n");
324185fb515bSPavan Nikhilesh 		return -1;
324285fb515bSPavan Nikhilesh 	}
324385fb515bSPavan Nikhilesh 	t->port[1] = 1;
324485fb515bSPavan Nikhilesh 
324585fb515bSPavan Nikhilesh 	/* CQ mapping to QID */
324685fb515bSPavan Nikhilesh 	err = rte_event_port_link(evdev, t->port[1], NULL, NULL, 0);
324785fb515bSPavan Nikhilesh 	if (err != 8) { /* should have mapped all queues*/
324885fb515bSPavan Nikhilesh 		printf("%d: error mapping port 2 to all qids\n", __LINE__);
324985fb515bSPavan Nikhilesh 		return -1;
325085fb515bSPavan Nikhilesh 	}
325185fb515bSPavan Nikhilesh 
325285fb515bSPavan Nikhilesh 	if (rte_event_dev_start(evdev) < 0) {
325385fb515bSPavan Nikhilesh 		printf("%d: Error with start call\n", __LINE__);
325485fb515bSPavan Nikhilesh 		return -1;
325585fb515bSPavan Nikhilesh 	}
325685fb515bSPavan Nikhilesh 
325785fb515bSPavan Nikhilesh 	p_lcore = rte_get_next_lcore(
325885fb515bSPavan Nikhilesh 			/* start core */ -1,
3259cb056611SStephen Hemminger 			/* skip main */ 1,
326085fb515bSPavan Nikhilesh 			/* wrap */ 0);
326185fb515bSPavan Nikhilesh 	w_lcore = rte_get_next_lcore(p_lcore, 1, 0);
326285fb515bSPavan Nikhilesh 
326385fb515bSPavan Nikhilesh 	rte_eal_remote_launch(worker_loopback_producer_fn, t, p_lcore);
326485fb515bSPavan Nikhilesh 	rte_eal_remote_launch(worker_loopback_worker_fn, t, w_lcore);
326585fb515bSPavan Nikhilesh 
326685fb515bSPavan Nikhilesh 	print_cycles = cycles = rte_get_timer_cycles();
3267f6c6c686SHonnappa Nagarahalli 	while (rte_eal_get_lcore_state(p_lcore) != WAIT ||
3268f6c6c686SHonnappa Nagarahalli 			rte_eal_get_lcore_state(w_lcore) != WAIT) {
326985fb515bSPavan Nikhilesh 
327085fb515bSPavan Nikhilesh 		rte_service_run_iter_on_app_lcore(t->service_id, 1);
327185fb515bSPavan Nikhilesh 
327285fb515bSPavan Nikhilesh 		uint64_t new_cycles = rte_get_timer_cycles();
327385fb515bSPavan Nikhilesh 
327485fb515bSPavan Nikhilesh 		if (new_cycles - print_cycles > rte_get_timer_hz()) {
327585fb515bSPavan Nikhilesh 			test_event_dev_stats_get(evdev, &stats);
327685fb515bSPavan Nikhilesh 			printf(
327785fb515bSPavan Nikhilesh 				"%d: \tSched Rx = %"PRIu64", Tx = %"PRIu64"\n",
327885fb515bSPavan Nikhilesh 				__LINE__, stats.rx_pkts, stats.tx_pkts);
327985fb515bSPavan Nikhilesh 
328085fb515bSPavan Nikhilesh 			print_cycles = new_cycles;
328185fb515bSPavan Nikhilesh 		}
328285fb515bSPavan Nikhilesh 		if (new_cycles - cycles > rte_get_timer_hz() * 3) {
328385fb515bSPavan Nikhilesh 			test_event_dev_stats_get(evdev, &stats);
328485fb515bSPavan Nikhilesh 			if (stats.tx_pkts == tx_pkts) {
328585fb515bSPavan Nikhilesh 				rte_event_dev_dump(evdev, stdout);
328685fb515bSPavan Nikhilesh 				printf("Dumping xstats:\n");
328785fb515bSPavan Nikhilesh 				xstats_print();
328885fb515bSPavan Nikhilesh 				printf(
328985fb515bSPavan Nikhilesh 					"%d: No schedules for seconds, deadlock\n",
329085fb515bSPavan Nikhilesh 					__LINE__);
329185fb515bSPavan Nikhilesh 				return -1;
329285fb515bSPavan Nikhilesh 			}
329385fb515bSPavan Nikhilesh 			tx_pkts = stats.tx_pkts;
329485fb515bSPavan Nikhilesh 			cycles = new_cycles;
329585fb515bSPavan Nikhilesh 		}
329685fb515bSPavan Nikhilesh 	}
329785fb515bSPavan Nikhilesh 	rte_service_run_iter_on_app_lcore(t->service_id, 1);
329885fb515bSPavan Nikhilesh 	/* ensure all completions are flushed */
329985fb515bSPavan Nikhilesh 
330085fb515bSPavan Nikhilesh 	rte_eal_mp_wait_lcore();
330185fb515bSPavan Nikhilesh 
330285fb515bSPavan Nikhilesh 	cleanup(t);
330385fb515bSPavan Nikhilesh 	return 0;
330485fb515bSPavan Nikhilesh }
330585fb515bSPavan Nikhilesh 
330685fb515bSPavan Nikhilesh static struct rte_mempool *eventdev_func_mempool;
330785fb515bSPavan Nikhilesh 
33085e6eb5ccSPavan Nikhilesh int
test_sw_eventdev(void)330985fb515bSPavan Nikhilesh test_sw_eventdev(void)
331085fb515bSPavan Nikhilesh {
3311e865cb4dSPavan Nikhilesh 	struct test *t;
331285fb515bSPavan Nikhilesh 	int ret;
331385fb515bSPavan Nikhilesh 
3314e865cb4dSPavan Nikhilesh 	t = malloc(sizeof(struct test));
3315e865cb4dSPavan Nikhilesh 	if (t == NULL)
3316e865cb4dSPavan Nikhilesh 		return -1;
331785fb515bSPavan Nikhilesh 	/* manually initialize the op, older gcc's complain on static
331885fb515bSPavan Nikhilesh 	 * initialization of struct elements that are a bitfield.
331985fb515bSPavan Nikhilesh 	 */
332085fb515bSPavan Nikhilesh 	release_ev.op = RTE_EVENT_OP_RELEASE;
332185fb515bSPavan Nikhilesh 
33225e6eb5ccSPavan Nikhilesh 	const char *eventdev_name = "event_sw";
332385fb515bSPavan Nikhilesh 	evdev = rte_event_dev_get_dev_id(eventdev_name);
332485fb515bSPavan Nikhilesh 	if (evdev < 0) {
332585fb515bSPavan Nikhilesh 		printf("%d: Eventdev %s not found - creating.\n",
332685fb515bSPavan Nikhilesh 				__LINE__, eventdev_name);
332785fb515bSPavan Nikhilesh 		if (rte_vdev_init(eventdev_name, NULL) < 0) {
332885fb515bSPavan Nikhilesh 			printf("Error creating eventdev\n");
33295e6eb5ccSPavan Nikhilesh 			goto test_fail;
333085fb515bSPavan Nikhilesh 		}
333185fb515bSPavan Nikhilesh 		evdev = rte_event_dev_get_dev_id(eventdev_name);
333285fb515bSPavan Nikhilesh 		if (evdev < 0) {
333385fb515bSPavan Nikhilesh 			printf("Error finding newly created eventdev\n");
33345e6eb5ccSPavan Nikhilesh 			goto test_fail;
333585fb515bSPavan Nikhilesh 		}
333685fb515bSPavan Nikhilesh 	}
333785fb515bSPavan Nikhilesh 
333885fb515bSPavan Nikhilesh 	if (rte_event_dev_service_id_get(evdev, &t->service_id) < 0) {
333985fb515bSPavan Nikhilesh 		printf("Failed to get service ID for software event dev\n");
33405e6eb5ccSPavan Nikhilesh 		goto test_fail;
334185fb515bSPavan Nikhilesh 	}
334285fb515bSPavan Nikhilesh 
334385fb515bSPavan Nikhilesh 	rte_service_runstate_set(t->service_id, 1);
334485fb515bSPavan Nikhilesh 	rte_service_set_runstate_mapped_check(t->service_id, 0);
334585fb515bSPavan Nikhilesh 
334685fb515bSPavan Nikhilesh 	/* Only create mbuf pool once, reuse for each test run */
334785fb515bSPavan Nikhilesh 	if (!eventdev_func_mempool) {
334885fb515bSPavan Nikhilesh 		eventdev_func_mempool = rte_pktmbuf_pool_create(
334985fb515bSPavan Nikhilesh 				"EVENTDEV_SW_SA_MBUF_POOL",
335085fb515bSPavan Nikhilesh 				(1<<12), /* 4k buffers */
335185fb515bSPavan Nikhilesh 				32 /*MBUF_CACHE_SIZE*/,
335285fb515bSPavan Nikhilesh 				0,
335385fb515bSPavan Nikhilesh 				512, /* use very small mbufs */
335485fb515bSPavan Nikhilesh 				rte_socket_id());
335585fb515bSPavan Nikhilesh 		if (!eventdev_func_mempool) {
335685fb515bSPavan Nikhilesh 			printf("ERROR creating mempool\n");
33575e6eb5ccSPavan Nikhilesh 			goto test_fail;
335885fb515bSPavan Nikhilesh 		}
335985fb515bSPavan Nikhilesh 	}
336085fb515bSPavan Nikhilesh 	t->mbuf_pool = eventdev_func_mempool;
336185fb515bSPavan Nikhilesh 	printf("*** Running Single Directed Packet test...\n");
336285fb515bSPavan Nikhilesh 	ret = test_single_directed_packet(t);
336385fb515bSPavan Nikhilesh 	if (ret != 0) {
336485fb515bSPavan Nikhilesh 		printf("ERROR - Single Directed Packet test FAILED.\n");
33655e6eb5ccSPavan Nikhilesh 		goto test_fail;
336685fb515bSPavan Nikhilesh 	}
336785fb515bSPavan Nikhilesh 	printf("*** Running Directed Forward Credit test...\n");
336885fb515bSPavan Nikhilesh 	ret = test_directed_forward_credits(t);
336985fb515bSPavan Nikhilesh 	if (ret != 0) {
337085fb515bSPavan Nikhilesh 		printf("ERROR - Directed Forward Credit test FAILED.\n");
33715e6eb5ccSPavan Nikhilesh 		goto test_fail;
337285fb515bSPavan Nikhilesh 	}
337385fb515bSPavan Nikhilesh 	printf("*** Running Single Load Balanced Packet test...\n");
337485fb515bSPavan Nikhilesh 	ret = single_packet(t);
337585fb515bSPavan Nikhilesh 	if (ret != 0) {
337685fb515bSPavan Nikhilesh 		printf("ERROR - Single Packet test FAILED.\n");
33775e6eb5ccSPavan Nikhilesh 		goto test_fail;
337885fb515bSPavan Nikhilesh 	}
337985fb515bSPavan Nikhilesh 	printf("*** Running Unordered Basic test...\n");
338085fb515bSPavan Nikhilesh 	ret = unordered_basic(t);
338185fb515bSPavan Nikhilesh 	if (ret != 0) {
338285fb515bSPavan Nikhilesh 		printf("ERROR -  Unordered Basic test FAILED.\n");
33835e6eb5ccSPavan Nikhilesh 		goto test_fail;
338485fb515bSPavan Nikhilesh 	}
338585fb515bSPavan Nikhilesh 	printf("*** Running Ordered Basic test...\n");
338685fb515bSPavan Nikhilesh 	ret = ordered_basic(t);
338785fb515bSPavan Nikhilesh 	if (ret != 0) {
338885fb515bSPavan Nikhilesh 		printf("ERROR -  Ordered Basic test FAILED.\n");
33895e6eb5ccSPavan Nikhilesh 		goto test_fail;
339085fb515bSPavan Nikhilesh 	}
339185fb515bSPavan Nikhilesh 	printf("*** Running Burst Packets test...\n");
339285fb515bSPavan Nikhilesh 	ret = burst_packets(t);
339385fb515bSPavan Nikhilesh 	if (ret != 0) {
339485fb515bSPavan Nikhilesh 		printf("ERROR - Burst Packets test FAILED.\n");
33955e6eb5ccSPavan Nikhilesh 		goto test_fail;
339685fb515bSPavan Nikhilesh 	}
339785fb515bSPavan Nikhilesh 	printf("*** Running Load Balancing test...\n");
339885fb515bSPavan Nikhilesh 	ret = load_balancing(t);
339985fb515bSPavan Nikhilesh 	if (ret != 0) {
340085fb515bSPavan Nikhilesh 		printf("ERROR - Load Balancing test FAILED.\n");
34015e6eb5ccSPavan Nikhilesh 		goto test_fail;
340285fb515bSPavan Nikhilesh 	}
340385fb515bSPavan Nikhilesh 	printf("*** Running Prioritized Directed test...\n");
340485fb515bSPavan Nikhilesh 	ret = test_priority_directed(t);
340585fb515bSPavan Nikhilesh 	if (ret != 0) {
340685fb515bSPavan Nikhilesh 		printf("ERROR - Prioritized Directed test FAILED.\n");
34075e6eb5ccSPavan Nikhilesh 		goto test_fail;
340885fb515bSPavan Nikhilesh 	}
340985fb515bSPavan Nikhilesh 	printf("*** Running Prioritized Atomic test...\n");
341085fb515bSPavan Nikhilesh 	ret = test_priority_atomic(t);
341185fb515bSPavan Nikhilesh 	if (ret != 0) {
341285fb515bSPavan Nikhilesh 		printf("ERROR - Prioritized Atomic test FAILED.\n");
34135e6eb5ccSPavan Nikhilesh 		goto test_fail;
341485fb515bSPavan Nikhilesh 	}
341585fb515bSPavan Nikhilesh 
341685fb515bSPavan Nikhilesh 	printf("*** Running Prioritized Ordered test...\n");
341785fb515bSPavan Nikhilesh 	ret = test_priority_ordered(t);
341885fb515bSPavan Nikhilesh 	if (ret != 0) {
341985fb515bSPavan Nikhilesh 		printf("ERROR - Prioritized Ordered test FAILED.\n");
34205e6eb5ccSPavan Nikhilesh 		goto test_fail;
342185fb515bSPavan Nikhilesh 	}
342285fb515bSPavan Nikhilesh 	printf("*** Running Prioritized Unordered test...\n");
342385fb515bSPavan Nikhilesh 	ret = test_priority_unordered(t);
342485fb515bSPavan Nikhilesh 	if (ret != 0) {
342585fb515bSPavan Nikhilesh 		printf("ERROR - Prioritized Unordered test FAILED.\n");
34265e6eb5ccSPavan Nikhilesh 		goto test_fail;
342785fb515bSPavan Nikhilesh 	}
342885fb515bSPavan Nikhilesh 	printf("*** Running Invalid QID test...\n");
342985fb515bSPavan Nikhilesh 	ret = invalid_qid(t);
343085fb515bSPavan Nikhilesh 	if (ret != 0) {
343185fb515bSPavan Nikhilesh 		printf("ERROR - Invalid QID test FAILED.\n");
34325e6eb5ccSPavan Nikhilesh 		goto test_fail;
343385fb515bSPavan Nikhilesh 	}
343485fb515bSPavan Nikhilesh 	printf("*** Running Load Balancing History test...\n");
343585fb515bSPavan Nikhilesh 	ret = load_balancing_history(t);
343685fb515bSPavan Nikhilesh 	if (ret != 0) {
343785fb515bSPavan Nikhilesh 		printf("ERROR - Load Balancing History test FAILED.\n");
34385e6eb5ccSPavan Nikhilesh 		goto test_fail;
343985fb515bSPavan Nikhilesh 	}
344085fb515bSPavan Nikhilesh 	printf("*** Running Inflight Count test...\n");
344185fb515bSPavan Nikhilesh 	ret = inflight_counts(t);
344285fb515bSPavan Nikhilesh 	if (ret != 0) {
344385fb515bSPavan Nikhilesh 		printf("ERROR - Inflight Count test FAILED.\n");
34445e6eb5ccSPavan Nikhilesh 		goto test_fail;
344585fb515bSPavan Nikhilesh 	}
344685fb515bSPavan Nikhilesh 	printf("*** Running Abuse Inflights test...\n");
344785fb515bSPavan Nikhilesh 	ret = abuse_inflights(t);
344885fb515bSPavan Nikhilesh 	if (ret != 0) {
344985fb515bSPavan Nikhilesh 		printf("ERROR - Abuse Inflights test FAILED.\n");
34505e6eb5ccSPavan Nikhilesh 		goto test_fail;
345185fb515bSPavan Nikhilesh 	}
345285fb515bSPavan Nikhilesh 	printf("*** Running XStats test...\n");
345385fb515bSPavan Nikhilesh 	ret = xstats_tests(t);
345485fb515bSPavan Nikhilesh 	if (ret != 0) {
345585fb515bSPavan Nikhilesh 		printf("ERROR - XStats test FAILED.\n");
34565e6eb5ccSPavan Nikhilesh 		goto test_fail;
345785fb515bSPavan Nikhilesh 	}
345885fb515bSPavan Nikhilesh 	printf("*** Running XStats ID Reset test...\n");
345985fb515bSPavan Nikhilesh 	ret = xstats_id_reset_tests(t);
346085fb515bSPavan Nikhilesh 	if (ret != 0) {
346185fb515bSPavan Nikhilesh 		printf("ERROR - XStats ID Reset test FAILED.\n");
34625e6eb5ccSPavan Nikhilesh 		goto test_fail;
346385fb515bSPavan Nikhilesh 	}
346485fb515bSPavan Nikhilesh 	printf("*** Running XStats Brute Force test...\n");
346585fb515bSPavan Nikhilesh 	ret = xstats_brute_force(t);
346685fb515bSPavan Nikhilesh 	if (ret != 0) {
346785fb515bSPavan Nikhilesh 		printf("ERROR - XStats Brute Force test FAILED.\n");
34685e6eb5ccSPavan Nikhilesh 		goto test_fail;
346985fb515bSPavan Nikhilesh 	}
347085fb515bSPavan Nikhilesh 	printf("*** Running XStats ID Abuse test...\n");
347185fb515bSPavan Nikhilesh 	ret = xstats_id_abuse_tests(t);
347285fb515bSPavan Nikhilesh 	if (ret != 0) {
347385fb515bSPavan Nikhilesh 		printf("ERROR - XStats ID Abuse test FAILED.\n");
34745e6eb5ccSPavan Nikhilesh 		goto test_fail;
347585fb515bSPavan Nikhilesh 	}
347685fb515bSPavan Nikhilesh 	printf("*** Running QID Priority test...\n");
347785fb515bSPavan Nikhilesh 	ret = qid_priorities(t);
347885fb515bSPavan Nikhilesh 	if (ret != 0) {
347985fb515bSPavan Nikhilesh 		printf("ERROR - QID Priority test FAILED.\n");
34805e6eb5ccSPavan Nikhilesh 		goto test_fail;
348185fb515bSPavan Nikhilesh 	}
34821638261aSHarry van Haaren 	printf("*** Running Unlink-in-progress test...\n");
34831638261aSHarry van Haaren 	ret = unlink_in_progress(t);
34841638261aSHarry van Haaren 	if (ret != 0) {
34851638261aSHarry van Haaren 		printf("ERROR - Unlink in progress test FAILED.\n");
34861638261aSHarry van Haaren 		goto test_fail;
34871638261aSHarry van Haaren 	}
348885fb515bSPavan Nikhilesh 	printf("*** Running Ordered Reconfigure test...\n");
348985fb515bSPavan Nikhilesh 	ret = ordered_reconfigure(t);
349085fb515bSPavan Nikhilesh 	if (ret != 0) {
349185fb515bSPavan Nikhilesh 		printf("ERROR - Ordered Reconfigure test FAILED.\n");
34925e6eb5ccSPavan Nikhilesh 		goto test_fail;
349385fb515bSPavan Nikhilesh 	}
349485fb515bSPavan Nikhilesh 	printf("*** Running Port LB Single Reconfig test...\n");
349585fb515bSPavan Nikhilesh 	ret = port_single_lb_reconfig(t);
349685fb515bSPavan Nikhilesh 	if (ret != 0) {
349785fb515bSPavan Nikhilesh 		printf("ERROR - Port LB Single Reconfig test FAILED.\n");
34985e6eb5ccSPavan Nikhilesh 		goto test_fail;
349985fb515bSPavan Nikhilesh 	}
350085fb515bSPavan Nikhilesh 	printf("*** Running Port Reconfig Credits test...\n");
350185fb515bSPavan Nikhilesh 	ret = port_reconfig_credits(t);
350285fb515bSPavan Nikhilesh 	if (ret != 0) {
350385fb515bSPavan Nikhilesh 		printf("ERROR - Port Reconfig Credits Reset test FAILED.\n");
35045e6eb5ccSPavan Nikhilesh 		goto test_fail;
350585fb515bSPavan Nikhilesh 	}
350685fb515bSPavan Nikhilesh 	printf("*** Running Head-of-line-blocking test...\n");
350785fb515bSPavan Nikhilesh 	ret = holb(t);
350885fb515bSPavan Nikhilesh 	if (ret != 0) {
350985fb515bSPavan Nikhilesh 		printf("ERROR - Head-of-line-blocking test FAILED.\n");
35105e6eb5ccSPavan Nikhilesh 		goto test_fail;
351185fb515bSPavan Nikhilesh 	}
35128490488aSGage Eads 	printf("*** Running Stop Flush test...\n");
35138490488aSGage Eads 	ret = dev_stop_flush(t);
35148490488aSGage Eads 	if (ret != 0) {
35158490488aSGage Eads 		printf("ERROR - Stop Flush test FAILED.\n");
35168490488aSGage Eads 		goto test_fail;
35178490488aSGage Eads 	}
3518a812a475SHarry van Haaren 	printf("*** Running Ordered & Atomic hist-list completion test...\n");
3519a812a475SHarry van Haaren 	ret = ordered_atomic_hist_completion(t);
3520a812a475SHarry van Haaren 	if (ret != 0) {
3521a812a475SHarry van Haaren 		printf("ERROR - Ordered & Atomic hist-list test FAILED.\n");
3522a812a475SHarry van Haaren 		goto test_fail;
3523a812a475SHarry van Haaren 	}
352485fb515bSPavan Nikhilesh 	if (rte_lcore_count() >= 3) {
352585fb515bSPavan Nikhilesh 		printf("*** Running Worker loopback test...\n");
352685fb515bSPavan Nikhilesh 		ret = worker_loopback(t, 0);
352785fb515bSPavan Nikhilesh 		if (ret != 0) {
352885fb515bSPavan Nikhilesh 			printf("ERROR - Worker loopback test FAILED.\n");
352985fb515bSPavan Nikhilesh 			return ret;
353085fb515bSPavan Nikhilesh 		}
353185fb515bSPavan Nikhilesh 
353285fb515bSPavan Nikhilesh 		printf("*** Running Worker loopback test (implicit release disabled)...\n");
353385fb515bSPavan Nikhilesh 		ret = worker_loopback(t, 1);
353485fb515bSPavan Nikhilesh 		if (ret != 0) {
353585fb515bSPavan Nikhilesh 			printf("ERROR - Worker loopback test FAILED.\n");
35365e6eb5ccSPavan Nikhilesh 			goto test_fail;
353785fb515bSPavan Nikhilesh 		}
353885fb515bSPavan Nikhilesh 	} else {
353985fb515bSPavan Nikhilesh 		printf("### Not enough cores for worker loopback tests.\n");
354085fb515bSPavan Nikhilesh 		printf("### Need at least 3 cores for the tests.\n");
354185fb515bSPavan Nikhilesh 	}
354285fb515bSPavan Nikhilesh 
354385fb515bSPavan Nikhilesh 	/*
354485fb515bSPavan Nikhilesh 	 * Free test instance, leaving mempool initialized, and a pointer to it
354585fb515bSPavan Nikhilesh 	 * in static eventdev_func_mempool, as it is re-used on re-runs
354685fb515bSPavan Nikhilesh 	 */
354785fb515bSPavan Nikhilesh 	free(t);
354885fb515bSPavan Nikhilesh 
35495e6eb5ccSPavan Nikhilesh 	printf("SW Eventdev Selftest Successful.\n");
355085fb515bSPavan Nikhilesh 	return 0;
35515e6eb5ccSPavan Nikhilesh test_fail:
3552e865cb4dSPavan Nikhilesh 	free(t);
35535e6eb5ccSPavan Nikhilesh 	printf("SW Eventdev Selftest Failed.\n");
35545e6eb5ccSPavan Nikhilesh 	return -1;
355585fb515bSPavan Nikhilesh }
3556