1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2017 Intel Corporation
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
5d30ea906Sjfb8856606 #include <stdio.h>
6d30ea906Sjfb8856606 #include <inttypes.h>
7d30ea906Sjfb8856606 #include <math.h>
8d30ea906Sjfb8856606 
9d30ea906Sjfb8856606 #include <rte_eal.h>
10d30ea906Sjfb8856606 #include <rte_common.h>
11d30ea906Sjfb8856606 #include <rte_dev.h>
12d30ea906Sjfb8856606 #include <rte_launch.h>
13d30ea906Sjfb8856606 #include <rte_bbdev.h>
14d30ea906Sjfb8856606 #include <rte_cycles.h>
15d30ea906Sjfb8856606 #include <rte_lcore.h>
16d30ea906Sjfb8856606 #include <rte_malloc.h>
17d30ea906Sjfb8856606 #include <rte_random.h>
18d30ea906Sjfb8856606 #include <rte_hexdump.h>
19*4418919fSjohnjiang #include <rte_interrupts.h>
20*4418919fSjohnjiang 
21*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC
22*4418919fSjohnjiang #include <fpga_lte_fec.h>
23*4418919fSjohnjiang #endif
24d30ea906Sjfb8856606 
25d30ea906Sjfb8856606 #include "main.h"
26d30ea906Sjfb8856606 #include "test_bbdev_vector.h"
27d30ea906Sjfb8856606 
28d30ea906Sjfb8856606 #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id))
29d30ea906Sjfb8856606 
30d30ea906Sjfb8856606 #define MAX_QUEUES RTE_MAX_LCORE
31*4418919fSjohnjiang #define TEST_REPETITIONS 1000
32*4418919fSjohnjiang 
33*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC
34*4418919fSjohnjiang #define FPGA_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf")
35*4418919fSjohnjiang #define FPGA_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf")
36*4418919fSjohnjiang #define VF_UL_QUEUE_VALUE 4
37*4418919fSjohnjiang #define VF_DL_QUEUE_VALUE 4
38*4418919fSjohnjiang #define UL_BANDWIDTH 3
39*4418919fSjohnjiang #define DL_BANDWIDTH 3
40*4418919fSjohnjiang #define UL_LOAD_BALANCE 128
41*4418919fSjohnjiang #define DL_LOAD_BALANCE 128
42*4418919fSjohnjiang #define FLR_TIMEOUT 610
43*4418919fSjohnjiang #endif
44d30ea906Sjfb8856606 
45d30ea906Sjfb8856606 #define OPS_CACHE_SIZE 256U
46d30ea906Sjfb8856606 #define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */
47d30ea906Sjfb8856606 
48d30ea906Sjfb8856606 #define SYNC_WAIT 0
49d30ea906Sjfb8856606 #define SYNC_START 1
50d30ea906Sjfb8856606 
51d30ea906Sjfb8856606 #define INVALID_QUEUE_ID -1
52d30ea906Sjfb8856606 
53d30ea906Sjfb8856606 static struct test_bbdev_vector test_vector;
54d30ea906Sjfb8856606 
55d30ea906Sjfb8856606 /* Switch between PMD and Interrupt for throughput TC */
56d30ea906Sjfb8856606 static bool intr_enabled;
57d30ea906Sjfb8856606 
58d30ea906Sjfb8856606 /* Represents tested active devices */
59d30ea906Sjfb8856606 static struct active_device {
60d30ea906Sjfb8856606 	const char *driver_name;
61d30ea906Sjfb8856606 	uint8_t dev_id;
62d30ea906Sjfb8856606 	uint16_t supported_ops;
63d30ea906Sjfb8856606 	uint16_t queue_ids[MAX_QUEUES];
64d30ea906Sjfb8856606 	uint16_t nb_queues;
65d30ea906Sjfb8856606 	struct rte_mempool *ops_mempool;
66d30ea906Sjfb8856606 	struct rte_mempool *in_mbuf_pool;
67d30ea906Sjfb8856606 	struct rte_mempool *hard_out_mbuf_pool;
68d30ea906Sjfb8856606 	struct rte_mempool *soft_out_mbuf_pool;
69*4418919fSjohnjiang 	struct rte_mempool *harq_in_mbuf_pool;
70*4418919fSjohnjiang 	struct rte_mempool *harq_out_mbuf_pool;
71d30ea906Sjfb8856606 } active_devs[RTE_BBDEV_MAX_DEVS];
72d30ea906Sjfb8856606 
73d30ea906Sjfb8856606 static uint8_t nb_active_devs;
74d30ea906Sjfb8856606 
75d30ea906Sjfb8856606 /* Data buffers used by BBDEV ops */
76d30ea906Sjfb8856606 struct test_buffers {
77d30ea906Sjfb8856606 	struct rte_bbdev_op_data *inputs;
78d30ea906Sjfb8856606 	struct rte_bbdev_op_data *hard_outputs;
79d30ea906Sjfb8856606 	struct rte_bbdev_op_data *soft_outputs;
80*4418919fSjohnjiang 	struct rte_bbdev_op_data *harq_inputs;
81*4418919fSjohnjiang 	struct rte_bbdev_op_data *harq_outputs;
82d30ea906Sjfb8856606 };
83d30ea906Sjfb8856606 
84d30ea906Sjfb8856606 /* Operation parameters specific for given test case */
85d30ea906Sjfb8856606 struct test_op_params {
86d30ea906Sjfb8856606 	struct rte_mempool *mp;
87d30ea906Sjfb8856606 	struct rte_bbdev_dec_op *ref_dec_op;
88d30ea906Sjfb8856606 	struct rte_bbdev_enc_op *ref_enc_op;
89d30ea906Sjfb8856606 	uint16_t burst_sz;
90d30ea906Sjfb8856606 	uint16_t num_to_process;
91d30ea906Sjfb8856606 	uint16_t num_lcores;
92d30ea906Sjfb8856606 	int vector_mask;
93d30ea906Sjfb8856606 	rte_atomic16_t sync;
94d30ea906Sjfb8856606 	struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES];
95d30ea906Sjfb8856606 };
96d30ea906Sjfb8856606 
97d30ea906Sjfb8856606 /* Contains per lcore params */
98d30ea906Sjfb8856606 struct thread_params {
99d30ea906Sjfb8856606 	uint8_t dev_id;
100d30ea906Sjfb8856606 	uint16_t queue_id;
101*4418919fSjohnjiang 	uint32_t lcore_id;
102d30ea906Sjfb8856606 	uint64_t start_time;
103*4418919fSjohnjiang 	double ops_per_sec;
104d30ea906Sjfb8856606 	double mbps;
105*4418919fSjohnjiang 	uint8_t iter_count;
106d30ea906Sjfb8856606 	rte_atomic16_t nb_dequeued;
107d30ea906Sjfb8856606 	rte_atomic16_t processing_status;
108*4418919fSjohnjiang 	rte_atomic16_t burst_sz;
109d30ea906Sjfb8856606 	struct test_op_params *op_params;
110*4418919fSjohnjiang 	struct rte_bbdev_dec_op *dec_ops[MAX_BURST];
111*4418919fSjohnjiang 	struct rte_bbdev_enc_op *enc_ops[MAX_BURST];
112d30ea906Sjfb8856606 };
113d30ea906Sjfb8856606 
114d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST
115d30ea906Sjfb8856606 /* Stores time statistics */
116d30ea906Sjfb8856606 struct test_time_stats {
117d30ea906Sjfb8856606 	/* Stores software enqueue total working time */
118*4418919fSjohnjiang 	uint64_t enq_sw_total_time;
119d30ea906Sjfb8856606 	/* Stores minimum value of software enqueue working time */
120d30ea906Sjfb8856606 	uint64_t enq_sw_min_time;
121d30ea906Sjfb8856606 	/* Stores maximum value of software enqueue working time */
122d30ea906Sjfb8856606 	uint64_t enq_sw_max_time;
123d30ea906Sjfb8856606 	/* Stores turbo enqueue total working time */
124*4418919fSjohnjiang 	uint64_t enq_acc_total_time;
125*4418919fSjohnjiang 	/* Stores minimum value of accelerator enqueue working time */
126*4418919fSjohnjiang 	uint64_t enq_acc_min_time;
127*4418919fSjohnjiang 	/* Stores maximum value of accelerator enqueue working time */
128*4418919fSjohnjiang 	uint64_t enq_acc_max_time;
129d30ea906Sjfb8856606 	/* Stores dequeue total working time */
130*4418919fSjohnjiang 	uint64_t deq_total_time;
131d30ea906Sjfb8856606 	/* Stores minimum value of dequeue working time */
132d30ea906Sjfb8856606 	uint64_t deq_min_time;
133d30ea906Sjfb8856606 	/* Stores maximum value of dequeue working time */
134d30ea906Sjfb8856606 	uint64_t deq_max_time;
135d30ea906Sjfb8856606 };
136d30ea906Sjfb8856606 #endif
137d30ea906Sjfb8856606 
138d30ea906Sjfb8856606 typedef int (test_case_function)(struct active_device *ad,
139d30ea906Sjfb8856606 		struct test_op_params *op_params);
140d30ea906Sjfb8856606 
141d30ea906Sjfb8856606 static inline void
142*4418919fSjohnjiang mbuf_reset(struct rte_mbuf *m)
143*4418919fSjohnjiang {
144*4418919fSjohnjiang 	m->pkt_len = 0;
145*4418919fSjohnjiang 
146*4418919fSjohnjiang 	do {
147*4418919fSjohnjiang 		m->data_len = 0;
148*4418919fSjohnjiang 		m = m->next;
149*4418919fSjohnjiang 	} while (m != NULL);
150*4418919fSjohnjiang }
151*4418919fSjohnjiang 
152*4418919fSjohnjiang /* Read flag value 0/1 from bitmap */
153*4418919fSjohnjiang static inline bool
154*4418919fSjohnjiang check_bit(uint32_t bitmap, uint32_t bitmask)
155*4418919fSjohnjiang {
156*4418919fSjohnjiang 	return bitmap & bitmask;
157*4418919fSjohnjiang }
158*4418919fSjohnjiang 
159*4418919fSjohnjiang static inline void
160d30ea906Sjfb8856606 set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
161d30ea906Sjfb8856606 {
162d30ea906Sjfb8856606 	ad->supported_ops |= (1 << op_type);
163d30ea906Sjfb8856606 }
164d30ea906Sjfb8856606 
165d30ea906Sjfb8856606 static inline bool
166d30ea906Sjfb8856606 is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
167d30ea906Sjfb8856606 {
168d30ea906Sjfb8856606 	return ad->supported_ops & (1 << op_type);
169d30ea906Sjfb8856606 }
170d30ea906Sjfb8856606 
171d30ea906Sjfb8856606 static inline bool
172d30ea906Sjfb8856606 flags_match(uint32_t flags_req, uint32_t flags_present)
173d30ea906Sjfb8856606 {
174d30ea906Sjfb8856606 	return (flags_req & flags_present) == flags_req;
175d30ea906Sjfb8856606 }
176d30ea906Sjfb8856606 
177d30ea906Sjfb8856606 static void
178d30ea906Sjfb8856606 clear_soft_out_cap(uint32_t *op_flags)
179d30ea906Sjfb8856606 {
180d30ea906Sjfb8856606 	*op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT;
181d30ea906Sjfb8856606 	*op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
182d30ea906Sjfb8856606 	*op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
183d30ea906Sjfb8856606 }
184d30ea906Sjfb8856606 
185d30ea906Sjfb8856606 static int
186d30ea906Sjfb8856606 check_dev_cap(const struct rte_bbdev_info *dev_info)
187d30ea906Sjfb8856606 {
188d30ea906Sjfb8856606 	unsigned int i;
189*4418919fSjohnjiang 	unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs,
190*4418919fSjohnjiang 		nb_harq_inputs, nb_harq_outputs;
191d30ea906Sjfb8856606 	const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities;
192d30ea906Sjfb8856606 
193d30ea906Sjfb8856606 	nb_inputs = test_vector.entries[DATA_INPUT].nb_segments;
194d30ea906Sjfb8856606 	nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments;
195d30ea906Sjfb8856606 	nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments;
196*4418919fSjohnjiang 	nb_harq_inputs  = test_vector.entries[DATA_HARQ_INPUT].nb_segments;
197*4418919fSjohnjiang 	nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments;
198d30ea906Sjfb8856606 
199d30ea906Sjfb8856606 	for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) {
200d30ea906Sjfb8856606 		if (op_cap->type != test_vector.op_type)
201d30ea906Sjfb8856606 			continue;
202d30ea906Sjfb8856606 
203d30ea906Sjfb8856606 		if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) {
204d30ea906Sjfb8856606 			const struct rte_bbdev_op_cap_turbo_dec *cap =
205d30ea906Sjfb8856606 					&op_cap->cap.turbo_dec;
206d30ea906Sjfb8856606 			/* Ignore lack of soft output capability, just skip
207d30ea906Sjfb8856606 			 * checking if soft output is valid.
208d30ea906Sjfb8856606 			 */
209d30ea906Sjfb8856606 			if ((test_vector.turbo_dec.op_flags &
210d30ea906Sjfb8856606 					RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
211d30ea906Sjfb8856606 					!(cap->capability_flags &
212d30ea906Sjfb8856606 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
213d30ea906Sjfb8856606 				printf(
214*4418919fSjohnjiang 					"INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n",
215d30ea906Sjfb8856606 					dev_info->dev_name);
216d30ea906Sjfb8856606 				clear_soft_out_cap(
217d30ea906Sjfb8856606 					&test_vector.turbo_dec.op_flags);
218d30ea906Sjfb8856606 			}
219d30ea906Sjfb8856606 
220d30ea906Sjfb8856606 			if (!flags_match(test_vector.turbo_dec.op_flags,
221d30ea906Sjfb8856606 					cap->capability_flags))
222d30ea906Sjfb8856606 				return TEST_FAILED;
223d30ea906Sjfb8856606 			if (nb_inputs > cap->num_buffers_src) {
224d30ea906Sjfb8856606 				printf("Too many inputs defined: %u, max: %u\n",
225d30ea906Sjfb8856606 					nb_inputs, cap->num_buffers_src);
226d30ea906Sjfb8856606 				return TEST_FAILED;
227d30ea906Sjfb8856606 			}
228d30ea906Sjfb8856606 			if (nb_soft_outputs > cap->num_buffers_soft_out &&
229d30ea906Sjfb8856606 					(test_vector.turbo_dec.op_flags &
230d30ea906Sjfb8856606 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
231d30ea906Sjfb8856606 				printf(
232d30ea906Sjfb8856606 					"Too many soft outputs defined: %u, max: %u\n",
233d30ea906Sjfb8856606 						nb_soft_outputs,
234d30ea906Sjfb8856606 						cap->num_buffers_soft_out);
235d30ea906Sjfb8856606 				return TEST_FAILED;
236d30ea906Sjfb8856606 			}
237d30ea906Sjfb8856606 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
238d30ea906Sjfb8856606 				printf(
239d30ea906Sjfb8856606 					"Too many hard outputs defined: %u, max: %u\n",
240d30ea906Sjfb8856606 						nb_hard_outputs,
241d30ea906Sjfb8856606 						cap->num_buffers_hard_out);
242d30ea906Sjfb8856606 				return TEST_FAILED;
243d30ea906Sjfb8856606 			}
244d30ea906Sjfb8856606 			if (intr_enabled && !(cap->capability_flags &
245d30ea906Sjfb8856606 					RTE_BBDEV_TURBO_DEC_INTERRUPTS)) {
246d30ea906Sjfb8856606 				printf(
247d30ea906Sjfb8856606 					"Dequeue interrupts are not supported!\n");
248d30ea906Sjfb8856606 				return TEST_FAILED;
249d30ea906Sjfb8856606 			}
250d30ea906Sjfb8856606 
251d30ea906Sjfb8856606 			return TEST_SUCCESS;
252d30ea906Sjfb8856606 		} else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) {
253d30ea906Sjfb8856606 			const struct rte_bbdev_op_cap_turbo_enc *cap =
254d30ea906Sjfb8856606 					&op_cap->cap.turbo_enc;
255d30ea906Sjfb8856606 
256d30ea906Sjfb8856606 			if (!flags_match(test_vector.turbo_enc.op_flags,
257d30ea906Sjfb8856606 					cap->capability_flags))
258d30ea906Sjfb8856606 				return TEST_FAILED;
259d30ea906Sjfb8856606 			if (nb_inputs > cap->num_buffers_src) {
260d30ea906Sjfb8856606 				printf("Too many inputs defined: %u, max: %u\n",
261d30ea906Sjfb8856606 					nb_inputs, cap->num_buffers_src);
262d30ea906Sjfb8856606 				return TEST_FAILED;
263d30ea906Sjfb8856606 			}
264d30ea906Sjfb8856606 			if (nb_hard_outputs > cap->num_buffers_dst) {
265d30ea906Sjfb8856606 				printf(
266d30ea906Sjfb8856606 					"Too many hard outputs defined: %u, max: %u\n",
267*4418919fSjohnjiang 					nb_hard_outputs, cap->num_buffers_dst);
268d30ea906Sjfb8856606 				return TEST_FAILED;
269d30ea906Sjfb8856606 			}
270d30ea906Sjfb8856606 			if (intr_enabled && !(cap->capability_flags &
271d30ea906Sjfb8856606 					RTE_BBDEV_TURBO_ENC_INTERRUPTS)) {
272d30ea906Sjfb8856606 				printf(
273d30ea906Sjfb8856606 					"Dequeue interrupts are not supported!\n");
274d30ea906Sjfb8856606 				return TEST_FAILED;
275d30ea906Sjfb8856606 			}
276d30ea906Sjfb8856606 
277d30ea906Sjfb8856606 			return TEST_SUCCESS;
278*4418919fSjohnjiang 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) {
279*4418919fSjohnjiang 			const struct rte_bbdev_op_cap_ldpc_enc *cap =
280*4418919fSjohnjiang 					&op_cap->cap.ldpc_enc;
281*4418919fSjohnjiang 
282*4418919fSjohnjiang 			if (!flags_match(test_vector.ldpc_enc.op_flags,
283*4418919fSjohnjiang 					cap->capability_flags)){
284*4418919fSjohnjiang 				printf("Flag Mismatch\n");
285*4418919fSjohnjiang 				return TEST_FAILED;
286*4418919fSjohnjiang 			}
287*4418919fSjohnjiang 			if (nb_inputs > cap->num_buffers_src) {
288*4418919fSjohnjiang 				printf("Too many inputs defined: %u, max: %u\n",
289*4418919fSjohnjiang 					nb_inputs, cap->num_buffers_src);
290*4418919fSjohnjiang 				return TEST_FAILED;
291*4418919fSjohnjiang 			}
292*4418919fSjohnjiang 			if (nb_hard_outputs > cap->num_buffers_dst) {
293*4418919fSjohnjiang 				printf(
294*4418919fSjohnjiang 					"Too many hard outputs defined: %u, max: %u\n",
295*4418919fSjohnjiang 					nb_hard_outputs, cap->num_buffers_dst);
296*4418919fSjohnjiang 				return TEST_FAILED;
297*4418919fSjohnjiang 			}
298*4418919fSjohnjiang 			if (intr_enabled && !(cap->capability_flags &
299*4418919fSjohnjiang 					RTE_BBDEV_TURBO_ENC_INTERRUPTS)) {
300*4418919fSjohnjiang 				printf(
301*4418919fSjohnjiang 					"Dequeue interrupts are not supported!\n");
302*4418919fSjohnjiang 				return TEST_FAILED;
303*4418919fSjohnjiang 			}
304*4418919fSjohnjiang 
305*4418919fSjohnjiang 			return TEST_SUCCESS;
306*4418919fSjohnjiang 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) {
307*4418919fSjohnjiang 			const struct rte_bbdev_op_cap_ldpc_dec *cap =
308*4418919fSjohnjiang 					&op_cap->cap.ldpc_dec;
309*4418919fSjohnjiang 
310*4418919fSjohnjiang 			if (!flags_match(test_vector.ldpc_dec.op_flags,
311*4418919fSjohnjiang 					cap->capability_flags)){
312*4418919fSjohnjiang 				printf("Flag Mismatch\n");
313*4418919fSjohnjiang 				return TEST_FAILED;
314*4418919fSjohnjiang 			}
315*4418919fSjohnjiang 			if (nb_inputs > cap->num_buffers_src) {
316*4418919fSjohnjiang 				printf("Too many inputs defined: %u, max: %u\n",
317*4418919fSjohnjiang 					nb_inputs, cap->num_buffers_src);
318*4418919fSjohnjiang 				return TEST_FAILED;
319*4418919fSjohnjiang 			}
320*4418919fSjohnjiang 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
321*4418919fSjohnjiang 				printf(
322*4418919fSjohnjiang 					"Too many hard outputs defined: %u, max: %u\n",
323*4418919fSjohnjiang 					nb_hard_outputs,
324*4418919fSjohnjiang 					cap->num_buffers_hard_out);
325*4418919fSjohnjiang 				return TEST_FAILED;
326*4418919fSjohnjiang 			}
327*4418919fSjohnjiang 			if (nb_harq_inputs > cap->num_buffers_hard_out) {
328*4418919fSjohnjiang 				printf(
329*4418919fSjohnjiang 					"Too many HARQ inputs defined: %u, max: %u\n",
330*4418919fSjohnjiang 					nb_hard_outputs,
331*4418919fSjohnjiang 					cap->num_buffers_hard_out);
332*4418919fSjohnjiang 				return TEST_FAILED;
333*4418919fSjohnjiang 			}
334*4418919fSjohnjiang 			if (nb_harq_outputs > cap->num_buffers_hard_out) {
335*4418919fSjohnjiang 				printf(
336*4418919fSjohnjiang 					"Too many HARQ outputs defined: %u, max: %u\n",
337*4418919fSjohnjiang 					nb_hard_outputs,
338*4418919fSjohnjiang 					cap->num_buffers_hard_out);
339*4418919fSjohnjiang 				return TEST_FAILED;
340*4418919fSjohnjiang 			}
341*4418919fSjohnjiang 			if (intr_enabled && !(cap->capability_flags &
342*4418919fSjohnjiang 					RTE_BBDEV_TURBO_DEC_INTERRUPTS)) {
343*4418919fSjohnjiang 				printf(
344*4418919fSjohnjiang 					"Dequeue interrupts are not supported!\n");
345*4418919fSjohnjiang 				return TEST_FAILED;
346*4418919fSjohnjiang 			}
347*4418919fSjohnjiang 
348*4418919fSjohnjiang 			return TEST_SUCCESS;
349d30ea906Sjfb8856606 		}
350d30ea906Sjfb8856606 	}
351d30ea906Sjfb8856606 
352d30ea906Sjfb8856606 	if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE))
353d30ea906Sjfb8856606 		return TEST_SUCCESS; /* Special case for NULL device */
354d30ea906Sjfb8856606 
355d30ea906Sjfb8856606 	return TEST_FAILED;
356d30ea906Sjfb8856606 }
357d30ea906Sjfb8856606 
358d30ea906Sjfb8856606 /* calculates optimal mempool size not smaller than the val */
359d30ea906Sjfb8856606 static unsigned int
360d30ea906Sjfb8856606 optimal_mempool_size(unsigned int val)
361d30ea906Sjfb8856606 {
362d30ea906Sjfb8856606 	return rte_align32pow2(val + 1) - 1;
363d30ea906Sjfb8856606 }
364d30ea906Sjfb8856606 
365d30ea906Sjfb8856606 /* allocates mbuf mempool for inputs and outputs */
366d30ea906Sjfb8856606 static struct rte_mempool *
367d30ea906Sjfb8856606 create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id,
368d30ea906Sjfb8856606 		int socket_id, unsigned int mbuf_pool_size,
369d30ea906Sjfb8856606 		const char *op_type_str)
370d30ea906Sjfb8856606 {
371d30ea906Sjfb8856606 	unsigned int i;
372d30ea906Sjfb8856606 	uint32_t max_seg_sz = 0;
373d30ea906Sjfb8856606 	char pool_name[RTE_MEMPOOL_NAMESIZE];
374d30ea906Sjfb8856606 
375d30ea906Sjfb8856606 	/* find max input segment size */
376d30ea906Sjfb8856606 	for (i = 0; i < entries->nb_segments; ++i)
377d30ea906Sjfb8856606 		if (entries->segments[i].length > max_seg_sz)
378d30ea906Sjfb8856606 			max_seg_sz = entries->segments[i].length;
379d30ea906Sjfb8856606 
380d30ea906Sjfb8856606 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
381d30ea906Sjfb8856606 			dev_id);
382d30ea906Sjfb8856606 	return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0,
383d30ea906Sjfb8856606 			RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM,
384d30ea906Sjfb8856606 			(unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id);
385d30ea906Sjfb8856606 }
386d30ea906Sjfb8856606 
387d30ea906Sjfb8856606 static int
388d30ea906Sjfb8856606 create_mempools(struct active_device *ad, int socket_id,
389d30ea906Sjfb8856606 		enum rte_bbdev_op_type org_op_type, uint16_t num_ops)
390d30ea906Sjfb8856606 {
391d30ea906Sjfb8856606 	struct rte_mempool *mp;
392d30ea906Sjfb8856606 	unsigned int ops_pool_size, mbuf_pool_size = 0;
393d30ea906Sjfb8856606 	char pool_name[RTE_MEMPOOL_NAMESIZE];
394d30ea906Sjfb8856606 	const char *op_type_str;
395d30ea906Sjfb8856606 	enum rte_bbdev_op_type op_type = org_op_type;
396d30ea906Sjfb8856606 
397d30ea906Sjfb8856606 	struct op_data_entries *in = &test_vector.entries[DATA_INPUT];
398d30ea906Sjfb8856606 	struct op_data_entries *hard_out =
399d30ea906Sjfb8856606 			&test_vector.entries[DATA_HARD_OUTPUT];
400d30ea906Sjfb8856606 	struct op_data_entries *soft_out =
401d30ea906Sjfb8856606 			&test_vector.entries[DATA_SOFT_OUTPUT];
402*4418919fSjohnjiang 	struct op_data_entries *harq_in =
403*4418919fSjohnjiang 			&test_vector.entries[DATA_HARQ_INPUT];
404*4418919fSjohnjiang 	struct op_data_entries *harq_out =
405*4418919fSjohnjiang 			&test_vector.entries[DATA_HARQ_OUTPUT];
406d30ea906Sjfb8856606 
407d30ea906Sjfb8856606 	/* allocate ops mempool */
408d30ea906Sjfb8856606 	ops_pool_size = optimal_mempool_size(RTE_MAX(
409d30ea906Sjfb8856606 			/* Ops used plus 1 reference op */
410d30ea906Sjfb8856606 			RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1),
411d30ea906Sjfb8856606 			/* Minimal cache size plus 1 reference op */
412d30ea906Sjfb8856606 			(unsigned int)(1.5 * rte_lcore_count() *
413d30ea906Sjfb8856606 					OPS_CACHE_SIZE + 1)),
414d30ea906Sjfb8856606 			OPS_POOL_SIZE_MIN));
415d30ea906Sjfb8856606 
416d30ea906Sjfb8856606 	if (org_op_type == RTE_BBDEV_OP_NONE)
417d30ea906Sjfb8856606 		op_type = RTE_BBDEV_OP_TURBO_ENC;
418d30ea906Sjfb8856606 
419d30ea906Sjfb8856606 	op_type_str = rte_bbdev_op_type_str(op_type);
420d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
421d30ea906Sjfb8856606 
422d30ea906Sjfb8856606 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
423d30ea906Sjfb8856606 			ad->dev_id);
424d30ea906Sjfb8856606 	mp = rte_bbdev_op_pool_create(pool_name, op_type,
425d30ea906Sjfb8856606 			ops_pool_size, OPS_CACHE_SIZE, socket_id);
426d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(mp,
427d30ea906Sjfb8856606 			"ERROR Failed to create %u items ops pool for dev %u on socket %u.",
428d30ea906Sjfb8856606 			ops_pool_size,
429d30ea906Sjfb8856606 			ad->dev_id,
430d30ea906Sjfb8856606 			socket_id);
431d30ea906Sjfb8856606 	ad->ops_mempool = mp;
432d30ea906Sjfb8856606 
433d30ea906Sjfb8856606 	/* Do not create inputs and outputs mbufs for BaseBand Null Device */
434d30ea906Sjfb8856606 	if (org_op_type == RTE_BBDEV_OP_NONE)
435d30ea906Sjfb8856606 		return TEST_SUCCESS;
436d30ea906Sjfb8856606 
437d30ea906Sjfb8856606 	/* Inputs */
438d30ea906Sjfb8856606 	mbuf_pool_size = optimal_mempool_size(ops_pool_size * in->nb_segments);
439d30ea906Sjfb8856606 	mp = create_mbuf_pool(in, ad->dev_id, socket_id, mbuf_pool_size, "in");
440d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(mp,
441d30ea906Sjfb8856606 			"ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.",
442d30ea906Sjfb8856606 			mbuf_pool_size,
443d30ea906Sjfb8856606 			ad->dev_id,
444d30ea906Sjfb8856606 			socket_id);
445d30ea906Sjfb8856606 	ad->in_mbuf_pool = mp;
446d30ea906Sjfb8856606 
447d30ea906Sjfb8856606 	/* Hard outputs */
448d30ea906Sjfb8856606 	mbuf_pool_size = optimal_mempool_size(ops_pool_size *
449d30ea906Sjfb8856606 			hard_out->nb_segments);
450d30ea906Sjfb8856606 	mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, mbuf_pool_size,
451d30ea906Sjfb8856606 			"hard_out");
452d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(mp,
453d30ea906Sjfb8856606 			"ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.",
454d30ea906Sjfb8856606 			mbuf_pool_size,
455d30ea906Sjfb8856606 			ad->dev_id,
456d30ea906Sjfb8856606 			socket_id);
457d30ea906Sjfb8856606 	ad->hard_out_mbuf_pool = mp;
458d30ea906Sjfb8856606 
459d30ea906Sjfb8856606 
460d30ea906Sjfb8856606 	/* Soft outputs */
461*4418919fSjohnjiang 	if (soft_out->nb_segments > 0) {
462d30ea906Sjfb8856606 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
463d30ea906Sjfb8856606 				soft_out->nb_segments);
464*4418919fSjohnjiang 		mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id,
465*4418919fSjohnjiang 				mbuf_pool_size,
466d30ea906Sjfb8856606 				"soft_out");
467d30ea906Sjfb8856606 		TEST_ASSERT_NOT_NULL(mp,
468d30ea906Sjfb8856606 				"ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.",
469d30ea906Sjfb8856606 				mbuf_pool_size,
470d30ea906Sjfb8856606 				ad->dev_id,
471d30ea906Sjfb8856606 				socket_id);
472d30ea906Sjfb8856606 		ad->soft_out_mbuf_pool = mp;
473*4418919fSjohnjiang 	}
474d30ea906Sjfb8856606 
475*4418919fSjohnjiang 	/* HARQ inputs */
476*4418919fSjohnjiang 	if (harq_in->nb_segments > 0) {
477*4418919fSjohnjiang 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
478*4418919fSjohnjiang 				harq_in->nb_segments);
479*4418919fSjohnjiang 		mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id,
480*4418919fSjohnjiang 				mbuf_pool_size,
481*4418919fSjohnjiang 				"harq_in");
482*4418919fSjohnjiang 		TEST_ASSERT_NOT_NULL(mp,
483*4418919fSjohnjiang 				"ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.",
484*4418919fSjohnjiang 				mbuf_pool_size,
485*4418919fSjohnjiang 				ad->dev_id,
486*4418919fSjohnjiang 				socket_id);
487*4418919fSjohnjiang 		ad->harq_in_mbuf_pool = mp;
488*4418919fSjohnjiang 	}
489*4418919fSjohnjiang 
490*4418919fSjohnjiang 	/* HARQ outputs */
491*4418919fSjohnjiang 	if (harq_out->nb_segments > 0) {
492*4418919fSjohnjiang 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
493*4418919fSjohnjiang 				harq_out->nb_segments);
494*4418919fSjohnjiang 		mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id,
495*4418919fSjohnjiang 				mbuf_pool_size,
496*4418919fSjohnjiang 				"harq_out");
497*4418919fSjohnjiang 		TEST_ASSERT_NOT_NULL(mp,
498*4418919fSjohnjiang 				"ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.",
499*4418919fSjohnjiang 				mbuf_pool_size,
500*4418919fSjohnjiang 				ad->dev_id,
501*4418919fSjohnjiang 				socket_id);
502*4418919fSjohnjiang 		ad->harq_out_mbuf_pool = mp;
503*4418919fSjohnjiang 	}
504*4418919fSjohnjiang 
505*4418919fSjohnjiang 	return TEST_SUCCESS;
506d30ea906Sjfb8856606 }
507d30ea906Sjfb8856606 
508d30ea906Sjfb8856606 static int
509d30ea906Sjfb8856606 add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info,
510d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
511d30ea906Sjfb8856606 {
512d30ea906Sjfb8856606 	int ret;
513d30ea906Sjfb8856606 	unsigned int queue_id;
514d30ea906Sjfb8856606 	struct rte_bbdev_queue_conf qconf;
515d30ea906Sjfb8856606 	struct active_device *ad = &active_devs[nb_active_devs];
516d30ea906Sjfb8856606 	unsigned int nb_queues;
517d30ea906Sjfb8856606 	enum rte_bbdev_op_type op_type = vector->op_type;
518d30ea906Sjfb8856606 
519*4418919fSjohnjiang /* Configure fpga lte fec with PF & VF values
520*4418919fSjohnjiang  * if '-i' flag is set and using fpga device
521*4418919fSjohnjiang  */
522*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC
523*4418919fSjohnjiang 	if ((get_init_device() == true) &&
524*4418919fSjohnjiang 		(!strcmp(info->drv.driver_name, FPGA_PF_DRIVER_NAME))) {
525*4418919fSjohnjiang 		struct fpga_lte_fec_conf conf;
526*4418919fSjohnjiang 		unsigned int i;
527*4418919fSjohnjiang 
528*4418919fSjohnjiang 		printf("Configure FPGA FEC Driver %s with default values\n",
529*4418919fSjohnjiang 				info->drv.driver_name);
530*4418919fSjohnjiang 
531*4418919fSjohnjiang 		/* clear default configuration before initialization */
532*4418919fSjohnjiang 		memset(&conf, 0, sizeof(struct fpga_lte_fec_conf));
533*4418919fSjohnjiang 
534*4418919fSjohnjiang 		/* Set PF mode :
535*4418919fSjohnjiang 		 * true if PF is used for data plane
536*4418919fSjohnjiang 		 * false for VFs
537*4418919fSjohnjiang 		 */
538*4418919fSjohnjiang 		conf.pf_mode_en = true;
539*4418919fSjohnjiang 
540*4418919fSjohnjiang 		for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) {
541*4418919fSjohnjiang 			/* Number of UL queues per VF (fpga supports 8 VFs) */
542*4418919fSjohnjiang 			conf.vf_ul_queues_number[i] = VF_UL_QUEUE_VALUE;
543*4418919fSjohnjiang 			/* Number of DL queues per VF (fpga supports 8 VFs) */
544*4418919fSjohnjiang 			conf.vf_dl_queues_number[i] = VF_DL_QUEUE_VALUE;
545*4418919fSjohnjiang 		}
546*4418919fSjohnjiang 
547*4418919fSjohnjiang 		/* UL bandwidth. Needed for schedule algorithm */
548*4418919fSjohnjiang 		conf.ul_bandwidth = UL_BANDWIDTH;
549*4418919fSjohnjiang 		/* DL bandwidth */
550*4418919fSjohnjiang 		conf.dl_bandwidth = DL_BANDWIDTH;
551*4418919fSjohnjiang 
552*4418919fSjohnjiang 		/* UL & DL load Balance Factor to 64 */
553*4418919fSjohnjiang 		conf.ul_load_balance = UL_LOAD_BALANCE;
554*4418919fSjohnjiang 		conf.dl_load_balance = DL_LOAD_BALANCE;
555*4418919fSjohnjiang 
556*4418919fSjohnjiang 		/**< FLR timeout value */
557*4418919fSjohnjiang 		conf.flr_time_out = FLR_TIMEOUT;
558*4418919fSjohnjiang 
559*4418919fSjohnjiang 		/* setup FPGA PF with configuration information */
560*4418919fSjohnjiang 		ret = fpga_lte_fec_configure(info->dev_name, &conf);
561*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
562*4418919fSjohnjiang 				"Failed to configure 4G FPGA PF for bbdev %s",
563*4418919fSjohnjiang 				info->dev_name);
564*4418919fSjohnjiang 	}
565*4418919fSjohnjiang #endif
566d30ea906Sjfb8856606 	nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues);
567*4418919fSjohnjiang 	nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES);
568*4418919fSjohnjiang 
569d30ea906Sjfb8856606 	/* setup device */
570d30ea906Sjfb8856606 	ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id);
571d30ea906Sjfb8856606 	if (ret < 0) {
572d30ea906Sjfb8856606 		printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n",
573d30ea906Sjfb8856606 				dev_id, nb_queues, info->socket_id, ret);
574d30ea906Sjfb8856606 		return TEST_FAILED;
575d30ea906Sjfb8856606 	}
576d30ea906Sjfb8856606 
577d30ea906Sjfb8856606 	/* configure interrupts if needed */
578d30ea906Sjfb8856606 	if (intr_enabled) {
579d30ea906Sjfb8856606 		ret = rte_bbdev_intr_enable(dev_id);
580d30ea906Sjfb8856606 		if (ret < 0) {
581d30ea906Sjfb8856606 			printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id,
582d30ea906Sjfb8856606 					ret);
583d30ea906Sjfb8856606 			return TEST_FAILED;
584d30ea906Sjfb8856606 		}
585d30ea906Sjfb8856606 	}
586d30ea906Sjfb8856606 
587d30ea906Sjfb8856606 	/* setup device queues */
588d30ea906Sjfb8856606 	qconf.socket = info->socket_id;
589d30ea906Sjfb8856606 	qconf.queue_size = info->drv.default_queue_conf.queue_size;
590d30ea906Sjfb8856606 	qconf.priority = 0;
591d30ea906Sjfb8856606 	qconf.deferred_start = 0;
592d30ea906Sjfb8856606 	qconf.op_type = op_type;
593d30ea906Sjfb8856606 
594d30ea906Sjfb8856606 	for (queue_id = 0; queue_id < nb_queues; ++queue_id) {
595d30ea906Sjfb8856606 		ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf);
596d30ea906Sjfb8856606 		if (ret != 0) {
597d30ea906Sjfb8856606 			printf(
598d30ea906Sjfb8856606 					"Allocated all queues (id=%u) at prio%u on dev%u\n",
599d30ea906Sjfb8856606 					queue_id, qconf.priority, dev_id);
600d30ea906Sjfb8856606 			qconf.priority++;
601d30ea906Sjfb8856606 			ret = rte_bbdev_queue_configure(ad->dev_id, queue_id,
602d30ea906Sjfb8856606 					&qconf);
603d30ea906Sjfb8856606 		}
604d30ea906Sjfb8856606 		if (ret != 0) {
605d30ea906Sjfb8856606 			printf("All queues on dev %u allocated: %u\n",
606d30ea906Sjfb8856606 					dev_id, queue_id);
607d30ea906Sjfb8856606 			break;
608d30ea906Sjfb8856606 		}
609d30ea906Sjfb8856606 		ad->queue_ids[queue_id] = queue_id;
610d30ea906Sjfb8856606 	}
611d30ea906Sjfb8856606 	TEST_ASSERT(queue_id != 0,
612d30ea906Sjfb8856606 			"ERROR Failed to configure any queues on dev %u",
613d30ea906Sjfb8856606 			dev_id);
614d30ea906Sjfb8856606 	ad->nb_queues = queue_id;
615d30ea906Sjfb8856606 
616d30ea906Sjfb8856606 	set_avail_op(ad, op_type);
617d30ea906Sjfb8856606 
618d30ea906Sjfb8856606 	return TEST_SUCCESS;
619d30ea906Sjfb8856606 }
620d30ea906Sjfb8856606 
621d30ea906Sjfb8856606 static int
622d30ea906Sjfb8856606 add_active_device(uint8_t dev_id, struct rte_bbdev_info *info,
623d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
624d30ea906Sjfb8856606 {
625d30ea906Sjfb8856606 	int ret;
626d30ea906Sjfb8856606 
627d30ea906Sjfb8856606 	active_devs[nb_active_devs].driver_name = info->drv.driver_name;
628d30ea906Sjfb8856606 	active_devs[nb_active_devs].dev_id = dev_id;
629d30ea906Sjfb8856606 
630d30ea906Sjfb8856606 	ret = add_bbdev_dev(dev_id, info, vector);
631d30ea906Sjfb8856606 	if (ret == TEST_SUCCESS)
632d30ea906Sjfb8856606 		++nb_active_devs;
633d30ea906Sjfb8856606 	return ret;
634d30ea906Sjfb8856606 }
635d30ea906Sjfb8856606 
636d30ea906Sjfb8856606 static uint8_t
637d30ea906Sjfb8856606 populate_active_devices(void)
638d30ea906Sjfb8856606 {
639d30ea906Sjfb8856606 	int ret;
640d30ea906Sjfb8856606 	uint8_t dev_id;
641d30ea906Sjfb8856606 	uint8_t nb_devs_added = 0;
642d30ea906Sjfb8856606 	struct rte_bbdev_info info;
643d30ea906Sjfb8856606 
644d30ea906Sjfb8856606 	RTE_BBDEV_FOREACH(dev_id) {
645d30ea906Sjfb8856606 		rte_bbdev_info_get(dev_id, &info);
646d30ea906Sjfb8856606 
647d30ea906Sjfb8856606 		if (check_dev_cap(&info)) {
648d30ea906Sjfb8856606 			printf(
649d30ea906Sjfb8856606 				"Device %d (%s) does not support specified capabilities\n",
650d30ea906Sjfb8856606 					dev_id, info.dev_name);
651d30ea906Sjfb8856606 			continue;
652d30ea906Sjfb8856606 		}
653d30ea906Sjfb8856606 
654d30ea906Sjfb8856606 		ret = add_active_device(dev_id, &info, &test_vector);
655d30ea906Sjfb8856606 		if (ret != 0) {
656d30ea906Sjfb8856606 			printf("Adding active bbdev %s skipped\n",
657d30ea906Sjfb8856606 					info.dev_name);
658d30ea906Sjfb8856606 			continue;
659d30ea906Sjfb8856606 		}
660d30ea906Sjfb8856606 		nb_devs_added++;
661d30ea906Sjfb8856606 	}
662d30ea906Sjfb8856606 
663d30ea906Sjfb8856606 	return nb_devs_added;
664d30ea906Sjfb8856606 }
665d30ea906Sjfb8856606 
666d30ea906Sjfb8856606 static int
667d30ea906Sjfb8856606 read_test_vector(void)
668d30ea906Sjfb8856606 {
669d30ea906Sjfb8856606 	int ret;
670d30ea906Sjfb8856606 
671d30ea906Sjfb8856606 	memset(&test_vector, 0, sizeof(test_vector));
672d30ea906Sjfb8856606 	printf("Test vector file = %s\n", get_vector_filename());
673d30ea906Sjfb8856606 	ret = test_bbdev_vector_read(get_vector_filename(), &test_vector);
674d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n",
675d30ea906Sjfb8856606 			get_vector_filename());
676d30ea906Sjfb8856606 
677d30ea906Sjfb8856606 	return TEST_SUCCESS;
678d30ea906Sjfb8856606 }
679d30ea906Sjfb8856606 
680d30ea906Sjfb8856606 static int
681d30ea906Sjfb8856606 testsuite_setup(void)
682d30ea906Sjfb8856606 {
683d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
684d30ea906Sjfb8856606 
685d30ea906Sjfb8856606 	if (populate_active_devices() == 0) {
686d30ea906Sjfb8856606 		printf("No suitable devices found!\n");
687d30ea906Sjfb8856606 		return TEST_SKIPPED;
688d30ea906Sjfb8856606 	}
689d30ea906Sjfb8856606 
690d30ea906Sjfb8856606 	return TEST_SUCCESS;
691d30ea906Sjfb8856606 }
692d30ea906Sjfb8856606 
693d30ea906Sjfb8856606 static int
694d30ea906Sjfb8856606 interrupt_testsuite_setup(void)
695d30ea906Sjfb8856606 {
696d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
697d30ea906Sjfb8856606 
698d30ea906Sjfb8856606 	/* Enable interrupts */
699d30ea906Sjfb8856606 	intr_enabled = true;
700d30ea906Sjfb8856606 
701d30ea906Sjfb8856606 	/* Special case for NULL device (RTE_BBDEV_OP_NONE) */
702d30ea906Sjfb8856606 	if (populate_active_devices() == 0 ||
703d30ea906Sjfb8856606 			test_vector.op_type == RTE_BBDEV_OP_NONE) {
704d30ea906Sjfb8856606 		intr_enabled = false;
705d30ea906Sjfb8856606 		printf("No suitable devices found!\n");
706d30ea906Sjfb8856606 		return TEST_SKIPPED;
707d30ea906Sjfb8856606 	}
708d30ea906Sjfb8856606 
709d30ea906Sjfb8856606 	return TEST_SUCCESS;
710d30ea906Sjfb8856606 }
711d30ea906Sjfb8856606 
712d30ea906Sjfb8856606 static void
713d30ea906Sjfb8856606 testsuite_teardown(void)
714d30ea906Sjfb8856606 {
715d30ea906Sjfb8856606 	uint8_t dev_id;
716d30ea906Sjfb8856606 
717d30ea906Sjfb8856606 	/* Unconfigure devices */
718d30ea906Sjfb8856606 	RTE_BBDEV_FOREACH(dev_id)
719d30ea906Sjfb8856606 		rte_bbdev_close(dev_id);
720d30ea906Sjfb8856606 
721d30ea906Sjfb8856606 	/* Clear active devices structs. */
722d30ea906Sjfb8856606 	memset(active_devs, 0, sizeof(active_devs));
723d30ea906Sjfb8856606 	nb_active_devs = 0;
724d30ea906Sjfb8856606 }
725d30ea906Sjfb8856606 
726d30ea906Sjfb8856606 static int
727d30ea906Sjfb8856606 ut_setup(void)
728d30ea906Sjfb8856606 {
729d30ea906Sjfb8856606 	uint8_t i, dev_id;
730d30ea906Sjfb8856606 
731d30ea906Sjfb8856606 	for (i = 0; i < nb_active_devs; i++) {
732d30ea906Sjfb8856606 		dev_id = active_devs[i].dev_id;
733d30ea906Sjfb8856606 		/* reset bbdev stats */
734d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
735d30ea906Sjfb8856606 				"Failed to reset stats of bbdev %u", dev_id);
736d30ea906Sjfb8856606 		/* start the device */
737d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
738d30ea906Sjfb8856606 				"Failed to start bbdev %u", dev_id);
739d30ea906Sjfb8856606 	}
740d30ea906Sjfb8856606 
741d30ea906Sjfb8856606 	return TEST_SUCCESS;
742d30ea906Sjfb8856606 }
743d30ea906Sjfb8856606 
744d30ea906Sjfb8856606 static void
745d30ea906Sjfb8856606 ut_teardown(void)
746d30ea906Sjfb8856606 {
747d30ea906Sjfb8856606 	uint8_t i, dev_id;
748d30ea906Sjfb8856606 	struct rte_bbdev_stats stats;
749d30ea906Sjfb8856606 
750d30ea906Sjfb8856606 	for (i = 0; i < nb_active_devs; i++) {
751d30ea906Sjfb8856606 		dev_id = active_devs[i].dev_id;
752d30ea906Sjfb8856606 		/* read stats and print */
753d30ea906Sjfb8856606 		rte_bbdev_stats_get(dev_id, &stats);
754d30ea906Sjfb8856606 		/* Stop the device */
755d30ea906Sjfb8856606 		rte_bbdev_stop(dev_id);
756d30ea906Sjfb8856606 	}
757d30ea906Sjfb8856606 }
758d30ea906Sjfb8856606 
759d30ea906Sjfb8856606 static int
760d30ea906Sjfb8856606 init_op_data_objs(struct rte_bbdev_op_data *bufs,
761d30ea906Sjfb8856606 		struct op_data_entries *ref_entries,
762d30ea906Sjfb8856606 		struct rte_mempool *mbuf_pool, const uint16_t n,
763d30ea906Sjfb8856606 		enum op_data_type op_type, uint16_t min_alignment)
764d30ea906Sjfb8856606 {
765d30ea906Sjfb8856606 	int ret;
766d30ea906Sjfb8856606 	unsigned int i, j;
767d30ea906Sjfb8856606 
768d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
769d30ea906Sjfb8856606 		char *data;
770d30ea906Sjfb8856606 		struct op_data_buf *seg = &ref_entries->segments[0];
771d30ea906Sjfb8856606 		struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool);
772d30ea906Sjfb8856606 		TEST_ASSERT_NOT_NULL(m_head,
773d30ea906Sjfb8856606 				"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
774d30ea906Sjfb8856606 				op_type, n * ref_entries->nb_segments,
775d30ea906Sjfb8856606 				mbuf_pool->size);
776d30ea906Sjfb8856606 
777*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(((seg->length + RTE_PKTMBUF_HEADROOM) >
778*4418919fSjohnjiang 				(uint32_t)UINT16_MAX),
779*4418919fSjohnjiang 				"Given data is bigger than allowed mbuf segment size");
780*4418919fSjohnjiang 
781d30ea906Sjfb8856606 		bufs[i].data = m_head;
782d30ea906Sjfb8856606 		bufs[i].offset = 0;
783d30ea906Sjfb8856606 		bufs[i].length = 0;
784d30ea906Sjfb8856606 
785*4418919fSjohnjiang 		if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) {
786d30ea906Sjfb8856606 			data = rte_pktmbuf_append(m_head, seg->length);
787d30ea906Sjfb8856606 			TEST_ASSERT_NOT_NULL(data,
788d30ea906Sjfb8856606 					"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
789d30ea906Sjfb8856606 					seg->length, op_type);
790d30ea906Sjfb8856606 
791d30ea906Sjfb8856606 			TEST_ASSERT(data == RTE_PTR_ALIGN(data, min_alignment),
792d30ea906Sjfb8856606 					"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
793d30ea906Sjfb8856606 					data, min_alignment);
794d30ea906Sjfb8856606 			rte_memcpy(data, seg->addr, seg->length);
795d30ea906Sjfb8856606 			bufs[i].length += seg->length;
796d30ea906Sjfb8856606 
797d30ea906Sjfb8856606 			for (j = 1; j < ref_entries->nb_segments; ++j) {
798d30ea906Sjfb8856606 				struct rte_mbuf *m_tail =
799d30ea906Sjfb8856606 						rte_pktmbuf_alloc(mbuf_pool);
800d30ea906Sjfb8856606 				TEST_ASSERT_NOT_NULL(m_tail,
801d30ea906Sjfb8856606 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
802d30ea906Sjfb8856606 						op_type,
803d30ea906Sjfb8856606 						n * ref_entries->nb_segments,
804d30ea906Sjfb8856606 						mbuf_pool->size);
805d30ea906Sjfb8856606 				seg += 1;
806d30ea906Sjfb8856606 
807d30ea906Sjfb8856606 				data = rte_pktmbuf_append(m_tail, seg->length);
808d30ea906Sjfb8856606 				TEST_ASSERT_NOT_NULL(data,
809d30ea906Sjfb8856606 						"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
810d30ea906Sjfb8856606 						seg->length, op_type);
811d30ea906Sjfb8856606 
812d30ea906Sjfb8856606 				TEST_ASSERT(data == RTE_PTR_ALIGN(data,
813d30ea906Sjfb8856606 						min_alignment),
814d30ea906Sjfb8856606 						"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
815d30ea906Sjfb8856606 						data, min_alignment);
816d30ea906Sjfb8856606 				rte_memcpy(data, seg->addr, seg->length);
817d30ea906Sjfb8856606 				bufs[i].length += seg->length;
818d30ea906Sjfb8856606 
819d30ea906Sjfb8856606 				ret = rte_pktmbuf_chain(m_head, m_tail);
820d30ea906Sjfb8856606 				TEST_ASSERT_SUCCESS(ret,
821d30ea906Sjfb8856606 						"Couldn't chain mbufs from %d data type mbuf pool",
822d30ea906Sjfb8856606 						op_type);
823d30ea906Sjfb8856606 			}
824*4418919fSjohnjiang 		} else {
825*4418919fSjohnjiang 
826*4418919fSjohnjiang 			/* allocate chained-mbuf for output buffer */
827*4418919fSjohnjiang 			for (j = 1; j < ref_entries->nb_segments; ++j) {
828*4418919fSjohnjiang 				struct rte_mbuf *m_tail =
829*4418919fSjohnjiang 						rte_pktmbuf_alloc(mbuf_pool);
830*4418919fSjohnjiang 				TEST_ASSERT_NOT_NULL(m_tail,
831*4418919fSjohnjiang 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
832*4418919fSjohnjiang 						op_type,
833*4418919fSjohnjiang 						n * ref_entries->nb_segments,
834*4418919fSjohnjiang 						mbuf_pool->size);
835*4418919fSjohnjiang 
836*4418919fSjohnjiang 				ret = rte_pktmbuf_chain(m_head, m_tail);
837*4418919fSjohnjiang 				TEST_ASSERT_SUCCESS(ret,
838*4418919fSjohnjiang 						"Couldn't chain mbufs from %d data type mbuf pool",
839*4418919fSjohnjiang 						op_type);
840*4418919fSjohnjiang 			}
841d30ea906Sjfb8856606 		}
842d30ea906Sjfb8856606 	}
843d30ea906Sjfb8856606 
844d30ea906Sjfb8856606 	return 0;
845d30ea906Sjfb8856606 }
846d30ea906Sjfb8856606 
847d30ea906Sjfb8856606 static int
848d30ea906Sjfb8856606 allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len,
849d30ea906Sjfb8856606 		const int socket)
850d30ea906Sjfb8856606 {
851d30ea906Sjfb8856606 	int i;
852d30ea906Sjfb8856606 
853d30ea906Sjfb8856606 	*buffers = rte_zmalloc_socket(NULL, len, 0, socket);
854d30ea906Sjfb8856606 	if (*buffers == NULL) {
855d30ea906Sjfb8856606 		printf("WARNING: Failed to allocate op_data on socket %d\n",
856d30ea906Sjfb8856606 				socket);
857d30ea906Sjfb8856606 		/* try to allocate memory on other detected sockets */
858d30ea906Sjfb8856606 		for (i = 0; i < socket; i++) {
859d30ea906Sjfb8856606 			*buffers = rte_zmalloc_socket(NULL, len, 0, i);
860d30ea906Sjfb8856606 			if (*buffers != NULL)
861d30ea906Sjfb8856606 				break;
862d30ea906Sjfb8856606 		}
863d30ea906Sjfb8856606 	}
864d30ea906Sjfb8856606 
865d30ea906Sjfb8856606 	return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS;
866d30ea906Sjfb8856606 }
867d30ea906Sjfb8856606 
868d30ea906Sjfb8856606 static void
869d30ea906Sjfb8856606 limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops,
870*4418919fSjohnjiang 		const uint16_t n, const int8_t max_llr_modulus)
871d30ea906Sjfb8856606 {
872d30ea906Sjfb8856606 	uint16_t i, byte_idx;
873d30ea906Sjfb8856606 
874d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
875d30ea906Sjfb8856606 		struct rte_mbuf *m = input_ops[i].data;
876d30ea906Sjfb8856606 		while (m != NULL) {
877d30ea906Sjfb8856606 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
878d30ea906Sjfb8856606 					input_ops[i].offset);
879*4418919fSjohnjiang 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
880d30ea906Sjfb8856606 					++byte_idx)
881d30ea906Sjfb8856606 				llr[byte_idx] = round((double)max_llr_modulus *
882d30ea906Sjfb8856606 						llr[byte_idx] / INT8_MAX);
883d30ea906Sjfb8856606 
884d30ea906Sjfb8856606 			m = m->next;
885d30ea906Sjfb8856606 		}
886d30ea906Sjfb8856606 	}
887d30ea906Sjfb8856606 }
888d30ea906Sjfb8856606 
889*4418919fSjohnjiang static void
890*4418919fSjohnjiang ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops,
891*4418919fSjohnjiang 		const uint16_t n, const int8_t llr_size,
892*4418919fSjohnjiang 		const int8_t llr_decimals)
893*4418919fSjohnjiang {
894*4418919fSjohnjiang 	if (input_ops == NULL)
895*4418919fSjohnjiang 		return;
896*4418919fSjohnjiang 
897*4418919fSjohnjiang 	uint16_t i, byte_idx;
898*4418919fSjohnjiang 
899*4418919fSjohnjiang 	int16_t llr_max, llr_min, llr_tmp;
900*4418919fSjohnjiang 	llr_max = (1 << (llr_size - 1)) - 1;
901*4418919fSjohnjiang 	llr_min = -llr_max;
902*4418919fSjohnjiang 	for (i = 0; i < n; ++i) {
903*4418919fSjohnjiang 		struct rte_mbuf *m = input_ops[i].data;
904*4418919fSjohnjiang 		while (m != NULL) {
905*4418919fSjohnjiang 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
906*4418919fSjohnjiang 					input_ops[i].offset);
907*4418919fSjohnjiang 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
908*4418919fSjohnjiang 					++byte_idx) {
909*4418919fSjohnjiang 
910*4418919fSjohnjiang 				llr_tmp = llr[byte_idx];
911*4418919fSjohnjiang 				if (llr_decimals == 2)
912*4418919fSjohnjiang 					llr_tmp *= 2;
913*4418919fSjohnjiang 				else if (llr_decimals == 0)
914*4418919fSjohnjiang 					llr_tmp /= 2;
915*4418919fSjohnjiang 				llr_tmp = RTE_MIN(llr_max,
916*4418919fSjohnjiang 						RTE_MAX(llr_min, llr_tmp));
917*4418919fSjohnjiang 				llr[byte_idx] = (int8_t) llr_tmp;
918*4418919fSjohnjiang 			}
919*4418919fSjohnjiang 
920*4418919fSjohnjiang 			m = m->next;
921*4418919fSjohnjiang 		}
922*4418919fSjohnjiang 	}
923*4418919fSjohnjiang }
924*4418919fSjohnjiang 
925*4418919fSjohnjiang 
926*4418919fSjohnjiang 
927d30ea906Sjfb8856606 static int
928d30ea906Sjfb8856606 fill_queue_buffers(struct test_op_params *op_params,
929d30ea906Sjfb8856606 		struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp,
930*4418919fSjohnjiang 		struct rte_mempool *soft_out_mp,
931*4418919fSjohnjiang 		struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp,
932*4418919fSjohnjiang 		uint16_t queue_id,
933d30ea906Sjfb8856606 		const struct rte_bbdev_op_cap *capabilities,
934d30ea906Sjfb8856606 		uint16_t min_alignment, const int socket_id)
935d30ea906Sjfb8856606 {
936d30ea906Sjfb8856606 	int ret;
937d30ea906Sjfb8856606 	enum op_data_type type;
938d30ea906Sjfb8856606 	const uint16_t n = op_params->num_to_process;
939d30ea906Sjfb8856606 
940d30ea906Sjfb8856606 	struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {
941d30ea906Sjfb8856606 		in_mp,
942d30ea906Sjfb8856606 		soft_out_mp,
943d30ea906Sjfb8856606 		hard_out_mp,
944*4418919fSjohnjiang 		harq_in_mp,
945*4418919fSjohnjiang 		harq_out_mp,
946d30ea906Sjfb8856606 	};
947d30ea906Sjfb8856606 
948d30ea906Sjfb8856606 	struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {
949d30ea906Sjfb8856606 		&op_params->q_bufs[socket_id][queue_id].inputs,
950d30ea906Sjfb8856606 		&op_params->q_bufs[socket_id][queue_id].soft_outputs,
951d30ea906Sjfb8856606 		&op_params->q_bufs[socket_id][queue_id].hard_outputs,
952*4418919fSjohnjiang 		&op_params->q_bufs[socket_id][queue_id].harq_inputs,
953*4418919fSjohnjiang 		&op_params->q_bufs[socket_id][queue_id].harq_outputs,
954d30ea906Sjfb8856606 	};
955d30ea906Sjfb8856606 
956d30ea906Sjfb8856606 	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
957d30ea906Sjfb8856606 		struct op_data_entries *ref_entries =
958d30ea906Sjfb8856606 				&test_vector.entries[type];
959d30ea906Sjfb8856606 		if (ref_entries->nb_segments == 0)
960d30ea906Sjfb8856606 			continue;
961d30ea906Sjfb8856606 
962d30ea906Sjfb8856606 		ret = allocate_buffers_on_socket(queue_ops[type],
963d30ea906Sjfb8856606 				n * sizeof(struct rte_bbdev_op_data),
964d30ea906Sjfb8856606 				socket_id);
965d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
966d30ea906Sjfb8856606 				"Couldn't allocate memory for rte_bbdev_op_data structs");
967d30ea906Sjfb8856606 
968d30ea906Sjfb8856606 		ret = init_op_data_objs(*queue_ops[type], ref_entries,
969d30ea906Sjfb8856606 				mbuf_pools[type], n, type, min_alignment);
970d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
971d30ea906Sjfb8856606 				"Couldn't init rte_bbdev_op_data structs");
972d30ea906Sjfb8856606 	}
973d30ea906Sjfb8856606 
974d30ea906Sjfb8856606 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
975d30ea906Sjfb8856606 		limit_input_llr_val_range(*queue_ops[DATA_INPUT], n,
976d30ea906Sjfb8856606 			capabilities->cap.turbo_dec.max_llr_modulus);
977d30ea906Sjfb8856606 
978*4418919fSjohnjiang 	if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
979*4418919fSjohnjiang 		ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n,
980*4418919fSjohnjiang 			capabilities->cap.ldpc_dec.llr_size,
981*4418919fSjohnjiang 			capabilities->cap.ldpc_dec.llr_decimals);
982*4418919fSjohnjiang 		ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n,
983*4418919fSjohnjiang 				capabilities->cap.ldpc_dec.llr_size,
984*4418919fSjohnjiang 				capabilities->cap.ldpc_dec.llr_decimals);
985*4418919fSjohnjiang 	}
986*4418919fSjohnjiang 
987d30ea906Sjfb8856606 	return 0;
988d30ea906Sjfb8856606 }
989d30ea906Sjfb8856606 
990d30ea906Sjfb8856606 static void
991d30ea906Sjfb8856606 free_buffers(struct active_device *ad, struct test_op_params *op_params)
992d30ea906Sjfb8856606 {
993d30ea906Sjfb8856606 	unsigned int i, j;
994d30ea906Sjfb8856606 
995d30ea906Sjfb8856606 	rte_mempool_free(ad->ops_mempool);
996d30ea906Sjfb8856606 	rte_mempool_free(ad->in_mbuf_pool);
997d30ea906Sjfb8856606 	rte_mempool_free(ad->hard_out_mbuf_pool);
998d30ea906Sjfb8856606 	rte_mempool_free(ad->soft_out_mbuf_pool);
999*4418919fSjohnjiang 	rte_mempool_free(ad->harq_in_mbuf_pool);
1000*4418919fSjohnjiang 	rte_mempool_free(ad->harq_out_mbuf_pool);
1001d30ea906Sjfb8856606 
1002d30ea906Sjfb8856606 	for (i = 0; i < rte_lcore_count(); ++i) {
1003d30ea906Sjfb8856606 		for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) {
1004d30ea906Sjfb8856606 			rte_free(op_params->q_bufs[j][i].inputs);
1005d30ea906Sjfb8856606 			rte_free(op_params->q_bufs[j][i].hard_outputs);
1006d30ea906Sjfb8856606 			rte_free(op_params->q_bufs[j][i].soft_outputs);
1007*4418919fSjohnjiang 			rte_free(op_params->q_bufs[j][i].harq_inputs);
1008*4418919fSjohnjiang 			rte_free(op_params->q_bufs[j][i].harq_outputs);
1009d30ea906Sjfb8856606 		}
1010d30ea906Sjfb8856606 	}
1011d30ea906Sjfb8856606 }
1012d30ea906Sjfb8856606 
1013d30ea906Sjfb8856606 static void
1014d30ea906Sjfb8856606 copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1015d30ea906Sjfb8856606 		unsigned int start_idx,
1016d30ea906Sjfb8856606 		struct rte_bbdev_op_data *inputs,
1017d30ea906Sjfb8856606 		struct rte_bbdev_op_data *hard_outputs,
1018d30ea906Sjfb8856606 		struct rte_bbdev_op_data *soft_outputs,
1019d30ea906Sjfb8856606 		struct rte_bbdev_dec_op *ref_op)
1020d30ea906Sjfb8856606 {
1021d30ea906Sjfb8856606 	unsigned int i;
1022d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec;
1023d30ea906Sjfb8856606 
1024d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
1025d30ea906Sjfb8856606 		if (turbo_dec->code_block_mode == 0) {
1026d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.ea =
1027d30ea906Sjfb8856606 					turbo_dec->tb_params.ea;
1028d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.eb =
1029d30ea906Sjfb8856606 					turbo_dec->tb_params.eb;
1030d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.k_pos =
1031d30ea906Sjfb8856606 					turbo_dec->tb_params.k_pos;
1032d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.k_neg =
1033d30ea906Sjfb8856606 					turbo_dec->tb_params.k_neg;
1034d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.c =
1035d30ea906Sjfb8856606 					turbo_dec->tb_params.c;
1036d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.c_neg =
1037d30ea906Sjfb8856606 					turbo_dec->tb_params.c_neg;
1038d30ea906Sjfb8856606 			ops[i]->turbo_dec.tb_params.cab =
1039d30ea906Sjfb8856606 					turbo_dec->tb_params.cab;
1040*4418919fSjohnjiang 			ops[i]->turbo_dec.tb_params.r =
1041*4418919fSjohnjiang 					turbo_dec->tb_params.r;
1042d30ea906Sjfb8856606 		} else {
1043d30ea906Sjfb8856606 			ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e;
1044d30ea906Sjfb8856606 			ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k;
1045d30ea906Sjfb8856606 		}
1046d30ea906Sjfb8856606 
1047d30ea906Sjfb8856606 		ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale;
1048d30ea906Sjfb8856606 		ops[i]->turbo_dec.iter_max = turbo_dec->iter_max;
1049d30ea906Sjfb8856606 		ops[i]->turbo_dec.iter_min = turbo_dec->iter_min;
1050d30ea906Sjfb8856606 		ops[i]->turbo_dec.op_flags = turbo_dec->op_flags;
1051d30ea906Sjfb8856606 		ops[i]->turbo_dec.rv_index = turbo_dec->rv_index;
1052d30ea906Sjfb8856606 		ops[i]->turbo_dec.num_maps = turbo_dec->num_maps;
1053d30ea906Sjfb8856606 		ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode;
1054d30ea906Sjfb8856606 
1055d30ea906Sjfb8856606 		ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i];
1056d30ea906Sjfb8856606 		ops[i]->turbo_dec.input = inputs[start_idx + i];
1057d30ea906Sjfb8856606 		if (soft_outputs != NULL)
1058d30ea906Sjfb8856606 			ops[i]->turbo_dec.soft_output =
1059d30ea906Sjfb8856606 				soft_outputs[start_idx + i];
1060d30ea906Sjfb8856606 	}
1061d30ea906Sjfb8856606 }
1062d30ea906Sjfb8856606 
1063d30ea906Sjfb8856606 static void
1064d30ea906Sjfb8856606 copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1065d30ea906Sjfb8856606 		unsigned int start_idx,
1066d30ea906Sjfb8856606 		struct rte_bbdev_op_data *inputs,
1067d30ea906Sjfb8856606 		struct rte_bbdev_op_data *outputs,
1068d30ea906Sjfb8856606 		struct rte_bbdev_enc_op *ref_op)
1069d30ea906Sjfb8856606 {
1070d30ea906Sjfb8856606 	unsigned int i;
1071d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc;
1072d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
1073d30ea906Sjfb8856606 		if (turbo_enc->code_block_mode == 0) {
1074d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.ea =
1075d30ea906Sjfb8856606 					turbo_enc->tb_params.ea;
1076d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.eb =
1077d30ea906Sjfb8856606 					turbo_enc->tb_params.eb;
1078d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.k_pos =
1079d30ea906Sjfb8856606 					turbo_enc->tb_params.k_pos;
1080d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.k_neg =
1081d30ea906Sjfb8856606 					turbo_enc->tb_params.k_neg;
1082d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.c =
1083d30ea906Sjfb8856606 					turbo_enc->tb_params.c;
1084d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.c_neg =
1085d30ea906Sjfb8856606 					turbo_enc->tb_params.c_neg;
1086d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.cab =
1087d30ea906Sjfb8856606 					turbo_enc->tb_params.cab;
1088d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.ncb_pos =
1089d30ea906Sjfb8856606 					turbo_enc->tb_params.ncb_pos;
1090d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.ncb_neg =
1091d30ea906Sjfb8856606 					turbo_enc->tb_params.ncb_neg;
1092d30ea906Sjfb8856606 			ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r;
1093d30ea906Sjfb8856606 		} else {
1094d30ea906Sjfb8856606 			ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e;
1095d30ea906Sjfb8856606 			ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k;
1096d30ea906Sjfb8856606 			ops[i]->turbo_enc.cb_params.ncb =
1097d30ea906Sjfb8856606 					turbo_enc->cb_params.ncb;
1098d30ea906Sjfb8856606 		}
1099d30ea906Sjfb8856606 		ops[i]->turbo_enc.rv_index = turbo_enc->rv_index;
1100d30ea906Sjfb8856606 		ops[i]->turbo_enc.op_flags = turbo_enc->op_flags;
1101d30ea906Sjfb8856606 		ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode;
1102d30ea906Sjfb8856606 
1103d30ea906Sjfb8856606 		ops[i]->turbo_enc.output = outputs[start_idx + i];
1104d30ea906Sjfb8856606 		ops[i]->turbo_enc.input = inputs[start_idx + i];
1105d30ea906Sjfb8856606 	}
1106d30ea906Sjfb8856606 }
1107d30ea906Sjfb8856606 
1108*4418919fSjohnjiang static void
1109*4418919fSjohnjiang copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1110*4418919fSjohnjiang 		unsigned int start_idx,
1111*4418919fSjohnjiang 		struct rte_bbdev_op_data *inputs,
1112*4418919fSjohnjiang 		struct rte_bbdev_op_data *hard_outputs,
1113*4418919fSjohnjiang 		struct rte_bbdev_op_data *soft_outputs,
1114*4418919fSjohnjiang 		struct rte_bbdev_op_data *harq_inputs,
1115*4418919fSjohnjiang 		struct rte_bbdev_op_data *harq_outputs,
1116*4418919fSjohnjiang 		struct rte_bbdev_dec_op *ref_op)
1117*4418919fSjohnjiang {
1118*4418919fSjohnjiang 	unsigned int i;
1119*4418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec;
1120*4418919fSjohnjiang 
1121*4418919fSjohnjiang 	for (i = 0; i < n; ++i) {
1122*4418919fSjohnjiang 		if (ldpc_dec->code_block_mode == 0) {
1123*4418919fSjohnjiang 			ops[i]->ldpc_dec.tb_params.ea =
1124*4418919fSjohnjiang 					ldpc_dec->tb_params.ea;
1125*4418919fSjohnjiang 			ops[i]->ldpc_dec.tb_params.eb =
1126*4418919fSjohnjiang 					ldpc_dec->tb_params.eb;
1127*4418919fSjohnjiang 			ops[i]->ldpc_dec.tb_params.c =
1128*4418919fSjohnjiang 					ldpc_dec->tb_params.c;
1129*4418919fSjohnjiang 			ops[i]->ldpc_dec.tb_params.cab =
1130*4418919fSjohnjiang 					ldpc_dec->tb_params.cab;
1131*4418919fSjohnjiang 			ops[i]->ldpc_dec.tb_params.r =
1132*4418919fSjohnjiang 					ldpc_dec->tb_params.r;
1133*4418919fSjohnjiang 		} else {
1134*4418919fSjohnjiang 			ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e;
1135*4418919fSjohnjiang 		}
1136*4418919fSjohnjiang 
1137*4418919fSjohnjiang 		ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph;
1138*4418919fSjohnjiang 		ops[i]->ldpc_dec.z_c = ldpc_dec->z_c;
1139*4418919fSjohnjiang 		ops[i]->ldpc_dec.q_m = ldpc_dec->q_m;
1140*4418919fSjohnjiang 		ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler;
1141*4418919fSjohnjiang 		ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb;
1142*4418919fSjohnjiang 		ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max;
1143*4418919fSjohnjiang 		ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index;
1144*4418919fSjohnjiang 		ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags;
1145*4418919fSjohnjiang 		ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode;
1146*4418919fSjohnjiang 
1147*4418919fSjohnjiang 		ops[i]->ldpc_dec.hard_output = hard_outputs[start_idx + i];
1148*4418919fSjohnjiang 		ops[i]->ldpc_dec.input = inputs[start_idx + i];
1149*4418919fSjohnjiang 		if (soft_outputs != NULL)
1150*4418919fSjohnjiang 			ops[i]->ldpc_dec.soft_output =
1151*4418919fSjohnjiang 				soft_outputs[start_idx + i];
1152*4418919fSjohnjiang 		if (harq_inputs != NULL)
1153*4418919fSjohnjiang 			ops[i]->ldpc_dec.harq_combined_input =
1154*4418919fSjohnjiang 					harq_inputs[start_idx + i];
1155*4418919fSjohnjiang 		if (harq_outputs != NULL)
1156*4418919fSjohnjiang 			ops[i]->ldpc_dec.harq_combined_output =
1157*4418919fSjohnjiang 				harq_outputs[start_idx + i];
1158*4418919fSjohnjiang 	}
1159*4418919fSjohnjiang }
1160*4418919fSjohnjiang 
1161*4418919fSjohnjiang 
1162*4418919fSjohnjiang static void
1163*4418919fSjohnjiang copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1164*4418919fSjohnjiang 		unsigned int start_idx,
1165*4418919fSjohnjiang 		struct rte_bbdev_op_data *inputs,
1166*4418919fSjohnjiang 		struct rte_bbdev_op_data *outputs,
1167*4418919fSjohnjiang 		struct rte_bbdev_enc_op *ref_op)
1168*4418919fSjohnjiang {
1169*4418919fSjohnjiang 	unsigned int i;
1170*4418919fSjohnjiang 	struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc;
1171*4418919fSjohnjiang 	for (i = 0; i < n; ++i) {
1172*4418919fSjohnjiang 		if (ldpc_enc->code_block_mode == 0) {
1173*4418919fSjohnjiang 			ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea;
1174*4418919fSjohnjiang 			ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb;
1175*4418919fSjohnjiang 			ops[i]->ldpc_enc.tb_params.cab =
1176*4418919fSjohnjiang 					ldpc_enc->tb_params.cab;
1177*4418919fSjohnjiang 			ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c;
1178*4418919fSjohnjiang 			ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r;
1179*4418919fSjohnjiang 		} else {
1180*4418919fSjohnjiang 			ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e;
1181*4418919fSjohnjiang 		}
1182*4418919fSjohnjiang 		ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph;
1183*4418919fSjohnjiang 		ops[i]->ldpc_enc.z_c = ldpc_enc->z_c;
1184*4418919fSjohnjiang 		ops[i]->ldpc_enc.q_m = ldpc_enc->q_m;
1185*4418919fSjohnjiang 		ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler;
1186*4418919fSjohnjiang 		ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb;
1187*4418919fSjohnjiang 		ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index;
1188*4418919fSjohnjiang 		ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags;
1189*4418919fSjohnjiang 		ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode;
1190*4418919fSjohnjiang 		ops[i]->ldpc_enc.output = outputs[start_idx + i];
1191*4418919fSjohnjiang 		ops[i]->ldpc_enc.input = inputs[start_idx + i];
1192*4418919fSjohnjiang 	}
1193*4418919fSjohnjiang }
1194*4418919fSjohnjiang 
1195d30ea906Sjfb8856606 static int
1196d30ea906Sjfb8856606 check_dec_status_and_ordering(struct rte_bbdev_dec_op *op,
1197d30ea906Sjfb8856606 		unsigned int order_idx, const int expected_status)
1198d30ea906Sjfb8856606 {
1199d30ea906Sjfb8856606 	TEST_ASSERT(op->status == expected_status,
1200d30ea906Sjfb8856606 			"op_status (%d) != expected_status (%d)",
1201d30ea906Sjfb8856606 			op->status, expected_status);
1202d30ea906Sjfb8856606 
1203d30ea906Sjfb8856606 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
1204d30ea906Sjfb8856606 			"Ordering error, expected %p, got %p",
1205d30ea906Sjfb8856606 			(void *)(uintptr_t)order_idx, op->opaque_data);
1206d30ea906Sjfb8856606 
1207d30ea906Sjfb8856606 	return TEST_SUCCESS;
1208d30ea906Sjfb8856606 }
1209d30ea906Sjfb8856606 
1210d30ea906Sjfb8856606 static int
1211d30ea906Sjfb8856606 check_enc_status_and_ordering(struct rte_bbdev_enc_op *op,
1212d30ea906Sjfb8856606 		unsigned int order_idx, const int expected_status)
1213d30ea906Sjfb8856606 {
1214d30ea906Sjfb8856606 	TEST_ASSERT(op->status == expected_status,
1215d30ea906Sjfb8856606 			"op_status (%d) != expected_status (%d)",
1216d30ea906Sjfb8856606 			op->status, expected_status);
1217d30ea906Sjfb8856606 
1218d30ea906Sjfb8856606 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
1219d30ea906Sjfb8856606 			"Ordering error, expected %p, got %p",
1220d30ea906Sjfb8856606 			(void *)(uintptr_t)order_idx, op->opaque_data);
1221d30ea906Sjfb8856606 
1222d30ea906Sjfb8856606 	return TEST_SUCCESS;
1223d30ea906Sjfb8856606 }
1224d30ea906Sjfb8856606 
1225d30ea906Sjfb8856606 static inline int
1226d30ea906Sjfb8856606 validate_op_chain(struct rte_bbdev_op_data *op,
1227d30ea906Sjfb8856606 		struct op_data_entries *orig_op)
1228d30ea906Sjfb8856606 {
1229d30ea906Sjfb8856606 	uint8_t i;
1230d30ea906Sjfb8856606 	struct rte_mbuf *m = op->data;
1231d30ea906Sjfb8856606 	uint8_t nb_dst_segments = orig_op->nb_segments;
1232*4418919fSjohnjiang 	uint32_t total_data_size = 0;
1233d30ea906Sjfb8856606 
1234d30ea906Sjfb8856606 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
1235d30ea906Sjfb8856606 			"Number of segments differ in original (%u) and filled (%u) op",
1236d30ea906Sjfb8856606 			nb_dst_segments, m->nb_segs);
1237d30ea906Sjfb8856606 
1238*4418919fSjohnjiang 	/* Validate each mbuf segment length */
1239d30ea906Sjfb8856606 	for (i = 0; i < nb_dst_segments; ++i) {
1240d30ea906Sjfb8856606 		/* Apply offset to the first mbuf segment */
1241d30ea906Sjfb8856606 		uint16_t offset = (i == 0) ? op->offset : 0;
1242*4418919fSjohnjiang 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
1243*4418919fSjohnjiang 		total_data_size += orig_op->segments[i].length;
1244d30ea906Sjfb8856606 
1245d30ea906Sjfb8856606 		TEST_ASSERT(orig_op->segments[i].length == data_len,
1246d30ea906Sjfb8856606 				"Length of segment differ in original (%u) and filled (%u) op",
1247d30ea906Sjfb8856606 				orig_op->segments[i].length, data_len);
1248d30ea906Sjfb8856606 		TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr,
1249d30ea906Sjfb8856606 				rte_pktmbuf_mtod_offset(m, uint32_t *, offset),
1250d30ea906Sjfb8856606 				data_len,
1251d30ea906Sjfb8856606 				"Output buffers (CB=%u) are not equal", i);
1252d30ea906Sjfb8856606 		m = m->next;
1253d30ea906Sjfb8856606 	}
1254d30ea906Sjfb8856606 
1255*4418919fSjohnjiang 	/* Validate total mbuf pkt length */
1256*4418919fSjohnjiang 	uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset;
1257*4418919fSjohnjiang 	TEST_ASSERT(total_data_size == pkt_len,
1258*4418919fSjohnjiang 			"Length of data differ in original (%u) and filled (%u) op",
1259*4418919fSjohnjiang 			total_data_size, pkt_len);
1260d30ea906Sjfb8856606 
1261d30ea906Sjfb8856606 	return TEST_SUCCESS;
1262d30ea906Sjfb8856606 }
1263d30ea906Sjfb8856606 
1264d30ea906Sjfb8856606 static int
1265d30ea906Sjfb8856606 validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
1266d30ea906Sjfb8856606 		struct rte_bbdev_dec_op *ref_op, const int vector_mask)
1267d30ea906Sjfb8856606 {
1268d30ea906Sjfb8856606 	unsigned int i;
1269d30ea906Sjfb8856606 	int ret;
1270d30ea906Sjfb8856606 	struct op_data_entries *hard_data_orig =
1271d30ea906Sjfb8856606 			&test_vector.entries[DATA_HARD_OUTPUT];
1272d30ea906Sjfb8856606 	struct op_data_entries *soft_data_orig =
1273d30ea906Sjfb8856606 			&test_vector.entries[DATA_SOFT_OUTPUT];
1274d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *ops_td;
1275d30ea906Sjfb8856606 	struct rte_bbdev_op_data *hard_output;
1276d30ea906Sjfb8856606 	struct rte_bbdev_op_data *soft_output;
1277d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec;
1278d30ea906Sjfb8856606 
1279d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
1280d30ea906Sjfb8856606 		ops_td = &ops[i]->turbo_dec;
1281d30ea906Sjfb8856606 		hard_output = &ops_td->hard_output;
1282d30ea906Sjfb8856606 		soft_output = &ops_td->soft_output;
1283d30ea906Sjfb8856606 
1284d30ea906Sjfb8856606 		if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)
1285d30ea906Sjfb8856606 			TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count,
1286d30ea906Sjfb8856606 					"Returned iter_count (%d) > expected iter_count (%d)",
1287d30ea906Sjfb8856606 					ops_td->iter_count, ref_td->iter_count);
1288d30ea906Sjfb8856606 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
1289d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
1290d30ea906Sjfb8856606 				"Checking status and ordering for decoder failed");
1291d30ea906Sjfb8856606 
1292d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
1293d30ea906Sjfb8856606 				hard_data_orig),
1294d30ea906Sjfb8856606 				"Hard output buffers (CB=%u) are not equal",
1295d30ea906Sjfb8856606 				i);
1296d30ea906Sjfb8856606 
1297d30ea906Sjfb8856606 		if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT)
1298d30ea906Sjfb8856606 			TEST_ASSERT_SUCCESS(validate_op_chain(soft_output,
1299d30ea906Sjfb8856606 					soft_data_orig),
1300d30ea906Sjfb8856606 					"Soft output buffers (CB=%u) are not equal",
1301d30ea906Sjfb8856606 					i);
1302d30ea906Sjfb8856606 	}
1303d30ea906Sjfb8856606 
1304d30ea906Sjfb8856606 	return TEST_SUCCESS;
1305d30ea906Sjfb8856606 }
1306d30ea906Sjfb8856606 
1307*4418919fSjohnjiang 
1308*4418919fSjohnjiang static int
1309*4418919fSjohnjiang validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
1310*4418919fSjohnjiang 		struct rte_bbdev_dec_op *ref_op, const int vector_mask)
1311*4418919fSjohnjiang {
1312*4418919fSjohnjiang 	unsigned int i;
1313*4418919fSjohnjiang 	int ret;
1314*4418919fSjohnjiang 	struct op_data_entries *hard_data_orig =
1315*4418919fSjohnjiang 			&test_vector.entries[DATA_HARD_OUTPUT];
1316*4418919fSjohnjiang 	struct op_data_entries *soft_data_orig =
1317*4418919fSjohnjiang 			&test_vector.entries[DATA_SOFT_OUTPUT];
1318*4418919fSjohnjiang 	struct op_data_entries *harq_data_orig =
1319*4418919fSjohnjiang 				&test_vector.entries[DATA_HARQ_OUTPUT];
1320*4418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ops_td;
1321*4418919fSjohnjiang 	struct rte_bbdev_op_data *hard_output;
1322*4418919fSjohnjiang 	struct rte_bbdev_op_data *harq_output;
1323*4418919fSjohnjiang 	struct rte_bbdev_op_data *soft_output;
1324*4418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec;
1325*4418919fSjohnjiang 
1326*4418919fSjohnjiang 	for (i = 0; i < n; ++i) {
1327*4418919fSjohnjiang 		ops_td = &ops[i]->ldpc_dec;
1328*4418919fSjohnjiang 		hard_output = &ops_td->hard_output;
1329*4418919fSjohnjiang 		harq_output = &ops_td->harq_combined_output;
1330*4418919fSjohnjiang 		soft_output = &ops_td->soft_output;
1331*4418919fSjohnjiang 
1332*4418919fSjohnjiang 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
1333*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
1334*4418919fSjohnjiang 				"Checking status and ordering for decoder failed");
1335*4418919fSjohnjiang 		if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)
1336*4418919fSjohnjiang 			TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count,
1337*4418919fSjohnjiang 					"Returned iter_count (%d) > expected iter_count (%d)",
1338*4418919fSjohnjiang 					ops_td->iter_count, ref_td->iter_count);
1339*4418919fSjohnjiang 		/* We can ignore data when the decoding failed to converge */
1340*4418919fSjohnjiang 		if ((ops[i]->status &  (1 << RTE_BBDEV_SYNDROME_ERROR)) == 0)
1341*4418919fSjohnjiang 			TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
1342*4418919fSjohnjiang 					hard_data_orig),
1343*4418919fSjohnjiang 					"Hard output buffers (CB=%u) are not equal",
1344*4418919fSjohnjiang 					i);
1345*4418919fSjohnjiang 
1346*4418919fSjohnjiang 		if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE)
1347*4418919fSjohnjiang 			TEST_ASSERT_SUCCESS(validate_op_chain(soft_output,
1348*4418919fSjohnjiang 					soft_data_orig),
1349*4418919fSjohnjiang 					"Soft output buffers (CB=%u) are not equal",
1350*4418919fSjohnjiang 					i);
1351*4418919fSjohnjiang 		if (ref_op->ldpc_dec.op_flags &
1352*4418919fSjohnjiang 				RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) {
1353*4418919fSjohnjiang 			ldpc_input_llr_scaling(harq_output, 1, 8, 0);
1354*4418919fSjohnjiang 			TEST_ASSERT_SUCCESS(validate_op_chain(harq_output,
1355*4418919fSjohnjiang 					harq_data_orig),
1356*4418919fSjohnjiang 					"HARQ output buffers (CB=%u) are not equal",
1357*4418919fSjohnjiang 					i);
1358*4418919fSjohnjiang 		}
1359*4418919fSjohnjiang 	}
1360*4418919fSjohnjiang 
1361*4418919fSjohnjiang 	return TEST_SUCCESS;
1362*4418919fSjohnjiang }
1363*4418919fSjohnjiang 
1364*4418919fSjohnjiang 
1365d30ea906Sjfb8856606 static int
1366d30ea906Sjfb8856606 validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
1367d30ea906Sjfb8856606 		struct rte_bbdev_enc_op *ref_op)
1368d30ea906Sjfb8856606 {
1369d30ea906Sjfb8856606 	unsigned int i;
1370d30ea906Sjfb8856606 	int ret;
1371d30ea906Sjfb8856606 	struct op_data_entries *hard_data_orig =
1372d30ea906Sjfb8856606 			&test_vector.entries[DATA_HARD_OUTPUT];
1373d30ea906Sjfb8856606 
1374d30ea906Sjfb8856606 	for (i = 0; i < n; ++i) {
1375d30ea906Sjfb8856606 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
1376d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
1377d30ea906Sjfb8856606 				"Checking status and ordering for encoder failed");
1378d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(validate_op_chain(
1379d30ea906Sjfb8856606 				&ops[i]->turbo_enc.output,
1380d30ea906Sjfb8856606 				hard_data_orig),
1381d30ea906Sjfb8856606 				"Output buffers (CB=%u) are not equal",
1382d30ea906Sjfb8856606 				i);
1383d30ea906Sjfb8856606 	}
1384d30ea906Sjfb8856606 
1385d30ea906Sjfb8856606 	return TEST_SUCCESS;
1386d30ea906Sjfb8856606 }
1387d30ea906Sjfb8856606 
1388*4418919fSjohnjiang static int
1389*4418919fSjohnjiang validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
1390*4418919fSjohnjiang 		struct rte_bbdev_enc_op *ref_op)
1391*4418919fSjohnjiang {
1392*4418919fSjohnjiang 	unsigned int i;
1393*4418919fSjohnjiang 	int ret;
1394*4418919fSjohnjiang 	struct op_data_entries *hard_data_orig =
1395*4418919fSjohnjiang 			&test_vector.entries[DATA_HARD_OUTPUT];
1396*4418919fSjohnjiang 
1397*4418919fSjohnjiang 	for (i = 0; i < n; ++i) {
1398*4418919fSjohnjiang 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
1399*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
1400*4418919fSjohnjiang 				"Checking status and ordering for encoder failed");
1401*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(validate_op_chain(
1402*4418919fSjohnjiang 				&ops[i]->ldpc_enc.output,
1403*4418919fSjohnjiang 				hard_data_orig),
1404*4418919fSjohnjiang 				"Output buffers (CB=%u) are not equal",
1405*4418919fSjohnjiang 				i);
1406*4418919fSjohnjiang 	}
1407*4418919fSjohnjiang 
1408*4418919fSjohnjiang 	return TEST_SUCCESS;
1409*4418919fSjohnjiang }
1410*4418919fSjohnjiang 
1411d30ea906Sjfb8856606 static void
1412d30ea906Sjfb8856606 create_reference_dec_op(struct rte_bbdev_dec_op *op)
1413d30ea906Sjfb8856606 {
1414d30ea906Sjfb8856606 	unsigned int i;
1415d30ea906Sjfb8856606 	struct op_data_entries *entry;
1416d30ea906Sjfb8856606 
1417d30ea906Sjfb8856606 	op->turbo_dec = test_vector.turbo_dec;
1418d30ea906Sjfb8856606 	entry = &test_vector.entries[DATA_INPUT];
1419d30ea906Sjfb8856606 	for (i = 0; i < entry->nb_segments; ++i)
1420d30ea906Sjfb8856606 		op->turbo_dec.input.length +=
1421d30ea906Sjfb8856606 				entry->segments[i].length;
1422d30ea906Sjfb8856606 }
1423d30ea906Sjfb8856606 
1424d30ea906Sjfb8856606 static void
1425*4418919fSjohnjiang create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op)
1426*4418919fSjohnjiang {
1427*4418919fSjohnjiang 	unsigned int i;
1428*4418919fSjohnjiang 	struct op_data_entries *entry;
1429*4418919fSjohnjiang 
1430*4418919fSjohnjiang 	op->ldpc_dec = test_vector.ldpc_dec;
1431*4418919fSjohnjiang 	entry = &test_vector.entries[DATA_INPUT];
1432*4418919fSjohnjiang 	for (i = 0; i < entry->nb_segments; ++i)
1433*4418919fSjohnjiang 		op->ldpc_dec.input.length +=
1434*4418919fSjohnjiang 				entry->segments[i].length;
1435*4418919fSjohnjiang 	if (test_vector.ldpc_dec.op_flags &
1436*4418919fSjohnjiang 			RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) {
1437*4418919fSjohnjiang 		entry = &test_vector.entries[DATA_HARQ_INPUT];
1438*4418919fSjohnjiang 		for (i = 0; i < entry->nb_segments; ++i)
1439*4418919fSjohnjiang 			op->ldpc_dec.harq_combined_input.length +=
1440*4418919fSjohnjiang 				entry->segments[i].length;
1441*4418919fSjohnjiang 	}
1442*4418919fSjohnjiang }
1443*4418919fSjohnjiang 
1444*4418919fSjohnjiang 
1445*4418919fSjohnjiang static void
1446d30ea906Sjfb8856606 create_reference_enc_op(struct rte_bbdev_enc_op *op)
1447d30ea906Sjfb8856606 {
1448d30ea906Sjfb8856606 	unsigned int i;
1449d30ea906Sjfb8856606 	struct op_data_entries *entry;
1450d30ea906Sjfb8856606 
1451d30ea906Sjfb8856606 	op->turbo_enc = test_vector.turbo_enc;
1452d30ea906Sjfb8856606 	entry = &test_vector.entries[DATA_INPUT];
1453d30ea906Sjfb8856606 	for (i = 0; i < entry->nb_segments; ++i)
1454d30ea906Sjfb8856606 		op->turbo_enc.input.length +=
1455d30ea906Sjfb8856606 				entry->segments[i].length;
1456d30ea906Sjfb8856606 }
1457d30ea906Sjfb8856606 
1458*4418919fSjohnjiang static void
1459*4418919fSjohnjiang create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op)
1460*4418919fSjohnjiang {
1461*4418919fSjohnjiang 	unsigned int i;
1462*4418919fSjohnjiang 	struct op_data_entries *entry;
1463*4418919fSjohnjiang 
1464*4418919fSjohnjiang 	op->ldpc_enc = test_vector.ldpc_enc;
1465*4418919fSjohnjiang 	entry = &test_vector.entries[DATA_INPUT];
1466*4418919fSjohnjiang 	for (i = 0; i < entry->nb_segments; ++i)
1467*4418919fSjohnjiang 		op->ldpc_enc.input.length +=
1468*4418919fSjohnjiang 				entry->segments[i].length;
1469*4418919fSjohnjiang }
1470*4418919fSjohnjiang 
1471*4418919fSjohnjiang static uint32_t
1472*4418919fSjohnjiang calc_dec_TB_size(struct rte_bbdev_dec_op *op)
1473*4418919fSjohnjiang {
1474*4418919fSjohnjiang 	uint8_t i;
1475*4418919fSjohnjiang 	uint32_t c, r, tb_size = 0;
1476*4418919fSjohnjiang 
1477*4418919fSjohnjiang 	if (op->turbo_dec.code_block_mode) {
1478*4418919fSjohnjiang 		tb_size = op->turbo_dec.tb_params.k_neg;
1479*4418919fSjohnjiang 	} else {
1480*4418919fSjohnjiang 		c = op->turbo_dec.tb_params.c;
1481*4418919fSjohnjiang 		r = op->turbo_dec.tb_params.r;
1482*4418919fSjohnjiang 		for (i = 0; i < c-r; i++)
1483*4418919fSjohnjiang 			tb_size += (r < op->turbo_dec.tb_params.c_neg) ?
1484*4418919fSjohnjiang 				op->turbo_dec.tb_params.k_neg :
1485*4418919fSjohnjiang 				op->turbo_dec.tb_params.k_pos;
1486*4418919fSjohnjiang 	}
1487*4418919fSjohnjiang 	return tb_size;
1488*4418919fSjohnjiang }
1489*4418919fSjohnjiang 
1490*4418919fSjohnjiang static uint32_t
1491*4418919fSjohnjiang calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op)
1492*4418919fSjohnjiang {
1493*4418919fSjohnjiang 	uint8_t i;
1494*4418919fSjohnjiang 	uint32_t c, r, tb_size = 0;
1495*4418919fSjohnjiang 	uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10;
1496*4418919fSjohnjiang 
1497*4418919fSjohnjiang 	if (op->ldpc_dec.code_block_mode) {
1498*4418919fSjohnjiang 		tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler;
1499*4418919fSjohnjiang 	} else {
1500*4418919fSjohnjiang 		c = op->ldpc_dec.tb_params.c;
1501*4418919fSjohnjiang 		r = op->ldpc_dec.tb_params.r;
1502*4418919fSjohnjiang 		for (i = 0; i < c-r; i++)
1503*4418919fSjohnjiang 			tb_size += sys_cols * op->ldpc_dec.z_c
1504*4418919fSjohnjiang 					- op->ldpc_dec.n_filler;
1505*4418919fSjohnjiang 	}
1506*4418919fSjohnjiang 	return tb_size;
1507*4418919fSjohnjiang }
1508*4418919fSjohnjiang 
1509*4418919fSjohnjiang static uint32_t
1510*4418919fSjohnjiang calc_enc_TB_size(struct rte_bbdev_enc_op *op)
1511*4418919fSjohnjiang {
1512*4418919fSjohnjiang 	uint8_t i;
1513*4418919fSjohnjiang 	uint32_t c, r, tb_size = 0;
1514*4418919fSjohnjiang 
1515*4418919fSjohnjiang 	if (op->turbo_enc.code_block_mode) {
1516*4418919fSjohnjiang 		tb_size = op->turbo_enc.tb_params.k_neg;
1517*4418919fSjohnjiang 	} else {
1518*4418919fSjohnjiang 		c = op->turbo_enc.tb_params.c;
1519*4418919fSjohnjiang 		r = op->turbo_enc.tb_params.r;
1520*4418919fSjohnjiang 		for (i = 0; i < c-r; i++)
1521*4418919fSjohnjiang 			tb_size += (r < op->turbo_enc.tb_params.c_neg) ?
1522*4418919fSjohnjiang 				op->turbo_enc.tb_params.k_neg :
1523*4418919fSjohnjiang 				op->turbo_enc.tb_params.k_pos;
1524*4418919fSjohnjiang 	}
1525*4418919fSjohnjiang 	return tb_size;
1526*4418919fSjohnjiang }
1527*4418919fSjohnjiang 
1528*4418919fSjohnjiang static uint32_t
1529*4418919fSjohnjiang calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op)
1530*4418919fSjohnjiang {
1531*4418919fSjohnjiang 	uint8_t i;
1532*4418919fSjohnjiang 	uint32_t c, r, tb_size = 0;
1533*4418919fSjohnjiang 	uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10;
1534*4418919fSjohnjiang 
1535*4418919fSjohnjiang 	if (op->turbo_enc.code_block_mode) {
1536*4418919fSjohnjiang 		tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler;
1537*4418919fSjohnjiang 	} else {
1538*4418919fSjohnjiang 		c = op->turbo_enc.tb_params.c;
1539*4418919fSjohnjiang 		r = op->turbo_enc.tb_params.r;
1540*4418919fSjohnjiang 		for (i = 0; i < c-r; i++)
1541*4418919fSjohnjiang 			tb_size += sys_cols * op->ldpc_enc.z_c
1542*4418919fSjohnjiang 					- op->ldpc_enc.n_filler;
1543*4418919fSjohnjiang 	}
1544*4418919fSjohnjiang 	return tb_size;
1545*4418919fSjohnjiang }
1546*4418919fSjohnjiang 
1547*4418919fSjohnjiang 
1548d30ea906Sjfb8856606 static int
1549d30ea906Sjfb8856606 init_test_op_params(struct test_op_params *op_params,
1550d30ea906Sjfb8856606 		enum rte_bbdev_op_type op_type, const int expected_status,
1551d30ea906Sjfb8856606 		const int vector_mask, struct rte_mempool *ops_mp,
1552d30ea906Sjfb8856606 		uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores)
1553d30ea906Sjfb8856606 {
1554d30ea906Sjfb8856606 	int ret = 0;
1555*4418919fSjohnjiang 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
1556*4418919fSjohnjiang 			op_type == RTE_BBDEV_OP_LDPC_DEC)
1557d30ea906Sjfb8856606 		ret = rte_bbdev_dec_op_alloc_bulk(ops_mp,
1558d30ea906Sjfb8856606 				&op_params->ref_dec_op, 1);
1559d30ea906Sjfb8856606 	else
1560d30ea906Sjfb8856606 		ret = rte_bbdev_enc_op_alloc_bulk(ops_mp,
1561d30ea906Sjfb8856606 				&op_params->ref_enc_op, 1);
1562d30ea906Sjfb8856606 
1563d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed");
1564d30ea906Sjfb8856606 
1565d30ea906Sjfb8856606 	op_params->mp = ops_mp;
1566d30ea906Sjfb8856606 	op_params->burst_sz = burst_sz;
1567d30ea906Sjfb8856606 	op_params->num_to_process = num_to_process;
1568d30ea906Sjfb8856606 	op_params->num_lcores = num_lcores;
1569d30ea906Sjfb8856606 	op_params->vector_mask = vector_mask;
1570*4418919fSjohnjiang 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
1571*4418919fSjohnjiang 			op_type == RTE_BBDEV_OP_LDPC_DEC)
1572d30ea906Sjfb8856606 		op_params->ref_dec_op->status = expected_status;
1573*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC
1574*4418919fSjohnjiang 			|| op_type == RTE_BBDEV_OP_LDPC_ENC)
1575d30ea906Sjfb8856606 		op_params->ref_enc_op->status = expected_status;
1576d30ea906Sjfb8856606 	return 0;
1577d30ea906Sjfb8856606 }
1578d30ea906Sjfb8856606 
1579d30ea906Sjfb8856606 static int
1580d30ea906Sjfb8856606 run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id,
1581d30ea906Sjfb8856606 		struct test_op_params *op_params)
1582d30ea906Sjfb8856606 {
1583d30ea906Sjfb8856606 	int t_ret, f_ret, socket_id = SOCKET_ID_ANY;
1584d30ea906Sjfb8856606 	unsigned int i;
1585d30ea906Sjfb8856606 	struct active_device *ad;
1586d30ea906Sjfb8856606 	unsigned int burst_sz = get_burst_sz();
1587d30ea906Sjfb8856606 	enum rte_bbdev_op_type op_type = test_vector.op_type;
1588d30ea906Sjfb8856606 	const struct rte_bbdev_op_cap *capabilities = NULL;
1589d30ea906Sjfb8856606 
1590d30ea906Sjfb8856606 	ad = &active_devs[dev_id];
1591d30ea906Sjfb8856606 
1592d30ea906Sjfb8856606 	/* Check if device supports op_type */
1593d30ea906Sjfb8856606 	if (!is_avail_op(ad, test_vector.op_type))
1594d30ea906Sjfb8856606 		return TEST_SUCCESS;
1595d30ea906Sjfb8856606 
1596d30ea906Sjfb8856606 	struct rte_bbdev_info info;
1597d30ea906Sjfb8856606 	rte_bbdev_info_get(ad->dev_id, &info);
1598d30ea906Sjfb8856606 	socket_id = GET_SOCKET(info.socket_id);
1599d30ea906Sjfb8856606 
1600d30ea906Sjfb8856606 	f_ret = create_mempools(ad, socket_id, op_type,
1601d30ea906Sjfb8856606 			get_num_ops());
1602d30ea906Sjfb8856606 	if (f_ret != TEST_SUCCESS) {
1603d30ea906Sjfb8856606 		printf("Couldn't create mempools");
1604d30ea906Sjfb8856606 		goto fail;
1605d30ea906Sjfb8856606 	}
1606d30ea906Sjfb8856606 	if (op_type == RTE_BBDEV_OP_NONE)
1607d30ea906Sjfb8856606 		op_type = RTE_BBDEV_OP_TURBO_ENC;
1608d30ea906Sjfb8856606 
1609d30ea906Sjfb8856606 	f_ret = init_test_op_params(op_params, test_vector.op_type,
1610d30ea906Sjfb8856606 			test_vector.expected_status,
1611d30ea906Sjfb8856606 			test_vector.mask,
1612d30ea906Sjfb8856606 			ad->ops_mempool,
1613d30ea906Sjfb8856606 			burst_sz,
1614d30ea906Sjfb8856606 			get_num_ops(),
1615d30ea906Sjfb8856606 			get_num_lcores());
1616d30ea906Sjfb8856606 	if (f_ret != TEST_SUCCESS) {
1617d30ea906Sjfb8856606 		printf("Couldn't init test op params");
1618d30ea906Sjfb8856606 		goto fail;
1619d30ea906Sjfb8856606 	}
1620d30ea906Sjfb8856606 
1621*4418919fSjohnjiang 
1622*4418919fSjohnjiang 	/* Find capabilities */
1623d30ea906Sjfb8856606 	const struct rte_bbdev_op_cap *cap = info.drv.capabilities;
1624*4418919fSjohnjiang 	for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) {
1625*4418919fSjohnjiang 		if (cap->type == test_vector.op_type) {
1626d30ea906Sjfb8856606 			capabilities = cap;
1627d30ea906Sjfb8856606 			break;
1628d30ea906Sjfb8856606 		}
1629*4418919fSjohnjiang 		cap++;
1630d30ea906Sjfb8856606 	}
1631d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(capabilities,
1632*4418919fSjohnjiang 			"Couldn't find capabilities");
1633d30ea906Sjfb8856606 
1634*4418919fSjohnjiang 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
1635d30ea906Sjfb8856606 		create_reference_dec_op(op_params->ref_dec_op);
1636d30ea906Sjfb8856606 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
1637d30ea906Sjfb8856606 		create_reference_enc_op(op_params->ref_enc_op);
1638*4418919fSjohnjiang 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
1639*4418919fSjohnjiang 		create_reference_ldpc_enc_op(op_params->ref_enc_op);
1640*4418919fSjohnjiang 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
1641*4418919fSjohnjiang 		create_reference_ldpc_dec_op(op_params->ref_dec_op);
1642d30ea906Sjfb8856606 
1643d30ea906Sjfb8856606 	for (i = 0; i < ad->nb_queues; ++i) {
1644d30ea906Sjfb8856606 		f_ret = fill_queue_buffers(op_params,
1645d30ea906Sjfb8856606 				ad->in_mbuf_pool,
1646d30ea906Sjfb8856606 				ad->hard_out_mbuf_pool,
1647d30ea906Sjfb8856606 				ad->soft_out_mbuf_pool,
1648*4418919fSjohnjiang 				ad->harq_in_mbuf_pool,
1649*4418919fSjohnjiang 				ad->harq_out_mbuf_pool,
1650d30ea906Sjfb8856606 				ad->queue_ids[i],
1651d30ea906Sjfb8856606 				capabilities,
1652d30ea906Sjfb8856606 				info.drv.min_alignment,
1653d30ea906Sjfb8856606 				socket_id);
1654d30ea906Sjfb8856606 		if (f_ret != TEST_SUCCESS) {
1655d30ea906Sjfb8856606 			printf("Couldn't init queue buffers");
1656d30ea906Sjfb8856606 			goto fail;
1657d30ea906Sjfb8856606 		}
1658d30ea906Sjfb8856606 	}
1659d30ea906Sjfb8856606 
1660d30ea906Sjfb8856606 	/* Run test case function */
1661d30ea906Sjfb8856606 	t_ret = test_case_func(ad, op_params);
1662d30ea906Sjfb8856606 
1663d30ea906Sjfb8856606 	/* Free active device resources and return */
1664d30ea906Sjfb8856606 	free_buffers(ad, op_params);
1665d30ea906Sjfb8856606 	return t_ret;
1666d30ea906Sjfb8856606 
1667d30ea906Sjfb8856606 fail:
1668d30ea906Sjfb8856606 	free_buffers(ad, op_params);
1669d30ea906Sjfb8856606 	return TEST_FAILED;
1670d30ea906Sjfb8856606 }
1671d30ea906Sjfb8856606 
1672d30ea906Sjfb8856606 /* Run given test function per active device per supported op type
1673d30ea906Sjfb8856606  * per burst size.
1674d30ea906Sjfb8856606  */
1675d30ea906Sjfb8856606 static int
1676d30ea906Sjfb8856606 run_test_case(test_case_function *test_case_func)
1677d30ea906Sjfb8856606 {
1678d30ea906Sjfb8856606 	int ret = 0;
1679d30ea906Sjfb8856606 	uint8_t dev;
1680d30ea906Sjfb8856606 
1681d30ea906Sjfb8856606 	/* Alloc op_params */
1682d30ea906Sjfb8856606 	struct test_op_params *op_params = rte_zmalloc(NULL,
1683d30ea906Sjfb8856606 			sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE);
1684d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params",
1685d30ea906Sjfb8856606 			RTE_ALIGN(sizeof(struct test_op_params),
1686d30ea906Sjfb8856606 				RTE_CACHE_LINE_SIZE));
1687d30ea906Sjfb8856606 
1688d30ea906Sjfb8856606 	/* For each device run test case function */
1689d30ea906Sjfb8856606 	for (dev = 0; dev < nb_active_devs; ++dev)
1690d30ea906Sjfb8856606 		ret |= run_test_case_on_device(test_case_func, dev, op_params);
1691d30ea906Sjfb8856606 
1692d30ea906Sjfb8856606 	rte_free(op_params);
1693d30ea906Sjfb8856606 
1694d30ea906Sjfb8856606 	return ret;
1695d30ea906Sjfb8856606 }
1696d30ea906Sjfb8856606 
1697d30ea906Sjfb8856606 static void
1698d30ea906Sjfb8856606 dequeue_event_callback(uint16_t dev_id,
1699d30ea906Sjfb8856606 		enum rte_bbdev_event_type event, void *cb_arg,
1700d30ea906Sjfb8856606 		void *ret_param)
1701d30ea906Sjfb8856606 {
1702d30ea906Sjfb8856606 	int ret;
1703d30ea906Sjfb8856606 	uint16_t i;
1704d30ea906Sjfb8856606 	uint64_t total_time;
1705*4418919fSjohnjiang 	uint16_t deq, burst_sz, num_ops;
1706*4418919fSjohnjiang 	uint16_t queue_id = *(uint16_t *) ret_param;
1707d30ea906Sjfb8856606 	struct rte_bbdev_info info;
1708*4418919fSjohnjiang 	double tb_len_bits;
1709d30ea906Sjfb8856606 	struct thread_params *tp = cb_arg;
1710d30ea906Sjfb8856606 
1711d30ea906Sjfb8856606 	/* Find matching thread params using queue_id */
1712d30ea906Sjfb8856606 	for (i = 0; i < MAX_QUEUES; ++i, ++tp)
1713d30ea906Sjfb8856606 		if (tp->queue_id == queue_id)
1714d30ea906Sjfb8856606 			break;
1715d30ea906Sjfb8856606 
1716d30ea906Sjfb8856606 	if (i == MAX_QUEUES) {
1717d30ea906Sjfb8856606 		printf("%s: Queue_id from interrupt details was not found!\n",
1718d30ea906Sjfb8856606 				__func__);
1719d30ea906Sjfb8856606 		return;
1720d30ea906Sjfb8856606 	}
1721d30ea906Sjfb8856606 
1722d30ea906Sjfb8856606 	if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) {
1723d30ea906Sjfb8856606 		rte_atomic16_set(&tp->processing_status, TEST_FAILED);
1724d30ea906Sjfb8856606 		printf(
1725d30ea906Sjfb8856606 			"Dequeue interrupt handler called for incorrect event!\n");
1726d30ea906Sjfb8856606 		return;
1727d30ea906Sjfb8856606 	}
1728d30ea906Sjfb8856606 
1729*4418919fSjohnjiang 	burst_sz = rte_atomic16_read(&tp->burst_sz);
1730*4418919fSjohnjiang 	num_ops = tp->op_params->num_to_process;
1731d30ea906Sjfb8856606 
1732*4418919fSjohnjiang 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
1733*4418919fSjohnjiang 			test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
1734*4418919fSjohnjiang 		deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
1735*4418919fSjohnjiang 				&tp->dec_ops[
1736*4418919fSjohnjiang 					rte_atomic16_read(&tp->nb_dequeued)],
1737d30ea906Sjfb8856606 				burst_sz);
1738d30ea906Sjfb8856606 	else
1739*4418919fSjohnjiang 		deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
1740*4418919fSjohnjiang 				&tp->enc_ops[
1741*4418919fSjohnjiang 					rte_atomic16_read(&tp->nb_dequeued)],
1742d30ea906Sjfb8856606 				burst_sz);
1743d30ea906Sjfb8856606 
1744d30ea906Sjfb8856606 	if (deq < burst_sz) {
1745d30ea906Sjfb8856606 		printf(
1746d30ea906Sjfb8856606 			"After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n",
1747d30ea906Sjfb8856606 			burst_sz, deq);
1748d30ea906Sjfb8856606 		rte_atomic16_set(&tp->processing_status, TEST_FAILED);
1749d30ea906Sjfb8856606 		return;
1750d30ea906Sjfb8856606 	}
1751d30ea906Sjfb8856606 
1752*4418919fSjohnjiang 	if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) {
1753d30ea906Sjfb8856606 		rte_atomic16_add(&tp->nb_dequeued, deq);
1754d30ea906Sjfb8856606 		return;
1755d30ea906Sjfb8856606 	}
1756d30ea906Sjfb8856606 
1757d30ea906Sjfb8856606 	total_time = rte_rdtsc_precise() - tp->start_time;
1758d30ea906Sjfb8856606 
1759d30ea906Sjfb8856606 	rte_bbdev_info_get(dev_id, &info);
1760d30ea906Sjfb8856606 
1761d30ea906Sjfb8856606 	ret = TEST_SUCCESS;
1762*4418919fSjohnjiang 
1763*4418919fSjohnjiang 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
1764*4418919fSjohnjiang 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
1765*4418919fSjohnjiang 		ret = validate_dec_op(tp->dec_ops, num_ops, ref_op,
1766*4418919fSjohnjiang 				tp->op_params->vector_mask);
1767*4418919fSjohnjiang 		/* get the max of iter_count for all dequeued ops */
1768*4418919fSjohnjiang 		for (i = 0; i < num_ops; ++i)
1769*4418919fSjohnjiang 			tp->iter_count = RTE_MAX(
1770*4418919fSjohnjiang 					tp->dec_ops[i]->turbo_dec.iter_count,
1771*4418919fSjohnjiang 					tp->iter_count);
1772*4418919fSjohnjiang 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
1773*4418919fSjohnjiang 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) {
1774*4418919fSjohnjiang 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
1775*4418919fSjohnjiang 		ret = validate_enc_op(tp->enc_ops, num_ops, ref_op);
1776*4418919fSjohnjiang 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
1777*4418919fSjohnjiang 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) {
1778*4418919fSjohnjiang 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
1779*4418919fSjohnjiang 		ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op);
1780*4418919fSjohnjiang 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
1781*4418919fSjohnjiang 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
1782*4418919fSjohnjiang 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
1783*4418919fSjohnjiang 		ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op,
1784*4418919fSjohnjiang 				tp->op_params->vector_mask);
1785*4418919fSjohnjiang 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
1786*4418919fSjohnjiang 	}
1787d30ea906Sjfb8856606 
1788d30ea906Sjfb8856606 	if (ret) {
1789d30ea906Sjfb8856606 		printf("Buffers validation failed\n");
1790d30ea906Sjfb8856606 		rte_atomic16_set(&tp->processing_status, TEST_FAILED);
1791d30ea906Sjfb8856606 	}
1792d30ea906Sjfb8856606 
1793d30ea906Sjfb8856606 	switch (test_vector.op_type) {
1794d30ea906Sjfb8856606 	case RTE_BBDEV_OP_TURBO_DEC:
1795*4418919fSjohnjiang 		tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op);
1796d30ea906Sjfb8856606 		break;
1797d30ea906Sjfb8856606 	case RTE_BBDEV_OP_TURBO_ENC:
1798*4418919fSjohnjiang 		tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op);
1799*4418919fSjohnjiang 		break;
1800*4418919fSjohnjiang 	case RTE_BBDEV_OP_LDPC_DEC:
1801*4418919fSjohnjiang 		tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op);
1802*4418919fSjohnjiang 		break;
1803*4418919fSjohnjiang 	case RTE_BBDEV_OP_LDPC_ENC:
1804*4418919fSjohnjiang 		tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op);
1805d30ea906Sjfb8856606 		break;
1806d30ea906Sjfb8856606 	case RTE_BBDEV_OP_NONE:
1807*4418919fSjohnjiang 		tb_len_bits = 0.0;
1808d30ea906Sjfb8856606 		break;
1809d30ea906Sjfb8856606 	default:
1810d30ea906Sjfb8856606 		printf("Unknown op type: %d\n", test_vector.op_type);
1811d30ea906Sjfb8856606 		rte_atomic16_set(&tp->processing_status, TEST_FAILED);
1812d30ea906Sjfb8856606 		return;
1813d30ea906Sjfb8856606 	}
1814d30ea906Sjfb8856606 
1815*4418919fSjohnjiang 	tp->ops_per_sec += ((double)num_ops) /
1816d30ea906Sjfb8856606 			((double)total_time / (double)rte_get_tsc_hz());
1817*4418919fSjohnjiang 	tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) /
1818d30ea906Sjfb8856606 			((double)total_time / (double)rte_get_tsc_hz());
1819d30ea906Sjfb8856606 
1820d30ea906Sjfb8856606 	rte_atomic16_add(&tp->nb_dequeued, deq);
1821d30ea906Sjfb8856606 }
1822d30ea906Sjfb8856606 
1823d30ea906Sjfb8856606 static int
1824d30ea906Sjfb8856606 throughput_intr_lcore_dec(void *arg)
1825d30ea906Sjfb8856606 {
1826d30ea906Sjfb8856606 	struct thread_params *tp = arg;
1827d30ea906Sjfb8856606 	unsigned int enqueued;
1828d30ea906Sjfb8856606 	const uint16_t queue_id = tp->queue_id;
1829d30ea906Sjfb8856606 	const uint16_t burst_sz = tp->op_params->burst_sz;
1830d30ea906Sjfb8856606 	const uint16_t num_to_process = tp->op_params->num_to_process;
1831*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops[num_to_process];
1832d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
1833d30ea906Sjfb8856606 	struct rte_bbdev_info info;
1834*4418919fSjohnjiang 	int ret, i, j;
1835*4418919fSjohnjiang 	uint16_t num_to_enq, enq;
1836d30ea906Sjfb8856606 
1837d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
1838d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
1839d30ea906Sjfb8856606 
1840d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
1841d30ea906Sjfb8856606 			"Failed to enable interrupts for dev: %u, queue_id: %u",
1842d30ea906Sjfb8856606 			tp->dev_id, queue_id);
1843d30ea906Sjfb8856606 
1844d30ea906Sjfb8856606 	rte_bbdev_info_get(tp->dev_id, &info);
1845*4418919fSjohnjiang 
1846*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
1847*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
1848*4418919fSjohnjiang 			info.drv.queue_size_lim);
1849*4418919fSjohnjiang 
1850d30ea906Sjfb8856606 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
1851d30ea906Sjfb8856606 
1852d30ea906Sjfb8856606 	rte_atomic16_clear(&tp->processing_status);
1853d30ea906Sjfb8856606 	rte_atomic16_clear(&tp->nb_dequeued);
1854d30ea906Sjfb8856606 
1855d30ea906Sjfb8856606 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
1856d30ea906Sjfb8856606 		rte_pause();
1857d30ea906Sjfb8856606 
1858*4418919fSjohnjiang 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops,
1859*4418919fSjohnjiang 				num_to_process);
1860*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
1861*4418919fSjohnjiang 			num_to_process);
1862*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
1863*4418919fSjohnjiang 		copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs,
1864*4418919fSjohnjiang 				bufs->hard_outputs, bufs->soft_outputs,
1865*4418919fSjohnjiang 				tp->op_params->ref_dec_op);
1866*4418919fSjohnjiang 
1867*4418919fSjohnjiang 	/* Set counter to validate the ordering */
1868*4418919fSjohnjiang 	for (j = 0; j < num_to_process; ++j)
1869*4418919fSjohnjiang 		ops[j]->opaque_data = (void *)(uintptr_t)j;
1870*4418919fSjohnjiang 
1871*4418919fSjohnjiang 	for (j = 0; j < TEST_REPETITIONS; ++j) {
1872*4418919fSjohnjiang 		for (i = 0; i < num_to_process; ++i)
1873*4418919fSjohnjiang 			rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data);
1874*4418919fSjohnjiang 
1875d30ea906Sjfb8856606 		tp->start_time = rte_rdtsc_precise();
1876d30ea906Sjfb8856606 		for (enqueued = 0; enqueued < num_to_process;) {
1877*4418919fSjohnjiang 			num_to_enq = burst_sz;
1878d30ea906Sjfb8856606 
1879d30ea906Sjfb8856606 			if (unlikely(num_to_process - enqueued < num_to_enq))
1880d30ea906Sjfb8856606 				num_to_enq = num_to_process - enqueued;
1881d30ea906Sjfb8856606 
1882*4418919fSjohnjiang 			enq = 0;
1883*4418919fSjohnjiang 			do {
1884*4418919fSjohnjiang 				enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
1885*4418919fSjohnjiang 						queue_id, &ops[enqueued],
1886d30ea906Sjfb8856606 						num_to_enq);
1887*4418919fSjohnjiang 			} while (unlikely(num_to_enq != enq));
1888*4418919fSjohnjiang 			enqueued += enq;
1889*4418919fSjohnjiang 
1890*4418919fSjohnjiang 			/* Write to thread burst_sz current number of enqueued
1891*4418919fSjohnjiang 			 * descriptors. It ensures that proper number of
1892*4418919fSjohnjiang 			 * descriptors will be dequeued in callback
1893*4418919fSjohnjiang 			 * function - needed for last batch in case where
1894*4418919fSjohnjiang 			 * the number of operations is not a multiple of
1895*4418919fSjohnjiang 			 * burst size.
1896*4418919fSjohnjiang 			 */
1897*4418919fSjohnjiang 			rte_atomic16_set(&tp->burst_sz, num_to_enq);
1898*4418919fSjohnjiang 
1899*4418919fSjohnjiang 			/* Wait until processing of previous batch is
1900*4418919fSjohnjiang 			 * completed
1901*4418919fSjohnjiang 			 */
1902*4418919fSjohnjiang 			while (rte_atomic16_read(&tp->nb_dequeued) !=
1903*4418919fSjohnjiang 					(int16_t) enqueued)
1904*4418919fSjohnjiang 				rte_pause();
1905d30ea906Sjfb8856606 		}
1906*4418919fSjohnjiang 		if (j != TEST_REPETITIONS - 1)
1907*4418919fSjohnjiang 			rte_atomic16_clear(&tp->nb_dequeued);
1908d30ea906Sjfb8856606 	}
1909d30ea906Sjfb8856606 
1910d30ea906Sjfb8856606 	return TEST_SUCCESS;
1911d30ea906Sjfb8856606 }
1912d30ea906Sjfb8856606 
1913d30ea906Sjfb8856606 static int
1914d30ea906Sjfb8856606 throughput_intr_lcore_enc(void *arg)
1915d30ea906Sjfb8856606 {
1916d30ea906Sjfb8856606 	struct thread_params *tp = arg;
1917d30ea906Sjfb8856606 	unsigned int enqueued;
1918d30ea906Sjfb8856606 	const uint16_t queue_id = tp->queue_id;
1919d30ea906Sjfb8856606 	const uint16_t burst_sz = tp->op_params->burst_sz;
1920d30ea906Sjfb8856606 	const uint16_t num_to_process = tp->op_params->num_to_process;
1921*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops[num_to_process];
1922d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
1923d30ea906Sjfb8856606 	struct rte_bbdev_info info;
1924*4418919fSjohnjiang 	int ret, i, j;
1925*4418919fSjohnjiang 	uint16_t num_to_enq, enq;
1926d30ea906Sjfb8856606 
1927d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
1928d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
1929d30ea906Sjfb8856606 
1930d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
1931d30ea906Sjfb8856606 			"Failed to enable interrupts for dev: %u, queue_id: %u",
1932d30ea906Sjfb8856606 			tp->dev_id, queue_id);
1933d30ea906Sjfb8856606 
1934d30ea906Sjfb8856606 	rte_bbdev_info_get(tp->dev_id, &info);
1935*4418919fSjohnjiang 
1936*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
1937*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
1938*4418919fSjohnjiang 			info.drv.queue_size_lim);
1939*4418919fSjohnjiang 
1940d30ea906Sjfb8856606 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
1941d30ea906Sjfb8856606 
1942d30ea906Sjfb8856606 	rte_atomic16_clear(&tp->processing_status);
1943d30ea906Sjfb8856606 	rte_atomic16_clear(&tp->nb_dequeued);
1944d30ea906Sjfb8856606 
1945d30ea906Sjfb8856606 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
1946d30ea906Sjfb8856606 		rte_pause();
1947d30ea906Sjfb8856606 
1948*4418919fSjohnjiang 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops,
1949*4418919fSjohnjiang 			num_to_process);
1950*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
1951*4418919fSjohnjiang 			num_to_process);
1952*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
1953*4418919fSjohnjiang 		copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs,
1954*4418919fSjohnjiang 				bufs->hard_outputs, tp->op_params->ref_enc_op);
1955*4418919fSjohnjiang 
1956*4418919fSjohnjiang 	/* Set counter to validate the ordering */
1957*4418919fSjohnjiang 	for (j = 0; j < num_to_process; ++j)
1958*4418919fSjohnjiang 		ops[j]->opaque_data = (void *)(uintptr_t)j;
1959*4418919fSjohnjiang 
1960*4418919fSjohnjiang 	for (j = 0; j < TEST_REPETITIONS; ++j) {
1961*4418919fSjohnjiang 		for (i = 0; i < num_to_process; ++i)
1962*4418919fSjohnjiang 			rte_pktmbuf_reset(ops[i]->turbo_enc.output.data);
1963*4418919fSjohnjiang 
1964d30ea906Sjfb8856606 		tp->start_time = rte_rdtsc_precise();
1965d30ea906Sjfb8856606 		for (enqueued = 0; enqueued < num_to_process;) {
1966*4418919fSjohnjiang 			num_to_enq = burst_sz;
1967d30ea906Sjfb8856606 
1968d30ea906Sjfb8856606 			if (unlikely(num_to_process - enqueued < num_to_enq))
1969d30ea906Sjfb8856606 				num_to_enq = num_to_process - enqueued;
1970d30ea906Sjfb8856606 
1971*4418919fSjohnjiang 			enq = 0;
1972*4418919fSjohnjiang 			do {
1973*4418919fSjohnjiang 				enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
1974*4418919fSjohnjiang 						queue_id, &ops[enqueued],
1975d30ea906Sjfb8856606 						num_to_enq);
1976*4418919fSjohnjiang 			} while (unlikely(enq != num_to_enq));
1977*4418919fSjohnjiang 			enqueued += enq;
1978*4418919fSjohnjiang 
1979*4418919fSjohnjiang 			/* Write to thread burst_sz current number of enqueued
1980*4418919fSjohnjiang 			 * descriptors. It ensures that proper number of
1981*4418919fSjohnjiang 			 * descriptors will be dequeued in callback
1982*4418919fSjohnjiang 			 * function - needed for last batch in case where
1983*4418919fSjohnjiang 			 * the number of operations is not a multiple of
1984*4418919fSjohnjiang 			 * burst size.
1985*4418919fSjohnjiang 			 */
1986*4418919fSjohnjiang 			rte_atomic16_set(&tp->burst_sz, num_to_enq);
1987*4418919fSjohnjiang 
1988*4418919fSjohnjiang 			/* Wait until processing of previous batch is
1989*4418919fSjohnjiang 			 * completed
1990*4418919fSjohnjiang 			 */
1991*4418919fSjohnjiang 			while (rte_atomic16_read(&tp->nb_dequeued) !=
1992*4418919fSjohnjiang 					(int16_t) enqueued)
1993*4418919fSjohnjiang 				rte_pause();
1994d30ea906Sjfb8856606 		}
1995*4418919fSjohnjiang 		if (j != TEST_REPETITIONS - 1)
1996*4418919fSjohnjiang 			rte_atomic16_clear(&tp->nb_dequeued);
1997d30ea906Sjfb8856606 	}
1998d30ea906Sjfb8856606 
1999d30ea906Sjfb8856606 	return TEST_SUCCESS;
2000d30ea906Sjfb8856606 }
2001d30ea906Sjfb8856606 
2002d30ea906Sjfb8856606 static int
2003d30ea906Sjfb8856606 throughput_pmd_lcore_dec(void *arg)
2004d30ea906Sjfb8856606 {
2005d30ea906Sjfb8856606 	struct thread_params *tp = arg;
2006*4418919fSjohnjiang 	uint16_t enq, deq;
2007*4418919fSjohnjiang 	uint64_t total_time = 0, start_time;
2008d30ea906Sjfb8856606 	const uint16_t queue_id = tp->queue_id;
2009d30ea906Sjfb8856606 	const uint16_t burst_sz = tp->op_params->burst_sz;
2010*4418919fSjohnjiang 	const uint16_t num_ops = tp->op_params->num_to_process;
2011*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_enq[num_ops];
2012*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_deq[num_ops];
2013d30ea906Sjfb8856606 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
2014d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
2015*4418919fSjohnjiang 	int i, j, ret;
2016d30ea906Sjfb8856606 	struct rte_bbdev_info info;
2017*4418919fSjohnjiang 	uint16_t num_to_enq;
2018d30ea906Sjfb8856606 
2019d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2020d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
2021d30ea906Sjfb8856606 
2022d30ea906Sjfb8856606 	rte_bbdev_info_get(tp->dev_id, &info);
2023*4418919fSjohnjiang 
2024*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
2025*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
2026*4418919fSjohnjiang 			info.drv.queue_size_lim);
2027*4418919fSjohnjiang 
2028d30ea906Sjfb8856606 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2029d30ea906Sjfb8856606 
2030d30ea906Sjfb8856606 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
2031d30ea906Sjfb8856606 		rte_pause();
2032d30ea906Sjfb8856606 
2033*4418919fSjohnjiang 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
2034*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
2035d30ea906Sjfb8856606 
2036d30ea906Sjfb8856606 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2037*4418919fSjohnjiang 		copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs,
2038*4418919fSjohnjiang 				bufs->hard_outputs, bufs->soft_outputs, ref_op);
2039d30ea906Sjfb8856606 
2040*4418919fSjohnjiang 	/* Set counter to validate the ordering */
2041*4418919fSjohnjiang 	for (j = 0; j < num_ops; ++j)
2042*4418919fSjohnjiang 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2043*4418919fSjohnjiang 
2044*4418919fSjohnjiang 	for (i = 0; i < TEST_REPETITIONS; ++i) {
2045*4418919fSjohnjiang 
2046*4418919fSjohnjiang 		for (j = 0; j < num_ops; ++j)
2047*4418919fSjohnjiang 			mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data);
2048*4418919fSjohnjiang 
2049*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2050*4418919fSjohnjiang 
2051*4418919fSjohnjiang 		for (enq = 0, deq = 0; enq < num_ops;) {
2052*4418919fSjohnjiang 			num_to_enq = burst_sz;
2053*4418919fSjohnjiang 
2054*4418919fSjohnjiang 			if (unlikely(num_ops - enq < num_to_enq))
2055*4418919fSjohnjiang 				num_to_enq = num_ops - enq;
2056*4418919fSjohnjiang 
2057*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
2058*4418919fSjohnjiang 					queue_id, &ops_enq[enq], num_to_enq);
2059*4418919fSjohnjiang 
2060*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
2061*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2062d30ea906Sjfb8856606 		}
2063*4418919fSjohnjiang 
2064*4418919fSjohnjiang 		/* dequeue the remaining */
2065*4418919fSjohnjiang 		while (deq < enq) {
2066*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
2067*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2068d30ea906Sjfb8856606 		}
2069d30ea906Sjfb8856606 
2070*4418919fSjohnjiang 		total_time += rte_rdtsc_precise() - start_time;
2071*4418919fSjohnjiang 	}
2072d30ea906Sjfb8856606 
2073*4418919fSjohnjiang 	tp->iter_count = 0;
2074*4418919fSjohnjiang 	/* get the max of iter_count for all dequeued ops */
2075*4418919fSjohnjiang 	for (i = 0; i < num_ops; ++i) {
2076*4418919fSjohnjiang 		tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count,
2077*4418919fSjohnjiang 				tp->iter_count);
2078*4418919fSjohnjiang 	}
2079d30ea906Sjfb8856606 
2080d30ea906Sjfb8856606 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2081*4418919fSjohnjiang 		ret = validate_dec_op(ops_deq, num_ops, ref_op,
2082*4418919fSjohnjiang 				tp->op_params->vector_mask);
2083*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2084d30ea906Sjfb8856606 	}
2085d30ea906Sjfb8856606 
2086*4418919fSjohnjiang 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
2087*4418919fSjohnjiang 
2088*4418919fSjohnjiang 	double tb_len_bits = calc_dec_TB_size(ref_op);
2089*4418919fSjohnjiang 
2090*4418919fSjohnjiang 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
2091d30ea906Sjfb8856606 			((double)total_time / (double)rte_get_tsc_hz());
2092*4418919fSjohnjiang 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
2093*4418919fSjohnjiang 			1000000.0) / ((double)total_time /
2094*4418919fSjohnjiang 			(double)rte_get_tsc_hz());
2095*4418919fSjohnjiang 
2096*4418919fSjohnjiang 	return TEST_SUCCESS;
2097*4418919fSjohnjiang }
2098*4418919fSjohnjiang 
2099*4418919fSjohnjiang static int
2100*4418919fSjohnjiang throughput_pmd_lcore_ldpc_dec(void *arg)
2101*4418919fSjohnjiang {
2102*4418919fSjohnjiang 	struct thread_params *tp = arg;
2103*4418919fSjohnjiang 	uint16_t enq, deq;
2104*4418919fSjohnjiang 	uint64_t total_time = 0, start_time;
2105*4418919fSjohnjiang 	const uint16_t queue_id = tp->queue_id;
2106*4418919fSjohnjiang 	const uint16_t burst_sz = tp->op_params->burst_sz;
2107*4418919fSjohnjiang 	const uint16_t num_ops = tp->op_params->num_to_process;
2108*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_enq[num_ops];
2109*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_deq[num_ops];
2110*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
2111*4418919fSjohnjiang 	struct test_buffers *bufs = NULL;
2112*4418919fSjohnjiang 	int i, j, ret;
2113*4418919fSjohnjiang 	struct rte_bbdev_info info;
2114*4418919fSjohnjiang 	uint16_t num_to_enq;
2115*4418919fSjohnjiang 
2116*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2117*4418919fSjohnjiang 			"BURST_SIZE should be <= %u", MAX_BURST);
2118*4418919fSjohnjiang 
2119*4418919fSjohnjiang 	rte_bbdev_info_get(tp->dev_id, &info);
2120*4418919fSjohnjiang 
2121*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
2122*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
2123*4418919fSjohnjiang 			info.drv.queue_size_lim);
2124*4418919fSjohnjiang 
2125*4418919fSjohnjiang 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2126*4418919fSjohnjiang 
2127*4418919fSjohnjiang 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
2128*4418919fSjohnjiang 		rte_pause();
2129*4418919fSjohnjiang 
2130*4418919fSjohnjiang 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
2131*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
2132*4418919fSjohnjiang 
2133*4418919fSjohnjiang 	/* For throughput tests we need to disable early termination */
2134*4418919fSjohnjiang 	if (check_bit(ref_op->ldpc_dec.op_flags,
2135*4418919fSjohnjiang 			RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
2136*4418919fSjohnjiang 		ref_op->ldpc_dec.op_flags -=
2137*4418919fSjohnjiang 				RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
2138*4418919fSjohnjiang 	ref_op->ldpc_dec.iter_max = 6;
2139*4418919fSjohnjiang 	ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
2140*4418919fSjohnjiang 
2141*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2142*4418919fSjohnjiang 		copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs,
2143*4418919fSjohnjiang 				bufs->hard_outputs, bufs->soft_outputs,
2144*4418919fSjohnjiang 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
2145*4418919fSjohnjiang 
2146*4418919fSjohnjiang 	/* Set counter to validate the ordering */
2147*4418919fSjohnjiang 	for (j = 0; j < num_ops; ++j)
2148*4418919fSjohnjiang 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2149*4418919fSjohnjiang 
2150*4418919fSjohnjiang 	for (i = 0; i < TEST_REPETITIONS; ++i) {
2151*4418919fSjohnjiang 		for (j = 0; j < num_ops; ++j) {
2152*4418919fSjohnjiang 			mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data);
2153*4418919fSjohnjiang 			if (check_bit(ref_op->ldpc_dec.op_flags,
2154*4418919fSjohnjiang 					RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE))
2155*4418919fSjohnjiang 				mbuf_reset(
2156*4418919fSjohnjiang 				ops_enq[j]->ldpc_dec.harq_combined_output.data);
2157*4418919fSjohnjiang 		}
2158*4418919fSjohnjiang 
2159*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2160*4418919fSjohnjiang 
2161*4418919fSjohnjiang 		for (enq = 0, deq = 0; enq < num_ops;) {
2162*4418919fSjohnjiang 			num_to_enq = burst_sz;
2163*4418919fSjohnjiang 
2164*4418919fSjohnjiang 			if (unlikely(num_ops - enq < num_to_enq))
2165*4418919fSjohnjiang 				num_to_enq = num_ops - enq;
2166*4418919fSjohnjiang 
2167*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id,
2168*4418919fSjohnjiang 					queue_id, &ops_enq[enq], num_to_enq);
2169*4418919fSjohnjiang 
2170*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
2171*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2172*4418919fSjohnjiang 		}
2173*4418919fSjohnjiang 
2174*4418919fSjohnjiang 		/* dequeue the remaining */
2175*4418919fSjohnjiang 		while (deq < enq) {
2176*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
2177*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2178*4418919fSjohnjiang 		}
2179*4418919fSjohnjiang 
2180*4418919fSjohnjiang 		total_time += rte_rdtsc_precise() - start_time;
2181*4418919fSjohnjiang 	}
2182*4418919fSjohnjiang 
2183*4418919fSjohnjiang 	tp->iter_count = 0;
2184*4418919fSjohnjiang 	/* get the max of iter_count for all dequeued ops */
2185*4418919fSjohnjiang 	for (i = 0; i < num_ops; ++i) {
2186*4418919fSjohnjiang 		tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count,
2187*4418919fSjohnjiang 				tp->iter_count);
2188*4418919fSjohnjiang 	}
2189*4418919fSjohnjiang 
2190*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2191*4418919fSjohnjiang 		ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op,
2192*4418919fSjohnjiang 				tp->op_params->vector_mask);
2193*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2194*4418919fSjohnjiang 	}
2195*4418919fSjohnjiang 
2196*4418919fSjohnjiang 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
2197*4418919fSjohnjiang 
2198*4418919fSjohnjiang 	double tb_len_bits = calc_ldpc_dec_TB_size(ref_op);
2199*4418919fSjohnjiang 
2200*4418919fSjohnjiang 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
2201d30ea906Sjfb8856606 			((double)total_time / (double)rte_get_tsc_hz());
2202*4418919fSjohnjiang 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
2203*4418919fSjohnjiang 			1000000.0) / ((double)total_time /
2204*4418919fSjohnjiang 			(double)rte_get_tsc_hz());
2205d30ea906Sjfb8856606 
2206d30ea906Sjfb8856606 	return TEST_SUCCESS;
2207d30ea906Sjfb8856606 }
2208d30ea906Sjfb8856606 
2209d30ea906Sjfb8856606 static int
2210d30ea906Sjfb8856606 throughput_pmd_lcore_enc(void *arg)
2211d30ea906Sjfb8856606 {
2212d30ea906Sjfb8856606 	struct thread_params *tp = arg;
2213*4418919fSjohnjiang 	uint16_t enq, deq;
2214*4418919fSjohnjiang 	uint64_t total_time = 0, start_time;
2215d30ea906Sjfb8856606 	const uint16_t queue_id = tp->queue_id;
2216d30ea906Sjfb8856606 	const uint16_t burst_sz = tp->op_params->burst_sz;
2217*4418919fSjohnjiang 	const uint16_t num_ops = tp->op_params->num_to_process;
2218*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_enq[num_ops];
2219*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_deq[num_ops];
2220d30ea906Sjfb8856606 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
2221d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
2222*4418919fSjohnjiang 	int i, j, ret;
2223d30ea906Sjfb8856606 	struct rte_bbdev_info info;
2224*4418919fSjohnjiang 	uint16_t num_to_enq;
2225d30ea906Sjfb8856606 
2226d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2227d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
2228d30ea906Sjfb8856606 
2229d30ea906Sjfb8856606 	rte_bbdev_info_get(tp->dev_id, &info);
2230*4418919fSjohnjiang 
2231*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
2232*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
2233*4418919fSjohnjiang 			info.drv.queue_size_lim);
2234*4418919fSjohnjiang 
2235d30ea906Sjfb8856606 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2236d30ea906Sjfb8856606 
2237d30ea906Sjfb8856606 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
2238d30ea906Sjfb8856606 		rte_pause();
2239d30ea906Sjfb8856606 
2240*4418919fSjohnjiang 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
2241*4418919fSjohnjiang 			num_ops);
2242*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
2243*4418919fSjohnjiang 			num_ops);
2244*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2245*4418919fSjohnjiang 		copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs,
2246*4418919fSjohnjiang 				bufs->hard_outputs, ref_op);
2247d30ea906Sjfb8856606 
2248*4418919fSjohnjiang 	/* Set counter to validate the ordering */
2249*4418919fSjohnjiang 	for (j = 0; j < num_ops; ++j)
2250*4418919fSjohnjiang 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2251d30ea906Sjfb8856606 
2252*4418919fSjohnjiang 	for (i = 0; i < TEST_REPETITIONS; ++i) {
2253d30ea906Sjfb8856606 
2254d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2255*4418919fSjohnjiang 			for (j = 0; j < num_ops; ++j)
2256*4418919fSjohnjiang 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
2257d30ea906Sjfb8856606 
2258*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2259*4418919fSjohnjiang 
2260*4418919fSjohnjiang 		for (enq = 0, deq = 0; enq < num_ops;) {
2261*4418919fSjohnjiang 			num_to_enq = burst_sz;
2262*4418919fSjohnjiang 
2263*4418919fSjohnjiang 			if (unlikely(num_ops - enq < num_to_enq))
2264*4418919fSjohnjiang 				num_to_enq = num_ops - enq;
2265*4418919fSjohnjiang 
2266*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
2267*4418919fSjohnjiang 					queue_id, &ops_enq[enq], num_to_enq);
2268*4418919fSjohnjiang 
2269*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
2270*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2271d30ea906Sjfb8856606 		}
2272*4418919fSjohnjiang 
2273*4418919fSjohnjiang 		/* dequeue the remaining */
2274*4418919fSjohnjiang 		while (deq < enq) {
2275*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
2276*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2277d30ea906Sjfb8856606 		}
2278d30ea906Sjfb8856606 
2279*4418919fSjohnjiang 		total_time += rte_rdtsc_precise() - start_time;
2280*4418919fSjohnjiang 	}
2281d30ea906Sjfb8856606 
2282d30ea906Sjfb8856606 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2283*4418919fSjohnjiang 		ret = validate_enc_op(ops_deq, num_ops, ref_op);
2284*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2285d30ea906Sjfb8856606 	}
2286d30ea906Sjfb8856606 
2287*4418919fSjohnjiang 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
2288d30ea906Sjfb8856606 
2289*4418919fSjohnjiang 	double tb_len_bits = calc_enc_TB_size(ref_op);
2290*4418919fSjohnjiang 
2291*4418919fSjohnjiang 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
2292d30ea906Sjfb8856606 			((double)total_time / (double)rte_get_tsc_hz());
2293*4418919fSjohnjiang 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
2294*4418919fSjohnjiang 			/ 1000000.0) / ((double)total_time /
2295*4418919fSjohnjiang 			(double)rte_get_tsc_hz());
2296d30ea906Sjfb8856606 
2297d30ea906Sjfb8856606 	return TEST_SUCCESS;
2298d30ea906Sjfb8856606 }
2299*4418919fSjohnjiang 
2300*4418919fSjohnjiang static int
2301*4418919fSjohnjiang throughput_pmd_lcore_ldpc_enc(void *arg)
2302d30ea906Sjfb8856606 {
2303*4418919fSjohnjiang 	struct thread_params *tp = arg;
2304*4418919fSjohnjiang 	uint16_t enq, deq;
2305*4418919fSjohnjiang 	uint64_t total_time = 0, start_time;
2306*4418919fSjohnjiang 	const uint16_t queue_id = tp->queue_id;
2307*4418919fSjohnjiang 	const uint16_t burst_sz = tp->op_params->burst_sz;
2308*4418919fSjohnjiang 	const uint16_t num_ops = tp->op_params->num_to_process;
2309*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_enq[num_ops];
2310*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_deq[num_ops];
2311*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
2312*4418919fSjohnjiang 	struct test_buffers *bufs = NULL;
2313*4418919fSjohnjiang 	int i, j, ret;
2314*4418919fSjohnjiang 	struct rte_bbdev_info info;
2315*4418919fSjohnjiang 	uint16_t num_to_enq;
2316*4418919fSjohnjiang 
2317*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2318*4418919fSjohnjiang 			"BURST_SIZE should be <= %u", MAX_BURST);
2319*4418919fSjohnjiang 
2320*4418919fSjohnjiang 	rte_bbdev_info_get(tp->dev_id, &info);
2321*4418919fSjohnjiang 
2322*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
2323*4418919fSjohnjiang 			"NUM_OPS cannot exceed %u for this device",
2324*4418919fSjohnjiang 			info.drv.queue_size_lim);
2325*4418919fSjohnjiang 
2326*4418919fSjohnjiang 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2327*4418919fSjohnjiang 
2328*4418919fSjohnjiang 	while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT)
2329*4418919fSjohnjiang 		rte_pause();
2330*4418919fSjohnjiang 
2331*4418919fSjohnjiang 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
2332*4418919fSjohnjiang 			num_ops);
2333*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
2334*4418919fSjohnjiang 			num_ops);
2335*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2336*4418919fSjohnjiang 		copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs,
2337*4418919fSjohnjiang 				bufs->hard_outputs, ref_op);
2338*4418919fSjohnjiang 
2339*4418919fSjohnjiang 	/* Set counter to validate the ordering */
2340*4418919fSjohnjiang 	for (j = 0; j < num_ops; ++j)
2341*4418919fSjohnjiang 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2342*4418919fSjohnjiang 
2343*4418919fSjohnjiang 	for (i = 0; i < TEST_REPETITIONS; ++i) {
2344*4418919fSjohnjiang 
2345*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2346*4418919fSjohnjiang 			for (j = 0; j < num_ops; ++j)
2347*4418919fSjohnjiang 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
2348*4418919fSjohnjiang 
2349*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2350*4418919fSjohnjiang 
2351*4418919fSjohnjiang 		for (enq = 0, deq = 0; enq < num_ops;) {
2352*4418919fSjohnjiang 			num_to_enq = burst_sz;
2353*4418919fSjohnjiang 
2354*4418919fSjohnjiang 			if (unlikely(num_ops - enq < num_to_enq))
2355*4418919fSjohnjiang 				num_to_enq = num_ops - enq;
2356*4418919fSjohnjiang 
2357*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id,
2358*4418919fSjohnjiang 					queue_id, &ops_enq[enq], num_to_enq);
2359*4418919fSjohnjiang 
2360*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
2361*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2362*4418919fSjohnjiang 		}
2363*4418919fSjohnjiang 
2364*4418919fSjohnjiang 		/* dequeue the remaining */
2365*4418919fSjohnjiang 		while (deq < enq) {
2366*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
2367*4418919fSjohnjiang 					queue_id, &ops_deq[deq], enq - deq);
2368*4418919fSjohnjiang 		}
2369*4418919fSjohnjiang 
2370*4418919fSjohnjiang 		total_time += rte_rdtsc_precise() - start_time;
2371*4418919fSjohnjiang 	}
2372*4418919fSjohnjiang 
2373*4418919fSjohnjiang 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2374*4418919fSjohnjiang 		ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op);
2375*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2376*4418919fSjohnjiang 	}
2377*4418919fSjohnjiang 
2378*4418919fSjohnjiang 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
2379*4418919fSjohnjiang 
2380*4418919fSjohnjiang 	double tb_len_bits = calc_ldpc_enc_TB_size(ref_op);
2381*4418919fSjohnjiang 
2382*4418919fSjohnjiang 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
2383*4418919fSjohnjiang 			((double)total_time / (double)rte_get_tsc_hz());
2384*4418919fSjohnjiang 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
2385*4418919fSjohnjiang 			/ 1000000.0) / ((double)total_time /
2386*4418919fSjohnjiang 			(double)rte_get_tsc_hz());
2387*4418919fSjohnjiang 
2388*4418919fSjohnjiang 	return TEST_SUCCESS;
2389*4418919fSjohnjiang }
2390*4418919fSjohnjiang 
2391*4418919fSjohnjiang static void
2392*4418919fSjohnjiang print_enc_throughput(struct thread_params *t_params, unsigned int used_cores)
2393*4418919fSjohnjiang {
2394*4418919fSjohnjiang 	unsigned int iter = 0;
2395d30ea906Sjfb8856606 	double total_mops = 0, total_mbps = 0;
2396d30ea906Sjfb8856606 
2397*4418919fSjohnjiang 	for (iter = 0; iter < used_cores; iter++) {
2398*4418919fSjohnjiang 		printf(
2399*4418919fSjohnjiang 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n",
2400*4418919fSjohnjiang 			t_params[iter].lcore_id, t_params[iter].ops_per_sec,
2401*4418919fSjohnjiang 			t_params[iter].mbps);
2402*4418919fSjohnjiang 		total_mops += t_params[iter].ops_per_sec;
2403*4418919fSjohnjiang 		total_mbps += t_params[iter].mbps;
2404d30ea906Sjfb8856606 	}
2405d30ea906Sjfb8856606 	printf(
2406*4418919fSjohnjiang 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n",
2407d30ea906Sjfb8856606 		used_cores, total_mops, total_mbps);
2408d30ea906Sjfb8856606 }
2409d30ea906Sjfb8856606 
2410*4418919fSjohnjiang static void
2411*4418919fSjohnjiang print_dec_throughput(struct thread_params *t_params, unsigned int used_cores)
2412*4418919fSjohnjiang {
2413*4418919fSjohnjiang 	unsigned int iter = 0;
2414*4418919fSjohnjiang 	double total_mops = 0, total_mbps = 0;
2415*4418919fSjohnjiang 	uint8_t iter_count = 0;
2416*4418919fSjohnjiang 
2417*4418919fSjohnjiang 	for (iter = 0; iter < used_cores; iter++) {
2418*4418919fSjohnjiang 		printf(
2419*4418919fSjohnjiang 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n",
2420*4418919fSjohnjiang 			t_params[iter].lcore_id, t_params[iter].ops_per_sec,
2421*4418919fSjohnjiang 			t_params[iter].mbps, t_params[iter].iter_count);
2422*4418919fSjohnjiang 		total_mops += t_params[iter].ops_per_sec;
2423*4418919fSjohnjiang 		total_mbps += t_params[iter].mbps;
2424*4418919fSjohnjiang 		iter_count = RTE_MAX(iter_count, t_params[iter].iter_count);
2425*4418919fSjohnjiang 	}
2426*4418919fSjohnjiang 	printf(
2427*4418919fSjohnjiang 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n",
2428*4418919fSjohnjiang 		used_cores, total_mops, total_mbps, iter_count);
2429*4418919fSjohnjiang }
2430*4418919fSjohnjiang 
2431d30ea906Sjfb8856606 /*
2432d30ea906Sjfb8856606  * Test function that determines how long an enqueue + dequeue of a burst
2433d30ea906Sjfb8856606  * takes on available lcores.
2434d30ea906Sjfb8856606  */
2435d30ea906Sjfb8856606 static int
2436d30ea906Sjfb8856606 throughput_test(struct active_device *ad,
2437d30ea906Sjfb8856606 		struct test_op_params *op_params)
2438d30ea906Sjfb8856606 {
2439d30ea906Sjfb8856606 	int ret;
2440d30ea906Sjfb8856606 	unsigned int lcore_id, used_cores = 0;
2441*4418919fSjohnjiang 	struct thread_params *t_params, *tp;
2442d30ea906Sjfb8856606 	struct rte_bbdev_info info;
2443d30ea906Sjfb8856606 	lcore_function_t *throughput_function;
2444d30ea906Sjfb8856606 	uint16_t num_lcores;
2445d30ea906Sjfb8856606 	const char *op_type_str;
2446d30ea906Sjfb8856606 
2447d30ea906Sjfb8856606 	rte_bbdev_info_get(ad->dev_id, &info);
2448d30ea906Sjfb8856606 
2449d30ea906Sjfb8856606 	op_type_str = rte_bbdev_op_type_str(test_vector.op_type);
2450d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u",
2451d30ea906Sjfb8856606 			test_vector.op_type);
2452d30ea906Sjfb8856606 
2453*4418919fSjohnjiang 	printf("+ ------------------------------------------------------- +\n");
2454*4418919fSjohnjiang 	printf("== test: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n",
2455d30ea906Sjfb8856606 			info.dev_name, ad->nb_queues, op_params->burst_sz,
2456d30ea906Sjfb8856606 			op_params->num_to_process, op_params->num_lcores,
2457d30ea906Sjfb8856606 			op_type_str,
2458d30ea906Sjfb8856606 			intr_enabled ? "Interrupt mode" : "PMD mode",
2459d30ea906Sjfb8856606 			(double)rte_get_tsc_hz() / 1000000000.0);
2460d30ea906Sjfb8856606 
2461d30ea906Sjfb8856606 	/* Set number of lcores */
2462d30ea906Sjfb8856606 	num_lcores = (ad->nb_queues < (op_params->num_lcores))
2463d30ea906Sjfb8856606 			? ad->nb_queues
2464d30ea906Sjfb8856606 			: op_params->num_lcores;
2465d30ea906Sjfb8856606 
2466*4418919fSjohnjiang 	/* Allocate memory for thread parameters structure */
2467*4418919fSjohnjiang 	t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params),
2468*4418919fSjohnjiang 			RTE_CACHE_LINE_SIZE);
2469*4418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params",
2470*4418919fSjohnjiang 			RTE_ALIGN(sizeof(struct thread_params) * num_lcores,
2471*4418919fSjohnjiang 				RTE_CACHE_LINE_SIZE));
2472*4418919fSjohnjiang 
2473d30ea906Sjfb8856606 	if (intr_enabled) {
2474d30ea906Sjfb8856606 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
2475d30ea906Sjfb8856606 			throughput_function = throughput_intr_lcore_dec;
2476*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2477*4418919fSjohnjiang 			throughput_function = throughput_intr_lcore_dec;
2478*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
2479*4418919fSjohnjiang 			throughput_function = throughput_intr_lcore_enc;
2480*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
2481*4418919fSjohnjiang 			throughput_function = throughput_intr_lcore_enc;
2482d30ea906Sjfb8856606 		else
2483d30ea906Sjfb8856606 			throughput_function = throughput_intr_lcore_enc;
2484d30ea906Sjfb8856606 
2485d30ea906Sjfb8856606 		/* Dequeue interrupt callback registration */
2486d30ea906Sjfb8856606 		ret = rte_bbdev_callback_register(ad->dev_id,
2487d30ea906Sjfb8856606 				RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback,
2488*4418919fSjohnjiang 				t_params);
2489*4418919fSjohnjiang 		if (ret < 0) {
2490*4418919fSjohnjiang 			rte_free(t_params);
2491d30ea906Sjfb8856606 			return ret;
2492*4418919fSjohnjiang 		}
2493d30ea906Sjfb8856606 	} else {
2494d30ea906Sjfb8856606 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
2495d30ea906Sjfb8856606 			throughput_function = throughput_pmd_lcore_dec;
2496*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2497*4418919fSjohnjiang 			throughput_function = throughput_pmd_lcore_ldpc_dec;
2498*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
2499*4418919fSjohnjiang 			throughput_function = throughput_pmd_lcore_enc;
2500*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
2501*4418919fSjohnjiang 			throughput_function = throughput_pmd_lcore_ldpc_enc;
2502d30ea906Sjfb8856606 		else
2503d30ea906Sjfb8856606 			throughput_function = throughput_pmd_lcore_enc;
2504d30ea906Sjfb8856606 	}
2505d30ea906Sjfb8856606 
2506d30ea906Sjfb8856606 	rte_atomic16_set(&op_params->sync, SYNC_WAIT);
2507d30ea906Sjfb8856606 
2508*4418919fSjohnjiang 	/* Master core is set at first entry */
2509*4418919fSjohnjiang 	t_params[0].dev_id = ad->dev_id;
2510*4418919fSjohnjiang 	t_params[0].lcore_id = rte_lcore_id();
2511*4418919fSjohnjiang 	t_params[0].op_params = op_params;
2512*4418919fSjohnjiang 	t_params[0].queue_id = ad->queue_ids[used_cores++];
2513*4418919fSjohnjiang 	t_params[0].iter_count = 0;
2514d30ea906Sjfb8856606 
2515d30ea906Sjfb8856606 	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
2516d30ea906Sjfb8856606 		if (used_cores >= num_lcores)
2517d30ea906Sjfb8856606 			break;
2518d30ea906Sjfb8856606 
2519*4418919fSjohnjiang 		t_params[used_cores].dev_id = ad->dev_id;
2520*4418919fSjohnjiang 		t_params[used_cores].lcore_id = lcore_id;
2521*4418919fSjohnjiang 		t_params[used_cores].op_params = op_params;
2522*4418919fSjohnjiang 		t_params[used_cores].queue_id = ad->queue_ids[used_cores];
2523*4418919fSjohnjiang 		t_params[used_cores].iter_count = 0;
2524d30ea906Sjfb8856606 
2525*4418919fSjohnjiang 		rte_eal_remote_launch(throughput_function,
2526*4418919fSjohnjiang 				&t_params[used_cores++], lcore_id);
2527d30ea906Sjfb8856606 	}
2528d30ea906Sjfb8856606 
2529d30ea906Sjfb8856606 	rte_atomic16_set(&op_params->sync, SYNC_START);
2530*4418919fSjohnjiang 	ret = throughput_function(&t_params[0]);
2531d30ea906Sjfb8856606 
2532d30ea906Sjfb8856606 	/* Master core is always used */
2533*4418919fSjohnjiang 	for (used_cores = 1; used_cores < num_lcores; used_cores++)
2534*4418919fSjohnjiang 		ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id);
2535d30ea906Sjfb8856606 
2536d30ea906Sjfb8856606 	/* Return if test failed */
2537*4418919fSjohnjiang 	if (ret) {
2538*4418919fSjohnjiang 		rte_free(t_params);
2539d30ea906Sjfb8856606 		return ret;
2540*4418919fSjohnjiang 	}
2541d30ea906Sjfb8856606 
2542d30ea906Sjfb8856606 	/* Print throughput if interrupts are disabled and test passed */
2543d30ea906Sjfb8856606 	if (!intr_enabled) {
2544*4418919fSjohnjiang 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
2545*4418919fSjohnjiang 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2546*4418919fSjohnjiang 			print_dec_throughput(t_params, num_lcores);
2547*4418919fSjohnjiang 		else
2548*4418919fSjohnjiang 			print_enc_throughput(t_params, num_lcores);
2549*4418919fSjohnjiang 		rte_free(t_params);
2550d30ea906Sjfb8856606 		return ret;
2551d30ea906Sjfb8856606 	}
2552d30ea906Sjfb8856606 
2553d30ea906Sjfb8856606 	/* In interrupt TC we need to wait for the interrupt callback to deqeue
2554d30ea906Sjfb8856606 	 * all pending operations. Skip waiting for queues which reported an
2555d30ea906Sjfb8856606 	 * error using processing_status variable.
2556d30ea906Sjfb8856606 	 * Wait for master lcore operations.
2557d30ea906Sjfb8856606 	 */
2558*4418919fSjohnjiang 	tp = &t_params[0];
2559d30ea906Sjfb8856606 	while ((rte_atomic16_read(&tp->nb_dequeued) <
2560d30ea906Sjfb8856606 			op_params->num_to_process) &&
2561d30ea906Sjfb8856606 			(rte_atomic16_read(&tp->processing_status) !=
2562d30ea906Sjfb8856606 			TEST_FAILED))
2563d30ea906Sjfb8856606 		rte_pause();
2564d30ea906Sjfb8856606 
2565*4418919fSjohnjiang 	tp->ops_per_sec /= TEST_REPETITIONS;
2566*4418919fSjohnjiang 	tp->mbps /= TEST_REPETITIONS;
2567*4418919fSjohnjiang 	ret |= (int)rte_atomic16_read(&tp->processing_status);
2568d30ea906Sjfb8856606 
2569d30ea906Sjfb8856606 	/* Wait for slave lcores operations */
2570*4418919fSjohnjiang 	for (used_cores = 1; used_cores < num_lcores; used_cores++) {
2571*4418919fSjohnjiang 		tp = &t_params[used_cores];
2572d30ea906Sjfb8856606 
2573d30ea906Sjfb8856606 		while ((rte_atomic16_read(&tp->nb_dequeued) <
2574d30ea906Sjfb8856606 				op_params->num_to_process) &&
2575d30ea906Sjfb8856606 				(rte_atomic16_read(&tp->processing_status) !=
2576d30ea906Sjfb8856606 				TEST_FAILED))
2577d30ea906Sjfb8856606 			rte_pause();
2578d30ea906Sjfb8856606 
2579*4418919fSjohnjiang 		tp->ops_per_sec /= TEST_REPETITIONS;
2580*4418919fSjohnjiang 		tp->mbps /= TEST_REPETITIONS;
2581*4418919fSjohnjiang 		ret |= (int)rte_atomic16_read(&tp->processing_status);
2582d30ea906Sjfb8856606 	}
2583d30ea906Sjfb8856606 
2584d30ea906Sjfb8856606 	/* Print throughput if test passed */
2585*4418919fSjohnjiang 	if (!ret) {
2586*4418919fSjohnjiang 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
2587*4418919fSjohnjiang 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2588*4418919fSjohnjiang 			print_dec_throughput(t_params, num_lcores);
2589*4418919fSjohnjiang 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC ||
2590*4418919fSjohnjiang 				test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
2591*4418919fSjohnjiang 			print_enc_throughput(t_params, num_lcores);
2592*4418919fSjohnjiang 	}
2593d30ea906Sjfb8856606 
2594*4418919fSjohnjiang 	rte_free(t_params);
2595d30ea906Sjfb8856606 	return ret;
2596d30ea906Sjfb8856606 }
2597d30ea906Sjfb8856606 
2598d30ea906Sjfb8856606 static int
2599d30ea906Sjfb8856606 latency_test_dec(struct rte_mempool *mempool,
2600d30ea906Sjfb8856606 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
2601d30ea906Sjfb8856606 		int vector_mask, uint16_t dev_id, uint16_t queue_id,
2602d30ea906Sjfb8856606 		const uint16_t num_to_process, uint16_t burst_sz,
2603d30ea906Sjfb8856606 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
2604d30ea906Sjfb8856606 {
2605d30ea906Sjfb8856606 	int ret = TEST_SUCCESS;
2606d30ea906Sjfb8856606 	uint16_t i, j, dequeued;
2607d30ea906Sjfb8856606 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
2608d30ea906Sjfb8856606 	uint64_t start_time = 0, last_time = 0;
2609d30ea906Sjfb8856606 
2610d30ea906Sjfb8856606 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
2611d30ea906Sjfb8856606 		uint16_t enq = 0, deq = 0;
2612d30ea906Sjfb8856606 		bool first_time = true;
2613d30ea906Sjfb8856606 		last_time = 0;
2614d30ea906Sjfb8856606 
2615d30ea906Sjfb8856606 		if (unlikely(num_to_process - dequeued < burst_sz))
2616d30ea906Sjfb8856606 			burst_sz = num_to_process - dequeued;
2617d30ea906Sjfb8856606 
2618d30ea906Sjfb8856606 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
2619d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
2620d30ea906Sjfb8856606 				"rte_bbdev_dec_op_alloc_bulk() failed");
2621d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2622d30ea906Sjfb8856606 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
2623d30ea906Sjfb8856606 					bufs->inputs,
2624d30ea906Sjfb8856606 					bufs->hard_outputs,
2625d30ea906Sjfb8856606 					bufs->soft_outputs,
2626d30ea906Sjfb8856606 					ref_op);
2627d30ea906Sjfb8856606 
2628d30ea906Sjfb8856606 		/* Set counter to validate the ordering */
2629d30ea906Sjfb8856606 		for (j = 0; j < burst_sz; ++j)
2630d30ea906Sjfb8856606 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2631d30ea906Sjfb8856606 
2632d30ea906Sjfb8856606 		start_time = rte_rdtsc_precise();
2633d30ea906Sjfb8856606 
2634d30ea906Sjfb8856606 		enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq],
2635d30ea906Sjfb8856606 				burst_sz);
2636d30ea906Sjfb8856606 		TEST_ASSERT(enq == burst_sz,
2637d30ea906Sjfb8856606 				"Error enqueueing burst, expected %u, got %u",
2638d30ea906Sjfb8856606 				burst_sz, enq);
2639d30ea906Sjfb8856606 
2640d30ea906Sjfb8856606 		/* Dequeue */
2641d30ea906Sjfb8856606 		do {
2642d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
2643d30ea906Sjfb8856606 					&ops_deq[deq], burst_sz - deq);
2644d30ea906Sjfb8856606 			if (likely(first_time && (deq > 0))) {
2645d30ea906Sjfb8856606 				last_time = rte_rdtsc_precise() - start_time;
2646d30ea906Sjfb8856606 				first_time = false;
2647d30ea906Sjfb8856606 			}
2648d30ea906Sjfb8856606 		} while (unlikely(burst_sz != deq));
2649d30ea906Sjfb8856606 
2650d30ea906Sjfb8856606 		*max_time = RTE_MAX(*max_time, last_time);
2651d30ea906Sjfb8856606 		*min_time = RTE_MIN(*min_time, last_time);
2652d30ea906Sjfb8856606 		*total_time += last_time;
2653d30ea906Sjfb8856606 
2654d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2655d30ea906Sjfb8856606 			ret = validate_dec_op(ops_deq, burst_sz, ref_op,
2656d30ea906Sjfb8856606 					vector_mask);
2657d30ea906Sjfb8856606 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2658d30ea906Sjfb8856606 		}
2659d30ea906Sjfb8856606 
2660d30ea906Sjfb8856606 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
2661d30ea906Sjfb8856606 		dequeued += deq;
2662d30ea906Sjfb8856606 	}
2663d30ea906Sjfb8856606 
2664d30ea906Sjfb8856606 	return i;
2665d30ea906Sjfb8856606 }
2666d30ea906Sjfb8856606 
2667d30ea906Sjfb8856606 static int
2668*4418919fSjohnjiang latency_test_ldpc_dec(struct rte_mempool *mempool,
2669*4418919fSjohnjiang 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
2670*4418919fSjohnjiang 		int vector_mask, uint16_t dev_id, uint16_t queue_id,
2671*4418919fSjohnjiang 		const uint16_t num_to_process, uint16_t burst_sz,
2672*4418919fSjohnjiang 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
2673*4418919fSjohnjiang {
2674*4418919fSjohnjiang 	int ret = TEST_SUCCESS;
2675*4418919fSjohnjiang 	uint16_t i, j, dequeued;
2676*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
2677*4418919fSjohnjiang 	uint64_t start_time = 0, last_time = 0;
2678*4418919fSjohnjiang 
2679*4418919fSjohnjiang 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
2680*4418919fSjohnjiang 		uint16_t enq = 0, deq = 0;
2681*4418919fSjohnjiang 		bool first_time = true;
2682*4418919fSjohnjiang 		last_time = 0;
2683*4418919fSjohnjiang 
2684*4418919fSjohnjiang 		if (unlikely(num_to_process - dequeued < burst_sz))
2685*4418919fSjohnjiang 			burst_sz = num_to_process - dequeued;
2686*4418919fSjohnjiang 
2687*4418919fSjohnjiang 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
2688*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
2689*4418919fSjohnjiang 				"rte_bbdev_dec_op_alloc_bulk() failed");
2690*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2691*4418919fSjohnjiang 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
2692*4418919fSjohnjiang 					bufs->inputs,
2693*4418919fSjohnjiang 					bufs->hard_outputs,
2694*4418919fSjohnjiang 					bufs->soft_outputs,
2695*4418919fSjohnjiang 					bufs->harq_inputs,
2696*4418919fSjohnjiang 					bufs->harq_outputs,
2697*4418919fSjohnjiang 					ref_op);
2698*4418919fSjohnjiang 
2699*4418919fSjohnjiang 		/* Set counter to validate the ordering */
2700*4418919fSjohnjiang 		for (j = 0; j < burst_sz; ++j)
2701*4418919fSjohnjiang 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2702*4418919fSjohnjiang 
2703*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2704*4418919fSjohnjiang 
2705*4418919fSjohnjiang 		enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
2706*4418919fSjohnjiang 				&ops_enq[enq], burst_sz);
2707*4418919fSjohnjiang 		TEST_ASSERT(enq == burst_sz,
2708*4418919fSjohnjiang 				"Error enqueueing burst, expected %u, got %u",
2709*4418919fSjohnjiang 				burst_sz, enq);
2710*4418919fSjohnjiang 
2711*4418919fSjohnjiang 		/* Dequeue */
2712*4418919fSjohnjiang 		do {
2713*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
2714*4418919fSjohnjiang 					&ops_deq[deq], burst_sz - deq);
2715*4418919fSjohnjiang 			if (likely(first_time && (deq > 0))) {
2716*4418919fSjohnjiang 				last_time = rte_rdtsc_precise() - start_time;
2717*4418919fSjohnjiang 				first_time = false;
2718*4418919fSjohnjiang 			}
2719*4418919fSjohnjiang 		} while (unlikely(burst_sz != deq));
2720*4418919fSjohnjiang 
2721*4418919fSjohnjiang 		*max_time = RTE_MAX(*max_time, last_time);
2722*4418919fSjohnjiang 		*min_time = RTE_MIN(*min_time, last_time);
2723*4418919fSjohnjiang 		*total_time += last_time;
2724*4418919fSjohnjiang 
2725*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2726*4418919fSjohnjiang 			ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op,
2727*4418919fSjohnjiang 					vector_mask);
2728*4418919fSjohnjiang 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2729*4418919fSjohnjiang 		}
2730*4418919fSjohnjiang 
2731*4418919fSjohnjiang 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
2732*4418919fSjohnjiang 		dequeued += deq;
2733*4418919fSjohnjiang 	}
2734*4418919fSjohnjiang 
2735*4418919fSjohnjiang 	return i;
2736*4418919fSjohnjiang }
2737*4418919fSjohnjiang 
2738*4418919fSjohnjiang static int
2739d30ea906Sjfb8856606 latency_test_enc(struct rte_mempool *mempool,
2740d30ea906Sjfb8856606 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
2741d30ea906Sjfb8856606 		uint16_t dev_id, uint16_t queue_id,
2742d30ea906Sjfb8856606 		const uint16_t num_to_process, uint16_t burst_sz,
2743d30ea906Sjfb8856606 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
2744d30ea906Sjfb8856606 {
2745d30ea906Sjfb8856606 	int ret = TEST_SUCCESS;
2746d30ea906Sjfb8856606 	uint16_t i, j, dequeued;
2747d30ea906Sjfb8856606 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
2748d30ea906Sjfb8856606 	uint64_t start_time = 0, last_time = 0;
2749d30ea906Sjfb8856606 
2750d30ea906Sjfb8856606 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
2751d30ea906Sjfb8856606 		uint16_t enq = 0, deq = 0;
2752d30ea906Sjfb8856606 		bool first_time = true;
2753d30ea906Sjfb8856606 		last_time = 0;
2754d30ea906Sjfb8856606 
2755d30ea906Sjfb8856606 		if (unlikely(num_to_process - dequeued < burst_sz))
2756d30ea906Sjfb8856606 			burst_sz = num_to_process - dequeued;
2757d30ea906Sjfb8856606 
2758d30ea906Sjfb8856606 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
2759d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
2760d30ea906Sjfb8856606 				"rte_bbdev_enc_op_alloc_bulk() failed");
2761d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2762d30ea906Sjfb8856606 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
2763d30ea906Sjfb8856606 					bufs->inputs,
2764d30ea906Sjfb8856606 					bufs->hard_outputs,
2765d30ea906Sjfb8856606 					ref_op);
2766d30ea906Sjfb8856606 
2767d30ea906Sjfb8856606 		/* Set counter to validate the ordering */
2768d30ea906Sjfb8856606 		for (j = 0; j < burst_sz; ++j)
2769d30ea906Sjfb8856606 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2770d30ea906Sjfb8856606 
2771d30ea906Sjfb8856606 		start_time = rte_rdtsc_precise();
2772d30ea906Sjfb8856606 
2773d30ea906Sjfb8856606 		enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq],
2774d30ea906Sjfb8856606 				burst_sz);
2775d30ea906Sjfb8856606 		TEST_ASSERT(enq == burst_sz,
2776d30ea906Sjfb8856606 				"Error enqueueing burst, expected %u, got %u",
2777d30ea906Sjfb8856606 				burst_sz, enq);
2778d30ea906Sjfb8856606 
2779d30ea906Sjfb8856606 		/* Dequeue */
2780d30ea906Sjfb8856606 		do {
2781d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
2782d30ea906Sjfb8856606 					&ops_deq[deq], burst_sz - deq);
2783d30ea906Sjfb8856606 			if (likely(first_time && (deq > 0))) {
2784d30ea906Sjfb8856606 				last_time += rte_rdtsc_precise() - start_time;
2785d30ea906Sjfb8856606 				first_time = false;
2786d30ea906Sjfb8856606 			}
2787d30ea906Sjfb8856606 		} while (unlikely(burst_sz != deq));
2788d30ea906Sjfb8856606 
2789d30ea906Sjfb8856606 		*max_time = RTE_MAX(*max_time, last_time);
2790d30ea906Sjfb8856606 		*min_time = RTE_MIN(*min_time, last_time);
2791d30ea906Sjfb8856606 		*total_time += last_time;
2792d30ea906Sjfb8856606 
2793d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2794d30ea906Sjfb8856606 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
2795d30ea906Sjfb8856606 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2796d30ea906Sjfb8856606 		}
2797d30ea906Sjfb8856606 
2798d30ea906Sjfb8856606 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
2799d30ea906Sjfb8856606 		dequeued += deq;
2800d30ea906Sjfb8856606 	}
2801d30ea906Sjfb8856606 
2802d30ea906Sjfb8856606 	return i;
2803d30ea906Sjfb8856606 }
2804d30ea906Sjfb8856606 
2805d30ea906Sjfb8856606 static int
2806*4418919fSjohnjiang latency_test_ldpc_enc(struct rte_mempool *mempool,
2807*4418919fSjohnjiang 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
2808*4418919fSjohnjiang 		uint16_t dev_id, uint16_t queue_id,
2809*4418919fSjohnjiang 		const uint16_t num_to_process, uint16_t burst_sz,
2810*4418919fSjohnjiang 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
2811*4418919fSjohnjiang {
2812*4418919fSjohnjiang 	int ret = TEST_SUCCESS;
2813*4418919fSjohnjiang 	uint16_t i, j, dequeued;
2814*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
2815*4418919fSjohnjiang 	uint64_t start_time = 0, last_time = 0;
2816*4418919fSjohnjiang 
2817*4418919fSjohnjiang 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
2818*4418919fSjohnjiang 		uint16_t enq = 0, deq = 0;
2819*4418919fSjohnjiang 		bool first_time = true;
2820*4418919fSjohnjiang 		last_time = 0;
2821*4418919fSjohnjiang 
2822*4418919fSjohnjiang 		if (unlikely(num_to_process - dequeued < burst_sz))
2823*4418919fSjohnjiang 			burst_sz = num_to_process - dequeued;
2824*4418919fSjohnjiang 
2825*4418919fSjohnjiang 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
2826*4418919fSjohnjiang 
2827*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
2828*4418919fSjohnjiang 				"rte_bbdev_enc_op_alloc_bulk() failed");
2829*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2830*4418919fSjohnjiang 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
2831*4418919fSjohnjiang 					bufs->inputs,
2832*4418919fSjohnjiang 					bufs->hard_outputs,
2833*4418919fSjohnjiang 					ref_op);
2834*4418919fSjohnjiang 
2835*4418919fSjohnjiang 		/* Set counter to validate the ordering */
2836*4418919fSjohnjiang 		for (j = 0; j < burst_sz; ++j)
2837*4418919fSjohnjiang 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
2838*4418919fSjohnjiang 
2839*4418919fSjohnjiang 		start_time = rte_rdtsc_precise();
2840*4418919fSjohnjiang 
2841*4418919fSjohnjiang 		/*
2842*4418919fSjohnjiang 		 * printf("Latency Debug %d\n",
2843*4418919fSjohnjiang 		 * ops_enq[0]->ldpc_enc.cb_params.z_c); REMOVEME
2844*4418919fSjohnjiang 		 */
2845*4418919fSjohnjiang 
2846*4418919fSjohnjiang 		enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
2847*4418919fSjohnjiang 				&ops_enq[enq], burst_sz);
2848*4418919fSjohnjiang 		TEST_ASSERT(enq == burst_sz,
2849*4418919fSjohnjiang 				"Error enqueueing burst, expected %u, got %u",
2850*4418919fSjohnjiang 				burst_sz, enq);
2851*4418919fSjohnjiang 
2852*4418919fSjohnjiang 		/* Dequeue */
2853*4418919fSjohnjiang 		do {
2854*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
2855*4418919fSjohnjiang 					&ops_deq[deq], burst_sz - deq);
2856*4418919fSjohnjiang 			if (likely(first_time && (deq > 0))) {
2857*4418919fSjohnjiang 				last_time += rte_rdtsc_precise() - start_time;
2858*4418919fSjohnjiang 				first_time = false;
2859*4418919fSjohnjiang 			}
2860*4418919fSjohnjiang 		} while (unlikely(burst_sz != deq));
2861*4418919fSjohnjiang 
2862*4418919fSjohnjiang 		*max_time = RTE_MAX(*max_time, last_time);
2863*4418919fSjohnjiang 		*min_time = RTE_MIN(*min_time, last_time);
2864*4418919fSjohnjiang 		*total_time += last_time;
2865*4418919fSjohnjiang 
2866*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
2867*4418919fSjohnjiang 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
2868*4418919fSjohnjiang 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
2869*4418919fSjohnjiang 		}
2870*4418919fSjohnjiang 
2871*4418919fSjohnjiang 		/*
2872*4418919fSjohnjiang 		 * printf("Ready to free - deq %d num_to_process %d\n", FIXME
2873*4418919fSjohnjiang 		 *		deq, num_to_process);
2874*4418919fSjohnjiang 		 * printf("cache %d\n", ops_enq[0]->mempool->cache_size);
2875*4418919fSjohnjiang 		 */
2876*4418919fSjohnjiang 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
2877*4418919fSjohnjiang 		dequeued += deq;
2878*4418919fSjohnjiang 	}
2879*4418919fSjohnjiang 
2880*4418919fSjohnjiang 	return i;
2881*4418919fSjohnjiang }
2882*4418919fSjohnjiang 
2883*4418919fSjohnjiang static int
2884d30ea906Sjfb8856606 latency_test(struct active_device *ad,
2885d30ea906Sjfb8856606 		struct test_op_params *op_params)
2886d30ea906Sjfb8856606 {
2887d30ea906Sjfb8856606 	int iter;
2888d30ea906Sjfb8856606 	uint16_t burst_sz = op_params->burst_sz;
2889d30ea906Sjfb8856606 	const uint16_t num_to_process = op_params->num_to_process;
2890d30ea906Sjfb8856606 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
2891d30ea906Sjfb8856606 	const uint16_t queue_id = ad->queue_ids[0];
2892d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
2893d30ea906Sjfb8856606 	struct rte_bbdev_info info;
2894d30ea906Sjfb8856606 	uint64_t total_time, min_time, max_time;
2895d30ea906Sjfb8856606 	const char *op_type_str;
2896d30ea906Sjfb8856606 
2897d30ea906Sjfb8856606 	total_time = max_time = 0;
2898d30ea906Sjfb8856606 	min_time = UINT64_MAX;
2899d30ea906Sjfb8856606 
2900d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2901d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
2902d30ea906Sjfb8856606 
2903d30ea906Sjfb8856606 	rte_bbdev_info_get(ad->dev_id, &info);
2904d30ea906Sjfb8856606 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2905d30ea906Sjfb8856606 
2906d30ea906Sjfb8856606 	op_type_str = rte_bbdev_op_type_str(op_type);
2907d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
2908d30ea906Sjfb8856606 
2909*4418919fSjohnjiang 	printf("+ ------------------------------------------------------- +\n");
2910*4418919fSjohnjiang 	printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
2911d30ea906Sjfb8856606 			info.dev_name, burst_sz, num_to_process, op_type_str);
2912d30ea906Sjfb8856606 
2913d30ea906Sjfb8856606 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
2914d30ea906Sjfb8856606 		iter = latency_test_dec(op_params->mp, bufs,
2915d30ea906Sjfb8856606 				op_params->ref_dec_op, op_params->vector_mask,
2916d30ea906Sjfb8856606 				ad->dev_id, queue_id, num_to_process,
2917d30ea906Sjfb8856606 				burst_sz, &total_time, &min_time, &max_time);
2918*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC)
2919d30ea906Sjfb8856606 		iter = latency_test_enc(op_params->mp, bufs,
2920d30ea906Sjfb8856606 				op_params->ref_enc_op, ad->dev_id, queue_id,
2921d30ea906Sjfb8856606 				num_to_process, burst_sz, &total_time,
2922d30ea906Sjfb8856606 				&min_time, &max_time);
2923*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
2924*4418919fSjohnjiang 		iter = latency_test_ldpc_enc(op_params->mp, bufs,
2925*4418919fSjohnjiang 				op_params->ref_enc_op, ad->dev_id, queue_id,
2926*4418919fSjohnjiang 				num_to_process, burst_sz, &total_time,
2927*4418919fSjohnjiang 				&min_time, &max_time);
2928*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
2929*4418919fSjohnjiang 		iter = latency_test_ldpc_dec(op_params->mp, bufs,
2930*4418919fSjohnjiang 				op_params->ref_dec_op, op_params->vector_mask,
2931*4418919fSjohnjiang 				ad->dev_id, queue_id, num_to_process,
2932*4418919fSjohnjiang 				burst_sz, &total_time, &min_time, &max_time);
2933*4418919fSjohnjiang 	else
2934*4418919fSjohnjiang 		iter = latency_test_enc(op_params->mp, bufs,
2935*4418919fSjohnjiang 					op_params->ref_enc_op,
2936*4418919fSjohnjiang 					ad->dev_id, queue_id,
2937*4418919fSjohnjiang 					num_to_process, burst_sz, &total_time,
2938*4418919fSjohnjiang 					&min_time, &max_time);
2939d30ea906Sjfb8856606 
2940d30ea906Sjfb8856606 	if (iter <= 0)
2941d30ea906Sjfb8856606 		return TEST_FAILED;
2942d30ea906Sjfb8856606 
2943*4418919fSjohnjiang 	printf("Operation latency:\n"
2944*4418919fSjohnjiang 			"\tavg: %lg cycles, %lg us\n"
2945*4418919fSjohnjiang 			"\tmin: %lg cycles, %lg us\n"
2946*4418919fSjohnjiang 			"\tmax: %lg cycles, %lg us\n",
2947d30ea906Sjfb8856606 			(double)total_time / (double)iter,
2948d30ea906Sjfb8856606 			(double)(total_time * 1000000) / (double)iter /
2949d30ea906Sjfb8856606 			(double)rte_get_tsc_hz(), (double)min_time,
2950d30ea906Sjfb8856606 			(double)(min_time * 1000000) / (double)rte_get_tsc_hz(),
2951d30ea906Sjfb8856606 			(double)max_time, (double)(max_time * 1000000) /
2952d30ea906Sjfb8856606 			(double)rte_get_tsc_hz());
2953d30ea906Sjfb8856606 
2954d30ea906Sjfb8856606 	return TEST_SUCCESS;
2955d30ea906Sjfb8856606 }
2956d30ea906Sjfb8856606 
2957d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST
2958d30ea906Sjfb8856606 static int
2959d30ea906Sjfb8856606 get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id,
2960d30ea906Sjfb8856606 		struct rte_bbdev_stats *stats)
2961d30ea906Sjfb8856606 {
2962d30ea906Sjfb8856606 	struct rte_bbdev *dev = &rte_bbdev_devices[dev_id];
2963d30ea906Sjfb8856606 	struct rte_bbdev_stats *q_stats;
2964d30ea906Sjfb8856606 
2965d30ea906Sjfb8856606 	if (queue_id >= dev->data->num_queues)
2966d30ea906Sjfb8856606 		return -1;
2967d30ea906Sjfb8856606 
2968d30ea906Sjfb8856606 	q_stats = &dev->data->queues[queue_id].queue_stats;
2969d30ea906Sjfb8856606 
2970d30ea906Sjfb8856606 	stats->enqueued_count = q_stats->enqueued_count;
2971d30ea906Sjfb8856606 	stats->dequeued_count = q_stats->dequeued_count;
2972d30ea906Sjfb8856606 	stats->enqueue_err_count = q_stats->enqueue_err_count;
2973d30ea906Sjfb8856606 	stats->dequeue_err_count = q_stats->dequeue_err_count;
2974*4418919fSjohnjiang 	stats->acc_offload_cycles = q_stats->acc_offload_cycles;
2975d30ea906Sjfb8856606 
2976d30ea906Sjfb8856606 	return 0;
2977d30ea906Sjfb8856606 }
2978d30ea906Sjfb8856606 
2979d30ea906Sjfb8856606 static int
2980d30ea906Sjfb8856606 offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs,
2981d30ea906Sjfb8856606 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
2982d30ea906Sjfb8856606 		uint16_t queue_id, const uint16_t num_to_process,
2983d30ea906Sjfb8856606 		uint16_t burst_sz, struct test_time_stats *time_st)
2984d30ea906Sjfb8856606 {
2985d30ea906Sjfb8856606 	int i, dequeued, ret;
2986d30ea906Sjfb8856606 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
2987d30ea906Sjfb8856606 	uint64_t enq_start_time, deq_start_time;
2988d30ea906Sjfb8856606 	uint64_t enq_sw_last_time, deq_last_time;
2989d30ea906Sjfb8856606 	struct rte_bbdev_stats stats;
2990d30ea906Sjfb8856606 
2991d30ea906Sjfb8856606 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
2992d30ea906Sjfb8856606 		uint16_t enq = 0, deq = 0;
2993d30ea906Sjfb8856606 
2994d30ea906Sjfb8856606 		if (unlikely(num_to_process - dequeued < burst_sz))
2995d30ea906Sjfb8856606 			burst_sz = num_to_process - dequeued;
2996d30ea906Sjfb8856606 
2997*4418919fSjohnjiang 		rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
2998d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2999d30ea906Sjfb8856606 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
3000d30ea906Sjfb8856606 					bufs->inputs,
3001d30ea906Sjfb8856606 					bufs->hard_outputs,
3002d30ea906Sjfb8856606 					bufs->soft_outputs,
3003d30ea906Sjfb8856606 					ref_op);
3004d30ea906Sjfb8856606 
3005d30ea906Sjfb8856606 		/* Start time meas for enqueue function offload latency */
3006d30ea906Sjfb8856606 		enq_start_time = rte_rdtsc_precise();
3007d30ea906Sjfb8856606 		do {
3008d30ea906Sjfb8856606 			enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id,
3009d30ea906Sjfb8856606 					&ops_enq[enq], burst_sz - enq);
3010d30ea906Sjfb8856606 		} while (unlikely(burst_sz != enq));
3011d30ea906Sjfb8856606 
3012d30ea906Sjfb8856606 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
3013d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
3014d30ea906Sjfb8856606 				"Failed to get stats for queue (%u) of device (%u)",
3015d30ea906Sjfb8856606 				queue_id, dev_id);
3016d30ea906Sjfb8856606 
3017d30ea906Sjfb8856606 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
3018*4418919fSjohnjiang 				stats.acc_offload_cycles;
3019d30ea906Sjfb8856606 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
3020d30ea906Sjfb8856606 				enq_sw_last_time);
3021d30ea906Sjfb8856606 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
3022d30ea906Sjfb8856606 				enq_sw_last_time);
3023*4418919fSjohnjiang 		time_st->enq_sw_total_time += enq_sw_last_time;
3024d30ea906Sjfb8856606 
3025*4418919fSjohnjiang 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
3026*4418919fSjohnjiang 				stats.acc_offload_cycles);
3027*4418919fSjohnjiang 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
3028*4418919fSjohnjiang 				stats.acc_offload_cycles);
3029*4418919fSjohnjiang 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
3030d30ea906Sjfb8856606 
3031*4418919fSjohnjiang 		/* give time for device to process ops */
3032*4418919fSjohnjiang 		rte_delay_us(200);
3033d30ea906Sjfb8856606 
3034d30ea906Sjfb8856606 		/* Start time meas for dequeue function offload latency */
3035d30ea906Sjfb8856606 		deq_start_time = rte_rdtsc_precise();
3036d30ea906Sjfb8856606 		/* Dequeue one operation */
3037d30ea906Sjfb8856606 		do {
3038d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
3039d30ea906Sjfb8856606 					&ops_deq[deq], 1);
3040d30ea906Sjfb8856606 		} while (unlikely(deq != 1));
3041d30ea906Sjfb8856606 
3042d30ea906Sjfb8856606 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3043d30ea906Sjfb8856606 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
3044d30ea906Sjfb8856606 				deq_last_time);
3045d30ea906Sjfb8856606 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
3046d30ea906Sjfb8856606 				deq_last_time);
3047*4418919fSjohnjiang 		time_st->deq_total_time += deq_last_time;
3048*4418919fSjohnjiang 
3049*4418919fSjohnjiang 		/* Dequeue remaining operations if needed*/
3050*4418919fSjohnjiang 		while (burst_sz != deq)
3051*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
3052*4418919fSjohnjiang 					&ops_deq[deq], burst_sz - deq);
3053*4418919fSjohnjiang 
3054*4418919fSjohnjiang 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
3055*4418919fSjohnjiang 		dequeued += deq;
3056*4418919fSjohnjiang 	}
3057*4418919fSjohnjiang 
3058*4418919fSjohnjiang 	return i;
3059*4418919fSjohnjiang }
3060*4418919fSjohnjiang 
3061*4418919fSjohnjiang static int
3062*4418919fSjohnjiang offload_latency_test_ldpc_dec(struct rte_mempool *mempool,
3063*4418919fSjohnjiang 		struct test_buffers *bufs,
3064*4418919fSjohnjiang 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
3065*4418919fSjohnjiang 		uint16_t queue_id, const uint16_t num_to_process,
3066*4418919fSjohnjiang 		uint16_t burst_sz, struct test_time_stats *time_st)
3067*4418919fSjohnjiang {
3068*4418919fSjohnjiang 	int i, dequeued, ret;
3069*4418919fSjohnjiang 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
3070*4418919fSjohnjiang 	uint64_t enq_start_time, deq_start_time;
3071*4418919fSjohnjiang 	uint64_t enq_sw_last_time, deq_last_time;
3072*4418919fSjohnjiang 	struct rte_bbdev_stats stats;
3073*4418919fSjohnjiang 
3074*4418919fSjohnjiang 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
3075*4418919fSjohnjiang 		uint16_t enq = 0, deq = 0;
3076*4418919fSjohnjiang 
3077*4418919fSjohnjiang 		if (unlikely(num_to_process - dequeued < burst_sz))
3078*4418919fSjohnjiang 			burst_sz = num_to_process - dequeued;
3079*4418919fSjohnjiang 
3080*4418919fSjohnjiang 		rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
3081*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3082*4418919fSjohnjiang 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
3083*4418919fSjohnjiang 					bufs->inputs,
3084*4418919fSjohnjiang 					bufs->hard_outputs,
3085*4418919fSjohnjiang 					bufs->soft_outputs,
3086*4418919fSjohnjiang 					bufs->harq_inputs,
3087*4418919fSjohnjiang 					bufs->harq_outputs,
3088*4418919fSjohnjiang 					ref_op);
3089*4418919fSjohnjiang 
3090*4418919fSjohnjiang 		/* Start time meas for enqueue function offload latency */
3091*4418919fSjohnjiang 		enq_start_time = rte_rdtsc_precise();
3092*4418919fSjohnjiang 		do {
3093*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
3094*4418919fSjohnjiang 					&ops_enq[enq], burst_sz - enq);
3095*4418919fSjohnjiang 		} while (unlikely(burst_sz != enq));
3096*4418919fSjohnjiang 
3097*4418919fSjohnjiang 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
3098*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
3099*4418919fSjohnjiang 				"Failed to get stats for queue (%u) of device (%u)",
3100*4418919fSjohnjiang 				queue_id, dev_id);
3101*4418919fSjohnjiang 
3102*4418919fSjohnjiang 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
3103*4418919fSjohnjiang 				stats.acc_offload_cycles;
3104*4418919fSjohnjiang 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
3105*4418919fSjohnjiang 				enq_sw_last_time);
3106*4418919fSjohnjiang 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
3107*4418919fSjohnjiang 				enq_sw_last_time);
3108*4418919fSjohnjiang 		time_st->enq_sw_total_time += enq_sw_last_time;
3109*4418919fSjohnjiang 
3110*4418919fSjohnjiang 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
3111*4418919fSjohnjiang 				stats.acc_offload_cycles);
3112*4418919fSjohnjiang 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
3113*4418919fSjohnjiang 				stats.acc_offload_cycles);
3114*4418919fSjohnjiang 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
3115*4418919fSjohnjiang 
3116*4418919fSjohnjiang 		/* give time for device to process ops */
3117*4418919fSjohnjiang 		rte_delay_us(200);
3118*4418919fSjohnjiang 
3119*4418919fSjohnjiang 		/* Start time meas for dequeue function offload latency */
3120*4418919fSjohnjiang 		deq_start_time = rte_rdtsc_precise();
3121*4418919fSjohnjiang 		/* Dequeue one operation */
3122*4418919fSjohnjiang 		do {
3123*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
3124*4418919fSjohnjiang 					&ops_deq[deq], 1);
3125*4418919fSjohnjiang 		} while (unlikely(deq != 1));
3126*4418919fSjohnjiang 
3127*4418919fSjohnjiang 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3128*4418919fSjohnjiang 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
3129*4418919fSjohnjiang 				deq_last_time);
3130*4418919fSjohnjiang 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
3131*4418919fSjohnjiang 				deq_last_time);
3132*4418919fSjohnjiang 		time_st->deq_total_time += deq_last_time;
3133d30ea906Sjfb8856606 
3134d30ea906Sjfb8856606 		/* Dequeue remaining operations if needed*/
3135d30ea906Sjfb8856606 		while (burst_sz != deq)
3136d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
3137d30ea906Sjfb8856606 					&ops_deq[deq], burst_sz - deq);
3138d30ea906Sjfb8856606 
3139d30ea906Sjfb8856606 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
3140d30ea906Sjfb8856606 		dequeued += deq;
3141d30ea906Sjfb8856606 	}
3142d30ea906Sjfb8856606 
3143d30ea906Sjfb8856606 	return i;
3144d30ea906Sjfb8856606 }
3145d30ea906Sjfb8856606 
3146d30ea906Sjfb8856606 static int
3147d30ea906Sjfb8856606 offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs,
3148d30ea906Sjfb8856606 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
3149d30ea906Sjfb8856606 		uint16_t queue_id, const uint16_t num_to_process,
3150d30ea906Sjfb8856606 		uint16_t burst_sz, struct test_time_stats *time_st)
3151d30ea906Sjfb8856606 {
3152d30ea906Sjfb8856606 	int i, dequeued, ret;
3153d30ea906Sjfb8856606 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
3154d30ea906Sjfb8856606 	uint64_t enq_start_time, deq_start_time;
3155d30ea906Sjfb8856606 	uint64_t enq_sw_last_time, deq_last_time;
3156d30ea906Sjfb8856606 	struct rte_bbdev_stats stats;
3157d30ea906Sjfb8856606 
3158d30ea906Sjfb8856606 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
3159d30ea906Sjfb8856606 		uint16_t enq = 0, deq = 0;
3160d30ea906Sjfb8856606 
3161d30ea906Sjfb8856606 		if (unlikely(num_to_process - dequeued < burst_sz))
3162d30ea906Sjfb8856606 			burst_sz = num_to_process - dequeued;
3163d30ea906Sjfb8856606 
31641646932aSjfb8856606 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
3165*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed");
3166d30ea906Sjfb8856606 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3167d30ea906Sjfb8856606 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
3168d30ea906Sjfb8856606 					bufs->inputs,
3169d30ea906Sjfb8856606 					bufs->hard_outputs,
3170d30ea906Sjfb8856606 					ref_op);
3171d30ea906Sjfb8856606 
3172d30ea906Sjfb8856606 		/* Start time meas for enqueue function offload latency */
3173d30ea906Sjfb8856606 		enq_start_time = rte_rdtsc_precise();
3174d30ea906Sjfb8856606 		do {
3175d30ea906Sjfb8856606 			enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id,
3176d30ea906Sjfb8856606 					&ops_enq[enq], burst_sz - enq);
3177d30ea906Sjfb8856606 		} while (unlikely(burst_sz != enq));
3178d30ea906Sjfb8856606 
3179d30ea906Sjfb8856606 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
3180d30ea906Sjfb8856606 		TEST_ASSERT_SUCCESS(ret,
3181d30ea906Sjfb8856606 				"Failed to get stats for queue (%u) of device (%u)",
3182d30ea906Sjfb8856606 				queue_id, dev_id);
3183d30ea906Sjfb8856606 
3184d30ea906Sjfb8856606 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
3185*4418919fSjohnjiang 				stats.acc_offload_cycles;
3186d30ea906Sjfb8856606 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
3187d30ea906Sjfb8856606 				enq_sw_last_time);
3188d30ea906Sjfb8856606 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
3189d30ea906Sjfb8856606 				enq_sw_last_time);
3190*4418919fSjohnjiang 		time_st->enq_sw_total_time += enq_sw_last_time;
3191d30ea906Sjfb8856606 
3192*4418919fSjohnjiang 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
3193*4418919fSjohnjiang 				stats.acc_offload_cycles);
3194*4418919fSjohnjiang 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
3195*4418919fSjohnjiang 				stats.acc_offload_cycles);
3196*4418919fSjohnjiang 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
3197d30ea906Sjfb8856606 
3198*4418919fSjohnjiang 		/* give time for device to process ops */
3199*4418919fSjohnjiang 		rte_delay_us(200);
3200d30ea906Sjfb8856606 
3201d30ea906Sjfb8856606 		/* Start time meas for dequeue function offload latency */
3202d30ea906Sjfb8856606 		deq_start_time = rte_rdtsc_precise();
3203d30ea906Sjfb8856606 		/* Dequeue one operation */
3204d30ea906Sjfb8856606 		do {
3205d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
3206d30ea906Sjfb8856606 					&ops_deq[deq], 1);
3207d30ea906Sjfb8856606 		} while (unlikely(deq != 1));
3208d30ea906Sjfb8856606 
3209d30ea906Sjfb8856606 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3210d30ea906Sjfb8856606 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
3211d30ea906Sjfb8856606 				deq_last_time);
3212d30ea906Sjfb8856606 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
3213d30ea906Sjfb8856606 				deq_last_time);
3214*4418919fSjohnjiang 		time_st->deq_total_time += deq_last_time;
3215d30ea906Sjfb8856606 
3216d30ea906Sjfb8856606 		while (burst_sz != deq)
3217d30ea906Sjfb8856606 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
3218d30ea906Sjfb8856606 					&ops_deq[deq], burst_sz - deq);
3219d30ea906Sjfb8856606 
3220d30ea906Sjfb8856606 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
3221d30ea906Sjfb8856606 		dequeued += deq;
3222d30ea906Sjfb8856606 	}
3223d30ea906Sjfb8856606 
3224d30ea906Sjfb8856606 	return i;
3225d30ea906Sjfb8856606 }
3226*4418919fSjohnjiang 
3227*4418919fSjohnjiang static int
3228*4418919fSjohnjiang offload_latency_test_ldpc_enc(struct rte_mempool *mempool,
3229*4418919fSjohnjiang 		struct test_buffers *bufs,
3230*4418919fSjohnjiang 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
3231*4418919fSjohnjiang 		uint16_t queue_id, const uint16_t num_to_process,
3232*4418919fSjohnjiang 		uint16_t burst_sz, struct test_time_stats *time_st)
3233*4418919fSjohnjiang {
3234*4418919fSjohnjiang 	int i, dequeued, ret;
3235*4418919fSjohnjiang 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
3236*4418919fSjohnjiang 	uint64_t enq_start_time, deq_start_time;
3237*4418919fSjohnjiang 	uint64_t enq_sw_last_time, deq_last_time;
3238*4418919fSjohnjiang 	struct rte_bbdev_stats stats;
3239*4418919fSjohnjiang 
3240*4418919fSjohnjiang 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
3241*4418919fSjohnjiang 		uint16_t enq = 0, deq = 0;
3242*4418919fSjohnjiang 
3243*4418919fSjohnjiang 		if (unlikely(num_to_process - dequeued < burst_sz))
3244*4418919fSjohnjiang 			burst_sz = num_to_process - dequeued;
3245*4418919fSjohnjiang 
3246*4418919fSjohnjiang 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
3247*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed");
3248*4418919fSjohnjiang 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3249*4418919fSjohnjiang 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
3250*4418919fSjohnjiang 					bufs->inputs,
3251*4418919fSjohnjiang 					bufs->hard_outputs,
3252*4418919fSjohnjiang 					ref_op);
3253*4418919fSjohnjiang 
3254*4418919fSjohnjiang 		/* Start time meas for enqueue function offload latency */
3255*4418919fSjohnjiang 		enq_start_time = rte_rdtsc_precise();
3256*4418919fSjohnjiang 		do {
3257*4418919fSjohnjiang 			enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
3258*4418919fSjohnjiang 					&ops_enq[enq], burst_sz - enq);
3259*4418919fSjohnjiang 		} while (unlikely(burst_sz != enq));
3260*4418919fSjohnjiang 
3261*4418919fSjohnjiang 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
3262*4418919fSjohnjiang 		TEST_ASSERT_SUCCESS(ret,
3263*4418919fSjohnjiang 				"Failed to get stats for queue (%u) of device (%u)",
3264*4418919fSjohnjiang 				queue_id, dev_id);
3265*4418919fSjohnjiang 
3266*4418919fSjohnjiang 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
3267*4418919fSjohnjiang 				stats.acc_offload_cycles;
3268*4418919fSjohnjiang 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
3269*4418919fSjohnjiang 				enq_sw_last_time);
3270*4418919fSjohnjiang 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
3271*4418919fSjohnjiang 				enq_sw_last_time);
3272*4418919fSjohnjiang 		time_st->enq_sw_total_time += enq_sw_last_time;
3273*4418919fSjohnjiang 
3274*4418919fSjohnjiang 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
3275*4418919fSjohnjiang 				stats.acc_offload_cycles);
3276*4418919fSjohnjiang 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
3277*4418919fSjohnjiang 				stats.acc_offload_cycles);
3278*4418919fSjohnjiang 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
3279*4418919fSjohnjiang 
3280*4418919fSjohnjiang 		/* give time for device to process ops */
3281*4418919fSjohnjiang 		rte_delay_us(200);
3282*4418919fSjohnjiang 
3283*4418919fSjohnjiang 		/* Start time meas for dequeue function offload latency */
3284*4418919fSjohnjiang 		deq_start_time = rte_rdtsc_precise();
3285*4418919fSjohnjiang 		/* Dequeue one operation */
3286*4418919fSjohnjiang 		do {
3287*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
3288*4418919fSjohnjiang 					&ops_deq[deq], 1);
3289*4418919fSjohnjiang 		} while (unlikely(deq != 1));
3290*4418919fSjohnjiang 
3291*4418919fSjohnjiang 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3292*4418919fSjohnjiang 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
3293*4418919fSjohnjiang 				deq_last_time);
3294*4418919fSjohnjiang 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
3295*4418919fSjohnjiang 				deq_last_time);
3296*4418919fSjohnjiang 		time_st->deq_total_time += deq_last_time;
3297*4418919fSjohnjiang 
3298*4418919fSjohnjiang 		while (burst_sz != deq)
3299*4418919fSjohnjiang 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
3300*4418919fSjohnjiang 					&ops_deq[deq], burst_sz - deq);
3301*4418919fSjohnjiang 
3302*4418919fSjohnjiang 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
3303*4418919fSjohnjiang 		dequeued += deq;
3304*4418919fSjohnjiang 	}
3305*4418919fSjohnjiang 
3306*4418919fSjohnjiang 	return i;
3307*4418919fSjohnjiang }
3308d30ea906Sjfb8856606 #endif
3309d30ea906Sjfb8856606 
3310d30ea906Sjfb8856606 static int
3311d30ea906Sjfb8856606 offload_cost_test(struct active_device *ad,
3312d30ea906Sjfb8856606 		struct test_op_params *op_params)
3313d30ea906Sjfb8856606 {
3314d30ea906Sjfb8856606 #ifndef RTE_BBDEV_OFFLOAD_COST
3315d30ea906Sjfb8856606 	RTE_SET_USED(ad);
3316d30ea906Sjfb8856606 	RTE_SET_USED(op_params);
3317d30ea906Sjfb8856606 	printf("Offload latency test is disabled.\n");
3318d30ea906Sjfb8856606 	printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n");
3319d30ea906Sjfb8856606 	return TEST_SKIPPED;
3320d30ea906Sjfb8856606 #else
3321d30ea906Sjfb8856606 	int iter;
3322d30ea906Sjfb8856606 	uint16_t burst_sz = op_params->burst_sz;
3323d30ea906Sjfb8856606 	const uint16_t num_to_process = op_params->num_to_process;
3324d30ea906Sjfb8856606 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
3325d30ea906Sjfb8856606 	const uint16_t queue_id = ad->queue_ids[0];
3326d30ea906Sjfb8856606 	struct test_buffers *bufs = NULL;
3327d30ea906Sjfb8856606 	struct rte_bbdev_info info;
3328d30ea906Sjfb8856606 	const char *op_type_str;
3329d30ea906Sjfb8856606 	struct test_time_stats time_st;
3330d30ea906Sjfb8856606 
3331d30ea906Sjfb8856606 	memset(&time_st, 0, sizeof(struct test_time_stats));
3332d30ea906Sjfb8856606 	time_st.enq_sw_min_time = UINT64_MAX;
3333*4418919fSjohnjiang 	time_st.enq_acc_min_time = UINT64_MAX;
3334d30ea906Sjfb8856606 	time_st.deq_min_time = UINT64_MAX;
3335d30ea906Sjfb8856606 
3336d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3337d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
3338d30ea906Sjfb8856606 
3339d30ea906Sjfb8856606 	rte_bbdev_info_get(ad->dev_id, &info);
3340d30ea906Sjfb8856606 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3341d30ea906Sjfb8856606 
3342d30ea906Sjfb8856606 	op_type_str = rte_bbdev_op_type_str(op_type);
3343d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
3344d30ea906Sjfb8856606 
3345*4418919fSjohnjiang 	printf("+ ------------------------------------------------------- +\n");
3346*4418919fSjohnjiang 	printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
3347d30ea906Sjfb8856606 			info.dev_name, burst_sz, num_to_process, op_type_str);
3348d30ea906Sjfb8856606 
3349d30ea906Sjfb8856606 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
3350d30ea906Sjfb8856606 		iter = offload_latency_test_dec(op_params->mp, bufs,
3351d30ea906Sjfb8856606 				op_params->ref_dec_op, ad->dev_id, queue_id,
3352d30ea906Sjfb8856606 				num_to_process, burst_sz, &time_st);
3353*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC)
3354*4418919fSjohnjiang 		iter = offload_latency_test_enc(op_params->mp, bufs,
3355*4418919fSjohnjiang 				op_params->ref_enc_op, ad->dev_id, queue_id,
3356*4418919fSjohnjiang 				num_to_process, burst_sz, &time_st);
3357*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
3358*4418919fSjohnjiang 		iter = offload_latency_test_ldpc_enc(op_params->mp, bufs,
3359*4418919fSjohnjiang 				op_params->ref_enc_op, ad->dev_id, queue_id,
3360*4418919fSjohnjiang 				num_to_process, burst_sz, &time_st);
3361*4418919fSjohnjiang 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
3362*4418919fSjohnjiang 		iter = offload_latency_test_ldpc_dec(op_params->mp, bufs,
3363*4418919fSjohnjiang 			op_params->ref_dec_op, ad->dev_id, queue_id,
3364*4418919fSjohnjiang 			num_to_process, burst_sz, &time_st);
3365d30ea906Sjfb8856606 	else
3366d30ea906Sjfb8856606 		iter = offload_latency_test_enc(op_params->mp, bufs,
3367d30ea906Sjfb8856606 				op_params->ref_enc_op, ad->dev_id, queue_id,
3368d30ea906Sjfb8856606 				num_to_process, burst_sz, &time_st);
3369d30ea906Sjfb8856606 
3370d30ea906Sjfb8856606 	if (iter <= 0)
3371d30ea906Sjfb8856606 		return TEST_FAILED;
3372d30ea906Sjfb8856606 
3373*4418919fSjohnjiang 	printf("Enqueue driver offload cost latency:\n"
3374*4418919fSjohnjiang 			"\tavg: %lg cycles, %lg us\n"
3375*4418919fSjohnjiang 			"\tmin: %lg cycles, %lg us\n"
3376*4418919fSjohnjiang 			"\tmax: %lg cycles, %lg us\n"
3377*4418919fSjohnjiang 			"Enqueue accelerator offload cost latency:\n"
3378*4418919fSjohnjiang 			"\tavg: %lg cycles, %lg us\n"
3379*4418919fSjohnjiang 			"\tmin: %lg cycles, %lg us\n"
3380*4418919fSjohnjiang 			"\tmax: %lg cycles, %lg us\n",
3381*4418919fSjohnjiang 			(double)time_st.enq_sw_total_time / (double)iter,
3382*4418919fSjohnjiang 			(double)(time_st.enq_sw_total_time * 1000000) /
3383d30ea906Sjfb8856606 			(double)iter / (double)rte_get_tsc_hz(),
3384d30ea906Sjfb8856606 			(double)time_st.enq_sw_min_time,
3385d30ea906Sjfb8856606 			(double)(time_st.enq_sw_min_time * 1000000) /
3386d30ea906Sjfb8856606 			rte_get_tsc_hz(), (double)time_st.enq_sw_max_time,
3387d30ea906Sjfb8856606 			(double)(time_st.enq_sw_max_time * 1000000) /
3388*4418919fSjohnjiang 			rte_get_tsc_hz(), (double)time_st.enq_acc_total_time /
3389d30ea906Sjfb8856606 			(double)iter,
3390*4418919fSjohnjiang 			(double)(time_st.enq_acc_total_time * 1000000) /
3391d30ea906Sjfb8856606 			(double)iter / (double)rte_get_tsc_hz(),
3392*4418919fSjohnjiang 			(double)time_st.enq_acc_min_time,
3393*4418919fSjohnjiang 			(double)(time_st.enq_acc_min_time * 1000000) /
3394*4418919fSjohnjiang 			rte_get_tsc_hz(), (double)time_st.enq_acc_max_time,
3395*4418919fSjohnjiang 			(double)(time_st.enq_acc_max_time * 1000000) /
3396d30ea906Sjfb8856606 			rte_get_tsc_hz());
3397d30ea906Sjfb8856606 
3398*4418919fSjohnjiang 	printf("Dequeue offload cost latency - one op:\n"
3399*4418919fSjohnjiang 			"\tavg: %lg cycles, %lg us\n"
3400*4418919fSjohnjiang 			"\tmin: %lg cycles, %lg us\n"
3401*4418919fSjohnjiang 			"\tmax: %lg cycles, %lg us\n",
3402*4418919fSjohnjiang 			(double)time_st.deq_total_time / (double)iter,
3403*4418919fSjohnjiang 			(double)(time_st.deq_total_time * 1000000) /
3404d30ea906Sjfb8856606 			(double)iter / (double)rte_get_tsc_hz(),
3405d30ea906Sjfb8856606 			(double)time_st.deq_min_time,
3406d30ea906Sjfb8856606 			(double)(time_st.deq_min_time * 1000000) /
3407d30ea906Sjfb8856606 			rte_get_tsc_hz(), (double)time_st.deq_max_time,
3408d30ea906Sjfb8856606 			(double)(time_st.deq_max_time * 1000000) /
3409d30ea906Sjfb8856606 			rte_get_tsc_hz());
3410d30ea906Sjfb8856606 
3411d30ea906Sjfb8856606 	return TEST_SUCCESS;
3412d30ea906Sjfb8856606 #endif
3413d30ea906Sjfb8856606 }
3414d30ea906Sjfb8856606 
3415d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST
3416d30ea906Sjfb8856606 static int
3417d30ea906Sjfb8856606 offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id,
3418d30ea906Sjfb8856606 		const uint16_t num_to_process, uint16_t burst_sz,
3419*4418919fSjohnjiang 		uint64_t *deq_total_time, uint64_t *deq_min_time,
3420d30ea906Sjfb8856606 		uint64_t *deq_max_time)
3421d30ea906Sjfb8856606 {
3422d30ea906Sjfb8856606 	int i, deq_total;
3423d30ea906Sjfb8856606 	struct rte_bbdev_dec_op *ops[MAX_BURST];
3424d30ea906Sjfb8856606 	uint64_t deq_start_time, deq_last_time;
3425d30ea906Sjfb8856606 
3426d30ea906Sjfb8856606 	/* Test deq offload latency from an empty queue */
3427d30ea906Sjfb8856606 
3428d30ea906Sjfb8856606 	for (i = 0, deq_total = 0; deq_total < num_to_process;
3429d30ea906Sjfb8856606 			++i, deq_total += burst_sz) {
3430d30ea906Sjfb8856606 		deq_start_time = rte_rdtsc_precise();
3431d30ea906Sjfb8856606 
3432d30ea906Sjfb8856606 		if (unlikely(num_to_process - deq_total < burst_sz))
3433d30ea906Sjfb8856606 			burst_sz = num_to_process - deq_total;
3434d30ea906Sjfb8856606 		rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, burst_sz);
3435d30ea906Sjfb8856606 
3436d30ea906Sjfb8856606 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3437d30ea906Sjfb8856606 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
3438d30ea906Sjfb8856606 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
3439*4418919fSjohnjiang 		*deq_total_time += deq_last_time;
3440d30ea906Sjfb8856606 	}
3441d30ea906Sjfb8856606 
3442d30ea906Sjfb8856606 	return i;
3443d30ea906Sjfb8856606 }
3444d30ea906Sjfb8856606 
3445d30ea906Sjfb8856606 static int
3446d30ea906Sjfb8856606 offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id,
3447d30ea906Sjfb8856606 		const uint16_t num_to_process, uint16_t burst_sz,
3448*4418919fSjohnjiang 		uint64_t *deq_total_time, uint64_t *deq_min_time,
3449d30ea906Sjfb8856606 		uint64_t *deq_max_time)
3450d30ea906Sjfb8856606 {
3451d30ea906Sjfb8856606 	int i, deq_total;
3452d30ea906Sjfb8856606 	struct rte_bbdev_enc_op *ops[MAX_BURST];
3453d30ea906Sjfb8856606 	uint64_t deq_start_time, deq_last_time;
3454d30ea906Sjfb8856606 
3455d30ea906Sjfb8856606 	/* Test deq offload latency from an empty queue */
3456d30ea906Sjfb8856606 	for (i = 0, deq_total = 0; deq_total < num_to_process;
3457d30ea906Sjfb8856606 			++i, deq_total += burst_sz) {
3458d30ea906Sjfb8856606 		deq_start_time = rte_rdtsc_precise();
3459d30ea906Sjfb8856606 
3460d30ea906Sjfb8856606 		if (unlikely(num_to_process - deq_total < burst_sz))
3461d30ea906Sjfb8856606 			burst_sz = num_to_process - deq_total;
3462d30ea906Sjfb8856606 		rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, burst_sz);
3463d30ea906Sjfb8856606 
3464d30ea906Sjfb8856606 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
3465d30ea906Sjfb8856606 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
3466d30ea906Sjfb8856606 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
3467*4418919fSjohnjiang 		*deq_total_time += deq_last_time;
3468d30ea906Sjfb8856606 	}
3469d30ea906Sjfb8856606 
3470d30ea906Sjfb8856606 	return i;
3471d30ea906Sjfb8856606 }
3472d30ea906Sjfb8856606 #endif
3473d30ea906Sjfb8856606 
3474d30ea906Sjfb8856606 static int
3475d30ea906Sjfb8856606 offload_latency_empty_q_test(struct active_device *ad,
3476d30ea906Sjfb8856606 		struct test_op_params *op_params)
3477d30ea906Sjfb8856606 {
3478d30ea906Sjfb8856606 #ifndef RTE_BBDEV_OFFLOAD_COST
3479d30ea906Sjfb8856606 	RTE_SET_USED(ad);
3480d30ea906Sjfb8856606 	RTE_SET_USED(op_params);
3481d30ea906Sjfb8856606 	printf("Offload latency empty dequeue test is disabled.\n");
3482d30ea906Sjfb8856606 	printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n");
3483d30ea906Sjfb8856606 	return TEST_SKIPPED;
3484d30ea906Sjfb8856606 #else
3485d30ea906Sjfb8856606 	int iter;
3486*4418919fSjohnjiang 	uint64_t deq_total_time, deq_min_time, deq_max_time;
3487d30ea906Sjfb8856606 	uint16_t burst_sz = op_params->burst_sz;
3488d30ea906Sjfb8856606 	const uint16_t num_to_process = op_params->num_to_process;
3489d30ea906Sjfb8856606 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
3490d30ea906Sjfb8856606 	const uint16_t queue_id = ad->queue_ids[0];
3491d30ea906Sjfb8856606 	struct rte_bbdev_info info;
3492d30ea906Sjfb8856606 	const char *op_type_str;
3493d30ea906Sjfb8856606 
3494*4418919fSjohnjiang 	deq_total_time = deq_max_time = 0;
3495d30ea906Sjfb8856606 	deq_min_time = UINT64_MAX;
3496d30ea906Sjfb8856606 
3497d30ea906Sjfb8856606 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3498d30ea906Sjfb8856606 			"BURST_SIZE should be <= %u", MAX_BURST);
3499d30ea906Sjfb8856606 
3500d30ea906Sjfb8856606 	rte_bbdev_info_get(ad->dev_id, &info);
3501d30ea906Sjfb8856606 
3502d30ea906Sjfb8856606 	op_type_str = rte_bbdev_op_type_str(op_type);
3503d30ea906Sjfb8856606 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
3504d30ea906Sjfb8856606 
3505*4418919fSjohnjiang 	printf("+ ------------------------------------------------------- +\n");
3506*4418919fSjohnjiang 	printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
3507d30ea906Sjfb8856606 			info.dev_name, burst_sz, num_to_process, op_type_str);
3508d30ea906Sjfb8856606 
3509d30ea906Sjfb8856606 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
3510d30ea906Sjfb8856606 		iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id,
3511*4418919fSjohnjiang 				num_to_process, burst_sz, &deq_total_time,
3512d30ea906Sjfb8856606 				&deq_min_time, &deq_max_time);
3513d30ea906Sjfb8856606 	else
3514d30ea906Sjfb8856606 		iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id,
3515*4418919fSjohnjiang 				num_to_process, burst_sz, &deq_total_time,
3516d30ea906Sjfb8856606 				&deq_min_time, &deq_max_time);
3517d30ea906Sjfb8856606 
3518d30ea906Sjfb8856606 	if (iter <= 0)
3519d30ea906Sjfb8856606 		return TEST_FAILED;
3520d30ea906Sjfb8856606 
3521*4418919fSjohnjiang 	printf("Empty dequeue offload:\n"
3522*4418919fSjohnjiang 			"\tavg: %lg cycles, %lg us\n"
3523*4418919fSjohnjiang 			"\tmin: %lg cycles, %lg us\n"
3524*4418919fSjohnjiang 			"\tmax: %lg cycles, %lg us\n",
3525*4418919fSjohnjiang 			(double)deq_total_time / (double)iter,
3526*4418919fSjohnjiang 			(double)(deq_total_time * 1000000) / (double)iter /
3527d30ea906Sjfb8856606 			(double)rte_get_tsc_hz(), (double)deq_min_time,
3528d30ea906Sjfb8856606 			(double)(deq_min_time * 1000000) / rte_get_tsc_hz(),
3529d30ea906Sjfb8856606 			(double)deq_max_time, (double)(deq_max_time * 1000000) /
3530d30ea906Sjfb8856606 			rte_get_tsc_hz());
3531d30ea906Sjfb8856606 
3532d30ea906Sjfb8856606 	return TEST_SUCCESS;
3533d30ea906Sjfb8856606 #endif
3534d30ea906Sjfb8856606 }
3535d30ea906Sjfb8856606 
3536d30ea906Sjfb8856606 static int
3537d30ea906Sjfb8856606 throughput_tc(void)
3538d30ea906Sjfb8856606 {
3539d30ea906Sjfb8856606 	return run_test_case(throughput_test);
3540d30ea906Sjfb8856606 }
3541d30ea906Sjfb8856606 
3542d30ea906Sjfb8856606 static int
3543d30ea906Sjfb8856606 offload_cost_tc(void)
3544d30ea906Sjfb8856606 {
3545d30ea906Sjfb8856606 	return run_test_case(offload_cost_test);
3546d30ea906Sjfb8856606 }
3547d30ea906Sjfb8856606 
3548d30ea906Sjfb8856606 static int
3549d30ea906Sjfb8856606 offload_latency_empty_q_tc(void)
3550d30ea906Sjfb8856606 {
3551d30ea906Sjfb8856606 	return run_test_case(offload_latency_empty_q_test);
3552d30ea906Sjfb8856606 }
3553d30ea906Sjfb8856606 
3554d30ea906Sjfb8856606 static int
3555d30ea906Sjfb8856606 latency_tc(void)
3556d30ea906Sjfb8856606 {
3557d30ea906Sjfb8856606 	return run_test_case(latency_test);
3558d30ea906Sjfb8856606 }
3559d30ea906Sjfb8856606 
3560d30ea906Sjfb8856606 static int
3561d30ea906Sjfb8856606 interrupt_tc(void)
3562d30ea906Sjfb8856606 {
3563d30ea906Sjfb8856606 	return run_test_case(throughput_test);
3564d30ea906Sjfb8856606 }
3565d30ea906Sjfb8856606 
3566d30ea906Sjfb8856606 static struct unit_test_suite bbdev_throughput_testsuite = {
3567d30ea906Sjfb8856606 	.suite_name = "BBdev Throughput Tests",
3568d30ea906Sjfb8856606 	.setup = testsuite_setup,
3569d30ea906Sjfb8856606 	.teardown = testsuite_teardown,
3570d30ea906Sjfb8856606 	.unit_test_cases = {
3571d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc),
3572d30ea906Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
3573d30ea906Sjfb8856606 	}
3574d30ea906Sjfb8856606 };
3575d30ea906Sjfb8856606 
3576d30ea906Sjfb8856606 static struct unit_test_suite bbdev_validation_testsuite = {
3577d30ea906Sjfb8856606 	.suite_name = "BBdev Validation Tests",
3578d30ea906Sjfb8856606 	.setup = testsuite_setup,
3579d30ea906Sjfb8856606 	.teardown = testsuite_teardown,
3580d30ea906Sjfb8856606 	.unit_test_cases = {
3581d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, latency_tc),
3582d30ea906Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
3583d30ea906Sjfb8856606 	}
3584d30ea906Sjfb8856606 };
3585d30ea906Sjfb8856606 
3586d30ea906Sjfb8856606 static struct unit_test_suite bbdev_latency_testsuite = {
3587d30ea906Sjfb8856606 	.suite_name = "BBdev Latency Tests",
3588d30ea906Sjfb8856606 	.setup = testsuite_setup,
3589d30ea906Sjfb8856606 	.teardown = testsuite_teardown,
3590d30ea906Sjfb8856606 	.unit_test_cases = {
3591d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, latency_tc),
3592d30ea906Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
3593d30ea906Sjfb8856606 	}
3594d30ea906Sjfb8856606 };
3595d30ea906Sjfb8856606 
3596d30ea906Sjfb8856606 static struct unit_test_suite bbdev_offload_cost_testsuite = {
3597d30ea906Sjfb8856606 	.suite_name = "BBdev Offload Cost Tests",
3598d30ea906Sjfb8856606 	.setup = testsuite_setup,
3599d30ea906Sjfb8856606 	.teardown = testsuite_teardown,
3600d30ea906Sjfb8856606 	.unit_test_cases = {
3601d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc),
3602d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc),
3603d30ea906Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
3604d30ea906Sjfb8856606 	}
3605d30ea906Sjfb8856606 };
3606d30ea906Sjfb8856606 
3607d30ea906Sjfb8856606 static struct unit_test_suite bbdev_interrupt_testsuite = {
3608d30ea906Sjfb8856606 	.suite_name = "BBdev Interrupt Tests",
3609d30ea906Sjfb8856606 	.setup = interrupt_testsuite_setup,
3610d30ea906Sjfb8856606 	.teardown = testsuite_teardown,
3611d30ea906Sjfb8856606 	.unit_test_cases = {
3612d30ea906Sjfb8856606 		TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc),
3613d30ea906Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
3614d30ea906Sjfb8856606 	}
3615d30ea906Sjfb8856606 };
3616d30ea906Sjfb8856606 
3617d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite);
3618d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite);
3619d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite);
3620d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite);
3621d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite);
3622