xref: /dpdk/app/test/test_dmadev_api.c (revision 0623f2758baa4bf1c347439ecf1ca03543b7b381)
19942ebb9SChengwen Feng /* SPDX-License-Identifier: BSD-3-Clause
29942ebb9SChengwen Feng  * Copyright(c) 2021 HiSilicon Limited
39942ebb9SChengwen Feng  */
49942ebb9SChengwen Feng 
59942ebb9SChengwen Feng #include <string.h>
69942ebb9SChengwen Feng 
79942ebb9SChengwen Feng #include <rte_cycles.h>
89942ebb9SChengwen Feng #include <rte_malloc.h>
99942ebb9SChengwen Feng #include <rte_test.h>
109942ebb9SChengwen Feng #include <rte_dmadev.h>
119942ebb9SChengwen Feng 
1214b477edSGowrishankar Muthukrishnan #include "test.h"
132aba4f16SGowrishankar Muthukrishnan #include "test_dmadev_api.h"
149942ebb9SChengwen Feng 
1514b477edSGowrishankar Muthukrishnan extern int test_dma_api(uint16_t dev_id);
169942ebb9SChengwen Feng 
179942ebb9SChengwen Feng #define TEST_MEMCPY_SIZE	1024
189942ebb9SChengwen Feng #define TEST_WAIT_US_VAL	50000
192aba4f16SGowrishankar Muthukrishnan #define TEST_SG_MAX		64
209942ebb9SChengwen Feng 
219942ebb9SChengwen Feng static int16_t test_dev_id;
229942ebb9SChengwen Feng static int16_t invalid_dev_id;
239942ebb9SChengwen Feng 
249942ebb9SChengwen Feng static char *src;
259942ebb9SChengwen Feng static char *dst;
262aba4f16SGowrishankar Muthukrishnan static char *src_sg[TEST_SG_MAX];
272aba4f16SGowrishankar Muthukrishnan static char *dst_sg[TEST_SG_MAX];
289942ebb9SChengwen Feng 
299942ebb9SChengwen Feng static int
testsuite_setup(void)3014b477edSGowrishankar Muthukrishnan testsuite_setup(void)
319942ebb9SChengwen Feng {
329942ebb9SChengwen Feng 	invalid_dev_id = -1;
332aba4f16SGowrishankar Muthukrishnan 	int i, rc = 0;
349942ebb9SChengwen Feng 
352aba4f16SGowrishankar Muthukrishnan 	for (i = 0; i < TEST_SG_MAX; i++) {
362aba4f16SGowrishankar Muthukrishnan 		src_sg[i] = rte_malloc("dmadev_test_src", TEST_MEMCPY_SIZE, 0);
372aba4f16SGowrishankar Muthukrishnan 		if (src_sg[i] == NULL) {
382aba4f16SGowrishankar Muthukrishnan 			rc = -ENOMEM;
392aba4f16SGowrishankar Muthukrishnan 			goto exit;
409942ebb9SChengwen Feng 		}
419942ebb9SChengwen Feng 
422aba4f16SGowrishankar Muthukrishnan 		dst_sg[i] = rte_malloc("dmadev_test_dst", TEST_MEMCPY_SIZE, 0);
432aba4f16SGowrishankar Muthukrishnan 		if (dst_sg[i] == NULL) {
442aba4f16SGowrishankar Muthukrishnan 			rte_free(src_sg[i]);
452aba4f16SGowrishankar Muthukrishnan 			src_sg[i] = NULL;
462aba4f16SGowrishankar Muthukrishnan 			rc = -ENOMEM;
472aba4f16SGowrishankar Muthukrishnan 			goto exit;
482aba4f16SGowrishankar Muthukrishnan 		}
492aba4f16SGowrishankar Muthukrishnan 	}
502aba4f16SGowrishankar Muthukrishnan 
512aba4f16SGowrishankar Muthukrishnan 	src = src_sg[0];
522aba4f16SGowrishankar Muthukrishnan 	dst = dst_sg[0];
532aba4f16SGowrishankar Muthukrishnan 
549942ebb9SChengwen Feng 	/* Set dmadev log level to critical to suppress unnecessary output
559942ebb9SChengwen Feng 	 * during API tests.
569942ebb9SChengwen Feng 	 */
579942ebb9SChengwen Feng 	rte_log_set_level_pattern("lib.dmadev", RTE_LOG_CRIT);
589942ebb9SChengwen Feng 
592aba4f16SGowrishankar Muthukrishnan 	return rc;
602aba4f16SGowrishankar Muthukrishnan exit:
612aba4f16SGowrishankar Muthukrishnan 	while (--i >= 0) {
622aba4f16SGowrishankar Muthukrishnan 		rte_free(src_sg[i]);
632aba4f16SGowrishankar Muthukrishnan 		rte_free(dst_sg[i]);
642aba4f16SGowrishankar Muthukrishnan 	}
652aba4f16SGowrishankar Muthukrishnan 
662aba4f16SGowrishankar Muthukrishnan 	return rc;
679942ebb9SChengwen Feng }
689942ebb9SChengwen Feng 
699942ebb9SChengwen Feng static void
testsuite_teardown(void)709942ebb9SChengwen Feng testsuite_teardown(void)
719942ebb9SChengwen Feng {
722aba4f16SGowrishankar Muthukrishnan 	int i;
732aba4f16SGowrishankar Muthukrishnan 
742aba4f16SGowrishankar Muthukrishnan 	for (i = 0; i < TEST_SG_MAX; i++) {
752aba4f16SGowrishankar Muthukrishnan 		rte_free(src_sg[i]);
762aba4f16SGowrishankar Muthukrishnan 		src_sg[i] = NULL;
772aba4f16SGowrishankar Muthukrishnan 		rte_free(dst_sg[i]);
782aba4f16SGowrishankar Muthukrishnan 		dst_sg[i] = NULL;
792aba4f16SGowrishankar Muthukrishnan 	}
802aba4f16SGowrishankar Muthukrishnan 
819942ebb9SChengwen Feng 	src = NULL;
829942ebb9SChengwen Feng 	dst = NULL;
839942ebb9SChengwen Feng 	/* Ensure the dmadev is stopped. */
849942ebb9SChengwen Feng 	rte_dma_stop(test_dev_id);
85*0623f275SKevin Laatz 	rte_dma_stats_reset(test_dev_id, RTE_DMA_ALL_VCHAN);
869942ebb9SChengwen Feng 
879942ebb9SChengwen Feng 	rte_log_set_level_pattern("lib.dmadev", RTE_LOG_INFO);
889942ebb9SChengwen Feng }
899942ebb9SChengwen Feng 
909942ebb9SChengwen Feng static int
test_dma_get_dev_id_by_name(void)919942ebb9SChengwen Feng test_dma_get_dev_id_by_name(void)
929942ebb9SChengwen Feng {
939942ebb9SChengwen Feng 	int ret = rte_dma_get_dev_id_by_name("invalid_dmadev_device");
949942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
959942ebb9SChengwen Feng 	return TEST_SUCCESS;
969942ebb9SChengwen Feng }
979942ebb9SChengwen Feng 
989942ebb9SChengwen Feng static int
test_dma_is_valid_dev(void)999942ebb9SChengwen Feng test_dma_is_valid_dev(void)
1009942ebb9SChengwen Feng {
1019942ebb9SChengwen Feng 	int ret;
1029942ebb9SChengwen Feng 	ret = rte_dma_is_valid(invalid_dev_id);
1039942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == false, "Expected false for invalid dev id");
1049942ebb9SChengwen Feng 	ret = rte_dma_is_valid(test_dev_id);
1059942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == true, "Expected true for valid dev id");
1069942ebb9SChengwen Feng 	return TEST_SUCCESS;
1079942ebb9SChengwen Feng }
1089942ebb9SChengwen Feng 
1099942ebb9SChengwen Feng static int
test_dma_count(void)1109942ebb9SChengwen Feng test_dma_count(void)
1119942ebb9SChengwen Feng {
1129942ebb9SChengwen Feng 	uint16_t count = rte_dma_count_avail();
1139942ebb9SChengwen Feng 	RTE_TEST_ASSERT(count > 0, "Invalid dmadev count %u", count);
1149942ebb9SChengwen Feng 	return TEST_SUCCESS;
1159942ebb9SChengwen Feng }
1169942ebb9SChengwen Feng 
1179942ebb9SChengwen Feng static int
test_dma_info_get(void)1189942ebb9SChengwen Feng test_dma_info_get(void)
1199942ebb9SChengwen Feng {
1209942ebb9SChengwen Feng 	struct rte_dma_info info =  { 0 };
1219942ebb9SChengwen Feng 	int ret;
1229942ebb9SChengwen Feng 
1239942ebb9SChengwen Feng 	ret = rte_dma_info_get(invalid_dev_id, &info);
1249942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1259942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, NULL);
1269942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1279942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &info);
1289942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info");
1299942ebb9SChengwen Feng 
1309942ebb9SChengwen Feng 	return TEST_SUCCESS;
1319942ebb9SChengwen Feng }
1329942ebb9SChengwen Feng 
1339942ebb9SChengwen Feng static int
test_dma_configure(void)1349942ebb9SChengwen Feng test_dma_configure(void)
1359942ebb9SChengwen Feng {
1369942ebb9SChengwen Feng 	struct rte_dma_conf conf = { 0 };
1379942ebb9SChengwen Feng 	struct rte_dma_info info = { 0 };
1389942ebb9SChengwen Feng 	int ret;
1399942ebb9SChengwen Feng 
1409942ebb9SChengwen Feng 	/* Check for invalid parameters */
1419942ebb9SChengwen Feng 	ret = rte_dma_configure(invalid_dev_id, &conf);
1429942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1439942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, NULL);
1449942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1459942ebb9SChengwen Feng 
1469942ebb9SChengwen Feng 	/* Check for nb_vchans == 0 */
1479942ebb9SChengwen Feng 	memset(&conf, 0, sizeof(conf));
1489942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &conf);
1499942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1509942ebb9SChengwen Feng 
1519942ebb9SChengwen Feng 	/* Check for conf.nb_vchans > info.max_vchans */
1529942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &info);
1539942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info");
1549942ebb9SChengwen Feng 	memset(&conf, 0, sizeof(conf));
1559942ebb9SChengwen Feng 	conf.nb_vchans = info.max_vchans + 1;
1569942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &conf);
1579942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1589942ebb9SChengwen Feng 
1599942ebb9SChengwen Feng 	/* Check enable silent mode */
1609942ebb9SChengwen Feng 	memset(&conf, 0, sizeof(conf));
1619942ebb9SChengwen Feng 	conf.nb_vchans = info.max_vchans;
1629942ebb9SChengwen Feng 	conf.enable_silent = true;
1639942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &conf);
1649942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1659942ebb9SChengwen Feng 
1669942ebb9SChengwen Feng 	/* Configure success */
1679942ebb9SChengwen Feng 	memset(&conf, 0, sizeof(conf));
1689942ebb9SChengwen Feng 	conf.nb_vchans = info.max_vchans;
1699942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &conf);
1709942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure dmadev, %d", ret);
1719942ebb9SChengwen Feng 
1729942ebb9SChengwen Feng 	/* Check configure success */
1739942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &info);
1749942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info");
1759942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(conf.nb_vchans, info.nb_vchans,
1769942ebb9SChengwen Feng 			      "Configure nb_vchans not match");
1779942ebb9SChengwen Feng 
1789942ebb9SChengwen Feng 	return TEST_SUCCESS;
1799942ebb9SChengwen Feng }
1809942ebb9SChengwen Feng 
1819942ebb9SChengwen Feng static int
check_direction(void)1829942ebb9SChengwen Feng check_direction(void)
1839942ebb9SChengwen Feng {
1849942ebb9SChengwen Feng 	struct rte_dma_vchan_conf vchan_conf;
1859942ebb9SChengwen Feng 	int ret;
1869942ebb9SChengwen Feng 
1879942ebb9SChengwen Feng 	/* Check for direction */
1889942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
1899942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_DEV_TO_DEV + 1;
1909942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
1919942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1929942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM - 1;
1939942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
1949942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1959942ebb9SChengwen Feng 
1969942ebb9SChengwen Feng 	/* Check for direction and dev_capa combination */
1979942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
1989942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_DEV;
1999942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2009942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2019942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_DEV_TO_MEM;
2029942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2039942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2049942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_DEV_TO_DEV;
2059942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2069942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2079942ebb9SChengwen Feng 
2089942ebb9SChengwen Feng 	return 0;
2099942ebb9SChengwen Feng }
2109942ebb9SChengwen Feng 
2119942ebb9SChengwen Feng static int
check_port_type(struct rte_dma_info * dev_info)2129942ebb9SChengwen Feng check_port_type(struct rte_dma_info *dev_info)
2139942ebb9SChengwen Feng {
2149942ebb9SChengwen Feng 	struct rte_dma_vchan_conf vchan_conf;
2159942ebb9SChengwen Feng 	int ret;
2169942ebb9SChengwen Feng 
2179942ebb9SChengwen Feng 	/* Check src port type validation */
2189942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
2199942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM;
2209942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info->min_desc;
2219942ebb9SChengwen Feng 	vchan_conf.src_port.port_type = RTE_DMA_PORT_PCIE;
2229942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2239942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2249942ebb9SChengwen Feng 
2259942ebb9SChengwen Feng 	/* Check dst port type validation */
2269942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
2279942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM;
2289942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info->min_desc;
2299942ebb9SChengwen Feng 	vchan_conf.dst_port.port_type = RTE_DMA_PORT_PCIE;
2309942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2319942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2329942ebb9SChengwen Feng 
2339942ebb9SChengwen Feng 	return 0;
2349942ebb9SChengwen Feng }
2359942ebb9SChengwen Feng 
2369942ebb9SChengwen Feng static int
test_dma_vchan_setup(void)2379942ebb9SChengwen Feng test_dma_vchan_setup(void)
2389942ebb9SChengwen Feng {
2399942ebb9SChengwen Feng 	struct rte_dma_vchan_conf vchan_conf = { 0 };
2409942ebb9SChengwen Feng 	struct rte_dma_conf dev_conf = { 0 };
2419942ebb9SChengwen Feng 	struct rte_dma_info dev_info = { 0 };
2429942ebb9SChengwen Feng 	int ret;
2439942ebb9SChengwen Feng 
2449942ebb9SChengwen Feng 	/* Check for invalid parameters */
2459942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(invalid_dev_id, 0, &vchan_conf);
2469942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2479942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, NULL);
2489942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2499942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2509942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2519942ebb9SChengwen Feng 
2529942ebb9SChengwen Feng 	/* Make sure configure success */
2539942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &dev_info);
2549942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info");
2559942ebb9SChengwen Feng 	dev_conf.nb_vchans = dev_info.max_vchans;
2569942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &dev_conf);
2579942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure dmadev, %d", ret);
2589942ebb9SChengwen Feng 
2599942ebb9SChengwen Feng 	/* Check for invalid vchan */
2609942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, dev_conf.nb_vchans, &vchan_conf);
2619942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2629942ebb9SChengwen Feng 
2639942ebb9SChengwen Feng 	/* Check for direction */
2649942ebb9SChengwen Feng 	ret = check_direction();
2659942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to check direction");
2669942ebb9SChengwen Feng 
2679942ebb9SChengwen Feng 	/* Check for nb_desc validation */
2689942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
2699942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM;
2709942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info.min_desc - 1;
2719942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2729942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2739942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info.max_desc + 1;
2749942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2759942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
2769942ebb9SChengwen Feng 
2779942ebb9SChengwen Feng 	/* Check port type */
2789942ebb9SChengwen Feng 	ret = check_port_type(&dev_info);
2799942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to check port type");
2809942ebb9SChengwen Feng 
2819942ebb9SChengwen Feng 	/* Check vchan setup success */
2829942ebb9SChengwen Feng 	memset(&vchan_conf, 0, sizeof(vchan_conf));
2839942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM;
2849942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info.min_desc;
2859942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
2869942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup vchan, %d", ret);
2879942ebb9SChengwen Feng 
2889942ebb9SChengwen Feng 	return TEST_SUCCESS;
2899942ebb9SChengwen Feng }
2909942ebb9SChengwen Feng 
2919942ebb9SChengwen Feng static int
setup_vchan(int nb_vchans)292d95af53fSGowrishankar Muthukrishnan setup_vchan(int nb_vchans)
2939942ebb9SChengwen Feng {
2949942ebb9SChengwen Feng 	struct rte_dma_vchan_conf vchan_conf = { 0 };
2959942ebb9SChengwen Feng 	struct rte_dma_info dev_info = { 0 };
2969942ebb9SChengwen Feng 	struct rte_dma_conf dev_conf = { 0 };
2979942ebb9SChengwen Feng 	int ret;
2989942ebb9SChengwen Feng 
2999942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &dev_info);
3009942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info, %d", ret);
301d95af53fSGowrishankar Muthukrishnan 	dev_conf.nb_vchans = nb_vchans;
3029942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &dev_conf);
3039942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure, %d", ret);
3049942ebb9SChengwen Feng 	vchan_conf.direction = RTE_DMA_DIR_MEM_TO_MEM;
3059942ebb9SChengwen Feng 	vchan_conf.nb_desc = dev_info.min_desc;
306d95af53fSGowrishankar Muthukrishnan 	for (int i = 0; i < nb_vchans; i++) {
307d95af53fSGowrishankar Muthukrishnan 		ret = rte_dma_vchan_setup(test_dev_id, i, &vchan_conf);
308d95af53fSGowrishankar Muthukrishnan 		RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup vchan %d, %d", i, ret);
309d95af53fSGowrishankar Muthukrishnan 	}
3109942ebb9SChengwen Feng 
3119942ebb9SChengwen Feng 	return TEST_SUCCESS;
3129942ebb9SChengwen Feng }
3139942ebb9SChengwen Feng 
3149942ebb9SChengwen Feng static int
test_dma_start_stop(void)3159942ebb9SChengwen Feng test_dma_start_stop(void)
3169942ebb9SChengwen Feng {
3179942ebb9SChengwen Feng 	struct rte_dma_vchan_conf vchan_conf = { 0 };
3189942ebb9SChengwen Feng 	struct rte_dma_conf dev_conf = { 0 };
3199942ebb9SChengwen Feng 	int ret;
3209942ebb9SChengwen Feng 
3219942ebb9SChengwen Feng 	/* Check for invalid parameters */
3229942ebb9SChengwen Feng 	ret = rte_dma_start(invalid_dev_id);
3239942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
3249942ebb9SChengwen Feng 	ret = rte_dma_stop(invalid_dev_id);
3259942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
3269942ebb9SChengwen Feng 
3279942ebb9SChengwen Feng 	/* Setup one vchan for later test */
328d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(1);
3299942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
3309942ebb9SChengwen Feng 
3319942ebb9SChengwen Feng 	ret = rte_dma_start(test_dev_id);
3329942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
3339942ebb9SChengwen Feng 
3349942ebb9SChengwen Feng 	/* Check reconfigure and vchan setup when device started */
3359942ebb9SChengwen Feng 	ret = rte_dma_configure(test_dev_id, &dev_conf);
3369942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EBUSY, "Failed to configure, %d", ret);
3379942ebb9SChengwen Feng 	ret = rte_dma_vchan_setup(test_dev_id, 0, &vchan_conf);
3389942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EBUSY, "Failed to setup vchan, %d", ret);
3399942ebb9SChengwen Feng 
3409942ebb9SChengwen Feng 	ret = rte_dma_stop(test_dev_id);
3419942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
3429942ebb9SChengwen Feng 
3439942ebb9SChengwen Feng 	return TEST_SUCCESS;
3449942ebb9SChengwen Feng }
3459942ebb9SChengwen Feng 
3469942ebb9SChengwen Feng static int
test_dma_reconfigure(void)347d95af53fSGowrishankar Muthukrishnan test_dma_reconfigure(void)
348d95af53fSGowrishankar Muthukrishnan {
349d95af53fSGowrishankar Muthukrishnan 	struct rte_dma_conf dev_conf = { 0 };
350d95af53fSGowrishankar Muthukrishnan 	struct rte_dma_info dev_info = { 0 };
351d95af53fSGowrishankar Muthukrishnan 	uint16_t cfg_vchans;
352d95af53fSGowrishankar Muthukrishnan 	int ret;
353d95af53fSGowrishankar Muthukrishnan 
354d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_info_get(test_dev_id, &dev_info);
355d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info, %d", ret);
356d95af53fSGowrishankar Muthukrishnan 
357d95af53fSGowrishankar Muthukrishnan 	/* At least two vchans required for the test */
358d95af53fSGowrishankar Muthukrishnan 	if (dev_info.max_vchans < 2)
359d95af53fSGowrishankar Muthukrishnan 		return TEST_SKIPPED;
360d95af53fSGowrishankar Muthukrishnan 
361d95af53fSGowrishankar Muthukrishnan 	/* Setup one vchan for later test */
362d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(1);
363d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
364d95af53fSGowrishankar Muthukrishnan 
365d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_start(test_dev_id);
366d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
367d95af53fSGowrishankar Muthukrishnan 
368d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_stop(test_dev_id);
369d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
370d95af53fSGowrishankar Muthukrishnan 
371d95af53fSGowrishankar Muthukrishnan 	/* Check reconfigure and vchan setup after device stopped */
372d95af53fSGowrishankar Muthukrishnan 	cfg_vchans = dev_conf.nb_vchans = (dev_info.max_vchans - 1);
373d95af53fSGowrishankar Muthukrishnan 
374d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(cfg_vchans);
375d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
376d95af53fSGowrishankar Muthukrishnan 
377d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_start(test_dev_id);
378d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
379d95af53fSGowrishankar Muthukrishnan 
380d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_info_get(test_dev_id, &dev_info);
381d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info, %d", ret);
382d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(dev_info.nb_vchans, cfg_vchans, "incorrect reconfiguration");
383d95af53fSGowrishankar Muthukrishnan 
384d95af53fSGowrishankar Muthukrishnan 	ret = rte_dma_stop(test_dev_id);
385d95af53fSGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
386d95af53fSGowrishankar Muthukrishnan 
387d95af53fSGowrishankar Muthukrishnan 	return TEST_SUCCESS;
388d95af53fSGowrishankar Muthukrishnan }
389d95af53fSGowrishankar Muthukrishnan 
390d95af53fSGowrishankar Muthukrishnan static int
test_dma_stats(void)3919942ebb9SChengwen Feng test_dma_stats(void)
3929942ebb9SChengwen Feng {
3939942ebb9SChengwen Feng 	struct rte_dma_info dev_info = { 0 };
3949942ebb9SChengwen Feng 	struct rte_dma_stats stats = { 0 };
3959942ebb9SChengwen Feng 	int ret;
3969942ebb9SChengwen Feng 
3979942ebb9SChengwen Feng 	/* Check for invalid parameters */
3989942ebb9SChengwen Feng 	ret = rte_dma_stats_get(invalid_dev_id, 0, &stats);
3999942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
4009942ebb9SChengwen Feng 	ret = rte_dma_stats_get(invalid_dev_id, 0, NULL);
4019942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
4029942ebb9SChengwen Feng 	ret = rte_dma_stats_reset(invalid_dev_id, 0);
4039942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
4049942ebb9SChengwen Feng 
4059942ebb9SChengwen Feng 	/* Setup one vchan for later test */
406d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(1);
4079942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
4089942ebb9SChengwen Feng 
4099942ebb9SChengwen Feng 	/* Check for invalid vchan */
4109942ebb9SChengwen Feng 	ret = rte_dma_info_get(test_dev_id, &dev_info);
4119942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info, %d", ret);
4129942ebb9SChengwen Feng 	ret = rte_dma_stats_get(test_dev_id, dev_info.max_vchans, &stats);
4139942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
4149942ebb9SChengwen Feng 	ret = rte_dma_stats_reset(test_dev_id, dev_info.max_vchans);
4159942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
4169942ebb9SChengwen Feng 
4179942ebb9SChengwen Feng 	/* Check for valid vchan */
4189942ebb9SChengwen Feng 	ret = rte_dma_stats_get(test_dev_id, 0, &stats);
4199942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get stats, %d", ret);
4209942ebb9SChengwen Feng 	ret = rte_dma_stats_get(test_dev_id, RTE_DMA_ALL_VCHAN, &stats);
4219942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get all stats, %d", ret);
4229942ebb9SChengwen Feng 	ret = rte_dma_stats_reset(test_dev_id, 0);
4239942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to reset stats, %d", ret);
4249942ebb9SChengwen Feng 	ret = rte_dma_stats_reset(test_dev_id, RTE_DMA_ALL_VCHAN);
4259942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to reset all stats, %d", ret);
4269942ebb9SChengwen Feng 
4279942ebb9SChengwen Feng 	return TEST_SUCCESS;
4289942ebb9SChengwen Feng }
4299942ebb9SChengwen Feng 
4309942ebb9SChengwen Feng static int
test_dma_dump(void)4319942ebb9SChengwen Feng test_dma_dump(void)
4329942ebb9SChengwen Feng {
4339942ebb9SChengwen Feng 	int ret;
4349942ebb9SChengwen Feng 
4359942ebb9SChengwen Feng 	/* Check for invalid parameters */
4369942ebb9SChengwen Feng 	ret = rte_dma_dump(invalid_dev_id, stderr);
4379942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Excepted -EINVAL, %d", ret);
4389942ebb9SChengwen Feng 	ret = rte_dma_dump(test_dev_id, NULL);
4399942ebb9SChengwen Feng 	RTE_TEST_ASSERT(ret == -EINVAL, "Excepted -EINVAL, %d", ret);
4409942ebb9SChengwen Feng 
4419942ebb9SChengwen Feng 	return TEST_SUCCESS;
4429942ebb9SChengwen Feng }
4439942ebb9SChengwen Feng 
4449942ebb9SChengwen Feng static void
setup_memory(void)4459942ebb9SChengwen Feng setup_memory(void)
4469942ebb9SChengwen Feng {
4479942ebb9SChengwen Feng 	int i;
4489942ebb9SChengwen Feng 
4499942ebb9SChengwen Feng 	for (i = 0; i < TEST_MEMCPY_SIZE; i++)
4509942ebb9SChengwen Feng 		src[i] = (char)i;
4519942ebb9SChengwen Feng 	memset(dst, 0, TEST_MEMCPY_SIZE);
4529942ebb9SChengwen Feng }
4539942ebb9SChengwen Feng 
4549942ebb9SChengwen Feng static int
verify_memory(void)4559942ebb9SChengwen Feng verify_memory(void)
4569942ebb9SChengwen Feng {
4579942ebb9SChengwen Feng 	int i;
4589942ebb9SChengwen Feng 
4599942ebb9SChengwen Feng 	for (i = 0; i < TEST_MEMCPY_SIZE; i++) {
4609942ebb9SChengwen Feng 		if (src[i] == dst[i])
4619942ebb9SChengwen Feng 			continue;
4629942ebb9SChengwen Feng 		RTE_TEST_ASSERT_EQUAL(src[i], dst[i],
4639942ebb9SChengwen Feng 			"Failed to copy memory, %d %d", src[i], dst[i]);
4649942ebb9SChengwen Feng 	}
4659942ebb9SChengwen Feng 
4669942ebb9SChengwen Feng 	return 0;
4679942ebb9SChengwen Feng }
4689942ebb9SChengwen Feng 
4692aba4f16SGowrishankar Muthukrishnan static void
sg_memory_setup(int n)4702aba4f16SGowrishankar Muthukrishnan sg_memory_setup(int n)
4712aba4f16SGowrishankar Muthukrishnan {
4722aba4f16SGowrishankar Muthukrishnan 	int i, j;
4732aba4f16SGowrishankar Muthukrishnan 
4742aba4f16SGowrishankar Muthukrishnan 	for (i = 0; i < n; i++) {
4752aba4f16SGowrishankar Muthukrishnan 		for (j = 0; j < TEST_MEMCPY_SIZE; j++)
4762aba4f16SGowrishankar Muthukrishnan 			src_sg[i][j] = (char)j;
4772aba4f16SGowrishankar Muthukrishnan 
4782aba4f16SGowrishankar Muthukrishnan 		memset(dst_sg[i], 0, TEST_MEMCPY_SIZE);
4792aba4f16SGowrishankar Muthukrishnan 	}
4802aba4f16SGowrishankar Muthukrishnan }
4812aba4f16SGowrishankar Muthukrishnan 
4822aba4f16SGowrishankar Muthukrishnan static int
sg_memory_verify(int n)4832aba4f16SGowrishankar Muthukrishnan sg_memory_verify(int n)
4842aba4f16SGowrishankar Muthukrishnan {
4852aba4f16SGowrishankar Muthukrishnan 	int i, j;
4862aba4f16SGowrishankar Muthukrishnan 
4872aba4f16SGowrishankar Muthukrishnan 	for (i = 0; i < n; i++) {
4882aba4f16SGowrishankar Muthukrishnan 		for (j = 0; j < TEST_MEMCPY_SIZE; j++) {
4892aba4f16SGowrishankar Muthukrishnan 			if (src_sg[i][j] == dst_sg[i][j])
4902aba4f16SGowrishankar Muthukrishnan 				continue;
4912aba4f16SGowrishankar Muthukrishnan 
4922aba4f16SGowrishankar Muthukrishnan 			RTE_TEST_ASSERT_EQUAL(src_sg[i][j], dst_sg[i][j], "Failed to copy memory, %d %d",
4932aba4f16SGowrishankar Muthukrishnan 				src_sg[i][j], dst_sg[i][j]);
4942aba4f16SGowrishankar Muthukrishnan 		}
4952aba4f16SGowrishankar Muthukrishnan 	}
4962aba4f16SGowrishankar Muthukrishnan 
4972aba4f16SGowrishankar Muthukrishnan 	return 0;
4982aba4f16SGowrishankar Muthukrishnan }
4992aba4f16SGowrishankar Muthukrishnan 
5009942ebb9SChengwen Feng static int
test_dma_completed(void)5019942ebb9SChengwen Feng test_dma_completed(void)
5029942ebb9SChengwen Feng {
5039942ebb9SChengwen Feng 	uint16_t last_idx = 1;
5049942ebb9SChengwen Feng 	bool has_error = true;
5059942ebb9SChengwen Feng 	uint16_t cpl_ret;
5069942ebb9SChengwen Feng 	int ret;
5079942ebb9SChengwen Feng 
5089942ebb9SChengwen Feng 	/* Setup one vchan for later test */
509d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(1);
5109942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
5119942ebb9SChengwen Feng 
5129942ebb9SChengwen Feng 	ret = rte_dma_start(test_dev_id);
5139942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
5149942ebb9SChengwen Feng 
5159942ebb9SChengwen Feng 	setup_memory();
5169942ebb9SChengwen Feng 
5179942ebb9SChengwen Feng 	/* Check enqueue without submit */
5189942ebb9SChengwen Feng 	ret = rte_dma_copy(test_dev_id, 0, (rte_iova_t)src, (rte_iova_t)dst,
5199942ebb9SChengwen Feng 			   TEST_MEMCPY_SIZE, 0);
5209942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to enqueue copy, %d", ret);
5219942ebb9SChengwen Feng 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
5229942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
5239942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 0, "Failed to get completed");
5249942ebb9SChengwen Feng 
5259942ebb9SChengwen Feng 	/* Check add submit */
5269942ebb9SChengwen Feng 	ret = rte_dma_submit(test_dev_id, 0);
5279942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to submit, %d", ret);
5289942ebb9SChengwen Feng 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
5299942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
5309942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to get completed");
5319942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(last_idx, 0, "Last idx should be zero, %u",
5329942ebb9SChengwen Feng 				last_idx);
5339942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(has_error, false, "Should have no error");
5349942ebb9SChengwen Feng 	ret = verify_memory();
5359942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to verify memory");
5369942ebb9SChengwen Feng 
5379942ebb9SChengwen Feng 	setup_memory();
5389942ebb9SChengwen Feng 
5399942ebb9SChengwen Feng 	/* Check for enqueue with submit */
5409942ebb9SChengwen Feng 	ret = rte_dma_copy(test_dev_id, 0, (rte_iova_t)src, (rte_iova_t)dst,
5419942ebb9SChengwen Feng 			   TEST_MEMCPY_SIZE, RTE_DMA_OP_FLAG_SUBMIT);
5429942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(ret, 1, "Failed to enqueue copy, %d", ret);
5439942ebb9SChengwen Feng 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
5449942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
5459942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to get completed");
5469942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(last_idx, 1, "Last idx should be 1, %u",
5479942ebb9SChengwen Feng 				last_idx);
5489942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(has_error, false, "Should have no error");
5499942ebb9SChengwen Feng 	ret = verify_memory();
5509942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to verify memory");
5519942ebb9SChengwen Feng 
5529942ebb9SChengwen Feng 	/* Stop dmadev to make sure dmadev to a known state */
5539942ebb9SChengwen Feng 	ret = rte_dma_stop(test_dev_id);
5549942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
5559942ebb9SChengwen Feng 
5569942ebb9SChengwen Feng 	return TEST_SUCCESS;
5579942ebb9SChengwen Feng }
5589942ebb9SChengwen Feng 
5599942ebb9SChengwen Feng static int
test_dma_completed_status(void)5609942ebb9SChengwen Feng test_dma_completed_status(void)
5619942ebb9SChengwen Feng {
5629942ebb9SChengwen Feng 	enum rte_dma_status_code status[1] = { 1 };
5639942ebb9SChengwen Feng 	uint16_t last_idx = 1;
5649942ebb9SChengwen Feng 	uint16_t cpl_ret, i;
5659942ebb9SChengwen Feng 	int ret;
5669942ebb9SChengwen Feng 
5679942ebb9SChengwen Feng 	/* Setup one vchan for later test */
568d95af53fSGowrishankar Muthukrishnan 	ret = setup_vchan(1);
5699942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
5709942ebb9SChengwen Feng 
5719942ebb9SChengwen Feng 	ret = rte_dma_start(test_dev_id);
5729942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
5739942ebb9SChengwen Feng 
5749942ebb9SChengwen Feng 	/* Check for enqueue with submit */
5759942ebb9SChengwen Feng 	ret = rte_dma_copy(test_dev_id, 0, (rte_iova_t)src, (rte_iova_t)dst,
5769942ebb9SChengwen Feng 			   TEST_MEMCPY_SIZE, RTE_DMA_OP_FLAG_SUBMIT);
5779942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to enqueue copy, %d", ret);
5789942ebb9SChengwen Feng 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
5799942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed_status(test_dev_id, 0, 1, &last_idx,
5809942ebb9SChengwen Feng 					   status);
5819942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to completed status");
5829942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(last_idx, 0, "Last idx should be zero, %u",
5839942ebb9SChengwen Feng 				last_idx);
5849942ebb9SChengwen Feng 	for (i = 0; i < RTE_DIM(status); i++)
5859942ebb9SChengwen Feng 		RTE_TEST_ASSERT_EQUAL(status[i], 0,
5869942ebb9SChengwen Feng 				"Failed to completed status, %d", status[i]);
5879942ebb9SChengwen Feng 
5889942ebb9SChengwen Feng 	/* Check do completed status again */
5899942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed_status(test_dev_id, 0, 1, &last_idx,
5909942ebb9SChengwen Feng 					   status);
5919942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 0, "Failed to completed status");
5929942ebb9SChengwen Feng 
5939942ebb9SChengwen Feng 	/* Check for enqueue with submit again */
5949942ebb9SChengwen Feng 	ret = rte_dma_copy(test_dev_id, 0, (rte_iova_t)src, (rte_iova_t)dst,
5959942ebb9SChengwen Feng 			   TEST_MEMCPY_SIZE, RTE_DMA_OP_FLAG_SUBMIT);
5969942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(ret, 1, "Failed to enqueue copy, %d", ret);
5979942ebb9SChengwen Feng 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
5989942ebb9SChengwen Feng 	cpl_ret = rte_dma_completed_status(test_dev_id, 0, 1, &last_idx,
5999942ebb9SChengwen Feng 					   status);
6009942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to completed status");
6019942ebb9SChengwen Feng 	RTE_TEST_ASSERT_EQUAL(last_idx, 1, "Last idx should be 1, %u",
6029942ebb9SChengwen Feng 				last_idx);
6039942ebb9SChengwen Feng 	for (i = 0; i < RTE_DIM(status); i++)
6049942ebb9SChengwen Feng 		RTE_TEST_ASSERT_EQUAL(status[i], 0,
6059942ebb9SChengwen Feng 				"Failed to completed status, %d", status[i]);
6069942ebb9SChengwen Feng 
6079942ebb9SChengwen Feng 	/* Stop dmadev to make sure dmadev to a known state */
6089942ebb9SChengwen Feng 	ret = rte_dma_stop(test_dev_id);
6099942ebb9SChengwen Feng 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
6109942ebb9SChengwen Feng 
6119942ebb9SChengwen Feng 	return TEST_SUCCESS;
6129942ebb9SChengwen Feng }
6139942ebb9SChengwen Feng 
6142aba4f16SGowrishankar Muthukrishnan static int
test_dma_sg(void)6152aba4f16SGowrishankar Muthukrishnan test_dma_sg(void)
6162aba4f16SGowrishankar Muthukrishnan {
6172aba4f16SGowrishankar Muthukrishnan 	struct rte_dma_sge src_sge[TEST_SG_MAX], dst_sge[TEST_SG_MAX];
6182aba4f16SGowrishankar Muthukrishnan 	struct rte_dma_info dev_info = { 0 };
6192aba4f16SGowrishankar Muthukrishnan 	uint16_t last_idx = -1;
6202aba4f16SGowrishankar Muthukrishnan 	bool has_error = true;
6212aba4f16SGowrishankar Muthukrishnan 	int n_sge, i, ret;
6222aba4f16SGowrishankar Muthukrishnan 	uint16_t cpl_ret;
6232aba4f16SGowrishankar Muthukrishnan 
6242aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_info_get(test_dev_id, &dev_info);
6252aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain device info, %d", ret);
6262aba4f16SGowrishankar Muthukrishnan 
6272aba4f16SGowrishankar Muthukrishnan 	if ((dev_info.dev_capa & RTE_DMA_CAPA_OPS_COPY_SG) == 0)
6282aba4f16SGowrishankar Muthukrishnan 		return TEST_SKIPPED;
6292aba4f16SGowrishankar Muthukrishnan 
6302aba4f16SGowrishankar Muthukrishnan 	n_sge = RTE_MIN(dev_info.max_sges, TEST_SG_MAX);
6312aba4f16SGowrishankar Muthukrishnan 
6322aba4f16SGowrishankar Muthukrishnan 	ret = setup_vchan(1);
6332aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup one vchan, %d", ret);
6342aba4f16SGowrishankar Muthukrishnan 
6352aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_start(test_dev_id);
6362aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to start, %d", ret);
6372aba4f16SGowrishankar Muthukrishnan 
6382aba4f16SGowrishankar Muthukrishnan 	for (i = 0; i < n_sge; i++) {
6392aba4f16SGowrishankar Muthukrishnan 		src_sge[i].addr = rte_malloc_virt2iova(src_sg[i]);
6402aba4f16SGowrishankar Muthukrishnan 		src_sge[i].length = TEST_MEMCPY_SIZE;
6412aba4f16SGowrishankar Muthukrishnan 		dst_sge[i].addr = rte_malloc_virt2iova(dst_sg[i]);
6422aba4f16SGowrishankar Muthukrishnan 		dst_sge[i].length = TEST_MEMCPY_SIZE;
6432aba4f16SGowrishankar Muthukrishnan 	}
6442aba4f16SGowrishankar Muthukrishnan 
6452aba4f16SGowrishankar Muthukrishnan 	sg_memory_setup(n_sge);
6462aba4f16SGowrishankar Muthukrishnan 
6472aba4f16SGowrishankar Muthukrishnan 	/* Check enqueue without submit */
6482aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_copy_sg(test_dev_id, 0, src_sge, dst_sge, n_sge, n_sge, 0);
6492aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to enqueue copy, %d", ret);
6502aba4f16SGowrishankar Muthukrishnan 
6512aba4f16SGowrishankar Muthukrishnan 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
6522aba4f16SGowrishankar Muthukrishnan 
6532aba4f16SGowrishankar Muthukrishnan 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
6542aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 0, "Failed to get completed");
6552aba4f16SGowrishankar Muthukrishnan 
6562aba4f16SGowrishankar Muthukrishnan 	/* Check DMA submit */
6572aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_submit(test_dev_id, 0);
6582aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to submit, %d", ret);
6592aba4f16SGowrishankar Muthukrishnan 
6602aba4f16SGowrishankar Muthukrishnan 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
6612aba4f16SGowrishankar Muthukrishnan 
6622aba4f16SGowrishankar Muthukrishnan 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
6632aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to get completed");
6642aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(last_idx, 0, "Last idx should be zero, %u", last_idx);
6652aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(has_error, false, "Should have no error");
6662aba4f16SGowrishankar Muthukrishnan 
6672aba4f16SGowrishankar Muthukrishnan 	ret = sg_memory_verify(n_sge);
6682aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to verify memory");
6692aba4f16SGowrishankar Muthukrishnan 
6702aba4f16SGowrishankar Muthukrishnan 	sg_memory_setup(n_sge);
6712aba4f16SGowrishankar Muthukrishnan 
6722aba4f16SGowrishankar Muthukrishnan 	/* Check for enqueue with submit */
6732aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_copy_sg(test_dev_id, 0, src_sge, dst_sge, n_sge, n_sge,
6742aba4f16SGowrishankar Muthukrishnan 			      RTE_DMA_OP_FLAG_SUBMIT);
6752aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(ret, 1, "Failed to enqueue copy, %d", ret);
6762aba4f16SGowrishankar Muthukrishnan 
6772aba4f16SGowrishankar Muthukrishnan 	rte_delay_us_sleep(TEST_WAIT_US_VAL);
6782aba4f16SGowrishankar Muthukrishnan 
6792aba4f16SGowrishankar Muthukrishnan 	cpl_ret = rte_dma_completed(test_dev_id, 0, 1, &last_idx, &has_error);
6802aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(cpl_ret, 1, "Failed to get completed");
6812aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(last_idx, 1, "Last idx should be 1, %u", last_idx);
6822aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_EQUAL(has_error, false, "Should have no error");
6832aba4f16SGowrishankar Muthukrishnan 
6842aba4f16SGowrishankar Muthukrishnan 	ret = sg_memory_verify(n_sge);
6852aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to verify memory");
6862aba4f16SGowrishankar Muthukrishnan 
6872aba4f16SGowrishankar Muthukrishnan 	/* Stop dmadev to make sure dmadev to a known state */
6882aba4f16SGowrishankar Muthukrishnan 	ret = rte_dma_stop(test_dev_id);
6892aba4f16SGowrishankar Muthukrishnan 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to stop, %d", ret);
6902aba4f16SGowrishankar Muthukrishnan 
6912aba4f16SGowrishankar Muthukrishnan 	return TEST_SUCCESS;
6922aba4f16SGowrishankar Muthukrishnan }
6932aba4f16SGowrishankar Muthukrishnan 
69414b477edSGowrishankar Muthukrishnan static struct unit_test_suite dma_api_testsuite = {
69514b477edSGowrishankar Muthukrishnan 	.suite_name = "DMA API Test Suite",
69614b477edSGowrishankar Muthukrishnan 	.setup = testsuite_setup,
69714b477edSGowrishankar Muthukrishnan 	.teardown = testsuite_teardown,
69814b477edSGowrishankar Muthukrishnan 	.unit_test_cases = {
69914b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_get_dev_id_by_name),
70014b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_is_valid_dev),
70114b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_count),
70214b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_info_get),
70314b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_configure),
70414b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_vchan_setup),
70514b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_start_stop),
706d95af53fSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_reconfigure),
70714b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_stats),
70814b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_dump),
70914b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_completed),
71014b477edSGowrishankar Muthukrishnan 		TEST_CASE(test_dma_completed_status),
7112aba4f16SGowrishankar Muthukrishnan 		TEST_CASE(test_dma_sg),
71214b477edSGowrishankar Muthukrishnan 		TEST_CASES_END()
71314b477edSGowrishankar Muthukrishnan 	}
71414b477edSGowrishankar Muthukrishnan };
71514b477edSGowrishankar Muthukrishnan 
7169942ebb9SChengwen Feng int
test_dma_api(uint16_t dev_id)7179942ebb9SChengwen Feng test_dma_api(uint16_t dev_id)
7189942ebb9SChengwen Feng {
71914b477edSGowrishankar Muthukrishnan 	struct rte_dma_info dev_info;
7209942ebb9SChengwen Feng 
72114b477edSGowrishankar Muthukrishnan 	if (rte_dma_info_get(dev_id, &dev_info) < 0)
72214b477edSGowrishankar Muthukrishnan 		return TEST_SKIPPED;
7239942ebb9SChengwen Feng 
72414b477edSGowrishankar Muthukrishnan 	printf("\n### Test dmadev infrastructure using %u [%s]\n", dev_id, dev_info.dev_name);
72514b477edSGowrishankar Muthukrishnan 	test_dev_id = dev_id;
72614b477edSGowrishankar Muthukrishnan 	return unit_test_suite_runner(&dma_api_testsuite);
7279942ebb9SChengwen Feng };
728