14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright 2017 NXP
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <rte_common.h>
64418919fSjohnjiang #include <rte_mbuf.h>
74418919fSjohnjiang #include <rte_malloc.h>
84418919fSjohnjiang #include <rte_memcpy.h>
94418919fSjohnjiang #include <rte_dev.h>
104418919fSjohnjiang #include <rte_rawdev.h>
114418919fSjohnjiang #include <rte_bus_vdev.h>
124418919fSjohnjiang #include <rte_test.h>
134418919fSjohnjiang 
144418919fSjohnjiang /* Using relative path as skeleton_rawdev is not part of exported headers */
154418919fSjohnjiang #include "skeleton_rawdev.h"
164418919fSjohnjiang 
174418919fSjohnjiang #define TEST_DEV_NAME "rawdev_skeleton"
184418919fSjohnjiang 
194418919fSjohnjiang #define SKELDEV_LOGS(level, fmt, args...) \
204418919fSjohnjiang 	rte_log(RTE_LOG_ ## level, skeleton_pmd_logtype, fmt "\n", \
214418919fSjohnjiang 		##args)
224418919fSjohnjiang 
234418919fSjohnjiang #define SKELDEV_TEST_INFO(fmt, args...) \
244418919fSjohnjiang 	SKELDEV_LOGS(INFO, fmt, ## args)
254418919fSjohnjiang #define SKELDEV_TEST_DEBUG(fmt, args...) \
264418919fSjohnjiang 	SKELDEV_LOGS(DEBUG, fmt, ## args)
274418919fSjohnjiang 
284418919fSjohnjiang #define SKELDEV_TEST_RUN(setup, teardown, test) \
294418919fSjohnjiang 	skeldev_test_run(setup, teardown, test, #test)
304418919fSjohnjiang 
314418919fSjohnjiang #define TEST_SUCCESS 0
324418919fSjohnjiang #define TEST_FAILED  -1
334418919fSjohnjiang 
344418919fSjohnjiang static int total;
354418919fSjohnjiang static int passed;
364418919fSjohnjiang static int failed;
374418919fSjohnjiang static int unsupported;
384418919fSjohnjiang 
394418919fSjohnjiang static uint16_t test_dev_id;
404418919fSjohnjiang 
414418919fSjohnjiang static int
testsuite_setup(void)424418919fSjohnjiang testsuite_setup(void)
434418919fSjohnjiang {
444418919fSjohnjiang 	uint8_t count;
450c6bd470Sfengbojiang 
460c6bd470Sfengbojiang 	total = 0;
470c6bd470Sfengbojiang 	passed = 0;
480c6bd470Sfengbojiang 	failed = 0;
490c6bd470Sfengbojiang 	unsupported = 0;
500c6bd470Sfengbojiang 
514418919fSjohnjiang 	count = rte_rawdev_count();
524418919fSjohnjiang 	if (!count) {
534418919fSjohnjiang 		SKELDEV_TEST_INFO("\tNo existing rawdev; "
544418919fSjohnjiang 				  "Creating 'skeldev_rawdev'");
554418919fSjohnjiang 		return rte_vdev_init(TEST_DEV_NAME, NULL);
564418919fSjohnjiang 	}
574418919fSjohnjiang 
584418919fSjohnjiang 	return TEST_SUCCESS;
594418919fSjohnjiang }
604418919fSjohnjiang 
614418919fSjohnjiang static void local_teardown(void);
624418919fSjohnjiang 
634418919fSjohnjiang static void
testsuite_teardown(void)644418919fSjohnjiang testsuite_teardown(void)
654418919fSjohnjiang {
664418919fSjohnjiang 	local_teardown();
674418919fSjohnjiang }
684418919fSjohnjiang 
694418919fSjohnjiang static void
local_teardown(void)704418919fSjohnjiang local_teardown(void)
714418919fSjohnjiang {
724418919fSjohnjiang 	rte_vdev_uninit(TEST_DEV_NAME);
734418919fSjohnjiang }
744418919fSjohnjiang 
754418919fSjohnjiang static int
test_rawdev_count(void)764418919fSjohnjiang test_rawdev_count(void)
774418919fSjohnjiang {
784418919fSjohnjiang 	uint8_t count;
794418919fSjohnjiang 	count = rte_rawdev_count();
804418919fSjohnjiang 	RTE_TEST_ASSERT(count > 0, "Invalid rawdev count %" PRIu8, count);
814418919fSjohnjiang 	return TEST_SUCCESS;
824418919fSjohnjiang }
834418919fSjohnjiang 
844418919fSjohnjiang static int
test_rawdev_get_dev_id(void)854418919fSjohnjiang test_rawdev_get_dev_id(void)
864418919fSjohnjiang {
874418919fSjohnjiang 	int ret;
884418919fSjohnjiang 	ret = rte_rawdev_get_dev_id("invalid_rawdev_device");
894418919fSjohnjiang 	RTE_TEST_ASSERT_FAIL(ret, "Expected <0 for invalid dev name ret=%d",
904418919fSjohnjiang 			     ret);
914418919fSjohnjiang 	return TEST_SUCCESS;
924418919fSjohnjiang }
934418919fSjohnjiang 
944418919fSjohnjiang static int
test_rawdev_socket_id(void)954418919fSjohnjiang test_rawdev_socket_id(void)
964418919fSjohnjiang {
974418919fSjohnjiang 	int socket_id;
984418919fSjohnjiang 	socket_id = rte_rawdev_socket_id(test_dev_id);
994418919fSjohnjiang 	RTE_TEST_ASSERT(socket_id != -EINVAL,
1004418919fSjohnjiang 			"Failed to get socket_id %d", socket_id);
1014418919fSjohnjiang 	socket_id = rte_rawdev_socket_id(RTE_RAWDEV_MAX_DEVS);
1024418919fSjohnjiang 	RTE_TEST_ASSERT(socket_id == -EINVAL,
1034418919fSjohnjiang 			"Expected -EINVAL %d", socket_id);
1044418919fSjohnjiang 
1054418919fSjohnjiang 	return TEST_SUCCESS;
1064418919fSjohnjiang }
1074418919fSjohnjiang 
1084418919fSjohnjiang static int
test_rawdev_info_get(void)1094418919fSjohnjiang test_rawdev_info_get(void)
1104418919fSjohnjiang {
1114418919fSjohnjiang 	int ret;
1124418919fSjohnjiang 	struct rte_rawdev_info rdev_info = {0};
1134418919fSjohnjiang 	struct skeleton_rawdev_conf skel_conf = {0};
1144418919fSjohnjiang 
115*2d9fd380Sjfb8856606 	ret = rte_rawdev_info_get(test_dev_id, NULL, 0);
1164418919fSjohnjiang 	RTE_TEST_ASSERT(ret == -EINVAL, "Expected -EINVAL, %d", ret);
1174418919fSjohnjiang 
1184418919fSjohnjiang 	rdev_info.dev_private = &skel_conf;
1194418919fSjohnjiang 
120*2d9fd380Sjfb8856606 	ret = rte_rawdev_info_get(test_dev_id, &rdev_info, sizeof(skel_conf));
1214418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get raw dev info");
1224418919fSjohnjiang 
1234418919fSjohnjiang 	return TEST_SUCCESS;
1244418919fSjohnjiang }
1254418919fSjohnjiang 
1264418919fSjohnjiang static int
test_rawdev_configure(void)1274418919fSjohnjiang test_rawdev_configure(void)
1284418919fSjohnjiang {
1294418919fSjohnjiang 	int ret;
1304418919fSjohnjiang 	struct rte_rawdev_info rdev_info = {0};
1314418919fSjohnjiang 	struct skeleton_rawdev_conf rdev_conf_set = {0};
1324418919fSjohnjiang 	struct skeleton_rawdev_conf rdev_conf_get = {0};
1334418919fSjohnjiang 
1344418919fSjohnjiang 	/* Check invalid configuration */
135*2d9fd380Sjfb8856606 	ret = rte_rawdev_configure(test_dev_id, NULL, 0);
1364418919fSjohnjiang 	RTE_TEST_ASSERT(ret == -EINVAL,
1374418919fSjohnjiang 			"Null configure; Expected -EINVAL, got %d", ret);
1384418919fSjohnjiang 
1394418919fSjohnjiang 	/* Valid configuration test */
1404418919fSjohnjiang 	rdev_conf_set.num_queues = 1;
1414418919fSjohnjiang 	rdev_conf_set.capabilities = SKELETON_CAPA_FW_LOAD |
1424418919fSjohnjiang 				     SKELETON_CAPA_FW_RESET;
1434418919fSjohnjiang 
1444418919fSjohnjiang 	rdev_info.dev_private = &rdev_conf_set;
1454418919fSjohnjiang 	ret = rte_rawdev_configure(test_dev_id,
146*2d9fd380Sjfb8856606 				   (rte_rawdev_obj_t)&rdev_info,
147*2d9fd380Sjfb8856606 				   sizeof(rdev_conf_set));
1484418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure rawdev (%d)", ret);
1494418919fSjohnjiang 
1504418919fSjohnjiang 	rdev_info.dev_private = &rdev_conf_get;
1514418919fSjohnjiang 	ret = rte_rawdev_info_get(test_dev_id,
152*2d9fd380Sjfb8856606 				  (rte_rawdev_obj_t)&rdev_info,
153*2d9fd380Sjfb8856606 				  sizeof(rdev_conf_get));
1544418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret,
1554418919fSjohnjiang 				"Failed to obtain rawdev configuration (%d)",
1564418919fSjohnjiang 				ret);
1574418919fSjohnjiang 
1584418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(rdev_conf_set.num_queues,
1594418919fSjohnjiang 			      rdev_conf_get.num_queues,
1604418919fSjohnjiang 			      "Configuration test failed; num_queues (%d)(%d)",
1614418919fSjohnjiang 			      rdev_conf_set.num_queues,
1624418919fSjohnjiang 			      rdev_conf_get.num_queues);
1634418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(rdev_conf_set.capabilities,
1644418919fSjohnjiang 			  rdev_conf_get.capabilities,
1654418919fSjohnjiang 			  "Configuration test failed; capabilities");
1664418919fSjohnjiang 
1674418919fSjohnjiang 	return TEST_SUCCESS;
1684418919fSjohnjiang }
1694418919fSjohnjiang 
1704418919fSjohnjiang static int
test_rawdev_queue_default_conf_get(void)1714418919fSjohnjiang test_rawdev_queue_default_conf_get(void)
1724418919fSjohnjiang {
1734418919fSjohnjiang 	int ret, i;
1744418919fSjohnjiang 	struct rte_rawdev_info rdev_info = {0};
1754418919fSjohnjiang 	struct skeleton_rawdev_conf rdev_conf_get = {0};
1764418919fSjohnjiang 	struct skeleton_rawdev_queue q = {0};
1774418919fSjohnjiang 
1784418919fSjohnjiang 	/* Get the current configuration */
1794418919fSjohnjiang 	rdev_info.dev_private = &rdev_conf_get;
1804418919fSjohnjiang 	ret = rte_rawdev_info_get(test_dev_id,
181*2d9fd380Sjfb8856606 				  (rte_rawdev_obj_t)&rdev_info,
182*2d9fd380Sjfb8856606 				  sizeof(rdev_conf_get));
1834418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to obtain rawdev configuration (%d)",
1844418919fSjohnjiang 				ret);
1854418919fSjohnjiang 
1864418919fSjohnjiang 	/* call to test_rawdev_configure would have set the num_queues = 1 */
1874418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(!(rdev_conf_get.num_queues > 0),
1884418919fSjohnjiang 				"Invalid number of queues (%d). Expected 1",
1894418919fSjohnjiang 				rdev_conf_get.num_queues);
1904418919fSjohnjiang 	/* All queues by default should have state = DETACH and
1914418919fSjohnjiang 	 * depth = DEF_DEPTH
1924418919fSjohnjiang 	 */
1934418919fSjohnjiang 	for (i = 0; i < rdev_conf_get.num_queues; i++) {
194*2d9fd380Sjfb8856606 		rte_rawdev_queue_conf_get(test_dev_id, i, &q, sizeof(q));
1954418919fSjohnjiang 		RTE_TEST_ASSERT_EQUAL(q.depth, SKELETON_QUEUE_DEF_DEPTH,
1964418919fSjohnjiang 				      "Invalid default depth of queue (%d)",
1974418919fSjohnjiang 				      q.depth);
1984418919fSjohnjiang 		RTE_TEST_ASSERT_EQUAL(q.state, SKELETON_QUEUE_DETACH,
1994418919fSjohnjiang 				      "Invalid default state of queue (%d)",
2004418919fSjohnjiang 				      q.state);
2014418919fSjohnjiang 	}
2024418919fSjohnjiang 
2034418919fSjohnjiang 	return TEST_SUCCESS;
2044418919fSjohnjiang }
2054418919fSjohnjiang 
2064418919fSjohnjiang static int
test_rawdev_queue_count(void)2074418919fSjohnjiang test_rawdev_queue_count(void)
2084418919fSjohnjiang {
2094418919fSjohnjiang 	unsigned int q_count;
2104418919fSjohnjiang 
2114418919fSjohnjiang 	/* Get the current configuration */
2124418919fSjohnjiang 	q_count = rte_rawdev_queue_count(test_dev_id);
2134418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(q_count, 1, "Invalid queue count (%d)", q_count);
2144418919fSjohnjiang 
2154418919fSjohnjiang 	return TEST_SUCCESS;
2164418919fSjohnjiang }
2174418919fSjohnjiang 
2184418919fSjohnjiang static int
test_rawdev_queue_setup(void)2194418919fSjohnjiang test_rawdev_queue_setup(void)
2204418919fSjohnjiang {
2214418919fSjohnjiang 	int ret;
2224418919fSjohnjiang 	struct rte_rawdev_info rdev_info = {0};
2234418919fSjohnjiang 	struct skeleton_rawdev_conf rdev_conf_get = {0};
2244418919fSjohnjiang 	struct skeleton_rawdev_queue qset = {0};
2254418919fSjohnjiang 	struct skeleton_rawdev_queue qget = {0};
2264418919fSjohnjiang 
2274418919fSjohnjiang 	/* Get the current configuration */
2284418919fSjohnjiang 	rdev_info.dev_private = &rdev_conf_get;
2294418919fSjohnjiang 	ret = rte_rawdev_info_get(test_dev_id,
230*2d9fd380Sjfb8856606 				  (rte_rawdev_obj_t)&rdev_info,
231*2d9fd380Sjfb8856606 				  sizeof(rdev_conf_get));
2324418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret,
2334418919fSjohnjiang 				"Failed to obtain rawdev configuration (%d)",
2344418919fSjohnjiang 				ret);
2354418919fSjohnjiang 
2364418919fSjohnjiang 	/* call to test_rawdev_configure would have set the num_queues = 1 */
2374418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(!(rdev_conf_get.num_queues > 0),
2384418919fSjohnjiang 				"Invalid number of queues (%d). Expected 1",
2394418919fSjohnjiang 				rdev_conf_get.num_queues);
2404418919fSjohnjiang 
2414418919fSjohnjiang 	/* Modify the queue depth for Queue 0 and attach it */
2424418919fSjohnjiang 	qset.depth = 15;
2434418919fSjohnjiang 	qset.state = SKELETON_QUEUE_ATTACH;
244*2d9fd380Sjfb8856606 	ret = rte_rawdev_queue_setup(test_dev_id, 0, &qset, sizeof(qset));
2454418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to setup queue (%d)", ret);
2464418919fSjohnjiang 
2474418919fSjohnjiang 	/* Now, fetching the queue 0 should show depth as 15 */
248*2d9fd380Sjfb8856606 	ret = rte_rawdev_queue_conf_get(test_dev_id, 0, &qget, sizeof(qget));
2494418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get queue config (%d)", ret);
2504418919fSjohnjiang 
2514418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(qset.depth, qget.depth,
2524418919fSjohnjiang 			      "Failed to set queue depth: Need(%d), has(%d)",
2534418919fSjohnjiang 			      qset.depth, qget.depth);
2544418919fSjohnjiang 
2554418919fSjohnjiang 	return TEST_SUCCESS;
2564418919fSjohnjiang }
2574418919fSjohnjiang 
2584418919fSjohnjiang /* After executing test_rawdev_queue_setup, queue_id=0 would have depth as 15.
2594418919fSjohnjiang  * Releasing should set it back to default. state would set to DETACH
2604418919fSjohnjiang  */
2614418919fSjohnjiang static int
test_rawdev_queue_release(void)2624418919fSjohnjiang test_rawdev_queue_release(void)
2634418919fSjohnjiang {
2644418919fSjohnjiang 	int ret;
2654418919fSjohnjiang 	struct skeleton_rawdev_queue qget = {0};
2664418919fSjohnjiang 
2674418919fSjohnjiang 	/* Now, fetching the queue 0 should show depth as 100 */
2684418919fSjohnjiang 	ret = rte_rawdev_queue_release(test_dev_id, 0);
2694418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to release queue 0; (%d)", ret);
2704418919fSjohnjiang 
2714418919fSjohnjiang 	/* Now, fetching the queue 0 should show depth as default */
272*2d9fd380Sjfb8856606 	ret = rte_rawdev_queue_conf_get(test_dev_id, 0, &qget, sizeof(qget));
2734418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get queue config (%d)", ret);
2744418919fSjohnjiang 
2754418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(qget.depth, SKELETON_QUEUE_DEF_DEPTH,
2764418919fSjohnjiang 			      "Release of Queue 0 failed; (depth)");
2774418919fSjohnjiang 
2784418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(qget.state, SKELETON_QUEUE_DETACH,
2794418919fSjohnjiang 			      "Release of Queue 0 failed; (state)");
2804418919fSjohnjiang 
2814418919fSjohnjiang 	return TEST_SUCCESS;
2824418919fSjohnjiang }
2834418919fSjohnjiang 
2844418919fSjohnjiang static int
test_rawdev_attr_set_get(void)2854418919fSjohnjiang test_rawdev_attr_set_get(void)
2864418919fSjohnjiang {
2874418919fSjohnjiang 	int ret;
2884418919fSjohnjiang 	int *dummy_value, set_value;
2894418919fSjohnjiang 	uint64_t ret_value;
2904418919fSjohnjiang 
2914418919fSjohnjiang 	/* Set an attribute and fetch it */
2924418919fSjohnjiang 	ret = rte_rawdev_set_attr(test_dev_id, "Test1", 100);
2934418919fSjohnjiang 	RTE_TEST_ASSERT(!ret, "Unable to set an attribute (Test1)");
2944418919fSjohnjiang 
2954418919fSjohnjiang 	dummy_value = &set_value;
2964418919fSjohnjiang 	*dummy_value = 200;
2974418919fSjohnjiang 	ret = rte_rawdev_set_attr(test_dev_id, "Test2", (uintptr_t)dummy_value);
2984418919fSjohnjiang 
2994418919fSjohnjiang 	/* Check if attributes have been set */
3004418919fSjohnjiang 	ret = rte_rawdev_get_attr(test_dev_id, "Test1", &ret_value);
3014418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(ret_value, 100,
3024418919fSjohnjiang 			      "Attribute (Test1) not set correctly (%" PRIu64 ")",
3034418919fSjohnjiang 			      ret_value);
3044418919fSjohnjiang 
3054418919fSjohnjiang 	ret_value = 0;
3064418919fSjohnjiang 	ret = rte_rawdev_get_attr(test_dev_id, "Test2", &ret_value);
3074418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(*((int *)(uintptr_t)ret_value), set_value,
3084418919fSjohnjiang 			      "Attribute (Test2) not set correctly (%" PRIu64 ")",
3094418919fSjohnjiang 			      ret_value);
3104418919fSjohnjiang 
3114418919fSjohnjiang 	return TEST_SUCCESS;
3124418919fSjohnjiang }
3134418919fSjohnjiang 
3144418919fSjohnjiang static int
test_rawdev_start_stop(void)3154418919fSjohnjiang test_rawdev_start_stop(void)
3164418919fSjohnjiang {
3174418919fSjohnjiang 	int ret;
3184418919fSjohnjiang 	struct rte_rawdev_info rdev_info = {0};
3194418919fSjohnjiang 	struct skeleton_rawdev_conf rdev_conf_get = {0};
3204418919fSjohnjiang 	char *dummy_firmware = NULL;
3214418919fSjohnjiang 
3224418919fSjohnjiang 	/* Get the current configuration */
3234418919fSjohnjiang 	rdev_info.dev_private = &rdev_conf_get;
3244418919fSjohnjiang 
3254418919fSjohnjiang 	/* Load a firmware using a dummy address area */
3264418919fSjohnjiang 	dummy_firmware = rte_zmalloc("RAWDEV SKELETON", sizeof(int) * 10, 0);
3274418919fSjohnjiang 	RTE_TEST_ASSERT(dummy_firmware != NULL,
3284418919fSjohnjiang 			"Failed to create firmware memory backing");
3294418919fSjohnjiang 
3304418919fSjohnjiang 	ret = rte_rawdev_firmware_load(test_dev_id, dummy_firmware);
3314418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Firmware loading failed (%d)", ret);
3324418919fSjohnjiang 
3334418919fSjohnjiang 	/* Skeleton doesn't do anything with the firmware area - that is dummy
3344418919fSjohnjiang 	 * and can be removed.
3354418919fSjohnjiang 	 */
3364418919fSjohnjiang 	rte_free(dummy_firmware);
3374418919fSjohnjiang 	dummy_firmware = NULL;
3384418919fSjohnjiang 
3394418919fSjohnjiang 	rte_rawdev_start(test_dev_id);
340*2d9fd380Sjfb8856606 	ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info,
341*2d9fd380Sjfb8856606 			sizeof(rdev_conf_get));
3424418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret,
3434418919fSjohnjiang 				"Failed to obtain rawdev configuration (%d)",
3444418919fSjohnjiang 				ret);
3454418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(rdev_conf_get.device_state, SKELETON_DEV_RUNNING,
3464418919fSjohnjiang 			      "Device start failed. State is (%d)",
3474418919fSjohnjiang 			      rdev_conf_get.device_state);
3484418919fSjohnjiang 
3494418919fSjohnjiang 	rte_rawdev_stop(test_dev_id);
350*2d9fd380Sjfb8856606 	ret = rte_rawdev_info_get(test_dev_id, (rte_rawdev_obj_t)&rdev_info,
351*2d9fd380Sjfb8856606 			sizeof(rdev_conf_get));
3524418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret,
3534418919fSjohnjiang 				"Failed to obtain rawdev configuration (%d)",
3544418919fSjohnjiang 				ret);
3554418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL(rdev_conf_get.device_state, SKELETON_DEV_STOPPED,
3564418919fSjohnjiang 			      "Device stop failed. State is (%d)",
3574418919fSjohnjiang 			      rdev_conf_get.device_state);
3584418919fSjohnjiang 
3594418919fSjohnjiang 	/* Unloading the firmware once device is stopped */
3604418919fSjohnjiang 	ret = rte_rawdev_firmware_unload(test_dev_id);
3614418919fSjohnjiang 	RTE_TEST_ASSERT_SUCCESS(ret, "Failed to unload firmware (%d)", ret);
3624418919fSjohnjiang 
3634418919fSjohnjiang 	return TEST_SUCCESS;
3644418919fSjohnjiang }
3654418919fSjohnjiang 
3664418919fSjohnjiang static int
test_rawdev_enqdeq(void)3674418919fSjohnjiang test_rawdev_enqdeq(void)
3684418919fSjohnjiang {
3694418919fSjohnjiang 	int ret;
3704418919fSjohnjiang 	unsigned int count = 1;
3714418919fSjohnjiang 	uint16_t queue_id = 0;
3724418919fSjohnjiang 	struct rte_rawdev_buf buffers[1];
3734418919fSjohnjiang 	struct rte_rawdev_buf *deq_buffers = NULL;
3744418919fSjohnjiang 
3754418919fSjohnjiang 	buffers[0].buf_addr = malloc(strlen(TEST_DEV_NAME) + 3);
3764418919fSjohnjiang 	if (!buffers[0].buf_addr)
3774418919fSjohnjiang 		goto cleanup;
3784418919fSjohnjiang 	snprintf(buffers[0].buf_addr, strlen(TEST_DEV_NAME) + 2, "%s%d",
3794418919fSjohnjiang 		 TEST_DEV_NAME, 0);
3804418919fSjohnjiang 
3814418919fSjohnjiang 	ret = rte_rawdev_enqueue_buffers(test_dev_id,
3824418919fSjohnjiang 					 (struct rte_rawdev_buf **)&buffers,
3834418919fSjohnjiang 					 count, &queue_id);
3844418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL((unsigned int)ret, count,
3854418919fSjohnjiang 			      "Unable to enqueue buffers");
3864418919fSjohnjiang 
3874418919fSjohnjiang 	deq_buffers = malloc(sizeof(struct rte_rawdev_buf) * count);
3884418919fSjohnjiang 	if (!deq_buffers)
3894418919fSjohnjiang 		goto cleanup;
3904418919fSjohnjiang 
3914418919fSjohnjiang 	ret = rte_rawdev_dequeue_buffers(test_dev_id,
3924418919fSjohnjiang 					(struct rte_rawdev_buf **)&deq_buffers,
3934418919fSjohnjiang 					count, &queue_id);
3944418919fSjohnjiang 	RTE_TEST_ASSERT_EQUAL((unsigned int)ret, count,
3954418919fSjohnjiang 			      "Unable to dequeue buffers");
3964418919fSjohnjiang 
3974418919fSjohnjiang 	if (deq_buffers)
3984418919fSjohnjiang 		free(deq_buffers);
3994418919fSjohnjiang 
4004418919fSjohnjiang 	return TEST_SUCCESS;
4014418919fSjohnjiang cleanup:
4024418919fSjohnjiang 	if (buffers[0].buf_addr)
4034418919fSjohnjiang 		free(buffers[0].buf_addr);
4044418919fSjohnjiang 
4054418919fSjohnjiang 	return TEST_FAILED;
4064418919fSjohnjiang }
4074418919fSjohnjiang 
skeldev_test_run(int (* setup)(void),void (* teardown)(void),int (* test)(void),const char * name)4084418919fSjohnjiang static void skeldev_test_run(int (*setup)(void),
4094418919fSjohnjiang 			     void (*teardown)(void),
4104418919fSjohnjiang 			     int (*test)(void),
4114418919fSjohnjiang 			     const char *name)
4124418919fSjohnjiang {
4134418919fSjohnjiang 	int ret = 0;
4144418919fSjohnjiang 
4154418919fSjohnjiang 	if (setup) {
4164418919fSjohnjiang 		ret = setup();
4174418919fSjohnjiang 		if (ret < 0) {
4184418919fSjohnjiang 			SKELDEV_TEST_INFO("Error setting up test %s", name);
4194418919fSjohnjiang 			unsupported++;
4204418919fSjohnjiang 		}
4214418919fSjohnjiang 	}
4224418919fSjohnjiang 
4234418919fSjohnjiang 	if (test) {
4244418919fSjohnjiang 		ret = test();
4254418919fSjohnjiang 		if (ret < 0) {
4264418919fSjohnjiang 			failed++;
4274418919fSjohnjiang 			SKELDEV_TEST_INFO("%s Failed", name);
4284418919fSjohnjiang 		} else {
4294418919fSjohnjiang 			passed++;
4304418919fSjohnjiang 			SKELDEV_TEST_DEBUG("%s Passed", name);
4314418919fSjohnjiang 		}
4324418919fSjohnjiang 	}
4334418919fSjohnjiang 
4344418919fSjohnjiang 	if (teardown)
4354418919fSjohnjiang 		teardown();
4364418919fSjohnjiang 
4374418919fSjohnjiang 	total++;
4384418919fSjohnjiang }
4394418919fSjohnjiang 
4404418919fSjohnjiang int
test_rawdev_skeldev(uint16_t dev_id)4414418919fSjohnjiang test_rawdev_skeldev(uint16_t dev_id)
4424418919fSjohnjiang {
4434418919fSjohnjiang 	test_dev_id = dev_id;
4444418919fSjohnjiang 	testsuite_setup();
4454418919fSjohnjiang 
4464418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_count);
4474418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_get_dev_id);
4484418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_socket_id);
4494418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_info_get);
4504418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_configure);
4514418919fSjohnjiang 	SKELDEV_TEST_RUN(test_rawdev_configure, NULL,
4524418919fSjohnjiang 			 test_rawdev_queue_default_conf_get);
4534418919fSjohnjiang 	SKELDEV_TEST_RUN(test_rawdev_configure, NULL, test_rawdev_queue_setup);
4544418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_queue_count);
4554418919fSjohnjiang 	SKELDEV_TEST_RUN(test_rawdev_queue_setup, NULL,
4564418919fSjohnjiang 			 test_rawdev_queue_release);
4574418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_attr_set_get);
4584418919fSjohnjiang 	SKELDEV_TEST_RUN(NULL, NULL, test_rawdev_start_stop);
4594418919fSjohnjiang 	SKELDEV_TEST_RUN(test_rawdev_queue_setup, NULL, test_rawdev_enqdeq);
4604418919fSjohnjiang 
4614418919fSjohnjiang 	testsuite_teardown();
4624418919fSjohnjiang 
4634418919fSjohnjiang 	SKELDEV_TEST_INFO("Total tests   : %d", total);
4644418919fSjohnjiang 	SKELDEV_TEST_INFO("Passed        : %d", passed);
4654418919fSjohnjiang 	SKELDEV_TEST_INFO("Failed        : %d", failed);
4664418919fSjohnjiang 	SKELDEV_TEST_INFO("Not supported : %d", unsupported);
4674418919fSjohnjiang 
4684418919fSjohnjiang 	if (failed)
4694418919fSjohnjiang 		return -1;
4704418919fSjohnjiang 
4714418919fSjohnjiang 	return 0;
4724418919fSjohnjiang };
473