xref: /dpdk/app/test/test_ethdev_api.c (revision 2834e6dd35ecb04feec26e5a48d79da07c562207)
1*2834e6ddSFerruh Yigit /* SPDX-License-Identifier: BSD-3-Clause
2*2834e6ddSFerruh Yigit  * Copyright (C) 2023, Advanced Micro Devices, Inc.
3*2834e6ddSFerruh Yigit  */
4*2834e6ddSFerruh Yigit 
5*2834e6ddSFerruh Yigit #include <rte_log.h>
6*2834e6ddSFerruh Yigit #include <rte_ethdev.h>
7*2834e6ddSFerruh Yigit 
8*2834e6ddSFerruh Yigit #include <rte_test.h>
9*2834e6ddSFerruh Yigit #include "test.h"
10*2834e6ddSFerruh Yigit 
11*2834e6ddSFerruh Yigit #define NUM_RXQ	2
12*2834e6ddSFerruh Yigit #define NUM_TXQ	2
13*2834e6ddSFerruh Yigit #define NUM_RXD 512
14*2834e6ddSFerruh Yigit #define NUM_TXD 512
15*2834e6ddSFerruh Yigit #define NUM_MBUF 1024
16*2834e6ddSFerruh Yigit #define MBUF_CACHE_SIZE 256
17*2834e6ddSFerruh Yigit 
18*2834e6ddSFerruh Yigit static int32_t
ethdev_api_queue_status(void)19*2834e6ddSFerruh Yigit ethdev_api_queue_status(void)
20*2834e6ddSFerruh Yigit {
21*2834e6ddSFerruh Yigit 	struct rte_eth_dev_info dev_info;
22*2834e6ddSFerruh Yigit 	struct rte_eth_rxq_info rx_qinfo;
23*2834e6ddSFerruh Yigit 	struct rte_eth_txq_info tx_qinfo;
24*2834e6ddSFerruh Yigit 	struct rte_mempool *mbuf_pool;
25*2834e6ddSFerruh Yigit 	struct rte_eth_conf eth_conf;
26*2834e6ddSFerruh Yigit 	uint16_t port_id;
27*2834e6ddSFerruh Yigit 	int ret;
28*2834e6ddSFerruh Yigit 
29*2834e6ddSFerruh Yigit 	if (rte_eth_dev_count_avail() == 0)
30*2834e6ddSFerruh Yigit 		return TEST_SKIPPED;
31*2834e6ddSFerruh Yigit 
32*2834e6ddSFerruh Yigit 	mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUF, MBUF_CACHE_SIZE, 0,
33*2834e6ddSFerruh Yigit 			RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
34*2834e6ddSFerruh Yigit 
35*2834e6ddSFerruh Yigit 	RTE_ETH_FOREACH_DEV(port_id) {
36*2834e6ddSFerruh Yigit 		memset(&eth_conf, 0, sizeof(eth_conf));
37*2834e6ddSFerruh Yigit 		ret = rte_eth_dev_configure(port_id, NUM_RXQ, NUM_TXQ, &eth_conf);
38*2834e6ddSFerruh Yigit 		TEST_ASSERT(ret == 0,
39*2834e6ddSFerruh Yigit 			"Port(%u) failed to configure.\n", port_id);
40*2834e6ddSFerruh Yigit 
41*2834e6ddSFerruh Yigit 		/* RxQ setup */
42*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < NUM_RXQ; queue_id++) {
43*2834e6ddSFerruh Yigit 			ret = rte_eth_rx_queue_setup(port_id, queue_id, NUM_RXD,
44*2834e6ddSFerruh Yigit 				rte_socket_id(), NULL,  mbuf_pool);
45*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
46*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to setup RxQ.\n",
47*2834e6ddSFerruh Yigit 				port_id, queue_id);
48*2834e6ddSFerruh Yigit 		}
49*2834e6ddSFerruh Yigit 
50*2834e6ddSFerruh Yigit 		/* TxQ setup */
51*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < NUM_TXQ; queue_id++) {
52*2834e6ddSFerruh Yigit 			ret = rte_eth_tx_queue_setup(port_id, queue_id, NUM_TXD,
53*2834e6ddSFerruh Yigit 				rte_socket_id(), NULL);
54*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
55*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to setup TxQ.\n",
56*2834e6ddSFerruh Yigit 				port_id, queue_id);
57*2834e6ddSFerruh Yigit 		}
58*2834e6ddSFerruh Yigit 
59*2834e6ddSFerruh Yigit 		ret = rte_eth_dev_info_get(port_id, &dev_info);
60*2834e6ddSFerruh Yigit 		TEST_ASSERT(ret == 0,
61*2834e6ddSFerruh Yigit 			"Port(%u) failed to get dev info.\n", port_id);
62*2834e6ddSFerruh Yigit 
63*2834e6ddSFerruh Yigit 		/* Initial RxQ */
64*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_rx_queues; queue_id++) {
65*2834e6ddSFerruh Yigit 			ret = rte_eth_rx_queue_info_get(port_id, queue_id, &rx_qinfo);
66*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
67*2834e6ddSFerruh Yigit 				continue;
68*2834e6ddSFerruh Yigit 
69*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
70*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get RxQ info.\n",
71*2834e6ddSFerruh Yigit 				port_id, queue_id);
72*2834e6ddSFerruh Yigit 
73*2834e6ddSFerruh Yigit 			TEST_ASSERT(rx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STOPPED,
74*2834e6ddSFerruh Yigit 				"Wrong initial Rx queue(%u) state(%d)\n",
75*2834e6ddSFerruh Yigit 				queue_id, rx_qinfo.queue_state);
76*2834e6ddSFerruh Yigit 		}
77*2834e6ddSFerruh Yigit 
78*2834e6ddSFerruh Yigit 		/* Initial TxQ */
79*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_tx_queues; queue_id++) {
80*2834e6ddSFerruh Yigit 			ret = rte_eth_tx_queue_info_get(port_id, queue_id, &tx_qinfo);
81*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
82*2834e6ddSFerruh Yigit 				continue;
83*2834e6ddSFerruh Yigit 
84*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
85*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get TxQ info.\n",
86*2834e6ddSFerruh Yigit 				port_id, queue_id);
87*2834e6ddSFerruh Yigit 
88*2834e6ddSFerruh Yigit 			TEST_ASSERT(tx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STOPPED,
89*2834e6ddSFerruh Yigit 				"Wrong initial Tx queue(%u) state(%d)\n",
90*2834e6ddSFerruh Yigit 				queue_id, tx_qinfo.queue_state);
91*2834e6ddSFerruh Yigit 		}
92*2834e6ddSFerruh Yigit 
93*2834e6ddSFerruh Yigit 		ret = rte_eth_dev_start(port_id);
94*2834e6ddSFerruh Yigit 		TEST_ASSERT(ret == 0,
95*2834e6ddSFerruh Yigit 			"Port(%u) failed to start.\n", port_id);
96*2834e6ddSFerruh Yigit 
97*2834e6ddSFerruh Yigit 		/* Started RxQ */
98*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_rx_queues; queue_id++) {
99*2834e6ddSFerruh Yigit 			ret = rte_eth_rx_queue_info_get(port_id, queue_id, &rx_qinfo);
100*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
101*2834e6ddSFerruh Yigit 				continue;
102*2834e6ddSFerruh Yigit 
103*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
104*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get RxQ info.\n",
105*2834e6ddSFerruh Yigit 				port_id, queue_id);
106*2834e6ddSFerruh Yigit 
107*2834e6ddSFerruh Yigit 			TEST_ASSERT(rx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STARTED,
108*2834e6ddSFerruh Yigit 				"Wrong started Rx queue(%u) state(%d)\n",
109*2834e6ddSFerruh Yigit 				queue_id, rx_qinfo.queue_state);
110*2834e6ddSFerruh Yigit 		}
111*2834e6ddSFerruh Yigit 
112*2834e6ddSFerruh Yigit 		/* Started TxQ */
113*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_tx_queues; queue_id++) {
114*2834e6ddSFerruh Yigit 			ret = rte_eth_tx_queue_info_get(port_id, queue_id, &tx_qinfo);
115*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
116*2834e6ddSFerruh Yigit 				continue;
117*2834e6ddSFerruh Yigit 
118*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
119*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get TxQ info.\n",
120*2834e6ddSFerruh Yigit 				port_id, queue_id);
121*2834e6ddSFerruh Yigit 
122*2834e6ddSFerruh Yigit 			TEST_ASSERT(tx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STARTED,
123*2834e6ddSFerruh Yigit 				"Wrong started Tx queue(%u) state(%d)\n",
124*2834e6ddSFerruh Yigit 				queue_id, tx_qinfo.queue_state);
125*2834e6ddSFerruh Yigit 		}
126*2834e6ddSFerruh Yigit 
127*2834e6ddSFerruh Yigit 		ret = rte_eth_dev_stop(port_id);
128*2834e6ddSFerruh Yigit 		TEST_ASSERT(ret == 0,
129*2834e6ddSFerruh Yigit 			"Port(%u) failed to stop.\n", port_id);
130*2834e6ddSFerruh Yigit 
131*2834e6ddSFerruh Yigit 		/* Stopped RxQ */
132*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_rx_queues; queue_id++) {
133*2834e6ddSFerruh Yigit 			ret = rte_eth_rx_queue_info_get(port_id, queue_id, &rx_qinfo);
134*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
135*2834e6ddSFerruh Yigit 				continue;
136*2834e6ddSFerruh Yigit 
137*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
138*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get RxQ info.\n",
139*2834e6ddSFerruh Yigit 				port_id, queue_id);
140*2834e6ddSFerruh Yigit 
141*2834e6ddSFerruh Yigit 			TEST_ASSERT(rx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STOPPED,
142*2834e6ddSFerruh Yigit 				"Wrong stopped Rx queue(%u) state(%d)\n",
143*2834e6ddSFerruh Yigit 				queue_id, rx_qinfo.queue_state);
144*2834e6ddSFerruh Yigit 		}
145*2834e6ddSFerruh Yigit 
146*2834e6ddSFerruh Yigit 		/* Stopped TxQ */
147*2834e6ddSFerruh Yigit 		for (uint16_t queue_id = 0; queue_id < dev_info.nb_tx_queues; queue_id++) {
148*2834e6ddSFerruh Yigit 			ret = rte_eth_tx_queue_info_get(port_id, queue_id, &tx_qinfo);
149*2834e6ddSFerruh Yigit 			if (ret == -ENOTSUP)
150*2834e6ddSFerruh Yigit 				continue;
151*2834e6ddSFerruh Yigit 
152*2834e6ddSFerruh Yigit 			TEST_ASSERT(ret == 0,
153*2834e6ddSFerruh Yigit 				"Port(%u), queue(%u) failed to get TxQ info.\n",
154*2834e6ddSFerruh Yigit 				port_id, queue_id);
155*2834e6ddSFerruh Yigit 
156*2834e6ddSFerruh Yigit 			TEST_ASSERT(tx_qinfo.queue_state == RTE_ETH_QUEUE_STATE_STOPPED,
157*2834e6ddSFerruh Yigit 				"Wrong stopped Tx queue(%u) state(%d)\n",
158*2834e6ddSFerruh Yigit 				queue_id, tx_qinfo.queue_state);
159*2834e6ddSFerruh Yigit 		}
160*2834e6ddSFerruh Yigit 	}
161*2834e6ddSFerruh Yigit 
162*2834e6ddSFerruh Yigit 	return TEST_SUCCESS;
163*2834e6ddSFerruh Yigit }
164*2834e6ddSFerruh Yigit 
165*2834e6ddSFerruh Yigit static struct unit_test_suite ethdev_api_testsuite = {
166*2834e6ddSFerruh Yigit 	.suite_name = "ethdev API tests",
167*2834e6ddSFerruh Yigit 	.setup = NULL,
168*2834e6ddSFerruh Yigit 	.teardown = NULL,
169*2834e6ddSFerruh Yigit 	.unit_test_cases = {
170*2834e6ddSFerruh Yigit 		TEST_CASE(ethdev_api_queue_status),
171*2834e6ddSFerruh Yigit 		/* TODO: Add deferred_start queue status test */
172*2834e6ddSFerruh Yigit 		TEST_CASES_END() /**< NULL terminate unit test array */
173*2834e6ddSFerruh Yigit 	}
174*2834e6ddSFerruh Yigit };
175*2834e6ddSFerruh Yigit 
176*2834e6ddSFerruh Yigit static int
test_ethdev_api(void)177*2834e6ddSFerruh Yigit test_ethdev_api(void)
178*2834e6ddSFerruh Yigit {
179*2834e6ddSFerruh Yigit 	rte_log_set_global_level(RTE_LOG_DEBUG);
180*2834e6ddSFerruh Yigit 	rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
181*2834e6ddSFerruh Yigit 
182*2834e6ddSFerruh Yigit 	return unit_test_suite_runner(&ethdev_api_testsuite);
183*2834e6ddSFerruh Yigit }
184*2834e6ddSFerruh Yigit 
185*2834e6ddSFerruh Yigit /* TODO: Make part of the fast test suite, `REGISTER_FAST_TEST()`,
186*2834e6ddSFerruh Yigit  *       when all drivers complies to the queue state requirement
187*2834e6ddSFerruh Yigit  */
188*2834e6ddSFerruh Yigit REGISTER_TEST_COMMAND(ethdev_api, test_ethdev_api);
189