1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Intel Corporation
8 #include "rte_rawdev.h"
9 #include "rte_ioat_rawdev.h"
11 #define MAX_SUPPORTED_RAWDEVS 64
12 #define TEST_SKIPPED 77
14 int ioat_rawdev_test(uint16_t dev_id); /* pre-define to keep compiler happy */
16 static struct rte_mempool *pool;
17 static unsigned short expected_ring_size[MAX_SUPPORTED_RAWDEVS];
20 test_enqueue_copies(int dev_id)
22 const unsigned int length = 1024;
26 struct rte_mbuf *src, *dst;
27 char *src_data, *dst_data;
28 struct rte_mbuf *completed[2] = {0};
30 /* test doing a single copy */
31 src = rte_pktmbuf_alloc(pool);
32 dst = rte_pktmbuf_alloc(pool);
33 src->data_len = src->pkt_len = length;
34 dst->data_len = dst->pkt_len = length;
35 src_data = rte_pktmbuf_mtod(src, char *);
36 dst_data = rte_pktmbuf_mtod(dst, char *);
38 for (i = 0; i < length; i++)
39 src_data[i] = rand() & 0xFF;
41 if (rte_ioat_enqueue_copy(dev_id,
42 src->buf_iova + src->data_off,
43 dst->buf_iova + dst->data_off,
47 0 /* no fence */) != 1) {
48 printf("Error with rte_ioat_enqueue_copy\n");
51 rte_ioat_do_copies(dev_id);
54 if (rte_ioat_completed_copies(dev_id, 1, (void *)&completed[0],
55 (void *)&completed[1]) != 1) {
56 printf("Error with rte_ioat_completed_copies\n");
59 if (completed[0] != src || completed[1] != dst) {
60 printf("Error with completions: got (%p, %p), not (%p,%p)\n",
61 completed[0], completed[1], src, dst);
65 for (i = 0; i < length; i++)
66 if (dst_data[i] != src_data[i]) {
67 printf("Data mismatch at char %u\n", i);
70 rte_pktmbuf_free(src);
71 rte_pktmbuf_free(dst);
74 /* test doing multiple copies */
76 struct rte_mbuf *srcs[32], *dsts[32];
77 struct rte_mbuf *completed_src[64];
78 struct rte_mbuf *completed_dst[64];
81 for (i = 0; i < RTE_DIM(srcs); i++) {
84 srcs[i] = rte_pktmbuf_alloc(pool);
85 dsts[i] = rte_pktmbuf_alloc(pool);
86 srcs[i]->data_len = srcs[i]->pkt_len = length;
87 dsts[i]->data_len = dsts[i]->pkt_len = length;
88 src_data = rte_pktmbuf_mtod(srcs[i], char *);
90 for (j = 0; j < length; j++)
91 src_data[j] = rand() & 0xFF;
93 if (rte_ioat_enqueue_copy(dev_id,
94 srcs[i]->buf_iova + srcs[i]->data_off,
95 dsts[i]->buf_iova + dsts[i]->data_off,
99 0 /* nofence */) != 1) {
100 printf("Error with rte_ioat_enqueue_copy for buffer %u\n",
105 rte_ioat_do_copies(dev_id);
108 if (rte_ioat_completed_copies(dev_id, 64, (void *)completed_src,
109 (void *)completed_dst) != RTE_DIM(srcs)) {
110 printf("Error with rte_ioat_completed_copies\n");
113 for (i = 0; i < RTE_DIM(srcs); i++) {
114 char *src_data, *dst_data;
116 if (completed_src[i] != srcs[i]) {
117 printf("Error with source pointer %u\n", i);
120 if (completed_dst[i] != dsts[i]) {
121 printf("Error with dest pointer %u\n", i);
125 src_data = rte_pktmbuf_mtod(srcs[i], char *);
126 dst_data = rte_pktmbuf_mtod(dsts[i], char *);
127 for (j = 0; j < length; j++)
128 if (src_data[j] != dst_data[j]) {
129 printf("Error with copy of packet %u, byte %u\n",
133 rte_pktmbuf_free(srcs[i]);
134 rte_pktmbuf_free(dsts[i]);
143 ioat_rawdev_test(uint16_t dev_id)
145 #define IOAT_TEST_RINGSIZE 512
146 struct rte_ioat_rawdev_config p = { .ring_size = -1 };
147 struct rte_rawdev_info info = { .dev_private = &p };
148 struct rte_rawdev_xstats_name *snames = NULL;
149 uint64_t *stats = NULL;
150 unsigned int *ids = NULL;
151 unsigned int nb_xstats;
154 if (dev_id >= MAX_SUPPORTED_RAWDEVS) {
155 printf("Skipping test. Cannot test rawdevs with id's greater than %d\n",
156 MAX_SUPPORTED_RAWDEVS);
160 rte_rawdev_info_get(dev_id, &info, sizeof(p));
161 if (p.ring_size != expected_ring_size[dev_id]) {
162 printf("Error, initial ring size is not as expected (Actual: %d, Expected: %d)\n",
163 (int)p.ring_size, expected_ring_size[dev_id]);
167 p.ring_size = IOAT_TEST_RINGSIZE;
168 if (rte_rawdev_configure(dev_id, &info, sizeof(p)) != 0) {
169 printf("Error with rte_rawdev_configure()\n");
172 rte_rawdev_info_get(dev_id, &info, sizeof(p));
173 if (p.ring_size != IOAT_TEST_RINGSIZE) {
174 printf("Error, ring size is not %d (%d)\n",
175 IOAT_TEST_RINGSIZE, (int)p.ring_size);
178 expected_ring_size[dev_id] = p.ring_size;
180 if (rte_rawdev_start(dev_id) != 0) {
181 printf("Error with rte_rawdev_start()\n");
185 pool = rte_pktmbuf_pool_create("TEST_IOAT_POOL",
186 256, /* n == num elements */
189 2048, /* data room size */
192 printf("Error with mempool creation\n");
196 /* allocate memory for xstats names and values */
197 nb_xstats = rte_rawdev_xstats_names_get(dev_id, NULL, 0);
199 snames = malloc(sizeof(*snames) * nb_xstats);
200 if (snames == NULL) {
201 printf("Error allocating xstat names memory\n");
204 rte_rawdev_xstats_names_get(dev_id, snames, nb_xstats);
206 ids = malloc(sizeof(*ids) * nb_xstats);
208 printf("Error allocating xstat ids memory\n");
211 for (i = 0; i < nb_xstats; i++)
214 stats = malloc(sizeof(*stats) * nb_xstats);
216 printf("Error allocating xstat memory\n");
220 /* run the test cases */
221 for (i = 0; i < 100; i++) {
224 if (test_enqueue_copies(dev_id) != 0)
227 rte_rawdev_xstats_get(dev_id, ids, stats, nb_xstats);
228 for (j = 0; j < nb_xstats; j++)
229 printf("%s: %"PRIu64" ", snames[j].name, stats[j]);
234 rte_rawdev_stop(dev_id);
235 if (rte_rawdev_xstats_reset(dev_id, NULL, 0) != 0) {
236 printf("Error resetting xstat values\n");
240 rte_mempool_free(pool);
247 rte_rawdev_stop(dev_id);
248 rte_rawdev_xstats_reset(dev_id, NULL, 0);
249 rte_mempool_free(pool);